> 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.

OK, thanks!
Honza
> 
> Martin

> >From 6f6f2d88d3141b1e1604698abf857fffbb42330e Mon Sep 17 00:00:00 2001
> From: marxin <mli...@suse.cz>
> 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  <mli...@suse.cz>
> 
>       * 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
> 

Reply via email to