combine: distribute_notes again (PR69567, PR64682)

As it happens the patch I did over a year ago for PR64682 isn't quite
correct.  This is PR69567.  This fixes it.


	PR rtl-optimization/64682
	PR rtl-optimization/69567
	* combine.c (distribute_notes) <REG_DEAD>: Place the death note
	before I2 only if the register is both used and set in I2.

From-SVN: r233159
This commit is contained in:
Segher Boessenkool 2016-02-05 00:09:51 +01:00 committed by Segher Boessenkool
parent 618d6c1c4d
commit 171dc40ede
2 changed files with 16 additions and 7 deletions

View File

@ -1,3 +1,10 @@
2016-02-04 Segher Boessenkool <segher@kernel.crashing.org>
PR rtl-optimization/64682
PR rtl-optimization/69567
* combine.c (distribute_notes) <REG_DEAD>: Place the death note
before I2 only if the register is both used and set in I2.
2016-02-04 DJ Delorie <dj@redhat.com>
* config/msp430/msp430.c (msp430_start_function): Add function type.

View File

@ -13901,6 +13901,7 @@ 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)))
@ -13909,7 +13910,14 @@ 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;
{
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)
&& !(i2mod
&& reg_overlap_mentioned_p (XEXP (note, 0),
@ -13917,12 +13925,6 @@ 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, the note now should not be put on I2, as the
note refers to a previous incarnation of the reg. */
if (i2 != 0 && reg_set_p (XEXP (note, 0), PATTERN (i2)))
tem_insn = i2;
}
if (place == 0)