This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Modernize loop_finite_p


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;
>  }
>  
>  /*


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]