Currently get_most_common_single_value could only return the max hist <value, count>, add two paramter to enable this function return kth value if needed.
gcc/ChangeLog: 2019-07-15 Xiong Hu Luo <luo...@linux.ibm.com> * value-prof.c (get_most_common_single_value): Add input params k_th and k, return the k_th <value, count> if k_th is true. * value-prof.h (get_most_common_single_value): Add input params k_th and k, default to false. --- gcc/value-prof.c | 16 ++++++++++++---- gcc/value-prof.h | 7 +++---- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/gcc/value-prof.c b/gcc/value-prof.c index 32e6ddd8165..e1a3e0bd4b5 100644 --- a/gcc/value-prof.c +++ b/gcc/value-prof.c @@ -719,9 +719,9 @@ gimple_divmod_fixed_value (gassign *stmt, tree value, profile_probability prob, bool get_most_common_single_value (gimple *stmt, const char *counter_type, - histogram_value hist, - gcov_type *value, gcov_type *count, - gcov_type *all) + histogram_value hist, gcov_type *value, + gcov_type *count, gcov_type *all, bool k_th, + unsigned k) { if (hist->hvalue.counters[2] == -1) return false; @@ -743,7 +743,15 @@ get_most_common_single_value (gimple *stmt, const char *counter_type, *all = read_all; - if (c > *count) + /* Return the kth value in hist instead of the max value for indirect + multiple call usage. */ + if (k_th && i == k) + { + *value = v; + *count = c; + break; + } + else if (c > *count) { *value = v; *count = c; diff --git a/gcc/value-prof.h b/gcc/value-prof.h index ca846d08cbd..0a064a71f7d 100644 --- a/gcc/value-prof.h +++ b/gcc/value-prof.h @@ -90,10 +90,9 @@ void stringop_block_profile (gimple *, unsigned int *, HOST_WIDE_INT *); gcall *gimple_ic (gcall *, struct cgraph_node *, profile_probability); bool check_ic_target (gcall *, struct cgraph_node *); bool get_most_common_single_value (gimple *stmt, const char *counter_type, - histogram_value hist, - gcov_type *value, gcov_type *count, - gcov_type *all); - + histogram_value hist, gcov_type *value, + gcov_type *count, gcov_type *all, + bool k_th = false, unsigned k = 0); /* In tree-profile.c. */ extern void gimple_init_gcov_profiler (void); -- 2.22.0.428.g6d5b264208