From 942df7390fb64e26bb7ed6ac58ee9911be4ea5cb Mon Sep 17 00:00:00 2001 From: Rong Xu Date: Thu, 3 Oct 2013 17:13:50 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 12 ++++++++++++ gcc/doc/invoke.texi | 5 +++++ gcc/params.def | 13 +++++++++++++ gcc/predict.c | 9 +++++---- gcc/predict.def | 5 ++++- gcc/testsuite/gcc.dg/tree-ssa/ipa-split-5.c | 2 +- gcc/testsuite/gcc.dg/tree-ssa/ipa-split-6.c | 2 +- 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 e7e28363180..c5ffb64ff05 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,15 @@ +2013-10-03 Rong Xu + + * 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 PR c++/19476 diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 6e3192f3cd0..0f32c24f15f 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 27491378d11..ff9ba9a8abc 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 2909117ef6b..e6a4095acd1 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 0006233da35..f8dba66e871 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 abf1e07e2b8..8fc1244e1ad 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 12070fa3362..fcdf79d7027 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 93ea906614f..4b61b9d56d8 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 t(int c) {