summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsegher <segher@138bc75d-0d04-0410-961f-82ee72b054a4>2016-02-04 23:09:51 +0000
committersegher <segher@138bc75d-0d04-0410-961f-82ee72b054a4>2016-02-04 23:09:51 +0000
commit81c08ac38543d80cdcb2601ce2d00e72ab946490 (patch)
tree0fdcad95e5f8873a1ee2cf85e01b7094f22cdd2e
parentf7ef53928bc90411d40404ce42dc2c3dfc33c2fb (diff)
downloadgcc-81c08ac38543d80cdcb2601ce2d00e72ab946490.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@233159 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/combine.c16
2 files changed, 16 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 17e4f49182b..a6ec06ff047 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/combine.c b/gcc/combine.c
index c307793a495..3609b946188 100644
--- a/gcc/combine.c
+++ b/gcc/combine.c
@@ -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)