From: Bernd Schmidt Date: Mon, 27 Nov 2000 14:42:54 +0000 (+0000) Subject: Re-apply an earlier fix, with a small update X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=7dbe6ae9b3232d6ff940ef8c6a65381e291154cd;p=gcc.git Re-apply an earlier fix, with a small update From-SVN: r37794 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9858a21fcb2..6e8fd8984dc 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -12,6 +12,11 @@ htab_find_slot_with_hash. (cselib_lookup): Likewise. + Based on a patch from Geoff Keating : + * 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 * configure.in (extra_objs): Enclose extra_headers in quotes. diff --git a/gcc/loop.c b/gcc/loop.c index a514d051113..7b4fd319168 100644 --- a/gcc/loop.c +++ b/gcc/loop.c @@ -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. */