re PR middle-end/77484 (Static branch predictor causes ~6-8% regression of SPEC2000 GAP)

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
This commit is contained in:
Jan Hubicka 2017-01-01 16:40:29 +01:00 committed by Jan Hubicka
parent cbe34bb5ed
commit 2c5123744b
3 changed files with 21 additions and 2 deletions

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

View 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;
}
}

View 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. */