diff options
author | Revital Eres <eres@il.ibm.com> | 2004-06-24 16:50:35 +0000 |
---|---|---|
committer | Roger Sayle <sayle@gcc.gnu.org> | 2004-06-24 16:50:35 +0000 |
commit | abe0d774cf58aa24fd3d9f73c2ac913e7dc65e03 (patch) | |
tree | 22302d5c99a616cc8c7a17165f37236497372afb /gcc/loop-iv.c | |
parent | be1ba3d170d2119394c4700e320240264513d64e (diff) | |
download | gcc-abe0d774cf58aa24fd3d9f73c2ac913e7dc65e03.zip gcc-abe0d774cf58aa24fd3d9f73c2ac913e7dc65e03.tar.gz gcc-abe0d774cf58aa24fd3d9f73c2ac913e7dc65e03.tar.bz2 |
loop-iv.c (iv_analyze, [...]): Support for identifying shifts of induction variable.
2004-06-24 Revital Eres <eres@il.ibm.com>
* loop-iv.c (iv_analyze, simple_set_p): Support for identifying
shifts of induction variable.
(iv_shift): New function.
From-SVN: r83599
Diffstat (limited to 'gcc/loop-iv.c')
-rw-r--r-- | gcc/loop-iv.c | 44 |
1 files changed, 43 insertions, 1 deletions
diff --git a/gcc/loop-iv.c b/gcc/loop-iv.c index 0093743..e739a85 100644 --- a/gcc/loop-iv.c +++ b/gcc/loop-iv.c @@ -222,6 +222,7 @@ simple_set_p (rtx lhs, rtx rhs) case PLUS: case MINUS: case MULT: + case ASHIFT: op0 = XEXP (rhs, 0); op1 = XEXP (rhs, 1); @@ -238,6 +239,10 @@ simple_set_p (rtx lhs, rtx rhs) && !CONSTANT_P (op1)) return false; + if (GET_CODE (rhs) == ASHIFT + && CONSTANT_P (op0)) + return false; + return true; default: @@ -589,6 +594,31 @@ iv_mult (struct rtx_iv *iv, rtx mby) return true; } +/* Evaluates shift of IV by constant CST. */ + +static bool +iv_shift (struct rtx_iv *iv, rtx mby) +{ + enum machine_mode mode = iv->extend_mode; + + if (GET_MODE (mby) != VOIDmode + && GET_MODE (mby) != mode) + return false; + + if (iv->extend == NIL) + { + iv->base = simplify_gen_binary (ASHIFT, mode, iv->base, mby); + iv->step = simplify_gen_binary (ASHIFT, mode, iv->step, mby); + } + else + { + iv->delta = simplify_gen_binary (ASHIFT, mode, iv->delta, mby); + iv->mult = simplify_gen_binary (ASHIFT, mode, iv->mult, mby); + } + + return true; +} + /* The recursive part of get_biv_step. Gets the value of the single value defined in INSN wrto initial value of REG inside loop, in shape described at get_biv_step. */ @@ -1032,7 +1062,14 @@ iv_analyze (rtx insn, rtx def, struct rtx_iv *iv) mby = tmp; } break; - + + case ASHIFT: + if (CONSTANT_P (XEXP (rhs, 0))) + abort (); + op0 = XEXP (rhs, 0); + mby = XEXP (rhs, 1); + break; + default: abort (); } @@ -1088,6 +1125,11 @@ iv_analyze (rtx insn, rtx def, struct rtx_iv *iv) goto end; break; + case ASHIFT: + if (!iv_shift (&iv0, mby)) + goto end; + break; + default: break; } |