From 03fd03d5bcb647dac06dd8e30a4660d4621e1d2e Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Wed, 18 Apr 2012 11:33:51 +0000 Subject: [PATCH] re PR tree-optimization/44688 (Excessive code-size growth at -O3) 2012-04-18 Richard Guenther 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 | 12 ++++++++++++ gcc/cfgloop.h | 1 + gcc/tree-ssa-loop-niter.c | 25 +++++++++++++------------ gcc/tree-vect-loop-manip.c | 6 ++++++ 4 files changed, 32 insertions(+), 12 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 45c2641f317..0bd86f3d2b2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,15 @@ +2012-04-18 Richard Guenther + + 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 * lto-symtab.c (lto_cgraph_replace_node): Update. diff --git a/gcc/cfgloop.h b/gcc/cfgloop.h index 14cc8e81a7c..b3c862cb12e 100644 --- a/gcc/cfgloop.h +++ b/gcc/cfgloop.h @@ -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 *); diff --git a/gcc/tree-ssa-loop-niter.c b/gcc/tree-ssa-loop-niter.c index ab7441b3ff9..8d99408d54b 100644 --- a/gcc/tree-ssa-loop-niter.c +++ b/gcc/tree-ssa-loop-niter.c @@ -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 diff --git a/gcc/tree-vect-loop-manip.c b/gcc/tree-vect-loop-manip.c index 499dece1dbf..18eef98fc45 100644 --- a/gcc/tree-vect-loop-manip.c +++ b/gcc/tree-vect-loop-manip.c @@ -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); -- 2.30.2