aboutsummaryrefslogtreecommitdiff
path: root/gcc/loop-iv.c
diff options
context:
space:
mode:
authorRevital Eres <eres@il.ibm.com>2004-06-24 16:50:35 +0000
committerRoger Sayle <sayle@gcc.gnu.org>2004-06-24 16:50:35 +0000
commitabe0d774cf58aa24fd3d9f73c2ac913e7dc65e03 (patch)
tree22302d5c99a616cc8c7a17165f37236497372afb /gcc/loop-iv.c
parentbe1ba3d170d2119394c4700e320240264513d64e (diff)
downloadgcc-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.c44
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;
}