Commit 942df739 by Rong Xu Committed by Rong Xu

predict.c (tree_predict_by_opcode): Get the probability for builtin_expect from…

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
parent 2ef7251f
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> 2013-10-03 Marc Glisse <marc.glisse@inria.fr>
PR c++/19476 PR c++/19476
......
...@@ -9491,6 +9491,11 @@ The known number of iterations is predicted correctly, while ...@@ -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 the unknown number of iterations average to roughly 10. This means that the
loop without bounds appears artificially cold relative to the other one. 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 @item align-threshold
Select fraction of the maximal frequency of executions of a basic block in Select fraction of the maximal frequency of executions of a basic block in
......
...@@ -398,6 +398,19 @@ DEFPARAM(PARAM_MAX_PREDICTED_ITERATIONS, ...@@ -398,6 +398,19 @@ DEFPARAM(PARAM_MAX_PREDICTED_ITERATIONS,
"max-predicted-iterations", "max-predicted-iterations",
"The maximum number of loop iterations we predict statically", "The maximum number of loop iterations we predict statically",
100, 0, 0) 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, DEFPARAM(TRACER_DYNAMIC_COVERAGE_FEEDBACK,
"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", "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) ...@@ -2000,11 +2000,12 @@ tree_predict_by_opcode (basic_block bb)
BITMAP_FREE (visited); BITMAP_FREE (visited);
if (val) if (val)
{ {
int percent = PARAM_VALUE (BUILTIN_EXPECT_PROBABILITY);
gcc_assert (percent >= 0 && percent <= 100);
if (integer_zerop (val)) if (integer_zerop (val))
predict_edge_def (then_edge, PRED_BUILTIN_EXPECT, NOT_TAKEN); percent = 100 - percent;
else predict_edge (then_edge, PRED_BUILTIN_EXPECT, HITRATE (percent));
predict_edge_def (then_edge, PRED_BUILTIN_EXPECT, TAKEN);
return;
} }
/* Try "pointer heuristic." /* Try "pointer heuristic."
A comparison ptr == 0 is predicted as false. A comparison ptr == 0 is predicted as false.
......
...@@ -57,7 +57,10 @@ DEF_PREDICTOR (PRED_UNCONDITIONAL, "unconditional jump", PROB_ALWAYS, ...@@ -57,7 +57,10 @@ DEF_PREDICTOR (PRED_UNCONDITIONAL, "unconditional jump", PROB_ALWAYS,
DEF_PREDICTOR (PRED_LOOP_ITERATIONS, "loop iterations", PROB_ALWAYS, DEF_PREDICTOR (PRED_LOOP_ITERATIONS, "loop iterations", PROB_ALWAYS,
PRED_FLAG_FIRST_MATCH) 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, DEF_PREDICTOR (PRED_BUILTIN_EXPECT, "__builtin_expect", PROB_VERY_LIKELY,
PRED_FLAG_FIRST_MATCH) PRED_FLAG_FIRST_MATCH)
......
/* { dg-do compile { target nonpic } } */ /* { 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 {int a,b;};
struct a make_me_big (int a); struct a make_me_big (int a);
......
/* PR tree-optimization/52019 */ /* PR tree-optimization/52019 */
/* { dg-do compile } */ /* { 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" #include "ipa-split-5.c"
......
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O2" } */ /* { dg-options "-O2 --param=builtin-expect-probability=100" } */
#include <string.h> #include <string.h>
t(int c) t(int c)
{ {
......
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