diff mbox series

[2/5] Introduce PROB_UNINITIALIZED constant and use it in, predict.def.

Message ID 5721567b-8b11-a2e4-09f5-de584b72bf0e@suse.cz
State New
Headers show
Series [1/5] Fix usage of analyze_brprob.py script. | expand

Commit Message

Martin Liška Jan. 9, 2018, 11:26 a.m. UTC
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

Comments

Jan Hubicka Jan. 11, 2018, 10:41 a.m. UTC | #1
> 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 <mliska@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  <mliska@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
>
diff mbox series

Patch

From 6f6f2d88d3141b1e1604698abf857fffbb42330e Mon Sep 17 00:00:00 2001
From: marxin <mliska@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  <mliska@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