profile.c: Include cfgloop.h.
authorJan Hubicka <hubicka@ucw.cz>
Fri, 10 Jun 2016 12:46:30 +0000 (14:46 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Fri, 10 Jun 2016 12:46:30 +0000 (12:46 +0000)
* profile.c: Include cfgloop.h.
(branch_prob): Compute estimated number of iterations.
* tree-ssa-loop-niter.c (estimate_numbers_of_iterations_loop): Do not
recompute estimate number of iterations from profile.

From-SVN: r237305

gcc/ChangeLog
gcc/profile.c
gcc/tree-ssa-loop-niter.c

index d9852c5a25baf2c604e839f4875ce48cc410c03e..954adf379478115e6bb627d5374f2e6b63277a96 100644 (file)
@@ -1,3 +1,10 @@
+2016-06-10  Jan Hubicka  <hubicka@ucw.cz>
+
+       * profile.c: Include cfgloop.h.
+       (branch_prob): Compute estimated number of iterations.
+       * tree-ssa-loop-niter.c (estimate_numbers_of_iterations_loop): Do not
+       recompute estimate number of iterations from profile.
+
 2016-06-10  Bernd Edlinger  <bernd.edlinger@hotmail.de>
 
        PR inline-asm/68843
index 9925bb568c68c9c35b54e8a882dde8038e74c2f2..4519e7d8558b4424c64decf932f59501b5a06beb 100644 (file)
@@ -63,6 +63,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "gimple-iterator.h"
 #include "tree-cfg.h"
 #include "dumpfile.h"
+#include "cfgloop.h"
 
 #include "profile.h"
 
@@ -1329,9 +1330,21 @@ branch_prob (void)
   coverage_end_function (lineno_checksum, cfg_checksum);
   if (flag_branch_probabilities && profile_info)
     {
+      struct loop *loop;
       if (dump_file && (dump_flags & TDF_DETAILS))
        report_predictor_hitrates ();
       profile_status_for_fn (cfun) = PROFILE_READ;
+
+      /* At this moment we have precise loop iteration count estimates.
+        Record them to loop structure before the profile gets out of date. */
+      FOR_EACH_LOOP (loop, 0)
+       if (loop->header->count)
+         {
+           gcov_type nit = expected_loop_iterations_unbounded (loop);
+           widest_int bound = gcov_type_to_wide_int (nit);
+           loop->any_estimate = false;
+           record_niter_bound (loop, bound, true, false);
+         }
       compute_function_frequency ();
     }
 }
index 78040364a97fbf1b7da023cfc426170ec52c3abe..32fe2f91eddc963a737f67b5c8f1a94b0e92c128 100644 (file)
@@ -3721,8 +3721,26 @@ estimate_numbers_of_iterations_loop (struct loop *loop)
     return;
 
   loop->estimate_state = EST_AVAILABLE;
-  /* Force estimate compuation but leave any existing upper bound in place.  */
-  loop->any_estimate = false;
+
+  /* If we have a measured profile, use it to estimate the number of
+     iterations.  Normally this is recorded by branch_prob right after
+     reading the profile.  In case we however found a new loop, record the
+     information here.
+
+     Explicitly check for profile status so we do not report
+     wrong prediction hitrates for guessed loop iterations heuristics.
+     Do not recompute already recorded bounds - we ought to be better on
+     updating iteration bounds than updating profile in general and thus
+     recomputing iteration bounds later in the compilation process will just
+     introduce random roundoff errors.  */
+  if (!loop->any_estimate
+      && loop->header->count != 0
+      && profile_status_for_fn (cfun) >= PROFILE_READ)
+    {
+      gcov_type nit = expected_loop_iterations_unbounded (loop);
+      bound = gcov_type_to_wide_int (nit);
+      record_niter_bound (loop, bound, true, false);
+    }
 
   /* Ensure that loop->nb_iterations is computed if possible.  If it turns out
      to be constant, we avoid undefined behavior implied bounds and instead
@@ -3756,17 +3774,6 @@ estimate_numbers_of_iterations_loop (struct loop *loop)
 
   maybe_lower_iteration_bound (loop);
 
-  /* If we have a measured profile, use it to estimate the number of
-     iterations.  Explicitly check for profile status so we do not report
-     wrong prediction hitrates for guessed loop iterations heuristics.  */
-  if (loop->header->count != 0
-      && profile_status_for_fn (cfun) >= PROFILE_READ)
-    {
-      gcov_type nit = expected_loop_iterations_unbounded (loop);
-      bound = gcov_type_to_wide_int (nit);
-      record_niter_bound (loop, bound, true, false);
-    }
-
   /* If we know the exact number of iterations of this loop, try to
      not break code with undefined behavior by not recording smaller
      maximum number of iterations.  */