combine: More distribute_notes trouble (PR69737)
authorSegher Boessenkool <segher@kernel.crashing.org>
Thu, 11 Feb 2016 22:26:35 +0000 (23:26 +0100)
committerSegher Boessenkool <segher@gcc.gnu.org>
Thu, 11 Feb 2016 22:26:35 +0000 (23:26 +0100)
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

gcc/ChangeLog
gcc/combine.c

index 4c17a5caf5d18c2c8b5e92ed02d07f0707c71b99..35f8865d5485d49dbac0532eedf5cb3fb074ba40 100644 (file)
@@ -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):
index 3609b946188a5f8d470f4f35a423198f6219d5bc..24dcefa0bf6228e7903f4df3163a7df78ffa8ed9 100644 (file)
@@ -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)