re PR rtl-optimization/20527 (Mishandling of postincrement causes bzip2 miscompilation.)
authorHans-Peter Nilsson <hp@axis.com>
Tue, 22 Mar 2005 03:48:44 +0000 (03:48 +0000)
committerHans-Peter Nilsson <hp@gcc.gnu.org>
Tue, 22 Mar 2005 03:48:44 +0000 (03:48 +0000)
PR rtl-optimization/20527
* combine.c (can_combine_p) [AUTO_INC_DEC]: When INSN has an
REG_INC note, test that the register also isn't mentioned in PRED
or SUCC.

From-SVN: r96853

gcc/ChangeLog
gcc/combine.c

index 42b4ac99dc374a3b7c8408d715bf7e2354db8411..0bc1367cf34c9b4775afe5781d05976f8ba2f14c 100644 (file)
@@ -1,3 +1,10 @@
+2005-03-22  Hans-Peter Nilsson  <hp@axis.com>
+
+       PR rtl-optimization/20527
+       * combine.c (can_combine_p) [AUTO_INC_DEC]: When INSN has an
+       REG_INC note, test that the register also isn't mentioned in PRED
+       or SUCC.
+
 2005-03-22  Ben Elliston  <bje@au.ibm.com>
 
        * dwarf2out.c (dwarf_type_encoding_name): Remove unused prototype
index 5981403eea907e43c6e611a4a7bbd600919cb038..297b58e914e050d132db5b3a12fb6d0118eb8475 100644 (file)
@@ -1314,9 +1314,9 @@ can_combine_p (rtx insn, rtx i3, rtx pred ATTRIBUTE_UNUSED, rtx succ,
     if (INSN_P (p) && p != succ && volatile_insn_p (PATTERN (p)))
       return 0;
 
-  /* If INSN or I2 contains an autoincrement or autodecrement,
-     make sure that register is not used between there and I3,
-     and not already used in I3 either.
+  /* If INSN contains an autoincrement or autodecrement, make sure that
+     register is not used between there and I3, and not already used in
+     I3 either.  Neither must it be used in PRED or SUCC, if they exist.
      Also insist that I3 not be a jump; if it were one
      and the incremented register were spilled, we would lose.  */
 
@@ -1325,6 +1325,10 @@ can_combine_p (rtx insn, rtx i3, rtx pred ATTRIBUTE_UNUSED, rtx succ,
     if (REG_NOTE_KIND (link) == REG_INC
        && (JUMP_P (i3)
            || reg_used_between_p (XEXP (link, 0), insn, i3)
+           || (pred != NULL_RTX
+               && reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (pred)))
+           || (succ != NULL_RTX
+               && reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (succ)))
            || reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (i3))))
       return 0;
 #endif