Second patch cleans up predictors that do not use a value from predict.def, but their value is derived from e.g. number of iterations of a loop. These predictors have set probability to PROB_UNINITIALIZED and analyze_branch.py does not compare statistics to values defined in predict.def.
The patch is no-op. Martin
>From 6f6f2d88d3141b1e1604698abf857fffbb42330e Mon Sep 17 00:00:00 2001 From: marxin <[email protected]> Date: Wed, 27 Dec 2017 14:49:20 +0100 Subject: [PATCH 2/5] Introduce PROB_UNINITIALIZED constant and use it in predict.def. gcc/ChangeLog: 2017-12-28 Martin Liska <[email protected]> * predict.c (predict_insn_def): Add new assert. (struct branch_predictor): Change type to signed integer. (test_prediction_value_range): Amend test to cover PROB_UNINITIALIZED. * predict.def (PRED_LOOP_ITERATIONS): Use the new constant. (PRED_LOOP_ITERATIONS_GUESSED): Likewise. (PRED_LOOP_ITERATIONS_MAX): Likewise. (PRED_LOOP_IV_COMPARE): Likewise. * predict.h (PROB_UNINITIALIZED): Define new constant. --- gcc/predict.c | 6 +++++- gcc/predict.def | 8 ++++---- gcc/predict.h | 1 + 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/gcc/predict.c b/gcc/predict.c index 3ac18a2c5f2..51fd14205c2 100644 --- a/gcc/predict.c +++ b/gcc/predict.c @@ -545,6 +545,7 @@ predict_insn_def (rtx_insn *insn, enum br_predictor predictor, enum prediction taken) { int probability = predictor_info[(int) predictor].hitrate; + gcc_assert (probability != PROB_UNINITIALIZED); if (taken != TAKEN) probability = REG_BR_PROB_BASE - probability; @@ -4185,7 +4186,7 @@ namespace selftest { struct branch_predictor { const char *name; - unsigned probability; + int probability; }; #define DEF_PREDICTOR(ENUM, NAME, HITRATE, FLAGS) { NAME, HITRATE }, @@ -4200,6 +4201,9 @@ test_prediction_value_range () for (unsigned i = 0; predictors[i].name != NULL; i++) { + if (predictors[i].probability == PROB_UNINITIALIZED) + continue; + unsigned p = 100 * predictors[i].probability / REG_BR_PROB_BASE; ASSERT_TRUE (p > 50 && p <= 100); } diff --git a/gcc/predict.def b/gcc/predict.def index 0f37e399312..390b9a35fa7 100644 --- a/gcc/predict.def +++ b/gcc/predict.def @@ -54,7 +54,7 @@ DEF_PREDICTOR (PRED_UNCONDITIONAL, "unconditional jump", PROB_ALWAYS, /* Use number of loop iterations determined by # of iterations analysis to set probability. We don't want to use Dempster-Shaffer theory here, as the predictions is exact. */ -DEF_PREDICTOR (PRED_LOOP_ITERATIONS, "loop iterations", PROB_ALWAYS, +DEF_PREDICTOR (PRED_LOOP_ITERATIONS, "loop iterations", PROB_UNINITIALIZED, PRED_FLAG_FIRST_MATCH) /* Assume that any given atomic operation has low contention, @@ -71,11 +71,11 @@ DEF_PREDICTOR (PRED_BUILTIN_EXPECT, "__builtin_expect", PROB_VERY_LIKELY, /* Use number of loop iterations guessed by the contents of the loop. */ DEF_PREDICTOR (PRED_LOOP_ITERATIONS_GUESSED, "guessed loop iterations", - PROB_ALWAYS, PRED_FLAG_FIRST_MATCH) + PROB_UNINITIALIZED, PRED_FLAG_FIRST_MATCH) /* Use number of loop iterations guessed by the contents of the loop. */ DEF_PREDICTOR (PRED_LOOP_ITERATIONS_MAX, "guessed loop iterations", - PROB_ALWAYS, PRED_FLAG_FIRST_MATCH) + PROB_UNINITIALIZED, PRED_FLAG_FIRST_MATCH) /* Branch containing goto is probably not taken. */ DEF_PREDICTOR (PRED_CONTINUE, "continue", HITRATE (67), 0) @@ -151,7 +151,7 @@ DEF_PREDICTOR (PRED_LOOP_IV_COMPARE_GUESS, "guess loop iv compare", /* Use number of loop iterations determined by # of iterations analysis to set probability of branches that compares IV to loop bound variable. */ -DEF_PREDICTOR (PRED_LOOP_IV_COMPARE, "loop iv compare", PROB_VERY_LIKELY, +DEF_PREDICTOR (PRED_LOOP_IV_COMPARE, "loop iv compare", PROB_UNINITIALIZED, PRED_FLAG_FIRST_MATCH) /* In the following code diff --git a/gcc/predict.h b/gcc/predict.h index 57715159b95..e4d1da090ca 100644 --- a/gcc/predict.h +++ b/gcc/predict.h @@ -31,6 +31,7 @@ along with GCC; see the file COPYING3. If not see #define PROB_ALWAYS (REG_BR_PROB_BASE) #define PROB_UNLIKELY (REG_BR_PROB_BASE / 5 - 1) #define PROB_LIKELY (REG_BR_PROB_BASE - PROB_UNLIKELY) +#define PROB_UNINITIALIZED (-1) #define DEF_PREDICTOR(ENUM, NAME, HITRATE, FLAGS) ENUM, enum br_predictor -- 2.14.3
