summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrakdver <rakdver@138bc75d-0d04-0410-961f-82ee72b054a4>2007-09-08 13:18:49 +0000
committerrakdver <rakdver@138bc75d-0d04-0410-961f-82ee72b054a4>2007-09-08 13:18:49 +0000
commit1b0af592d3709c7d2ffe46c384b42c7dbdda1072 (patch)
tree53f39305ff8de4157e5710fcf6c2b2d0a0f21bb6
parentb271e0427f0549ac33204be91fc14affbafa7e86 (diff)
downloadgcc-1b0af592d3709c7d2ffe46c384b42c7dbdda1072.tar.gz
PR tree-optimization/32283
* tree-ssa-loop-ivopts.c (may_eliminate_iv): Use estimated_loop_iterations. (determine_use_iv_cost_condition): Decrease cost of expressions used in iv elimination. * gcc.dg/tree-ssa/loop-31.c: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@128272 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/loop-31.c19
-rw-r--r--gcc/tree-ssa-loop-ivopts.c31
4 files changed, 47 insertions, 16 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 10fe2e86d6d..f09c60db992 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2007-09-08 Zdenek Dvorak <ook@ucw.cz>
+
+ PR tree-optimization/32283
+ * tree-ssa-loop-ivopts.c (may_eliminate_iv): Use
+ estimated_loop_iterations.
+ (determine_use_iv_cost_condition): Decrease cost of expressions
+ used in iv elimination.
+
2007-09-08 Richard Guenther <rguenther@suse.de>
* tree-cfg.c (verify_gimple_expr): Avoid building new
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 641d9f1f8ec..b29fc791803 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2007-09-08 Zdenek Dvorak <ook@ucw.cz>
+
+ PR tree-optimization/32283
+ * gcc.dg/tree-ssa/loop-31.c: New test.
+
2007-09-08 Uros Bizjak <ubizjak@gmail.com>
PR rtl-optimization/26449
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/loop-31.c b/gcc/testsuite/gcc.dg/tree-ssa/loop-31.c
new file mode 100644
index 00000000000..cf5843ca7b8
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/loop-31.c
@@ -0,0 +1,19 @@
+/* PR 32283 */
+
+/* { dg-do compile } */
+/* { dg-options "-O1 -fdump-tree-optimized" } */
+
+short a[(2048)];
+short foo (int len, int v)
+{
+ int i;
+ for (i = 0; i < len; i++) {
+ a[i] = v;
+ }
+ return a[0];
+}
+
+/* When we do not have addressing mode including multiplication,
+ the memory access should be strength-reduced. */
+/* { dg-final { scan-tree-dump-times " \\+ 2" 1 "optimized" { target arm-*-* ia64-*-* } } } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
diff --git a/gcc/tree-ssa-loop-ivopts.c b/gcc/tree-ssa-loop-ivopts.c
index edc45867cfb..c8cefd418a1 100644
--- a/gcc/tree-ssa-loop-ivopts.c
+++ b/gcc/tree-ssa-loop-ivopts.c
@@ -3623,11 +3623,11 @@ may_eliminate_iv (struct ivopts_data *data,
{
basic_block ex_bb;
edge exit;
- tree nit, nit_type;
- tree wider_type, period, per_type;
+ tree nit, period;
struct loop *loop = data->current_loop;
aff_tree bnd;
-
+ double_int period_value, max_niter;
+
if (TREE_CODE (cand->iv->step) != INTEGER_CST)
return false;
@@ -3650,25 +3650,19 @@ may_eliminate_iv (struct ivopts_data *data,
if (!nit)
return false;
- nit_type = TREE_TYPE (nit);
-
/* Determine whether we may use the variable to test whether niter iterations
elapsed. This is the case iff the period of the induction variable is
greater than the number of iterations. */
period = iv_period (cand->iv);
if (!period)
return false;
- per_type = TREE_TYPE (period);
-
- wider_type = TREE_TYPE (period);
- if (TYPE_PRECISION (nit_type) < TYPE_PRECISION (per_type))
- wider_type = per_type;
- else
- wider_type = nit_type;
- if (!integer_nonzerop (fold_build2 (GE_EXPR, boolean_type_node,
- fold_convert (wider_type, period),
- fold_convert (wider_type, nit))))
+ /* Compare the period with the estimate on the number of iterations of the
+ loop. */
+ if (!estimated_loop_iterations (loop, true, &max_niter))
+ return false;
+ period_value = tree_to_double_int (period);
+ if (double_int_ucmp (period_value, max_niter) <= 0)
return false;
cand_value_at (loop, cand, use->stmt, nit, &bnd);
@@ -3697,7 +3691,12 @@ determine_use_iv_cost_condition (struct ivopts_data *data,
/* Try iv elimination. */
if (may_eliminate_iv (data, use, cand, &bound))
- elim_cost = force_var_cost (data, bound, &depends_on_elim);
+ {
+ elim_cost = force_var_cost (data, bound, &depends_on_elim);
+ /* The bound is a loop invariant, so it will be only computed
+ once. */
+ elim_cost /= AVG_LOOP_NITER (data->current_loop);
+ }
else
elim_cost = INFTY;