* loop.c (basic_induction_var): Avoid double recording of an increment.
authorJ"orn Rennecke <amylaar@cygnus.co.uk>
Thu, 25 May 2000 01:30:51 +0000 (01:30 +0000)
committerJoern Rennecke <amylaar@gcc.gnu.org>
Thu, 25 May 2000 01:30:51 +0000 (02:30 +0100)
From-SVN: r34153

gcc/ChangeLog
gcc/loop.c

index ded3ed7474f25d05cbbfbfaeb7e2093a4b5d37f4..5f2ac8d4407411ffafbd28edba85a284b8757887 100644 (file)
@@ -1,3 +1,7 @@
+Thu May 25 02:27:22 2000  J"orn Rennecke <amylaar@cygnus.co.uk>
+
+       * loop.c (basic_induction_var): Avoid double recording of an increment.
+
 Thu May 25 02:19:27 2000  J"orn Rennecke <amylaar@cygnus.co.uk>
 
        * Back out this patch:
index ed396f4ab8ffcae784c47c7ef19373da384533e4..6746c98c2b12a68284e7cddcf7ed9c0691e1005b 100644 (file)
@@ -5995,6 +5995,11 @@ basic_induction_var (loop, x, mode, dest_reg, p, inc_val, mult_val, location)
       /* If this register is assigned in a previous insn, look at its
         source, but don't go outside the loop or past a label.  */
 
+      /* If this sets a register to itself, we would repeat any previous
+        biv increment if we applied this strategy blindly.  */
+      if (rtx_equal_p (dest_reg, x))
+       return 0;
+
       insn = p;
       while (1)
        {
@@ -6066,7 +6071,8 @@ basic_induction_var (loop, x, mode, dest_reg, p, inc_val, mult_val, location)
       if (insn)
        set = single_set (insn);
 
-      if (set && SET_DEST (set) == XEXP (x, 0)
+      if (! rtx_equal_p (dest_reg, XEXP (x, 0))
+         && set && SET_DEST (set) == XEXP (x, 0)
          && GET_CODE (XEXP (x, 1)) == CONST_INT
          && INTVAL (XEXP (x, 1)) >= 0
          && GET_CODE (SET_SRC (set)) == ASHIFT