aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog12
-rw-r--r--gcc/doc/invoke.texi6
-rw-r--r--gcc/params.def11
-rw-r--r--gcc/predict.c17
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