Hi, This patch adjusts the single target indirect call promotion heuristics. (1) it uses bb counts (bb_all), instead of count "all" which only counts the targets with the same modules as the caller. (becaue __gcov_indirect_call_callee is file scope statics). Using overall bb counts makes more sense here. (2) use a prameter option to control the threshold. (3) change the default threshold from 75% to 67%.
Tested with google internal benchmarks and gcc regression test. Thanks, -Rong 2013-01-04 Rong Xu <x...@google.com> * gcc/value-prof.c (gimple_ic_transform_single_targ): adjust the single_target i_call promotion heuristics. * gcc/params.def.h: Add new parameter options. Index: gcc/value-prof.c =================================================================== --- gcc/value-prof.c (revision 194916) +++ gcc/value-prof.c (working copy) @@ -1491,16 +1491,20 @@ gimple_ic_transform_single_targ (gimple stmt, hist gcov_type prob; gimple modify; struct cgraph_node *direct_call; + int perc_threshold, count_threshold; val = histogram->hvalue.counters [0]; count = histogram->hvalue.counters [1]; all = histogram->hvalue.counters [2]; gimple_remove_histogram_value (cfun, stmt, histogram); + bb_all = gimple_bb (stmt)->count; - if (4 * count <= 3 * all) + perc_threshold = PARAM_VALUE (PARAM_SINGLE_ICALL_PROMOTE_PERCENT_THRESHOLD); + count_threshold = PARAM_VALUE (PARAM_SINGLE_ICALL_PROMOTE_COUNT_THRESHOLD); + + if (100 * count < bb_all * perc_threshold || count < count_threshold) return false; - bb_all = gimple_bb (stmt)->count; /* The order of CHECK_COUNTER calls is important - since check_counter can correct the third parameter and we want to make count <= all <= bb_all. */ @@ -1508,6 +1512,7 @@ gimple_ic_transform_single_targ (gimple stmt, hist || check_counter (stmt, "ic", &count, &all, all)) return false; + all = bb_all; if (all > 0) prob = (count * REG_BR_PROB_BASE + all / 2) / all; else Index: gcc/params.def =================================================================== --- gcc/params.def (revision 194916) +++ gcc/params.def (working copy) @@ -907,6 +907,7 @@ DEFPARAM (PARAM_LOOP_INVARIANT_MAX_BBS_IN_LOOP, /* Promote indirect call to conditional direct call only when the percentage of the target count over the total indirect call count is no smaller than the threshold. */ +/* For multi-targ indirect_call. */ DEFPARAM (PARAM_ICALL_PROMOTE_PERCENT_THRESHOLD, "icall-promote-target-percent-threshold", "percentage threshold for direct call promotion" @@ -919,6 +920,19 @@ DEFPARAM (PARAM_ICALL_PROMOTE_COUNT_THRESHOLD, " of a callee target", 1, 0, 0) +/* For single-targ indirect_call. */ +DEFPARAM (PARAM_SINGLE_ICALL_PROMOTE_PERCENT_THRESHOLD, + "single_icall-promote-target-percent-threshold", + "percentage threshold for direct call promotion" + " of a callee target", + 67, 0, 100) + +DEFPARAM (PARAM_SINGLE_ICALL_PROMOTE_COUNT_THRESHOLD, + "single_icall-promote-target_count-threshold", + "call count threshold for direct call promotion" + " of a callee target", + 1, 0, 0) + /* 0: do not always inline icall target: other value: always inline icall target when call count exceeds this value. -- This patch is available for review at http://codereview.appspot.com/7059044