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

Tested on the separate testcases; also did bootstrap + testsuite on
powerpc64-linux and x86_64-linux.  I'll commit this tomorrow or so if
no one sees something wrong with it.


Segher


2016-02-02  Segher Boessenkool  <seg...@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.

---
 gcc/combine.c | 16 +++++++++-------
 1 file changed, 9 insertions(+), 7 deletions(-)

diff --git a/gcc/combine.c b/gcc/combine.c
index ad79c44..7251078 100644
--- a/gcc/combine.c
+++ b/gcc/combine.c
@@ -13888,6 +13888,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)))
@@ -13896,7 +13897,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),
@@ -13904,12 +13912,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)
-- 
1.9.3

Reply via email to