From: Rong Xu Date: Thu, 3 Oct 2013 17:13:50 +0000 (+0000) Subject: predict.c (tree_predict_by_opcode): Get the probability for builtin_expect from param... X-Git-Tag: releases/gcc-4.9.0~3723 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=942df7390fb64e26bb7ed6ac58ee9911be4ea5cb;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e7e28363180f..c5ffb64ff05e 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 6e3192f3cd08..0f32c24f15fd 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 27491378d118..ff9ba9a8abcc 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 2909117ef6bd..e6a4095acd15 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 0006233da35a..f8dba66e8718 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 abf1e07e2b84..8fc1244e1ad6 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 12070fa3362f..fcdf79d7027a 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 93ea906614f4..4b61b9d56d8f 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) {