[PATCH] Disable unroll loop that has header count less than iteration count.
Richard Biener
richard.guenther@gmail.com
Fri May 23 08:55:00 GMT 2014
On Thu, May 22, 2014 at 11:36 PM, Dehao Chen <dehao@google.com> wrote:
> If a loop's header count is less than iteration count, the iteration
> estimation is apparently incorrect for this loop. Thus disable
> unrolling of such loops.
>
> Testing on going. OK for trunk if test pass?
No. Why don't you instead plug the hole in expected_loop_iterations ()?
That is, why may not loop->header be bogus? Isn't it maybe the bounding
you run into?
/* Returns expected number of LOOP iterations. The returned value is bounded
by REG_BR_PROB_BASE. */
unsigned
expected_loop_iterations (const struct loop *loop)
{
gcov_type expected = expected_loop_iterations_unbounded (loop);
return (expected > REG_BR_PROB_BASE ? REG_BR_PROB_BASE : expected);
}
I miss a testcase as well.
Richard.
> Thanks,
> Dehao
>
> gcc/ChangeLog:
> 2014-05-21 Dehao Chen <dehao@google.com>
>
> * cfgloop.h (expected_loop_iterations_reliable_p): New func.
> * cfgloopanal.c (expected_loop_iterations_reliable_p): Likewise.
> * loop-unroll.c (decide_unroll_runtime_iterations): Disable unroll
> loop that has unreliable iteration counts.
>
> Index: gcc/cfgloop.h
> ===================================================================
> --- gcc/cfgloop.h (revision 210717)
> +++ gcc/cfgloop.h (working copy)
> @@ -307,8 +307,8 @@ extern bool just_once_each_iteration_p (const stru
> gcov_type expected_loop_iterations_unbounded (const struct loop *);
> extern unsigned expected_loop_iterations (const struct loop *);
> extern rtx doloop_condition_get (rtx);
> +extern bool expected_loop_iterations_reliable_p (const struct loop *);
>
> -
> /* Loop manipulation. */
> extern bool can_duplicate_loop_p (const struct loop *loop);
>
> Index: gcc/cfgloopanal.c
> ===================================================================
> --- gcc/cfgloopanal.c (revision 210717)
> +++ gcc/cfgloopanal.c (working copy)
> @@ -285,6 +285,15 @@ expected_loop_iterations (const struct loop *loop)
> return (expected > REG_BR_PROB_BASE ? REG_BR_PROB_BASE : expected);
> }
>
> +/* Returns true if the loop header's profile count is smaller than expected
> + loop iteration. */
> +
> +bool
> +expected_loop_iterations_reliable_p (const struct loop *loop)
> +{
> + return expected_loop_iterations (loop) < loop->header->count;
> +}
> +
> /* Returns the maximum level of nesting of subloops of LOOP. */
>
> unsigned
> Index: gcc/loop-unroll.c
> ===================================================================
> --- gcc/loop-unroll.c (revision 210717)
> +++ gcc/loop-unroll.c (working copy)
> @@ -988,6 +988,15 @@ decide_unroll_runtime_iterations (struct loop *loo
> return;
> }
>
> + if (profile_status_for_fn (cfun) == PROFILE_READ
> + && expected_loop_iterations_reliable_p (loop))
> + {
> + if (dump_file)
> + fprintf (dump_file, ";; Not unrolling loop, loop iteration "
> + "not reliable.");
> + return;
> + }
> +
> /* Check whether the loop rolls. */
> if ((get_estimated_loop_iterations (loop, &iterations)
> || get_max_loop_iterations (loop, &iterations))
More information about the Gcc-patches
mailing list