From e2a1e6a441f9ced9412609cd4d8ae8ede52628a3 Mon Sep 17 00:00:00 2001 From: Martin Liska Date: Fri, 19 Jan 2018 13:05:20 +0100 Subject: [PATCH] Introduce PROB_UNINITIALIZED constant and use it in predict.def. 2018-01-19 Martin Liska * 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. From-SVN: r256887 --- gcc/ChangeLog | 12 ++++++++++++ gcc/predict.c | 6 +++++- gcc/predict.def | 8 ++++---- gcc/predict.h | 1 + 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5ea286f..38c85fe 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,17 @@ 2018-01-19 Martin Liska + * 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. + +2018-01-19 Martin Liska + * predict.c (dump_prediction): Add new format for analyze_brprob.py script which is enabled with -details suboption. diff --git a/gcc/predict.c b/gcc/predict.c index fdf5d82..340c766 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; @@ -4196,7 +4197,7 @@ namespace selftest { struct branch_predictor { const char *name; - unsigned probability; + int probability; }; #define DEF_PREDICTOR(ENUM, NAME, HITRATE, FLAGS) { NAME, HITRATE }, @@ -4211,6 +4212,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 0f37e39..390b9a3 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 5771515..e4d1da0 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.7.4