mirror of git://gcc.gnu.org/git/gcc.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
This commit is contained in:
parent
2ef7251f6c
commit
942df7390f
|
|
@ -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>
|
2013-10-03 Marc Glisse <marc.glisse@inria.fr>
|
||||||
|
|
||||||
PR c++/19476
|
PR c++/19476
|
||||||
|
|
|
||||||
|
|
@ -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
|
the unknown number of iterations average to roughly 10. This means that the
|
||||||
loop without bounds appears artificially cold relative to the other one.
|
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
|
@item align-threshold
|
||||||
|
|
||||||
Select fraction of the maximal frequency of executions of a basic block in
|
Select fraction of the maximal frequency of executions of a basic block in
|
||||||
|
|
|
||||||
|
|
@ -398,6 +398,19 @@ DEFPARAM(PARAM_MAX_PREDICTED_ITERATIONS,
|
||||||
"max-predicted-iterations",
|
"max-predicted-iterations",
|
||||||
"The maximum number of loop iterations we predict statically",
|
"The maximum number of loop iterations we predict statically",
|
||||||
100, 0, 0)
|
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,
|
DEFPARAM(TRACER_DYNAMIC_COVERAGE_FEEDBACK,
|
||||||
"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",
|
"The percentage of function, weighted by execution frequency, that must be covered by trace formation. Used when profile feedback is available",
|
||||||
|
|
|
||||||
|
|
@ -2000,11 +2000,12 @@ tree_predict_by_opcode (basic_block bb)
|
||||||
BITMAP_FREE (visited);
|
BITMAP_FREE (visited);
|
||||||
if (val)
|
if (val)
|
||||||
{
|
{
|
||||||
|
int percent = PARAM_VALUE (BUILTIN_EXPECT_PROBABILITY);
|
||||||
|
|
||||||
|
gcc_assert (percent >= 0 && percent <= 100);
|
||||||
if (integer_zerop (val))
|
if (integer_zerop (val))
|
||||||
predict_edge_def (then_edge, PRED_BUILTIN_EXPECT, NOT_TAKEN);
|
percent = 100 - percent;
|
||||||
else
|
predict_edge (then_edge, PRED_BUILTIN_EXPECT, HITRATE (percent));
|
||||||
predict_edge_def (then_edge, PRED_BUILTIN_EXPECT, TAKEN);
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
/* Try "pointer heuristic."
|
/* Try "pointer heuristic."
|
||||||
A comparison ptr == 0 is predicted as false.
|
A comparison ptr == 0 is predicted as false.
|
||||||
|
|
|
||||||
|
|
@ -57,7 +57,10 @@ DEF_PREDICTOR (PRED_UNCONDITIONAL, "unconditional jump", PROB_ALWAYS,
|
||||||
DEF_PREDICTOR (PRED_LOOP_ITERATIONS, "loop iterations", PROB_ALWAYS,
|
DEF_PREDICTOR (PRED_LOOP_ITERATIONS, "loop iterations", PROB_ALWAYS,
|
||||||
PRED_FLAG_FIRST_MATCH)
|
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,
|
DEF_PREDICTOR (PRED_BUILTIN_EXPECT, "__builtin_expect", PROB_VERY_LIKELY,
|
||||||
PRED_FLAG_FIRST_MATCH)
|
PRED_FLAG_FIRST_MATCH)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
/* { dg-do compile { target nonpic } } */
|
/* { 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 {int a,b;};
|
||||||
struct a make_me_big (int a);
|
struct a make_me_big (int a);
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
/* PR tree-optimization/52019 */
|
/* PR tree-optimization/52019 */
|
||||||
/* { dg-do compile } */
|
/* { 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"
|
#include "ipa-split-5.c"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
/* { dg-do compile } */
|
/* { dg-do compile } */
|
||||||
/* { dg-options "-O2" } */
|
/* { dg-options "-O2 --param=builtin-expect-probability=100" } */
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
t(int c)
|
t(int c)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue