diff mbox

pr70890, r235660 miscompiles stage2

Message ID 20160503144616.GO18915@bubble.grove.modra.org
State New
Headers show

Commit Message

Alan Modra May 3, 2016, 2:46 p.m. UTC
On Tue, May 03, 2016 at 03:51:11PM +0200, Bernd Schmidt wrote:
> If that is all ok and we just have a really odd cfg, then your patch is ok
> with a better comment as to which situations can cause the problem.

Thanks, committed rev 235825.
diff mbox

Patch

diff --git a/gcc/ira.c b/gcc/ira.c
index a38e67e..269a190 100644
--- a/gcc/ira.c
+++ b/gcc/ira.c
@@ -3742,6 +3742,22 @@  combine_and_move_insns (void)
 	  if (use_insn == BB_HEAD (use_bb))
 	    BB_HEAD (use_bb) = new_insn;
 
+	  /* We know regno dies in use_insn, but inside a loop
+	     REG_DEAD notes might be missing when def_insn was in
+	     another basic block.  However, when we move def_insn into
+	     this bb we'll definitely get a REG_DEAD note and reload
+	     will see the death.  It's possible that update_equiv_regs
+	     set up an equivalence referencing regno for a reg set by
+	     use_insn, when regno was seen as non-local.  Now that
+	     regno is local to this block, and dies, such an
+	     equivalence is invalid.  */
+	  if (find_reg_note (use_insn, REG_EQUIV, NULL_RTX))
+	    {
+	      rtx set = single_set (use_insn);
+	      if (set && REG_P (SET_DEST (set)))
+		no_equiv (SET_DEST (set), set, NULL);
+	    }
+
 	  ira_reg_equiv[regno].init_insns
 	    = gen_rtx_INSN_LIST (VOIDmode, new_insn, NULL_RTX);
 	  bitmap_set_bit (cleared_regs, regno);