]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR middle-end/77484 (Static branch predictor causes ~6-8% regression of SPEC2000...
authorJan Hubicka <hubicka@ucw.cz>
Sun, 1 Jan 2017 15:40:29 +0000 (16:40 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Sun, 1 Jan 2017 15:40:29 +0000 (15:40 +0000)
PR middle-end/77484
* predict.def (PRED_CALL): Update hitrate.
(PRED_INDIR_CALL, PRED_POLYMORPHIC_CALL): New predictors.
* predict.c (tree_estimate_probability_bb): Split CALL predictor
into direct/indirect/polymorphic variants.

From-SVN: r243995

gcc/ChangeLog
gcc/predict.c
gcc/predict.def

index 07e5c3e592a3917452dce4b95c35b845f4b3ee23..a5767870bcabef7894358c532af0a343029316c2 100644 (file)
@@ -1,3 +1,11 @@
+2017-01-01  Jan Hubicka  <hubicka@ucw.cz>
+
+       PR middle-end/77484
+       * predict.def (PRED_CALL): Update hitrate.
+       (PRED_INDIR_CALL, PRED_POLYMORPHIC_CALL): New predictors.
+       * predict.c (tree_estimate_probability_bb): Split CALL predictor
+       into direct/indirect/polymorphic variants.
+
 2017-01-01  Jakub Jelinek  <jakub@redhat.com>
 
        Update copyright years.
index 82177abeb8918b5396411487a80ce941188a10aa..e85573bc51dd5ea2e1bf07f6599e7b4393ddc651 100644 (file)
@@ -2786,7 +2786,12 @@ tree_estimate_probability_bb (basic_block bb)
                     something exceptional.  */
                  && gimple_has_side_effects (stmt))
                {
-                 predict_edge_def (e, PRED_CALL, NOT_TAKEN);
+                 if (gimple_call_fndecl (stmt))
+                   predict_edge_def (e, PRED_CALL, NOT_TAKEN);
+                 else if (virtual_method_call_p (gimple_call_fn (stmt)))
+                   predict_edge_def (e, PRED_POLYMORPHIC_CALL, TAKEN);
+                 else
+                   predict_edge_def (e, PRED_INDIR_CALL, TAKEN);
                  break;
                }
            }
index c151ce2104fc8c907b4ce9ab96691744ae604c41..b6b2a402b22e1598ff9350b93197b61c166ae5a0 100644 (file)
@@ -116,7 +116,13 @@ DEF_PREDICTOR (PRED_TREE_OPCODE_NONEQUAL, "opcode values nonequal (on trees)",
 DEF_PREDICTOR (PRED_TREE_FPOPCODE, "fp_opcode (on trees)", HITRATE (90), 0)
 
 /* Branch guarding call is probably taken.  */
-DEF_PREDICTOR (PRED_CALL, "call", HITRATE (67), 0)
+DEF_PREDICTOR (PRED_CALL, "call", HITRATE (55), 0)
+
+/* PRED_CALL is not very reliable predictor and it turns out to be even
+   less reliable for indirect calls and polymorphic calls.  For spec2k6
+   the predictio nis slightly in the direction of taking the call.  */
+DEF_PREDICTOR (PRED_INDIR_CALL, "indirect call", HITRATE (51), 0)
+DEF_PREDICTOR (PRED_POLYMORPHIC_CALL, "polymorphic call", HITRATE (58), 0)
 
 /* Recursive calls are usually not taken or the function will recurse
    indefinitely.  */