diff options
author | Teresa Johnson <tejohnson@google.com> | 2012-11-23 08:49:43 +0000 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2012-11-23 08:49:43 +0000 |
commit | b131b583978ceadbe54325be3a09710a48481df2 (patch) | |
tree | c3a33c43f2e5098a3927078c4b315cd7408551cc | |
parent | 3409d40e47ed30f1b6dca3fa074c4094efbf5b50 (diff) | |
download | gcc-b131b583978ceadbe54325be3a09710a48481df2.zip gcc-b131b583978ceadbe54325be3a09710a48481df2.tar.gz gcc-b131b583978ceadbe54325be3a09710a48481df2.tar.bz2 |
predict.c (maybe_hot_count_p): Use threshold from profiled working set instead of hard limit.
* 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
-rw-r--r-- | gcc/ChangeLog | 12 | ||||
-rw-r--r-- | gcc/doc/invoke.texi | 6 | ||||
-rw-r--r-- | gcc/params.def | 11 | ||||
-rw-r--r-- | gcc/predict.c | 17 |
4 files changed, 33 insertions, 13 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8a2fc8f..258bed5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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 diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 9c2629c..59fa35e 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -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 diff --git a/gcc/params.def b/gcc/params.def index 41177ee..38aaf4b 100644 --- a/gcc/params.def +++ b/gcc/params.def @@ -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, diff --git a/gcc/predict.c b/gcc/predict.c index aceca1d..5d3de29 100644 --- a/gcc/predict.c +++ b/gcc/predict.c @@ -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 |