diff options
author | Rong Xu <xur@google.com> | 2013-10-03 17:13:50 +0000 |
---|---|---|
committer | Rong Xu <xur@gcc.gnu.org> | 2013-10-03 17:13:50 +0000 |
commit | 942df7390fb64e26bb7ed6ac58ee9911be4ea5cb (patch) | |
tree | 48352394b524e6a8198bc62633939861961f8a7e | |
parent | 2ef7251f6cd9e228cafa3473929ff55c9cb56928 (diff) | |
download | gcc-942df7390fb64e26bb7ed6ac58ee9911be4ea5cb.zip gcc-942df7390fb64e26bb7ed6ac58ee9911be4ea5cb.tar.gz gcc-942df7390fb64e26bb7ed6ac58ee9911be4ea5cb.tar.bz2 |
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
-rw-r--r-- | gcc/ChangeLog | 12 | ||||
-rw-r--r-- | gcc/doc/invoke.texi | 5 | ||||
-rw-r--r-- | gcc/params.def | 13 | ||||
-rw-r--r-- | gcc/predict.c | 9 | ||||
-rw-r--r-- | gcc/predict.def | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/ipa-split-5.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/ipa-split-6.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/cold-attribute-2.c | 2 |
8 files changed, 42 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e7e2836..c5ffb64 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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 diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 6e3192f..0f32c24 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -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 diff --git a/gcc/params.def b/gcc/params.def index 2749137..ff9ba9a 100644 --- a/gcc/params.def +++ b/gcc/params.def @@ -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", diff --git a/gcc/predict.c b/gcc/predict.c index 2909117..e6a4095 100644 --- a/gcc/predict.c +++ b/gcc/predict.c @@ -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. diff --git a/gcc/predict.def b/gcc/predict.def index 0006233..f8dba66 100644 --- a/gcc/predict.def +++ b/gcc/predict.def @@ -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) diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ipa-split-5.c b/gcc/testsuite/gcc.dg/tree-ssa/ipa-split-5.c index abf1e07..8fc1244 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ipa-split-5.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ipa-split-5.c @@ -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); diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ipa-split-6.c b/gcc/testsuite/gcc.dg/tree-ssa/ipa-split-6.c index 12070fa..fcdf79d 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ipa-split-6.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ipa-split-6.c @@ -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" diff --git a/gcc/testsuite/gcc.target/i386/cold-attribute-2.c b/gcc/testsuite/gcc.target/i386/cold-attribute-2.c index 93ea906..4b61b9d 100644 --- a/gcc/testsuite/gcc.target/i386/cold-attribute-2.c +++ b/gcc/testsuite/gcc.target/i386/cold-attribute-2.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) { |