predict.c (tree_predict_by_opcode): Get the probability for builtin_expect from param builtin_expect_probability.
* predict.c (tree_predict_by_opcode): Get the probability for builtin_expect from param builtin_expect_probability. * params.def (BUILTIN_EXPECT_PROBABILITY): New parameter. * predict.def (PRED_BUILTIN_EXPECT_RELAXED): Fix comments. * doc/invoke.texi: Add documentation for builtin-expect-probability. * gcc.target/i386/cold-attribute-2.c: Fix the test by using original probability. * gcc.dg/tree-ssa/ipa-split-5.c: Ditto. * gcc.dg/tree-ssa/ipa-split-6.c: Ditto. --This li (t)ene, and those below, will be ignored-- M gcc/params.def M gcc/predict.def M gcc/ChangeLog M gcc/testsuite/gcc.dg/tree-ssa/ipa-split-5.c M gcc/testsuite/gcc.dg/tree-ssa/ipa-split-6.c M gcc/testsuite/gcc.target/i386/cold-attribute-2.c M gcc/predict.c M gcc/doc/invoke.texi From-SVN: r203167
This commit is contained in:
parent
2ef7251f6c
commit
942df7390f
8 changed files with 42 additions and 8 deletions
|
@ -1,3 +1,15 @@
|
|||
2013-10-03 Rong Xu <xur@google.com>
|
||||
|
||||
* predict.c (tree_predict_by_opcode): Get the probability
|
||||
for builtin_expect from param builtin_expect_probability.
|
||||
* params.def (BUILTIN_EXPECT_PROBABILITY): New parameter.
|
||||
* predict.def (PRED_BUILTIN_EXPECT_RELAXED): Fix comments.
|
||||
* doc/invoke.texi: Add documentation for builtin-expect-probability.
|
||||
* gcc.target/i386/cold-attribute-2.c: Fix the test by using original
|
||||
probability.
|
||||
* gcc.dg/tree-ssa/ipa-split-5.c: Ditto.
|
||||
* gcc.dg/tree-ssa/ipa-split-6.c: Ditto.
|
||||
|
||||
2013-10-03 Marc Glisse <marc.glisse@inria.fr>
|
||||
|
||||
PR c++/19476
|
||||
|
|
|
@ -9491,6 +9491,11 @@ The known number of iterations is predicted correctly, while
|
|||
the unknown number of iterations average to roughly 10. This means that the
|
||||
loop without bounds appears artificially cold relative to the other one.
|
||||
|
||||
@item builtin-expect-probability
|
||||
Control the probability of the expression having the specified value. This
|
||||
parameter takes a percentage (i.e. 0 ... 100) as input.
|
||||
The default probability of 90 is obtained empirically.
|
||||
|
||||
@item align-threshold
|
||||
|
||||
Select fraction of the maximal frequency of executions of a basic block in
|
||||
|
|
|
@ -398,6 +398,19 @@ DEFPARAM(PARAM_MAX_PREDICTED_ITERATIONS,
|
|||
"max-predicted-iterations",
|
||||
"The maximum number of loop iterations we predict statically",
|
||||
100, 0, 0)
|
||||
|
||||
/* This parameter controls the probability of builtin_expect. The default
|
||||
value is 90%. This empirical value is obtained through the weighted
|
||||
probability of FDO counters (with the FDO count value as the weight)
|
||||
in some real world programs:
|
||||
(1) Google performance test benchmarks: the probability is 0.9081.
|
||||
(2) Linux 3.3 kernel running Google search workload: the probability
|
||||
is 0.8717. */
|
||||
|
||||
DEFPARAM(BUILTIN_EXPECT_PROBABILITY,
|
||||
"builtin-expect-probability",
|
||||
"Set the estimated probability in percentage for builtin expect. The default value is 90% probability.",
|
||||
90, 0, 100)
|
||||
DEFPARAM(TRACER_DYNAMIC_COVERAGE_FEEDBACK,
|
||||
"tracer-dynamic-coverage-feedback",
|
||||
"The percentage of function, weighted by execution frequency, that must be covered by trace formation. Used when profile feedback is available",
|
||||
|
|
|
@ -2000,11 +2000,12 @@ tree_predict_by_opcode (basic_block bb)
|
|||
BITMAP_FREE (visited);
|
||||
if (val)
|
||||
{
|
||||
int percent = PARAM_VALUE (BUILTIN_EXPECT_PROBABILITY);
|
||||
|
||||
gcc_assert (percent >= 0 && percent <= 100);
|
||||
if (integer_zerop (val))
|
||||
predict_edge_def (then_edge, PRED_BUILTIN_EXPECT, NOT_TAKEN);
|
||||
else
|
||||
predict_edge_def (then_edge, PRED_BUILTIN_EXPECT, TAKEN);
|
||||
return;
|
||||
percent = 100 - percent;
|
||||
predict_edge (then_edge, PRED_BUILTIN_EXPECT, HITRATE (percent));
|
||||
}
|
||||
/* Try "pointer heuristic."
|
||||
A comparison ptr == 0 is predicted as false.
|
||||
|
|
|
@ -57,7 +57,10 @@ DEF_PREDICTOR (PRED_UNCONDITIONAL, "unconditional jump", PROB_ALWAYS,
|
|||
DEF_PREDICTOR (PRED_LOOP_ITERATIONS, "loop iterations", PROB_ALWAYS,
|
||||
PRED_FLAG_FIRST_MATCH)
|
||||
|
||||
/* Hints dropped by user via __builtin_expect feature. */
|
||||
/* Hints dropped by user via __builtin_expect feature. Note: the
|
||||
probability of PROB_VERY_LIKELY is now overwritten by param
|
||||
builtin_expect_probability with a default value of HITRATE(90).
|
||||
Refer to param.def for details. */
|
||||
DEF_PREDICTOR (PRED_BUILTIN_EXPECT, "__builtin_expect", PROB_VERY_LIKELY,
|
||||
PRED_FLAG_FIRST_MATCH)
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/* { dg-do compile { target nonpic } } */
|
||||
/* { dg-options "-O3 -fdump-tree-fnsplit -fdump-tree-optimized" } */
|
||||
/* { dg-options "-O3 -fdump-tree-fnsplit -fdump-tree-optimized --param=builtin-expect-probability=100" } */
|
||||
|
||||
struct a {int a,b;};
|
||||
struct a make_me_big (int a);
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/* PR tree-optimization/52019 */
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-O3 -fno-tree-sra -fdump-tree-fnsplit -fdump-tree-optimized" } */
|
||||
/* { dg-options "-O3 -fno-tree-sra -fdump-tree-fnsplit -fdump-tree-optimized --param=builtin-expect-probability=100" } */
|
||||
|
||||
#include "ipa-split-5.c"
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/* { dg-do compile } */
|
||||
/* { dg-options "-O2" } */
|
||||
/* { dg-options "-O2 --param=builtin-expect-probability=100" } */
|
||||
#include <string.h>
|
||||
t(int c)
|
||||
{
|
||||
|
|
Loading…
Add table
Reference in a new issue