OSDN Git Service

* tree-data-ref.c (compute_estimated_nb_iterations,
authorspop <spop@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 8 Jun 2005 08:47:05 +0000 (08:47 +0000)
committerspop <spop@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 8 Jun 2005 08:47:05 +0000 (08:47 +0000)
analyze_array_indexes, compute_overlap_steps_for_affine_1_2,
analyze_subscript_affine_affine, find_data_references_in_loop):
Fixed to use chrec_contains_undetermined to test the values of
loop->estimated_nb_iterations.
* tree-ssa-loop-niter.c (estimate_numbers_of_iterations_loop):
Compute the estimation only when loop->estimated_nb_iterations
has not yet been initialized.
(convert_step_widening, scev_probably_wraps_p): Add a call to
estimate_numbers_of_iterations_loop.
* tree-vrp.c (execute_vrp): Don't call estimate_numbers_of_iterations.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@100749 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/tree-data-ref.c
gcc/tree-ssa-loop-niter.c
gcc/tree-vrp.c

index 014fa67..542b30d 100644 (file)
@@ -1,3 +1,17 @@
+2005-06-08  Sebastian Pop  <pop@cri.ensmp.fr>
+
+       * tree-data-ref.c (compute_estimated_nb_iterations,
+       analyze_array_indexes, compute_overlap_steps_for_affine_1_2,
+       analyze_subscript_affine_affine, find_data_references_in_loop):
+       Fixed to use chrec_contains_undetermined to test the values of
+       loop->estimated_nb_iterations.
+       * tree-ssa-loop-niter.c (estimate_numbers_of_iterations_loop):
+       Compute the estimation only when loop->estimated_nb_iterations
+       has not yet been initialized.
+       (convert_step_widening, scev_probably_wraps_p): Add a call to
+       estimate_numbers_of_iterations_loop.
+       * tree-vrp.c (execute_vrp): Don't call estimate_numbers_of_iterations.
+
 2005-06-08  Eric Botcazou  <ebotcazou@libertysurf.fr>
 
        PR debug/21946
index 50b805b..e4917df 100644 (file)
@@ -447,32 +447,21 @@ dump_ddrs (FILE *file, varray_type ddrs)
 
 \f
 
-/* Compute the lowest iteration bound for LOOP.  It is an
-   INTEGER_CST.  */
+/* Initialize LOOP->ESTIMATED_NB_ITERATIONS with the lowest safe
+   approximation of the number of iterations for LOOP.  */
 
 static void
 compute_estimated_nb_iterations (struct loop *loop)
 {
-  tree estimation;
-  struct nb_iter_bound *bound, *next;
-  
-  for (bound = loop->bounds; bound; bound = next)
-    {
-      next = bound->next;
-      estimation = bound->bound;
-
-      if (TREE_CODE (estimation) != INTEGER_CST)
-       continue;
-
-      if (loop->estimated_nb_iterations)
-       {
-         /* Update only if estimation is smaller.  */
-         if (tree_int_cst_lt (estimation, loop->estimated_nb_iterations))
-           loop->estimated_nb_iterations = estimation;
-       }
-      else
-       loop->estimated_nb_iterations = estimation;
-    }
+  struct nb_iter_bound *bound;
+  
+  for (bound = loop->bounds; bound; bound = bound->next)
+    if (TREE_CODE (bound->bound) == INTEGER_CST
+       /* Update only when there is no previous estimation.  */
+       && (chrec_contains_undetermined (loop->estimated_nb_iterations)
+           /* Or when the current estimation is smaller.  */
+           || tree_int_cst_lt (bound->bound, loop->estimated_nb_iterations)))
+      loop->estimated_nb_iterations = bound->bound;
 }
 
 /* Estimate the number of iterations from the size of the data and the
@@ -538,7 +527,7 @@ analyze_array_indexes (struct loop *loop,
   access_fn = instantiate_parameters 
     (loop, analyze_scalar_evolution (loop, opnd1));
 
-  if (loop->estimated_nb_iterations == NULL_TREE)
+  if (chrec_contains_undetermined (loop->estimated_nb_iterations))
     estimate_niter_from_size_of_data (loop, opnd0, access_fn, stmt);
   
   VEC_safe_push (tree, heap, *access_fns, access_fn);
@@ -1129,8 +1118,12 @@ compute_overlap_steps_for_affine_1_2 (tree chrec_a, tree chrec_b,
     numiter_z = current_loops->parray[CHREC_VARIABLE (chrec_b)]
       ->estimated_nb_iterations;
 
-  if (numiter_x == NULL_TREE || numiter_y == NULL_TREE 
-      || numiter_z == NULL_TREE)
+  if (chrec_contains_undetermined (numiter_x)
+      || chrec_contains_undetermined (numiter_y)
+      || chrec_contains_undetermined (numiter_z)
+      || TREE_CODE (numiter_x) != INTEGER_CST
+      || TREE_CODE (numiter_y) != INTEGER_CST
+      || TREE_CODE (numiter_z) != INTEGER_CST)
     {
       *overlaps_a = chrec_dont_know;
       *overlaps_b = chrec_dont_know;
@@ -1278,7 +1271,10 @@ analyze_subscript_affine_affine (tree chrec_a,
          if (TREE_CODE (numiter_b) != INTEGER_CST)
            numiter_b = current_loops->parray[CHREC_VARIABLE (chrec_b)]
              ->estimated_nb_iterations;
-         if (numiter_a == NULL_TREE || numiter_b == NULL_TREE)
+         if (chrec_contains_undetermined (numiter_a)
+             || chrec_contains_undetermined (numiter_b)
+             || TREE_CODE (numiter_a) != INTEGER_CST
+             || TREE_CODE (numiter_b) != INTEGER_CST)
            {
              *overlaps_a = chrec_dont_know;
              *overlaps_b = chrec_dont_know;
@@ -1379,7 +1375,10 @@ analyze_subscript_affine_affine (tree chrec_a,
          if (TREE_CODE (numiter_b) != INTEGER_CST)
            numiter_b = current_loops->parray[CHREC_VARIABLE (chrec_b)]
              ->estimated_nb_iterations;
-         if (numiter_a == NULL_TREE || numiter_b == NULL_TREE)
+         if (chrec_contains_undetermined (numiter_a)
+             || chrec_contains_undetermined (numiter_b)
+             || TREE_CODE (numiter_a) != INTEGER_CST
+             || TREE_CODE (numiter_b) != INTEGER_CST)
            {
              *overlaps_a = chrec_dont_know;
              *overlaps_b = chrec_dont_know;
@@ -2344,11 +2343,11 @@ find_data_references_in_loop (struct loop *loop, varray_type *datarefs)
 
          /* When there are no defs in the loop, the loop is parallel.  */
          if (!ZERO_SSA_OPERANDS (stmt, SSA_OP_VIRTUAL_DEFS))
-           bb->loop_father->parallel_p = false;
+           loop->parallel_p = false;
        }
 
-      if (bb->loop_father->estimated_nb_iterations == NULL_TREE)
-       compute_estimated_nb_iterations (bb->loop_father);
+      if (chrec_contains_undetermined (loop->estimated_nb_iterations))
+       compute_estimated_nb_iterations (loop);
     }
 
   free (bbs);
index 40f8e45..73424ee 100644 (file)
@@ -1348,6 +1348,15 @@ estimate_numbers_of_iterations_loop (struct loop *loop)
   unsigned i, n_exits;
   struct tree_niter_desc niter_desc;
 
+  /* Give up if we already have tried to compute an estimation.  */
+  if (loop->estimated_nb_iterations == chrec_dont_know
+      /* Or when we already have an estimation.  */
+      || (loop->estimated_nb_iterations != NULL_TREE
+         && TREE_CODE (loop->estimated_nb_iterations) == INTEGER_CST))
+    return;
+  else
+    loop->estimated_nb_iterations = chrec_dont_know;
+
   exits = get_loop_exit_edges (loop, &n_exits);
   for (i = 0; i < n_exits; i++)
     {
@@ -1368,7 +1377,7 @@ estimate_numbers_of_iterations_loop (struct loop *loop)
   free (exits);
   
   /* Analyzes the bounds of arrays accessed in the loop.  */
-  if (loop->estimated_nb_iterations == NULL_TREE)
+  if (chrec_contains_undetermined (loop->estimated_nb_iterations))
     {
       varray_type datarefs;
       VARRAY_GENERIC_PTR_INIT (datarefs, 3, "datarefs");
@@ -1581,6 +1590,7 @@ convert_step_widening (struct loop *loop, tree new_type, tree base, tree step,
   valid_niter = fold_build2 (FLOOR_DIV_EXPR, unsigned_type,
                             delta, step_abs);
 
+  estimate_numbers_of_iterations_loop (loop);
   for (bound = loop->bounds; bound; bound = bound->next)
     if (proved_non_wrapping_p (at_stmt, bound, new_type, valid_niter))
       return step_in_new_type;
@@ -1649,6 +1659,7 @@ scev_probably_wraps_p (tree type, tree base, tree step,
   step_abs = fold_convert (unsigned_type, step_abs);
   valid_niter = fold_build2 (FLOOR_DIV_EXPR, unsigned_type, delta, step_abs);
 
+  estimate_numbers_of_iterations_loop (loop);
   for (bound = loop->bounds; bound; bound = bound->next)
     if (proved_non_wrapping_p (at_stmt, bound, type, valid_niter))
       return false;
index b42da82..35f78f4 100644 (file)
@@ -3509,10 +3509,7 @@ execute_vrp (void)
 
   cfg_loops = loop_optimizer_init (NULL);
   if (cfg_loops)
-    {
-      scev_initialize (cfg_loops);
-      estimate_numbers_of_iterations (cfg_loops);
-    }
+    scev_initialize (cfg_loops);
 
   vrp_initialize ();
   ssa_propagate (vrp_visit_stmt, vrp_visit_phi_node);