OSDN Git Service

Re-apply an earlier fix, with a small update
authorbernds <bernds@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 27 Nov 2000 14:42:54 +0000 (14:42 +0000)
committerbernds <bernds@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 27 Nov 2000 14:42:54 +0000 (14:42 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@37794 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/loop.c

index 9858a21..6e8fd89 100644 (file)
        htab_find_slot_with_hash.
        (cselib_lookup): Likewise.
 
+       Based on a patch from Geoff Keating <geoffk@redhat.com>:
+       * loop.c (basic_induction_var): If a REG is set from something
+       that is not a biv, then the REG is not a biv.  Even if it is
+       earlier set from something that is a biv.
+
 2000-11-27  Alexandre Oliva  <aoliva@redhat.com>
 
        * configure.in (extra_objs): Enclose extra_headers in quotes.
index a514d05..7b4fd31 100644 (file)
@@ -5467,6 +5467,7 @@ basic_induction_var (loop, x, mode, dest_reg, p, inc_val, mult_val, location)
       insn = p;
       while (1)
        {
+         rtx dest;
          do
            {
              insn = PREV_INSN (insn);
@@ -5479,21 +5480,26 @@ basic_induction_var (loop, x, mode, dest_reg, p, inc_val, mult_val, location)
          set = single_set (insn);
          if (set == 0)
            break;
-
-         if ((SET_DEST (set) == x
-              || (GET_CODE (SET_DEST (set)) == SUBREG
-                  && (GET_MODE_SIZE (GET_MODE (SET_DEST (set)))
-                      <= UNITS_PER_WORD)
-                  && (GET_MODE_CLASS (GET_MODE (SET_DEST (set)))
-                      == MODE_INT)
-                  && SUBREG_REG (SET_DEST (set)) == x))
-             && basic_induction_var (loop, SET_SRC (set),
-                                     (GET_MODE (SET_SRC (set)) == VOIDmode
-                                      ? GET_MODE (x)
-                                      : GET_MODE (SET_SRC (set))),
-                                     dest_reg, insn,
-                                     inc_val, mult_val, location))
-           return 1;
+         dest = SET_DEST (set);
+         if (dest == x
+             || (GET_CODE (dest) == SUBREG
+                 && (GET_MODE_SIZE (GET_MODE (dest)) <= UNITS_PER_WORD)
+                 && (GET_MODE_CLASS (GET_MODE (dest)) == MODE_INT)
+                 && SUBREG_REG (dest) == x))
+           return basic_induction_var (loop, SET_SRC (set),
+                                       (GET_MODE (SET_SRC (set)) == VOIDmode
+                                        ? GET_MODE (x)
+                                        : GET_MODE (SET_SRC (set))),
+                                       dest_reg, insn,
+                                       inc_val, mult_val, location);
+
+         while (GET_CODE (dest) == SIGN_EXTRACT
+                || GET_CODE (dest) == ZERO_EXTRACT
+                || GET_CODE (dest) == SUBREG
+                || GET_CODE (dest) == STRICT_LOW_PART)
+           dest = XEXP (dest, 0);
+         if (dest == x)
+           break;
        }
       /* Fall through.  */