Commit fcc861d9 by Alan Modra Committed by Alan Modra

PR70890, stage2 miscompilation

	PR rtl-optimization/70890
	* ira.c (combine_and_move_insns): When moving def_insn, remove
	equivs on use_insn.

From-SVN: r235825
parent f3d90045
2016-05-03 Alan Modra <amodra@gmail.com>
PR rtl-optimization/70890
* ira.c (combine_and_move_insns): When moving def_insn, remove
equivs on use_insn.
2016-05-03 Dominik Vogt <vogt@linux.vnet.ibm.com> 2016-05-03 Dominik Vogt <vogt@linux.vnet.ibm.com>
* config/s390/s390.md ("*r<noxa>sbg_<mode>_sll") * config/s390/s390.md ("*r<noxa>sbg_<mode>_sll")
......
...@@ -3742,6 +3742,22 @@ combine_and_move_insns (void) ...@@ -3742,6 +3742,22 @@ combine_and_move_insns (void)
if (use_insn == BB_HEAD (use_bb)) if (use_insn == BB_HEAD (use_bb))
BB_HEAD (use_bb) = new_insn; 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 ira_reg_equiv[regno].init_insns
= gen_rtx_INSN_LIST (VOIDmode, new_insn, NULL_RTX); = gen_rtx_INSN_LIST (VOIDmode, new_insn, NULL_RTX);
bitmap_set_bit (cleared_regs, regno); bitmap_set_bit (cleared_regs, regno);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment