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 <tejohn...@google.com> Backport r193747 from trunk: 2012-11-22 Teresa Johnson <tejohn...@google.com> Jan Hubicka <j...@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. 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, -- This patch is available for review at http://codereview.appspot.com/6907063