Patchwork loop-unroll.c TLC 1/4

login
register
mail settings
Submitter Jan Hubicka
Date Oct. 20, 2012, 2:21 p.m.
Message ID <20121020142153.GA5141@kam.mff.cuni.cz>
Download mbox | patch
Permalink /patch/192918/
State New
Headers show

Comments

Jan Hubicka - Oct. 20, 2012, 2:21 p.m.
Hi,
the TLC path I sent last week became outdated for few reaons.  I decided to split it up for easier reviewing.
This is simple correcntess issue I am comitting as obvoius - my last update to loop-iv missed the fact
that loop-iv bounds may depend on further conditions. In that case we can not record them as hard upper
bound.
I also double checked that we actually use the bounds only when they are unconditional, so I hopefully
did not introduced any missed optimization.

Bootstrapped/regtested x86_64-linux, comitted as obvoius.

	* loop-iv.c (iv_number_of_iterations): Record the upper bound
	only if there are no further conditions on it.

Patch

Index: loop-iv.c
===================================================================
--- loop-iv.c	(revision 192632)
+++ loop-iv.c	(working copy)
@@ -2593,8 +2593,10 @@  iv_number_of_iterations (struct loop *lo
 			 ? iv0.base
 			 : mode_mmin);
 	  max = (up - down) / inc + 1;
-	  record_niter_bound (loop, double_int::from_uhwi (max),
-			      false, true);
+	  if (!desc->infinite
+	      && !desc->assumptions)
+	    record_niter_bound (loop, double_int::from_uhwi (max),
+			        false, true);
 
 	  if (iv0.step == const0_rtx)
 	    {
@@ -2806,15 +2808,19 @@  iv_number_of_iterations (struct loop *lo
 
       desc->const_iter = true;
       desc->niter = val & GET_MODE_MASK (desc->mode);
-      record_niter_bound (loop, double_int::from_uhwi (desc->niter),
-			  false, true);
+      if (!desc->infinite
+	  && !desc->assumptions)
+        record_niter_bound (loop, double_int::from_uhwi (desc->niter),
+			    false, true);
     }
   else
     {
       max = determine_max_iter (loop, desc, old_niter);
       gcc_assert (max);
-      record_niter_bound (loop, double_int::from_uhwi (max),
-			  false, true);
+      if (!desc->infinite
+	  && !desc->assumptions)
+	record_niter_bound (loop, double_int::from_uhwi (max),
+			    false, true);
 
       /* simplify_using_initial_values does a copy propagation on the registers
 	 in the expression for the number of iterations.  This prolongs life