+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.
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;
}
}
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. */