OSDN Git Service

PR tree-optimization/32283
authorrakdver <rakdver@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 8 Sep 2007 13:18:49 +0000 (13:18 +0000)
committerrakdver <rakdver@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 8 Sep 2007 13:18:49 +0000 (13:18 +0000)
* 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

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/loop-31.c [new file with mode: 0644]
gcc/tree-ssa-loop-ivopts.c

index 10fe2e8..f09c60d 100644 (file)
@@ -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
index 641d9f1..b29fc79 100644 (file)
@@ -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 (file)
index 0000000..cf5843c
--- /dev/null
@@ -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" } } */
index edc4586..c8cefd4 100644 (file)
@@ -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;