]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
predict.c (maybe_hot_count_p): Use threshold from profiled working set instead of...
authorTeresa Johnson <tejohnson@google.com>
Fri, 23 Nov 2012 08:49:43 +0000 (08:49 +0000)
committerJan Hubicka <hubicka@gcc.gnu.org>
Fri, 23 Nov 2012 08:49:43 +0000 (08:49 +0000)
* predict.c (maybe_hot_count_p): Use threshold from profiled working
set instead of hard limit.
(cgraph_maybe_hot_edge_p): Invoke maybe_hot_count_p() instead of
directly checking limit.
* params.def (HOT_BB_COUNT_FRACTION): Remove.
(HOT_BB_COUNT_WS_PERMILLE): New parameter.
* invoke.texi (hot-bb-count-fraction): Remove.
(hot-bb-count-ws-permille): Document.

Co-Authored-By: Jan Hubicka <jh@suse.cz>
From-SVN: r193747

gcc/ChangeLog
gcc/doc/invoke.texi
gcc/params.def
gcc/predict.c

index 8a2fc8f556f7323388f0c20a082b4806d05c2129..258bed5e264b92707291fe40a4f6c51a123e3b70 100644 (file)
@@ -1,3 +1,15 @@
+2012-11-22  Teresa Johnson  <tejohnson@google.com>
+           Jan Hubicka  <jh@suse.cz>
+
+       * predict.c (maybe_hot_count_p): Use threshold from profiled working
+       set instead of hard limit.
+       (cgraph_maybe_hot_edge_p): Invoke maybe_hot_count_p() instead of
+       directly checking limit.
+       * params.def (HOT_BB_COUNT_FRACTION): Remove.
+       (HOT_BB_COUNT_WS_PERMILLE): New parameter.
+       * invoke.texi (hot-bb-count-fraction): Remove.
+       (hot-bb-count-ws-permille): Document.
+
 2012-11-22  Vladimir Makarov  <vmakarov@redhat.com>
 
        PR middle-end/55430
index 9c2629cf77805e197106b305d84c1ced64f97437..59fa35e8f198e5978892d17df13737b796536f09 100644 (file)
@@ -9224,9 +9224,9 @@ doing loop versioning for alias in the vectorizer.  See option
 The maximum number of iterations of a loop the brute-force algorithm
 for analysis of the number of iterations of the loop tries to evaluate.
 
-@item hot-bb-count-fraction
-Select fraction of the maximal count of repetitions of basic block in program
-given basic block needs to have to be considered hot.
+@item hot-bb-count-ws-permille
+A basic block profile count is considered hot if it contributes to 
+the given permillage (i.e. 0...1000) of the entire profiled execution.
 
 @item hot-bb-frequency-fraction
 Select fraction of the entry block frequency of executions of basic block in
index 41177eed986745d101bce91d671268a98262f16b..38aaf4b0b0342553d9d6f520fc77e177bd1c51b2 100644 (file)
@@ -365,10 +365,11 @@ DEFPARAM(PARAM_SMS_LOOP_AVERAGE_COUNT_THRESHOLD,
         "A threshold on the average loop count considered by the swing modulo scheduler",
         0, 0, 0)
 
-DEFPARAM(HOT_BB_COUNT_FRACTION,
-        "hot-bb-count-fraction",
-        "Select fraction of the maximal count of repetitions of basic block in program given basic block needs to have to be considered hot",
-        10000, 0, 0)
+DEFPARAM(HOT_BB_COUNT_WS_PERMILLE,
+        "hot-bb-count-ws-permille",
+         "A basic block profile count is considered hot if it contributes to "
+         "the given permillage of the entire profiled execution",
+        999, 0, 1000)
 DEFPARAM(HOT_BB_FREQUENCY_FRACTION,
         "hot-bb-frequency-fraction",
         "Select fraction of the maximal frequency of executions of basic block in function given basic block needs to have to be considered hot",
@@ -392,7 +393,7 @@ DEFPARAM (PARAM_ALIGN_LOOP_ITERATIONS,
    flatten the profile.
 
    We need to cut the maximal predicted iterations to large enough iterations
-   so the loop appears important, but safely within HOT_BB_COUNT_FRACTION
+   so the loop appears important, but safely within maximum hotness
    range.  */
 
 DEFPARAM(PARAM_MAX_PREDICTED_ITERATIONS,
index aceca1dc3c9162195d4617f00850e8b9bde4a84b..5d3de29085849796db74b3f40050d1c0e83d3535 100644 (file)
@@ -134,13 +134,20 @@ maybe_hot_frequency_p (struct function *fun, int freq)
 static inline bool
 maybe_hot_count_p (struct function *fun, gcov_type count)
 {
-  if (profile_status_for_function (fun) != PROFILE_READ)
+  gcov_working_set_t *ws;
+  static gcov_type min_count = -1;
+  if (fun && profile_status_for_function (fun) != PROFILE_READ)
     return true;
   /* Code executed at most once is not hot.  */
   if (profile_info->runs >= count)
     return false;
-  return (count
-         > profile_info->sum_max / PARAM_VALUE (HOT_BB_COUNT_FRACTION));
+  if (min_count == -1)
+    {
+      ws = find_working_set (PARAM_VALUE (HOT_BB_COUNT_WS_PERMILLE));
+      gcc_assert (ws);
+      min_count = ws->min_counter;
+    }
+  return (count >= min_count);
 }
 
 /* Return true in case BB can be CPU intensive and should be optimized
@@ -161,8 +168,8 @@ bool
 cgraph_maybe_hot_edge_p (struct cgraph_edge *edge)
 {
   if (profile_info && flag_branch_probabilities
-      && (edge->count
-         <= profile_info->sum_max / PARAM_VALUE (HOT_BB_COUNT_FRACTION)))
+      && !maybe_hot_count_p (NULL,
+                             edge->count))
     return false;
   if (edge->caller->frequency == NODE_FREQUENCY_UNLIKELY_EXECUTED
       || (edge->callee