From 73367f92ad4316a6a149d40e076f6a2d5cd9a022 Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Tue, 9 Oct 2012 15:10:37 +0200 Subject: [PATCH] loop-unroll.c (unroll_loop_constant_iterations): Add update of loop->nb_iterations_upper_bound I missed in my previous commit... * loop-unroll.c (unroll_loop_constant_iterations): Add update of loop->nb_iterations_upper_bound I missed in my previous commit; use TRUNC_DIV_EXPR instead of FLOOR_DIV_EXPR to divide iteration count. (decide_unroll_runtime_iterations): Avoid overflow. (unroll_loop_runtime_iterations): Use TRUNC_DIV_EXPR instead of FLOOR_DIV_EXPR to update iteration bounds. (decide_peel_simple): Avoid integer overflow when deciding on number of peelings. (decide_unroll_stupid): Likewise. From-SVN: r192251 --- gcc/ChangeLog | 13 +++++++++++++ gcc/loop-unroll.c | 29 +++++++++++++---------------- 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7ad8a41c197..67e4a64fec6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,16 @@ +2012-10-09 Jan Hubicka + + * loop-unroll.c (unroll_loop_constant_iterations): Add + update of loop->nb_iterations_upper_bound I missed in my previous + commit; use TRUNC_DIV_EXPR instead of FLOOR_DIV_EXPR to divide + iteration count. + (decide_unroll_runtime_iterations): Avoid overflow. + (unroll_loop_runtime_iterations): Use TRUNC_DIV_EXPR instead of + FLOOR_DIV_EXPR to update iteration bounds. + (decide_peel_simple): Avoid integer overflow when deciding + on number of peelings. + (decide_unroll_stupid): Likewise. + 2012-10-09 Tobias Burnus * lto-cgraph.c (input_node_opt_summary): Remove unused code. diff --git a/gcc/loop-unroll.c b/gcc/loop-unroll.c index b9ac22b8255..b6dace030c1 100644 --- a/gcc/loop-unroll.c +++ b/gcc/loop-unroll.c @@ -740,6 +740,7 @@ unroll_loop_constant_iterations (struct loop *loop) apply_opt_in_copies (opt_info, exit_mod + 1, false, false); desc->niter -= exit_mod + 1; + loop->nb_iterations_upper_bound -= double_int::from_uhwi (exit_mod + 1); if (loop->any_estimate && double_int::from_uhwi (exit_mod + 1).ule (loop->nb_iterations_estimate)) @@ -795,14 +796,14 @@ unroll_loop_constant_iterations (struct loop *loop) desc->niter /= max_unroll + 1; loop->nb_iterations_upper_bound - = loop->nb_iterations_upper_bound.udiv (double_int::from_uhwi (exit_mod + = loop->nb_iterations_upper_bound.udiv (double_int::from_uhwi (max_unroll + 1), - FLOOR_DIV_EXPR); + TRUNC_DIV_EXPR); if (loop->any_estimate) loop->nb_iterations_estimate - = loop->nb_iterations_estimate.udiv (double_int::from_uhwi (exit_mod + = loop->nb_iterations_estimate.udiv (double_int::from_uhwi (max_unroll + 1), - FLOOR_DIV_EXPR); + TRUNC_DIV_EXPR); desc->niter_expr = GEN_INT (desc->niter); /* Remove the edges. */ @@ -876,11 +877,10 @@ decide_unroll_runtime_iterations (struct loop *loop, int flags) return; } - /* If we have profile feedback, check whether the loop rolls. */ + /* Check whether the loop rolls. */ if ((estimated_loop_iterations (loop, &iterations) || max_loop_iterations (loop, &iterations)) - && iterations.fits_shwi () - && iterations.to_shwi () <= 2 * nunroll) + && iterations.ult (double_int::from_shwi (2 * nunroll))) { if (dump_file) fprintf (dump_file, ";; Not unrolling loop, doesn't roll\n"); @@ -1199,12 +1199,12 @@ unroll_loop_runtime_iterations (struct loop *loop) loop->nb_iterations_upper_bound = loop->nb_iterations_upper_bound.udiv (double_int::from_uhwi (max_unroll + 1), - FLOOR_DIV_EXPR); + TRUNC_DIV_EXPR); if (loop->any_estimate) loop->nb_iterations_estimate = loop->nb_iterations_estimate.udiv (double_int::from_uhwi (max_unroll + 1), - FLOOR_DIV_EXPR); + TRUNC_DIV_EXPR); if (exit_at_end) { desc->niter_expr = @@ -1280,8 +1280,7 @@ decide_peel_simple (struct loop *loop, int flags) /* If we have realistic estimate on number of iterations, use it. */ if (estimated_loop_iterations (loop, &iterations)) { - if (!iterations.fits_shwi () - || iterations.to_shwi () + 1 > npeel) + if (double_int::from_shwi (npeel).ule (iterations)) { if (dump_file) { @@ -1298,8 +1297,7 @@ decide_peel_simple (struct loop *loop, int flags) /* If we have small enough bound on iterations, we can still peel (completely unroll). */ else if (max_loop_iterations (loop, &iterations) - && iterations.fits_shwi () - && iterations.to_shwi () + 1 <= npeel) + && iterations.ult (double_int::from_shwi (npeel))) npeel = iterations.to_shwi () + 1; else { @@ -1446,11 +1444,10 @@ decide_unroll_stupid (struct loop *loop, int flags) return; } - /* If we have profile feedback, check whether the loop rolls. */ + /* Check whether the loop rolls. */ if ((estimated_loop_iterations (loop, &iterations) || max_loop_iterations (loop, &iterations)) - && iterations.fits_shwi () - && iterations.to_shwi () <= 2 * nunroll) + && iterations.ult (double_int::from_shwi (2 * nunroll))) { if (dump_file) fprintf (dump_file, ";; Not unrolling loop, doesn't roll\n"); -- 2.30.2