Patchwork [google/gcc-4_7] Backport r193747 to using working set for bb hotness (issue6907063)

login
register
mail settings
Submitter Teresa Johnson
Date Dec. 10, 2012, 4:13 p.m.
Message ID <20121210161301.2CB6261661@tjsboxrox.mtv.corp.google.com>
Download mbox | patch
Permalink /patch/204964/
State New
Headers show

Comments

Teresa Johnson - Dec. 10, 2012, 4:13 p.m.
This is a backport of r193747 to use the working set from the profile summary
to determine the bb hot count threshold.

Bootstrapped and tested on x86_64-unknown-linux-gnu. Ok for google 4_7 branch?

Thanks,
Teresa

2012-12-10  Teresa Johnson  <tejohnson@google.com>

        Backport r193747 from trunk:

        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.
        * doc/invoke.texi (hot-bb-count-fraction): Remove.
        (hot-bb-count-ws-permille): Document.



--
This patch is available for review at http://codereview.appspot.com/6907063

Patch

Index: doc/invoke.texi
===================================================================
--- doc/invoke.texi	(revision 194315)
+++ doc/invoke.texi	(working copy)
@@ -9307,9 +9307,9 @@  ftree-vect-loop-version for more information.
 The maximum number of iterations of a loop the brute force algorithm
 for analysis of # 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: predict.c
===================================================================
--- predict.c	(revision 194315)
+++ predict.c	(working copy)
@@ -137,13 +137,20 @@  maybe_hot_frequency_p (int freq)
 bool
 maybe_hot_count_p (gcov_type count)
 {
+  gcov_working_set_t *ws = NULL;
+  static gcov_type min_count = -1;
   if (!profile_info)
     return false;
   /* 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
@@ -163,8 +170,7 @@  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 (edge->count))
     return false;
   if (edge->caller->frequency == NODE_FREQUENCY_UNLIKELY_EXECUTED
       || edge->callee->frequency == NODE_FREQUENCY_UNLIKELY_EXECUTED)
Index: params.def
===================================================================
--- params.def	(revision 194315)
+++ params.def	(working copy)
@@ -424,10 +424,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",
-	 60000, 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",
@@ -451,7 +452,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,