re PR tree-optimization/44688 (Excessive code-size growth at -O3)
authorRichard Guenther <rguenther@suse.de>
Wed, 18 Apr 2012 11:33:51 +0000 (11:33 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 18 Apr 2012 11:33:51 +0000 (11:33 +0000)
2012-04-18  Richard Guenther  <rguenther@suse.de>

PR tree-optimization/44688
* cfgloop.h (record_niter_bound): Declare.
* tree-ssa-loop-niter.c (record_niter_bound): Export.
Update the estimation with the upper bound here...
(estimate_numbers_of_iterations_loop): ... instead of here.
Do not forcefully reset a recorded upper bound.
* tree-vect-loop-manip.c (vect_do_peeling_for_alignment):
Record the maximum number of loop iterations of the
prologue loop.

From-SVN: r186566

gcc/ChangeLog
gcc/cfgloop.h
gcc/tree-ssa-loop-niter.c
gcc/tree-vect-loop-manip.c

index 45c2641f317b05e673f55d9b2b67efade825c2f9..0bd86f3d2b29b631bebae6ab3c7933a99bb39b2a 100644 (file)
@@ -1,3 +1,15 @@
+2012-04-18  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/44688
+       * cfgloop.h (record_niter_bound): Declare.
+       * tree-ssa-loop-niter.c (record_niter_bound): Export.
+       Update the estimation with the upper bound here...
+       (estimate_numbers_of_iterations_loop): ... instead of here.
+       Do not forcefully reset a recorded upper bound.
+       * tree-vect-loop-manip.c (vect_do_peeling_for_alignment):
+       Record the maximum number of loop iterations of the
+       prologue loop.
+
 2012-04-18  Jan Hubicka  <jh@suse.cz>
 
        * lto-symtab.c (lto_cgraph_replace_node): Update.
index 14cc8e81a7c596ac4c526f76cff4e1b27fbe47fb..b3c862cb12e10aa58904d0202367944b326007d8 100644 (file)
@@ -279,6 +279,7 @@ extern unsigned expected_loop_iterations (const struct loop *);
 extern rtx doloop_condition_get (rtx);
 
 void estimate_numbers_of_iterations_loop (struct loop *);
+void record_niter_bound (struct loop *, double_int, bool, bool);
 bool estimated_loop_iterations (struct loop *, double_int *);
 bool max_loop_iterations (struct loop *, double_int *);
 HOST_WIDE_INT estimated_loop_iterations_int (struct loop *);
index ab7441b3ff97c0dedeae781d1fc02c3d6a648828..8d99408d54ba0dfb104b159246ce913ca8a13216 100644 (file)
@@ -2494,12 +2494,12 @@ derive_constant_upper_bound_ops (tree type, tree op0,
    of iterations.  UPPER is true if we are sure the loop iterates at most
    I_BOUND times.  */
 
-static void
+void
 record_niter_bound (struct loop *loop, double_int i_bound, bool realistic,
                    bool upper)
 {
-  /* Update the bounds only when there is no previous estimation, or when the current
-     estimation is smaller.  */
+  /* Update the bounds only when there is no previous estimation, or when the
+     current estimation is smaller.  */
   if (upper
       && (!loop->any_upper_bound
          || double_int_ucmp (i_bound, loop->nb_iterations_upper_bound) < 0))
@@ -2514,6 +2514,14 @@ record_niter_bound (struct loop *loop, double_int i_bound, bool realistic,
       loop->any_estimate = true;
       loop->nb_iterations_estimate = i_bound;
     }
+
+  /* If an upper bound is smaller than the realistic estimate of the
+     number of iterations, use the upper bound instead.  */
+  if (loop->any_upper_bound
+      && loop->any_estimate
+      && double_int_ucmp (loop->nb_iterations_upper_bound,
+                         loop->nb_iterations_estimate) < 0)
+    loop->nb_iterations_estimate = loop->nb_iterations_upper_bound;
 }
 
 /* Records that AT_STMT is executed at most BOUND + 1 times in LOOP.  IS_EXIT
@@ -2962,8 +2970,9 @@ estimate_numbers_of_iterations_loop (struct loop *loop)
   /* Give up if we already have tried to compute an estimation.  */
   if (loop->estimate_state != EST_NOT_COMPUTED)
     return;
+
   loop->estimate_state = EST_AVAILABLE;
-  loop->any_upper_bound = false;
+  /* Force estimate compuation but leave any existing upper bound in place.  */
   loop->any_estimate = false;
 
   exits = get_loop_exit_edges (loop);
@@ -2994,14 +3003,6 @@ estimate_numbers_of_iterations_loop (struct loop *loop)
       bound = gcov_type_to_double_int (nit);
       record_niter_bound (loop, bound, true, false);
     }
-
-  /* If an upper bound is smaller than the realistic estimate of the
-     number of iterations, use the upper bound instead.  */
-  if (loop->any_upper_bound
-      && loop->any_estimate
-      && double_int_ucmp (loop->nb_iterations_upper_bound,
-                         loop->nb_iterations_estimate) < 0)
-    loop->nb_iterations_estimate = loop->nb_iterations_upper_bound;
 }
 
 /* Sets NIT to the estimated number of executions of the latch of the
index 499dece1dbf216a98a3a69ddf1833ce6b6e34c32..18eef98fc45a25b5b0b02a0c7cce2df33b4aa539 100644 (file)
@@ -2167,6 +2167,7 @@ vect_do_peeling_for_alignment (loop_vec_info loop_vinfo)
   struct loop *new_loop;
   unsigned int th = 0;
   int min_profitable_iters;
+  int max_iter;
 
   if (vect_print_dump_info (REPORT_DETAILS))
     fprintf (vect_dump, "=== vect_do_peeling_for_alignment ===");
@@ -2192,6 +2193,11 @@ vect_do_peeling_for_alignment (loop_vec_info loop_vinfo)
 #ifdef ENABLE_CHECKING
   slpeel_verify_cfg_after_peeling (new_loop, loop);
 #endif
+  max_iter = MAX (LOOP_VINFO_VECT_FACTOR (loop_vinfo) - 1, (int) th);
+  record_niter_bound (new_loop, shwi_to_double_int (max_iter), false, true);
+  if (dump_file && (dump_flags & TDF_DETAILS))
+    fprintf (dump_file, "Setting upper bound of nb iterations for prologue "
+            "loop to %d\n", max_iter);
 
   /* Update number of times loop executes.  */
   n_iters = LOOP_VINFO_NITERS (loop_vinfo);