On Wed, 31 Oct 2012, Jan Hubicka wrote:

> Hi,
> this patch changes finite_loop_p to use max_loop_iterations.  Long time ago I 
> made
> finite_loop_p as rip-off from the max_loop_iterations skipping parts that are 
> not
> exactly related to the number of iteration estimates.  It went out of date 
> since then
> completelly missing the bounds derived from overflows and array bounds that 
> are quite
> useful.
> 
> So I guess these days it is better to simply implement it using 
> max_loop_iterations,
> we do not save that much of effort and we can store the result.
> 
> Bootstrapped/regtested x86_64, OK?
> 
> Honza
> 
>       * tree-ssa-loop-niter.c (finite_loop_p): Reorg to use 
> max_loop_iterations.
> Index: tree-ssa-loop-niter.c
> ===================================================================
> --- tree-ssa-loop-niter.c     (revision 192991)
> +++ tree-ssa-loop-niter.c     (working copy)
> @@ -1993,11 +1990,7 @@ find_loop_niter (struct loop *loop, edge
>  bool
>  finite_loop_p (struct loop *loop)
>  {
> -  unsigned i;
> -  VEC (edge, heap) *exits;
> -  edge ex;
> -  struct tree_niter_desc desc;
> -  bool finite = false;
> +  double_int nit;
>    int flags;
>  
>    if (flag_unsafe_loop_optimizations)
> @@ -2011,26 +2004,22 @@ finite_loop_p (struct loop *loop)
>        return true;
>      }
>  
> -  exits = get_loop_exit_edges (loop);
> -  FOR_EACH_VEC_ELT (edge, exits, i, ex)
> +  if (loop->any_upper_bound)
>      {
> -      if (!just_once_each_iteration_p (loop, ex->src))
> -     continue;
> +      if (dump_file && (dump_flags & TDF_DETAILS))
> +     fprintf (dump_file, "Found loop %i to be finite: upper bound is 
> recorded.\n",
> +              loop->num);
> +      return true;
> +    }

This looks redundant with ...

> -      if (number_of_iterations_exit (loop, ex, &desc, false))
> -        {
> -       if (dump_file && (dump_flags & TDF_DETAILS))
> -         {
> -           fprintf (dump_file, "Found loop %i to be finite: iterating ", 
> loop->num);
> -           print_generic_expr (dump_file, desc.niter, TDF_SLIM);
> -           fprintf (dump_file, " times\n");
> -         }
> -       finite = true;
> -       break;
> -     }
> +  if (max_loop_iterations (loop, &nit))
> +    {

... this.  If you want to short-circuit max_loop_iterations ()
then why not

   if (loop->any_upper_bound
       || max_loop_iterations (loop, &nit))
     {
       ...

?  The different dumping seems not a good reason to obfuscate it.

Richard.

> +      if (dump_file && (dump_flags & TDF_DETAILS))
> +     fprintf (dump_file, "Found loop %i to be finite: upper bound found.\n",
> +              loop->num);
> +      return true;
>      }
> -  VEC_free (edge, heap, exits);
> -  return finite;
> +  return false;
>  }
>  
>  /*

Reply via email to