Commit ec4836a7 by Segher Boessenkool Committed by Segher Boessenkool

combine: More distribute_notes trouble (PR69737)

PR64682 is a problem in distribute_notes, where it has trouble putting
a REG_DEAD note for a reg that is set twice in the right spot.  My fix
for that did the wrong thing for PR69567.  And then my attempted fix
for that one made PR64682 fail again.

Instead, let's just lose the note in such complicated cases, like we
already do in certain similar cases.


	PR rtl-optimization/64682
	PR rtl-optimization/69567
	PR rtl-optimization/69737
	* combine.c (distribute_notes) <REG_DEAD>: If the register is set
	in I2 as well, just lose it.

From-SVN: r233356
parent 76fe932b
2016-02-11 Segher Boessenkool <segher@kernel.crashing.org>
PR rtl-optimization/64682
PR rtl-optimization/69567
PR rtl-optimization/69737
* combine.c (distribute_notes) <REG_DEAD>: If the register is set
in I2 as well, just lose it.
2016-02-11 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
* config/aarch64/aarch64.c (aarch64_last_printed_arch_string):
......
......@@ -13901,7 +13901,6 @@ distribute_notes (rtx notes, rtx_insn *from_insn, rtx_insn *i3, rtx_insn *i2,
tem_insn = from_insn;
else
{
tem_insn = i3;
if (from_insn
&& CALL_P (from_insn)
&& find_reg_fusage (from_insn, USE, XEXP (note, 0)))
......@@ -13910,14 +13909,7 @@ distribute_notes (rtx notes, rtx_insn *from_insn, rtx_insn *i3, rtx_insn *i2,
place = i3;
else if (i2 != 0 && next_nonnote_nondebug_insn (i2) == i3
&& reg_referenced_p (XEXP (note, 0), PATTERN (i2)))
{
place = i2;
/* If the new I2 sets the same register that is marked dead
in the note, the note now should not be put on I2, as the
note refers to a previous incarnation of the reg. */
if (reg_set_p (XEXP (note, 0), PATTERN (i2)))
tem_insn = i2;
}
place = i2;
else if ((rtx_equal_p (XEXP (note, 0), elim_i2)
&& !(i2mod
&& reg_overlap_mentioned_p (XEXP (note, 0),
......@@ -13925,6 +13917,12 @@ distribute_notes (rtx notes, rtx_insn *from_insn, rtx_insn *i3, rtx_insn *i2,
|| rtx_equal_p (XEXP (note, 0), elim_i1)
|| rtx_equal_p (XEXP (note, 0), elim_i0))
break;
tem_insn = i3;
/* If the new I2 sets the same register that is marked dead
in the note, we do not know where to put the note.
Give up. */
if (i2 != 0 && reg_set_p (XEXP (note, 0), PATTERN (i2)))
break;
}
if (place == 0)
......
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