Commit bfaa17c1 by Teresa Johnson Committed by Teresa Johnson

predict.c (probably_never_executed): Compare frequency-based count to number of training runs.

2013-10-18  Teresa Johnson  <tejohnson@google.com>

	* predict.c (probably_never_executed): Compare frequency-based
	count to number of training runs.
	* params.def (UNLIKELY_BB_COUNT_FRACTION): New parameter.

From-SVN: r203830
parent f58883bd
2013-10-18 Teresa Johnson <tejohnson@google.com>
* predict.c (probably_never_executed): Compare frequency-based
count to number of training runs.
* params.def (UNLIKELY_BB_COUNT_FRACTION): New parameter.
2013-10-18 Kyrylo Tkachov <kyrylo.tkachov@arm.com> 2013-10-18 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
* config/arm/arm.c (cortexa9_extra_costs): New table. * config/arm/arm.c (cortexa9_extra_costs): New table.
......
...@@ -373,6 +373,11 @@ DEFPARAM(HOT_BB_FREQUENCY_FRACTION, ...@@ -373,6 +373,11 @@ DEFPARAM(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", "Select fraction of the maximal frequency of executions of basic block in function given basic block needs to have to be considered hot",
1000, 0, 0) 1000, 0, 0)
DEFPARAM(UNLIKELY_BB_COUNT_FRACTION,
"unlikely-bb-count-fraction",
"The minimum fraction of profile runs a given basic block execution count must be not to be considered unlikely",
20, 1, 10000)
DEFPARAM (PARAM_ALIGN_THRESHOLD, DEFPARAM (PARAM_ALIGN_THRESHOLD,
"align-threshold", "align-threshold",
"Select fraction of the maximal frequency of executions of basic block in function given basic block get alignment", "Select fraction of the maximal frequency of executions of basic block in function given basic block get alignment",
......
...@@ -237,17 +237,33 @@ probably_never_executed (struct function *fun, ...@@ -237,17 +237,33 @@ probably_never_executed (struct function *fun,
gcc_checking_assert (fun); gcc_checking_assert (fun);
if (profile_status_for_function (fun) == PROFILE_READ) if (profile_status_for_function (fun) == PROFILE_READ)
{ {
if ((count * 4 + profile_info->runs / 2) / profile_info->runs > 0) int unlikely_count_fraction = PARAM_VALUE (UNLIKELY_BB_COUNT_FRACTION);
if (count * unlikely_count_fraction >= profile_info->runs)
return false; return false;
if (!frequency) if (!frequency)
return true; return true;
if (!ENTRY_BLOCK_PTR->frequency) if (!ENTRY_BLOCK_PTR->frequency)
return false; return false;
if (ENTRY_BLOCK_PTR->count && ENTRY_BLOCK_PTR->count < REG_BR_PROB_BASE) if (ENTRY_BLOCK_PTR->count)
{ {
return (RDIV (frequency * ENTRY_BLOCK_PTR->count, gcov_type computed_count;
ENTRY_BLOCK_PTR->frequency) /* Check for possibility of overflow, in which case entry bb count
< REG_BR_PROB_BASE / 4); is large enough to do the division first without losing much
precision. */
if (ENTRY_BLOCK_PTR->count < REG_BR_PROB_BASE * REG_BR_PROB_BASE)
{
gcov_type scaled_count
= frequency * ENTRY_BLOCK_PTR->count * unlikely_count_fraction;
computed_count = RDIV (scaled_count, ENTRY_BLOCK_PTR->frequency);
}
else
{
computed_count = RDIV (ENTRY_BLOCK_PTR->count,
ENTRY_BLOCK_PTR->frequency);
computed_count *= frequency * unlikely_count_fraction;
}
if (computed_count >= profile_info->runs)
return false;
} }
return true; return true;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment