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]

Make loop optimizers more profile aware


Hi,
estimated_loop_iterations is used by loop optimizers (such as prefetching) to decide
whether to apply the transfromation.  This function ignore profile that is returned
by expected_loop_iterations_unbounded.

Making it to do so has one unwanted effect making predict_loops to use it too.
This is wrong, since we want predict_loops to be purely based on static information
(so predictor statistics works).

Bootstrapped/regtested x86_64-linux, OK?

	* double-int.h (uhwti_to_double_int): New function.
	* predict.c (predict_loops): Avoid estimated_loop_iterations_int to
	return estimates based on profile; be ready for 0 estimated iterations.
	* tree-data-ref.c (estimated_loop_iterations): Use profile if
	available.
Index: double-int.h
===================================================================
--- double-int.h	(revision 161810)
+++ double-int.h	(working copy)
@@ -97,6 +97,24 @@ uhwi_to_double_int (unsigned HOST_WIDE_I
   return r;
 }
 
+/* Constructs double_int from unsigned integer CST.  The bits over the
+   precision of HOST_WIDEST_INT are filled with zeros.  */
+
+static inline double_int
+uhwti_to_double_int (unsigned HOST_WIDEST_INT cst)
+{
+  double_int r;
+
+  r.low = cst;
+#if HOST_BITS_PER_WIDEST_INT != HOST_BITS_PER_WIDE_INT
+  r.high = cst >> HOST_BITS_PER_WIDEST_INT;
+#else
+  r.high = 0;
+#endif
+
+  return r;
+}
+
 /* Returns value of CST as a signed number.  CST must satisfy
    double_int_fits_in_shwi_p.  */
 
Index: predict.c
===================================================================
--- predict.c	(revision 161810)
+++ predict.c	(working copy)
@@ -968,7 +968,13 @@ predict_loops (void)
 	     the loop, use it to predict this exit.  */
 	  else if (n_exits == 1)
 	    {
+	      enum profile_status_d old_profile_status = profile_status;
+
+	      /* We do not want estimated_loop_iterations_int to use profile info
+		 when available or dumping of statistics would be biassed.  */
+	      profile_status = PROFILE_ABSENT;
 	      nitercst = estimated_loop_iterations_int (loop, false);
+	      profile_status = old_profile_status;
 	      if (nitercst < 0)
 		continue;
 	      if (nitercst > max)
@@ -979,7 +985,10 @@ predict_loops (void)
 	  else
 	    continue;
 
-	  probability = ((REG_BR_PROB_BASE + nitercst / 2) / nitercst);
+	  if (!nitercst)
+	    probability = REG_BR_PROB_BASE;
+	  else
+	    probability = ((REG_BR_PROB_BASE + nitercst / 2) / nitercst);
 	  predict_edge (ex, predictor, probability);
 	}
       VEC_free (edge, heap, exits);
Index: tree-data-ref.c
===================================================================
--- tree-data-ref.c	(revision 161810)
+++ tree-data-ref.c	(working copy)
@@ -1724,6 +1724,10 @@ estimated_loop_iterations (struct loop *
 
       *nit = loop->nb_iterations_upper_bound;
     }
+  /* When we do have profile, see what real number of iterations is.  */
+  else if (profile_status == PROFILE_READ
+	   && (loop->latch->count || loop->header->count))
+    *nit = uhwti_to_double_int (expected_loop_iterations_unbounded (loop));
   else
     {
       if (!loop->any_estimate)


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