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]

Minor record_upper_bound tweek


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.
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


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