mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-02-23 23:01:43 +08:00
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:
parent
76fe932be3
commit
ec4836a75d
@ -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>
|
||||
|
||||
* 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)
|
||||
|
Loading…
Reference in New Issue
Block a user