[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