combine: distribute_notes again (PR69567, PR64682)
authorSegher Boessenkool <segher@kernel.crashing.org>
Thu, 4 Feb 2016 23:09:51 +0000 (00:09 +0100)
committerSegher Boessenkool <segher@gcc.gnu.org>
Thu, 4 Feb 2016 23:09:51 +0000 (00:09 +0100)
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

gcc/ChangeLog
gcc/combine.c

index 17e4f49..a6ec06f 100644 (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.
index c307793..3609b94 100644 (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)