+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
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
"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",
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.
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)
/* { 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);
/* 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"
/* { dg-do compile } */
-/* { dg-options "-O2" } */
+/* { dg-options "-O2 --param=builtin-expect-probability=100" } */
#include <string.h>
t(int c)
{