Patchwork Minor record_upper_bound tweek

login
register
mail settings
Submitter Jan Hubicka
Date Oct. 22, 2012, 3:26 p.m.
Message ID <20121022152625.GA18262@kam.mff.cuni.cz>
Download mbox | patch
Permalink /patch/193179/
State New
Headers show

Comments

Jan Hubicka - Oct. 22, 2012, 3:26 p.m.
Hi,
with profile feedback we may misupdate the profile and start to believe that loops
iterate more times than they do.  This patch makes at least nb_iterations_estimate
no greater than nb_iterations_upper_bound.  This makes the unrolling/peeling/unswitching
heuristics to behave more consistently.
Bootstrapped/regtested x86_64-linux, OK?

Honza

	* tree-sssa-loop-niter.c (record_niter_bound): Be sure that realistic
	estimate is not bigger than upper bound.
Richard Guenther - Oct. 23, 2012, 9:31 a.m.
On Mon, 22 Oct 2012, Jan Hubicka wrote:

> Hi,
> with profile feedback we may misupdate the profile and start to believe that loops
> iterate more times than they do.  This patch makes at least nb_iterations_estimate
> no greater than nb_iterations_upper_bound.  This makes the unrolling/peeling/unswitching
> heuristics to behave more consistently.
> Bootstrapped/regtested x86_64-linux, OK?

Ok with ...

> Honza
> 
> 	* tree-sssa-loop-niter.c (record_niter_bound): Be sure that realistic
> 	estimate is not bigger than upper bound.
> Index: tree-ssa-loop-niter.c
> ===================================================================
> --- tree-ssa-loop-niter.c	(revision 192632)
> +++ tree-ssa-loop-niter.c	(working copy)
> @@ -2506,13 +2506,20 @@ record_niter_bound (struct loop *loop, d
>      {
>        loop->any_upper_bound = true;
>        loop->nb_iterations_upper_bound = i_bound;
> +      if (loop->any_estimate
> +	  && i_bound.ult (loop->nb_iterations_estimate))
> +        loop->nb_iterations_estimate = i_bound;
>      }
>    if (realistic
>        && (!loop->any_estimate
>  	  || i_bound.ult (loop->nb_iterations_estimate)))
>      {
>        loop->any_estimate = true;
> -      loop->nb_iterations_estimate = i_bound;
> +      if (loop->nb_iterations_upper_bound.ult (i_bound)
> +	   && loop->any_upper_bound)

testing any_upper_bound before accessing loop->nb_iterations_upper_bound

> +        loop->nb_iterations_estimate = loop->nb_iterations_upper_bound;
> +      else
> +        loop->nb_iterations_estimate = i_bound;
>      }
>  
>    /* If an upper bound is smaller than the realistic estimate of the
> 
>

Patch

Index: tree-ssa-loop-niter.c
===================================================================
--- tree-ssa-loop-niter.c	(revision 192632)
+++ tree-ssa-loop-niter.c	(working copy)
@@ -2506,13 +2506,20 @@  record_niter_bound (struct loop *loop, d
     {
       loop->any_upper_bound = true;
       loop->nb_iterations_upper_bound = i_bound;
+      if (loop->any_estimate
+	  && i_bound.ult (loop->nb_iterations_estimate))
+        loop->nb_iterations_estimate = i_bound;
     }
   if (realistic
       && (!loop->any_estimate
 	  || i_bound.ult (loop->nb_iterations_estimate)))
     {
       loop->any_estimate = true;
-      loop->nb_iterations_estimate = i_bound;
+      if (loop->nb_iterations_upper_bound.ult (i_bound)
+	   && loop->any_upper_bound)
+        loop->nb_iterations_estimate = loop->nb_iterations_upper_bound;
+      else
+        loop->nb_iterations_estimate = i_bound;
     }
 
   /* If an upper bound is smaller than the realistic estimate of the