aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRong Xu <xur@google.com>2013-10-03 17:13:50 +0000
committerRong Xu <xur@gcc.gnu.org>2013-10-03 17:13:50 +0000
commit942df7390fb64e26bb7ed6ac58ee9911be4ea5cb (patch)
tree48352394b524e6a8198bc62633939861961f8a7e
parent2ef7251f6cd9e228cafa3473929ff55c9cb56928 (diff)
downloadgcc-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/ChangeLog12
-rw-r--r--gcc/doc/invoke.texi5
-rw-r--r--gcc/params.def13
-rw-r--r--gcc/predict.c9
-rw-r--r--gcc/predict.def5
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/ipa-split-5.c2
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/ipa-split-6.c2
-rw-r--r--gcc/testsuite/gcc.target/i386/cold-attribute-2.c2
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)
{