aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBernd Schmidt <bernd.schmidt@analog.com>2009-03-31 15:21:30 +0000
committerBernd Schmidt <bernds@gcc.gnu.org>2009-03-31 15:21:30 +0000
commit28af33b0313e692c910d94bb839b5c76aa9bd4c5 (patch)
tree4ce5df489c1a18e936be58bd5d8dd2be412323bd
parent1d1eb80cf6d7d4ef999bc3a3024fd49aab88f92b (diff)
downloadgcc-28af33b0313e692c910d94bb839b5c76aa9bd4c5.zip
gcc-28af33b0313e692c910d94bb839b5c76aa9bd4c5.tar.gz
gcc-28af33b0313e692c910d94bb839b5c76aa9bd4c5.tar.bz2
loop-iv.c (determine_max_iter): New arg OLD_NITER.
* loop-iv.c (determine_max_iter): New arg OLD_NITER. All callers changed. Use this when trying to improve the upper bound. Generate the comparison by using simplify_gen_relational. From-SVN: r145354
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/loop-iv.c12
2 files changed, 12 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 9aeafa9..d060adf 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -19,6 +19,10 @@
(LTU (PLUS a C) C) or (LTU (PLUS a C) a) to (GEU a -C); likewise with
GEU/LTU reversed.
+ * loop-iv.c (determine_max_iter): New arg OLD_NITER. All callers
+ changed. Use this when trying to improve the upper bound.
+ Generate the comparison by using simplify_gen_relational.
+
2009-03-31 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
PR target/27237
diff --git a/gcc/loop-iv.c b/gcc/loop-iv.c
index 123e37c..9b35b88 100644
--- a/gcc/loop-iv.c
+++ b/gcc/loop-iv.c
@@ -2114,10 +2114,13 @@ canonicalize_iv_subregs (struct rtx_iv *iv0, struct rtx_iv *iv1,
return true;
}
-/* Tries to estimate the maximum number of iterations. */
+/* Tries to estimate the maximum number of iterations in LOOP, and store the
+ result in DESC. This function is called from iv_number_of_iterations with
+ a number of fields in DESC already filled in. OLD_NITER is the original
+ expression for the number of iterations, before we tried to simplify it. */
static unsigned HOST_WIDEST_INT
-determine_max_iter (struct loop *loop, struct niter_desc *desc)
+determine_max_iter (struct loop *loop, struct niter_desc *desc, rtx old_niter)
{
rtx niter = desc->niter_expr;
rtx mmin, mmax, cmp;
@@ -2152,7 +2155,8 @@ determine_max_iter (struct loop *loop, struct niter_desc *desc)
/* We could use a binary search here, but for now improving the upper
bound by just one eliminates one important corner case. */
- cmp = gen_rtx_fmt_ee (desc->signed_p ? LT : LTU, VOIDmode, niter, mmax);
+ cmp = simplify_gen_relational (desc->signed_p ? LT : LTU, VOIDmode,
+ desc->mode, old_niter, mmax);
simplify_using_initial_values (loop, UNKNOWN, &cmp);
if (cmp == const_true_rtx)
{
@@ -2683,7 +2687,7 @@ iv_number_of_iterations (struct loop *loop, rtx insn, rtx condition,
else
{
if (!desc->niter_max)
- desc->niter_max = determine_max_iter (loop, desc);
+ desc->niter_max = determine_max_iter (loop, desc, old_niter);
/* simplify_using_initial_values does a copy propagation on the registers
in the expression for the number of iterations. This prolongs life