diff mbox

Fix finding of a first match predictor

Message ID 12ac497e-6557-3db5-f017-74d75cba26aa@suse.cz
State New
Headers show

Commit Message

Martin Liška June 16, 2016, 7:26 p.m. UTC
Hello.

Currently, whenever we find a first match predictor, we firstly find a predictor
which is defined first in the list of predictors and eventually we check that
the predictor is PRED_FLAG_FIRST_MATCH. Proper implementation is to consider just
predictors with the flag set.

Patch reg&bootstraps on x86_64-linux-gnu and is pre-approved by Honza.

Installed as r237539.

Martin
diff mbox

Patch

From c20cc4a5f3b7ae756ce286a1ef0045f50bc96d46 Mon Sep 17 00:00:00 2001
From: marxin <mliska@suse.cz>
Date: Thu, 16 Jun 2016 17:44:48 +0200
Subject: [PATCH] Fix finding of a first match predictor

gcc/ChangeLog:

2016-06-16  Martin Liska  <mliska@suse.cz>

	* predict.c (combine_predictions_for_insn): When we find a first
	match predictor, we should consider just predictors with
	PRED_FLAG_FIRST_MATCH.  Print either first match (if any) or
	DS theory predictor.
	(combine_predictions_for_bb): Likewise.
---
 gcc/predict.c | 30 ++++++++++++++++++------------
 1 file changed, 18 insertions(+), 12 deletions(-)

diff --git a/gcc/predict.c b/gcc/predict.c
index bafcc96..642bd62 100644
--- a/gcc/predict.c
+++ b/gcc/predict.c
@@ -835,7 +835,8 @@  combine_predictions_for_insn (rtx_insn *insn, basic_block bb)
 	int probability = INTVAL (XEXP (XEXP (note, 0), 1));
 
 	found = true;
-	if (best_predictor > predictor)
+	if (best_predictor > predictor
+	    && predictor_info[predictor].flags & PRED_FLAG_FIRST_MATCH)
 	  best_probability = probability, best_predictor = predictor;
 
 	d = (combined_probability * probability
@@ -855,7 +856,7 @@  combine_predictions_for_insn (rtx_insn *insn, basic_block bb)
      use no_prediction heuristic, in case we did match, use either
      first match or Dempster-Shaffer theory depending on the flags.  */
 
-  if (predictor_info [best_predictor].flags & PRED_FLAG_FIRST_MATCH)
+  if (best_predictor != END_PREDICTORS)
     first_match = true;
 
   if (!found)
@@ -863,10 +864,12 @@  combine_predictions_for_insn (rtx_insn *insn, basic_block bb)
 		     combined_probability, bb);
   else
     {
-      dump_prediction (dump_file, PRED_DS_THEORY, combined_probability,
-		       bb, !first_match ? REASON_NONE : REASON_IGNORED);
-      dump_prediction (dump_file, PRED_FIRST_MATCH, best_probability,
-		       bb, first_match ? REASON_NONE : REASON_IGNORED);
+      if (!first_match)
+	dump_prediction (dump_file, PRED_DS_THEORY, combined_probability,
+			 bb, !first_match ? REASON_NONE : REASON_IGNORED);
+      else
+	dump_prediction (dump_file, PRED_FIRST_MATCH, best_probability,
+			 bb, first_match ? REASON_NONE : REASON_IGNORED);
     }
 
   if (first_match)
@@ -1096,7 +1099,8 @@  combine_predictions_for_bb (basic_block bb, bool dry_run)
 	  found = true;
 	  /* First match heuristics would be widly confused if we predicted
 	     both directions.  */
-	  if (best_predictor > predictor)
+	  if (best_predictor > predictor
+	    && predictor_info[predictor].flags & PRED_FLAG_FIRST_MATCH)
 	    {
               struct edge_prediction *pred2;
 	      int prob = probability;
@@ -1142,17 +1146,19 @@  combine_predictions_for_bb (basic_block bb, bool dry_run)
      use no_prediction heuristic, in case we did match, use either
      first match or Dempster-Shaffer theory depending on the flags.  */
 
-  if (predictor_info [best_predictor].flags & PRED_FLAG_FIRST_MATCH)
+  if (best_predictor != END_PREDICTORS)
     first_match = true;
 
   if (!found)
     dump_prediction (dump_file, PRED_NO_PREDICTION, combined_probability, bb);
   else
     {
-      dump_prediction (dump_file, PRED_DS_THEORY, combined_probability, bb,
-		       !first_match ? REASON_NONE : REASON_IGNORED);
-      dump_prediction (dump_file, PRED_FIRST_MATCH, best_probability, bb,
-		       first_match ? REASON_NONE : REASON_IGNORED);
+      if (!first_match)
+	dump_prediction (dump_file, PRED_DS_THEORY, combined_probability, bb,
+			 !first_match ? REASON_NONE : REASON_IGNORED);
+      else
+	dump_prediction (dump_file, PRED_FIRST_MATCH, best_probability, bb,
+			 first_match ? REASON_NONE : REASON_IGNORED);
     }
 
   if (first_match)
-- 
2.8.3