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
This commit is contained in:
Segher Boessenkool 2016-02-11 23:26:35 +01:00 committed by Segher Boessenkool
parent 76fe932be3
commit ec4836a75d
2 changed files with 15 additions and 9 deletions

View File

@ -1,3 +1,11 @@
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> 2016-02-11 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
* config/aarch64/aarch64.c (aarch64_last_printed_arch_string): * config/aarch64/aarch64.c (aarch64_last_printed_arch_string):

View File

@ -13901,7 +13901,6 @@ distribute_notes (rtx notes, rtx_insn *from_insn, rtx_insn *i3, rtx_insn *i2,
tem_insn = from_insn; tem_insn = from_insn;
else else
{ {
tem_insn = i3;
if (from_insn if (from_insn
&& CALL_P (from_insn) && CALL_P (from_insn)
&& find_reg_fusage (from_insn, USE, XEXP (note, 0))) && 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; place = i3;
else if (i2 != 0 && next_nonnote_nondebug_insn (i2) == i3 else if (i2 != 0 && next_nonnote_nondebug_insn (i2) == i3
&& reg_referenced_p (XEXP (note, 0), PATTERN (i2))) && reg_referenced_p (XEXP (note, 0), PATTERN (i2)))
{ place = 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;
}
else if ((rtx_equal_p (XEXP (note, 0), elim_i2) else if ((rtx_equal_p (XEXP (note, 0), elim_i2)
&& !(i2mod && !(i2mod
&& reg_overlap_mentioned_p (XEXP (note, 0), && 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_i1)
|| rtx_equal_p (XEXP (note, 0), elim_i0)) || rtx_equal_p (XEXP (note, 0), elim_i0))
break; 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) if (place == 0)