These predictors are in my opinion not reliable and thus I decided to remove them:
1) PRED_NEGATIVE_RETURN: probability is ~51% 2) PRED_RECURSIVE_CALL: there are 2 dominant edges that influence value to 63%; w/o these edges it goes down to 52% 3) PRED_POLYMORPHIC_CALL: having very low coverage, probability is ~51% 4) PRED_INDIR_CALL: likewise Question here is whether we want to remove them, or to predict them with a 'ignored' flag? Doing that, we can measure statistics of the predictor in the future? Martin
>From afbc86cb72eab37bcf6325954d0bf306b301f76e Mon Sep 17 00:00:00 2001 From: marxin <mli...@suse.cz> Date: Thu, 28 Dec 2017 10:23:48 +0100 Subject: [PATCH 4/5] Remove predictors that are unrealiable. gcc/ChangeLog: 2017-12-28 Martin Liska <mli...@suse.cz> * predict.c (return_prediction): Do not predict PRED_NEGATIVE_RETURN. (tree_bb_level_predictions): Do not predict PRED_RECURSIVE_CALL. (tree_estimate_probability_bb): Do not predict PRED_POLYMORPHIC_CALL and PRED_INDIR_CALL. * predict.def (PRED_INDIR_CALL): Remove unused predictors. (PRED_POLYMORPHIC_CALL): Likewise. (PRED_RECURSIVE_CALL): Likewise. (PRED_NEGATIVE_RETURN): Likewise. --- gcc/predict.c | 17 ++--------------- gcc/predict.def | 13 ------------- 2 files changed, 2 insertions(+), 28 deletions(-) diff --git a/gcc/predict.c b/gcc/predict.c index 51fd14205c2..f53724792e9 100644 --- a/gcc/predict.c +++ b/gcc/predict.c @@ -2632,14 +2632,6 @@ return_prediction (tree val, enum prediction *prediction) } else if (INTEGRAL_TYPE_P (TREE_TYPE (val))) { - /* Negative return values are often used to indicate - errors. */ - if (TREE_CODE (val) == INTEGER_CST - && tree_int_cst_sgn (val) < 0) - { - *prediction = NOT_TAKEN; - return PRED_NEGATIVE_RETURN; - } /* Constant return values seems to be commonly taken. Zero/one often represent booleans so exclude them from the heuristics. */ @@ -2820,9 +2812,6 @@ tree_bb_level_predictions (void) DECL_ATTRIBUTES (decl))) predict_paths_leading_to (bb, PRED_COLD_FUNCTION, NOT_TAKEN); - if (decl && recursive_call_p (current_function_decl, decl)) - predict_paths_leading_to (bb, PRED_RECURSIVE_CALL, - NOT_TAKEN); } else if (gimple_code (stmt) == GIMPLE_PREDICT) { @@ -2880,12 +2869,10 @@ tree_estimate_probability_bb (basic_block bb, bool local_only) something exceptional. */ && gimple_has_side_effects (stmt)) { + /* Consider just normal function calls, skip indirect and + polymorphic calls as these tend to be unreliable. */ 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, NOT_TAKEN); - else - predict_edge_def (e, PRED_INDIR_CALL, TAKEN); break; } } diff --git a/gcc/predict.def b/gcc/predict.def index fe72080d5bd..7291650d237 100644 --- a/gcc/predict.def +++ b/gcc/predict.def @@ -118,16 +118,6 @@ 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) -/* 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 (86), 0) -DEF_PREDICTOR (PRED_POLYMORPHIC_CALL, "polymorphic call", HITRATE (59), 0) - -/* Recursive calls are usually not taken or the function will recurse - indefinitely. */ -DEF_PREDICTOR (PRED_RECURSIVE_CALL, "recursive call", HITRATE (75), 0) - /* Branch causing function to terminate is probably not taken. */ DEF_PREDICTOR (PRED_TREE_EARLY_RETURN, "early return (on trees)", HITRATE (66), 0) @@ -138,9 +128,6 @@ DEF_PREDICTOR (PRED_GOTO, "goto", HITRATE (66), 0) /* Branch ending with return constant is probably not taken. */ DEF_PREDICTOR (PRED_CONST_RETURN, "const return", HITRATE (65), 0) -/* Branch ending with return negative constant is probably not taken. */ -DEF_PREDICTOR (PRED_NEGATIVE_RETURN, "negative return", HITRATE (98), 0) - /* Branch ending with return; is probably not taken */ DEF_PREDICTOR (PRED_NULL_RETURN, "null return", HITRATE (71), 0) -- 2.14.3