From 596341c741a4a746497a1da8322fce0ad625e26b Mon Sep 17 00:00:00 2001 From: Martin Liska Date: Wed, 3 Jul 2019 14:42:23 +0200 Subject: Rename SINGE_VALUE to TOPN_VALUES counters. 2019-07-03 Martin Liska * gcov-counter.def (GCOV_COUNTER_V_SINGLE): Remove. (GCOV_COUNTER_V_TOPN): New. (GCOV_COUNTER_V_INDIR): Use _topn. * gcov-io.h (GCOV_DISK_SINGLE_VALUES): Remove. (GCOV_TOPN_VALUES): New. (GCOV_SINGLE_VALUE_COUNTERS): Remove. (GCOV_TOPN_VALUES_COUNTERS): New. * profile.c (instrument_values): Use HIST_TYPE_TOPN_VALUES. * tree-profile.c: (gimple_init_gcov_profiler): Rename variables from one_value to topn_values. (gimple_gen_one_value_profiler): Remove. (gimple_gen_topn_values_profiler): New function. * value-prof.c (dump_histogram_value): Use TOPN_VALUES names instead of SINGLE_VALUE. (stream_out_histogram_value): Likewise. (stream_in_histogram_value): Likewise. (get_most_common_single_value): Likewise. (gimple_divmod_fixed_value_transform): Likewise. (gimple_stringops_transform): Likewise. (gimple_divmod_values_to_profile): Likewise. (gimple_stringops_values_to_profile): Likewise. (gimple_find_values_to_profile): Likewise. * value-prof.h (enum hist_type): Rename to TOPN. (gimple_gen_one_value_profiler): Remove. (gimple_gen_topn_values_profiler): New. 2019-07-03 Martin Liska * Makefile.in: Use topn_values instead of one_value names. * libgcov-merge.c (__gcov_merge_single): Move to ... (__gcov_merge_topn): ... this. (merge_single_value_set): Move to ... (merge_topn_values_set): ... this. * libgcov-profiler.c (__gcov_one_value_profiler_body): Move to ... (__gcov_topn_values_profiler_body): ... this. (__gcov_one_value_profiler_v2): Move to ... (__gcov_topn_values_profiler): ... this. (__gcov_one_value_profiler_v2_atomic): Move to ... (__gcov_topn_values_profiler_atomic): ... this. (__gcov_indirect_call_profiler_v4): Remove. * libgcov-util.c (__gcov_single_counter_op): Move to ... (__gcov_topn_counter_op): ... this. * libgcov.h (L_gcov_merge_single): Remove. (L_gcov_merge_topn): New. (__gcov_merge_single): Remove. (__gcov_merge_topn): New. (__gcov_one_value_profiler_v2): Move to .. (__gcov_topn_values_profiler): ... this. (__gcov_one_value_profiler_v2_atomic): Move to ... (__gcov_topn_values_profiler_atomic): ... this. From-SVN: r273005 --- gcc/ChangeLog | 29 +++++++++++++++++++++++++++++ gcc/gcov-counter.def | 4 ++-- gcc/gcov-io.h | 7 +++---- gcc/profile.c | 4 ++-- gcc/tree-profile.c | 31 ++++++++++++++++--------------- gcc/value-prof.c | 35 ++++++++++++++++------------------- gcc/value-prof.h | 6 +++--- libgcc/ChangeLog | 26 ++++++++++++++++++++++++++ libgcc/Makefile.in | 6 +++--- libgcc/libgcov-merge.c | 30 +++++++++++++++--------------- libgcc/libgcov-profiler.c | 30 ++++++++++++------------------ libgcc/libgcov-util.c | 6 +++--- libgcc/libgcov.h | 10 +++++----- 13 files changed, 135 insertions(+), 89 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 154e336..579463e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,32 @@ +2019-07-03 Martin Liska + + * gcov-counter.def (GCOV_COUNTER_V_SINGLE): Remove. + (GCOV_COUNTER_V_TOPN): New. + (GCOV_COUNTER_V_INDIR): Use _topn. + * gcov-io.h (GCOV_DISK_SINGLE_VALUES): Remove. + (GCOV_TOPN_VALUES): New. + (GCOV_SINGLE_VALUE_COUNTERS): Remove. + (GCOV_TOPN_VALUES_COUNTERS): New. + * profile.c (instrument_values): Use HIST_TYPE_TOPN_VALUES. + * tree-profile.c: + (gimple_init_gcov_profiler): Rename variables from one_value + to topn_values. + (gimple_gen_one_value_profiler): Remove. + (gimple_gen_topn_values_profiler): New function. + * value-prof.c (dump_histogram_value): Use TOPN_VALUES + names instead of SINGLE_VALUE. + (stream_out_histogram_value): Likewise. + (stream_in_histogram_value): Likewise. + (get_most_common_single_value): Likewise. + (gimple_divmod_fixed_value_transform): Likewise. + (gimple_stringops_transform): Likewise. + (gimple_divmod_values_to_profile): Likewise. + (gimple_stringops_values_to_profile): Likewise. + (gimple_find_values_to_profile): Likewise. + * value-prof.h (enum hist_type): Rename to TOPN. + (gimple_gen_one_value_profiler): Remove. + (gimple_gen_topn_values_profiler): New. + 2019-07-03 Eric Botcazou * dwarf2out.c (add_scalar_info): Add back refererence to existing DIE diff --git a/gcc/gcov-counter.def b/gcc/gcov-counter.def index b0596c8..1a2cbb2 100644 --- a/gcc/gcov-counter.def +++ b/gcc/gcov-counter.def @@ -36,10 +36,10 @@ DEF_GCOV_COUNTER(GCOV_COUNTER_V_INTERVAL, "interval", _add) DEF_GCOV_COUNTER(GCOV_COUNTER_V_POW2, "pow2", _add) /* The most common value of expression. */ -DEF_GCOV_COUNTER(GCOV_COUNTER_V_SINGLE, "single", _single) +DEF_GCOV_COUNTER(GCOV_COUNTER_V_TOPN, "topn", _topn) /* The most common indirect address. */ -DEF_GCOV_COUNTER(GCOV_COUNTER_V_INDIR, "indirect_call", _single) +DEF_GCOV_COUNTER(GCOV_COUNTER_V_INDIR, "indirect_call", _topn) /* Compute average value passed to the counter. */ DEF_GCOV_COUNTER(GCOV_COUNTER_AVERAGE, "average", _add) diff --git a/gcc/gcov-io.h b/gcc/gcov-io.h index 0f2905c..7df578f 100644 --- a/gcc/gcov-io.h +++ b/gcc/gcov-io.h @@ -266,12 +266,11 @@ GCOV_COUNTERS #define GCOV_N_VALUE_COUNTERS \ (GCOV_LAST_VALUE_COUNTER - GCOV_FIRST_VALUE_COUNTER + 1) -/* Number of single value histogram values that live - on disk representation. */ -#define GCOV_DISK_SINGLE_VALUES 4 +/* Number of top N value histogram. */ +#define GCOV_TOPN_VALUES 4 /* Total number of single value counters. */ -#define GCOV_SINGLE_VALUE_COUNTERS (2 * GCOV_DISK_SINGLE_VALUES + 1) +#define GCOV_TOPN_VALUES_COUNTERS (2 * GCOV_TOPN_VALUES + 1) /* Convert a counter index to a tag. */ #define GCOV_TAG_FOR_COUNTER(COUNT) \ diff --git a/gcc/profile.c b/gcc/profile.c index 9aff9ef..e3f8c55 100644 --- a/gcc/profile.c +++ b/gcc/profile.c @@ -167,8 +167,8 @@ instrument_values (histogram_values values) gimple_gen_pow2_profiler (hist, t, 0); break; - case HIST_TYPE_SINGLE_VALUE: - gimple_gen_one_value_profiler (hist, t, 0); + case HIST_TYPE_TOPN_VALUES: + gimple_gen_topn_values_profiler (hist, t, 0); break; case HIST_TYPE_INDIR_CALL: diff --git a/gcc/tree-profile.c b/gcc/tree-profile.c index 5ca4c3e..554a8c9 100644 --- a/gcc/tree-profile.c +++ b/gcc/tree-profile.c @@ -60,7 +60,7 @@ along with GCC; see the file COPYING3. If not see static GTY(()) tree gcov_type_node; static GTY(()) tree tree_interval_profiler_fn; static GTY(()) tree tree_pow2_profiler_fn; -static GTY(()) tree tree_one_value_profiler_fn; +static GTY(()) tree tree_topn_values_profiler_fn; static GTY(()) tree tree_indirect_call_profiler_fn; static GTY(()) tree tree_average_profiler_fn; static GTY(()) tree tree_ior_profiler_fn; @@ -117,7 +117,7 @@ gimple_init_gcov_profiler (void) { tree interval_profiler_fn_type; tree pow2_profiler_fn_type; - tree one_value_profiler_fn_type; + tree topn_values_profiler_fn_type; tree gcov_type_ptr; tree ic_profiler_fn_type; tree average_profiler_fn_type; @@ -161,18 +161,18 @@ gimple_init_gcov_profiler (void) DECL_ATTRIBUTES (tree_pow2_profiler_fn)); /* void (*) (gcov_type *, gcov_type) */ - one_value_profiler_fn_type + topn_values_profiler_fn_type = build_function_type_list (void_type_node, gcov_type_ptr, gcov_type_node, NULL_TREE); - fn_name = concat ("__gcov_one_value_profiler_v2", fn_suffix, NULL); - tree_one_value_profiler_fn = build_fn_decl (fn_name, - one_value_profiler_fn_type); + fn_name = concat ("__gcov_topn_values_profiler", fn_suffix, NULL); + tree_topn_values_profiler_fn + = build_fn_decl (fn_name, topn_values_profiler_fn_type); - TREE_NOTHROW (tree_one_value_profiler_fn) = 1; - DECL_ATTRIBUTES (tree_one_value_profiler_fn) + TREE_NOTHROW (tree_topn_values_profiler_fn) = 1; + DECL_ATTRIBUTES (tree_topn_values_profiler_fn) = tree_cons (get_identifier ("leaf"), NULL, - DECL_ATTRIBUTES (tree_one_value_profiler_fn)); + DECL_ATTRIBUTES (tree_topn_values_profiler_fn)); init_ic_make_global_vars (); @@ -226,7 +226,7 @@ gimple_init_gcov_profiler (void) late, we need to initialize them by hand. */ DECL_ASSEMBLER_NAME (tree_interval_profiler_fn); DECL_ASSEMBLER_NAME (tree_pow2_profiler_fn); - DECL_ASSEMBLER_NAME (tree_one_value_profiler_fn); + DECL_ASSEMBLER_NAME (tree_topn_values_profiler_fn); DECL_ASSEMBLER_NAME (tree_indirect_call_profiler_fn); DECL_ASSEMBLER_NAME (tree_average_profiler_fn); DECL_ASSEMBLER_NAME (tree_ior_profiler_fn); @@ -334,12 +334,13 @@ gimple_gen_pow2_profiler (histogram_value value, unsigned tag, unsigned base) gsi_insert_before (&gsi, call, GSI_NEW_STMT); } -/* Output instructions as GIMPLE trees for code to find the most common value. - VALUE is the expression whose value is profiled. TAG is the tag of the - section for counters, BASE is offset of the counter position. */ +/* Output instructions as GIMPLE trees for code to find the most N common + values. VALUE is the expression whose value is profiled. TAG is the tag + of the section for counters, BASE is offset of the counter position. */ void -gimple_gen_one_value_profiler (histogram_value value, unsigned tag, unsigned base) +gimple_gen_topn_values_profiler (histogram_value value, unsigned tag, + unsigned base) { gimple *stmt = value->hvalue.stmt; gimple_stmt_iterator gsi = gsi_for_stmt (stmt); @@ -350,7 +351,7 @@ gimple_gen_one_value_profiler (histogram_value value, unsigned tag, unsigned bas ref_ptr = force_gimple_operand_gsi (&gsi, ref_ptr, true, NULL_TREE, true, GSI_SAME_STMT); val = prepare_instrumented_value (&gsi, value); - call = gimple_build_call (tree_one_value_profiler_fn, 2, ref_ptr, val); + call = gimple_build_call (tree_topn_values_profiler_fn, 2, ref_ptr, val); gsi_insert_before (&gsi, call, GSI_NEW_STMT); } diff --git a/gcc/value-prof.c b/gcc/value-prof.c index 7289a69..66c4bba 100644 --- a/gcc/value-prof.c +++ b/gcc/value-prof.c @@ -257,23 +257,23 @@ dump_histogram_value (FILE *dump_file, histogram_value hist) (int64_t) hist->hvalue.counters[0]); break; - case HIST_TYPE_SINGLE_VALUE: + case HIST_TYPE_TOPN_VALUES: case HIST_TYPE_INDIR_CALL: if (hist->hvalue.counters) { fprintf (dump_file, - (hist->type == HIST_TYPE_SINGLE_VALUE - ? "Single value counter " : "Indirect call counter")); + (hist->type == HIST_TYPE_TOPN_VALUES + ? "Top N value counter " : "Indirect call counter")); if (hist->hvalue.counters) { fprintf (dump_file, "all: %" PRId64 ", values: ", (int64_t) hist->hvalue.counters[0]); - for (unsigned i = 0; i < GCOV_DISK_SINGLE_VALUES; i++) + for (unsigned i = 0; i < GCOV_TOPN_VALUES; i++) { fprintf (dump_file, "[%" PRId64 ":%" PRId64 "]", (int64_t) hist->hvalue.counters[2 * i + 1], (int64_t) hist->hvalue.counters[2 * i + 2]); - if (i != GCOV_DISK_SINGLE_VALUES - 1) + if (i != GCOV_TOPN_VALUES - 1) fprintf (dump_file, ", "); } fprintf (dump_file, ".\n"); @@ -331,7 +331,7 @@ stream_out_histogram_value (struct output_block *ob, histogram_value hist) /* When user uses an unsigned type with a big value, constant converted to gcov_type (a signed type) can be negative. */ gcov_type value = hist->hvalue.counters[i]; - if (hist->type == HIST_TYPE_SINGLE_VALUE && i > 0) + if (hist->type == HIST_TYPE_TOPN_VALUES && i > 0) ; else gcc_assert (value >= 0); @@ -374,9 +374,9 @@ stream_in_histogram_value (struct lto_input_block *ib, gimple *stmt) ncounters = 2; break; - case HIST_TYPE_SINGLE_VALUE: + case HIST_TYPE_TOPN_VALUES: case HIST_TYPE_INDIR_CALL: - ncounters = GCOV_SINGLE_VALUE_COUNTERS; + ncounters = GCOV_TOPN_VALUES_COUNTERS; break; case HIST_TYPE_IOR: @@ -713,7 +713,7 @@ gimple_divmod_fixed_value (gassign *stmt, tree value, profile_probability prob, return tmp2; } -/* Return most common value of SINGLE_VALUE histogram. If +/* Return most common value of TOPN_VALUE histogram. If there's a unique value, return true and set VALUE and COUNT arguments. */ @@ -731,7 +731,7 @@ get_most_common_single_value (gimple *stmt, const char *counter_type, gcov_type read_all = hist->hvalue.counters[0]; - for (unsigned i = 0; i < GCOV_DISK_SINGLE_VALUES; i++) + for (unsigned i = 0; i < GCOV_TOPN_VALUES; i++) { gcov_type v = hist->hvalue.counters[2 * i + 1]; gcov_type c = hist->hvalue.counters[2 * i + 2]; @@ -780,7 +780,7 @@ gimple_divmod_fixed_value_transform (gimple_stmt_iterator *si) return false; histogram = gimple_histogram_value_of_type (cfun, stmt, - HIST_TYPE_SINGLE_VALUE); + HIST_TYPE_TOPN_VALUES); if (!histogram) return false; @@ -1654,7 +1654,7 @@ gimple_stringops_transform (gimple_stmt_iterator *gsi) return false; histogram = gimple_histogram_value_of_type (cfun, stmt, - HIST_TYPE_SINGLE_VALUE); + HIST_TYPE_TOPN_VALUES); if (!histogram) return false; @@ -1808,7 +1808,7 @@ gimple_divmod_values_to_profile (gimple *stmt, histogram_values *values) /* Check for the case where the divisor is the same value most of the time. */ values->quick_push (gimple_alloc_histogram_value (cfun, - HIST_TYPE_SINGLE_VALUE, + HIST_TYPE_TOPN_VALUES, stmt, divisor)); /* For mod, check whether it is not often a noop (or replaceable by @@ -1887,7 +1887,7 @@ gimple_stringops_values_to_profile (gimple *gs, histogram_values *values) if (TREE_CODE (blck_size) != INTEGER_CST) { values->safe_push (gimple_alloc_histogram_value (cfun, - HIST_TYPE_SINGLE_VALUE, + HIST_TYPE_TOPN_VALUES, stmt, blck_size)); values->safe_push (gimple_alloc_histogram_value (cfun, HIST_TYPE_AVERAGE, stmt, blck_size)); @@ -1936,12 +1936,9 @@ gimple_find_values_to_profile (histogram_values *values) hist->n_counters = 2; break; - case HIST_TYPE_SINGLE_VALUE: - hist->n_counters = GCOV_SINGLE_VALUE_COUNTERS; - break; - + case HIST_TYPE_TOPN_VALUES: case HIST_TYPE_INDIR_CALL: - hist->n_counters = GCOV_SINGLE_VALUE_COUNTERS; + hist->n_counters = GCOV_TOPN_VALUES_COUNTERS; break; case HIST_TYPE_TIME_PROFILE: diff --git a/gcc/value-prof.h b/gcc/value-prof.h index 25b03f7..9f69d7d 100644 --- a/gcc/value-prof.h +++ b/gcc/value-prof.h @@ -26,8 +26,7 @@ enum hist_type HIST_TYPE_INTERVAL, /* Measures histogram of values inside a specified interval. */ HIST_TYPE_POW2, /* Histogram of power of 2 values. */ - HIST_TYPE_SINGLE_VALUE, /* Tries to identify the value that is (almost) - always constant. */ + HIST_TYPE_TOPN_VALUES, /* Tries to identify the N most common values. */ HIST_TYPE_INDIR_CALL, /* Tries to identify the function that is (almost) called in indirect call */ HIST_TYPE_AVERAGE, /* Compute average value (sum of all values). */ @@ -101,7 +100,8 @@ extern void gimple_init_gcov_profiler (void); extern void gimple_gen_edge_profiler (int, edge); extern void gimple_gen_interval_profiler (histogram_value, unsigned, unsigned); extern void gimple_gen_pow2_profiler (histogram_value, unsigned, unsigned); -extern void gimple_gen_one_value_profiler (histogram_value, unsigned, unsigned); +extern void gimple_gen_topn_values_profiler (histogram_value, unsigned, + unsigned); extern void gimple_gen_ic_profiler (histogram_value, unsigned, unsigned); extern void gimple_gen_ic_func_profiler (void); extern void gimple_gen_time_profiler (unsigned, unsigned); diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog index 90183dc..d4cbee0 100644 --- a/libgcc/ChangeLog +++ b/libgcc/ChangeLog @@ -1,5 +1,31 @@ 2019-07-03 Martin Liska + * Makefile.in: Use topn_values instead of one_value names. + * libgcov-merge.c (__gcov_merge_single): Move to ... + (__gcov_merge_topn): ... this. + (merge_single_value_set): Move to ... + (merge_topn_values_set): ... this. + * libgcov-profiler.c (__gcov_one_value_profiler_body): Move to + ... + (__gcov_topn_values_profiler_body): ... this. + (__gcov_one_value_profiler_v2): Move to ... + (__gcov_topn_values_profiler): ... this. + (__gcov_one_value_profiler_v2_atomic): Move to ... + (__gcov_topn_values_profiler_atomic): ... this. + (__gcov_indirect_call_profiler_v4): Remove. + * libgcov-util.c (__gcov_single_counter_op): Move to ... + (__gcov_topn_counter_op): ... this. + * libgcov.h (L_gcov_merge_single): Remove. + (L_gcov_merge_topn): New. + (__gcov_merge_single): Remove. + (__gcov_merge_topn): New. + (__gcov_one_value_profiler_v2): Move to .. + (__gcov_topn_values_profiler): ... this. + (__gcov_one_value_profiler_v2_atomic): Move to ... + (__gcov_topn_values_profiler_atomic): ... this. + +2019-07-03 Martin Liska + * libgcov-merge.c (merge_single_value_set): Support N values. * libgcov-profiler.c (__gcov_one_value_profiler_body): Likewise. diff --git a/libgcc/Makefile.in b/libgcc/Makefile.in index e10a197..5608352 100644 --- a/libgcc/Makefile.in +++ b/libgcc/Makefile.in @@ -889,14 +889,14 @@ include $(iterator) # Build libgcov components. -LIBGCOV_MERGE = _gcov_merge_add _gcov_merge_single \ +LIBGCOV_MERGE = _gcov_merge_add _gcov_merge_topn \ _gcov_merge_ior _gcov_merge_time_profile LIBGCOV_PROFILER = _gcov_interval_profiler \ _gcov_interval_profiler_atomic \ _gcov_pow2_profiler \ _gcov_pow2_profiler_atomic \ - _gcov_one_value_profiler_v2 \ - _gcov_one_value_profiler_v2_atomic \ + _gcov_topn_values_profiler \ + _gcov_topn_values_profiler_atomic \ _gcov_average_profiler \ _gcov_average_profiler_atomic \ _gcov_ior_profiler \ diff --git a/libgcc/libgcov-merge.c b/libgcc/libgcov-merge.c index 8436700..15f27ae 100644 --- a/libgcc/libgcov-merge.c +++ b/libgcc/libgcov-merge.c @@ -33,9 +33,9 @@ void __gcov_merge_add (gcov_type *counters __attribute__ ((unused)), unsigned n_counters __attribute__ ((unused))) {} #endif -#ifdef L_gcov_merge_single -void __gcov_merge_single (gcov_type *counters __attribute__ ((unused)), - unsigned n_counters __attribute__ ((unused))) {} +#ifdef L_gcov_merge_topn +void __gcov_merge_topn (gcov_type *counters __attribute__ ((unused)), + unsigned n_counters __attribute__ ((unused))) {} #endif #else @@ -84,10 +84,10 @@ __gcov_merge_time_profile (gcov_type *counters, unsigned n_counters) } #endif /* L_gcov_merge_time_profile */ -#ifdef L_gcov_merge_single +#ifdef L_gcov_merge_topn static void -merge_single_value_set (gcov_type *counters) +merge_topn_values_set (gcov_type *counters) { /* First value is number of total executions of the profiler. */ gcov_type all = gcov_get_counter_ignore_scaling (-1); @@ -95,9 +95,9 @@ merge_single_value_set (gcov_type *counters) ++counters; /* Read all part values. */ - gcov_type read_counters[2 * GCOV_DISK_SINGLE_VALUES]; + gcov_type read_counters[2 * GCOV_TOPN_VALUES]; - for (unsigned i = 0; i < GCOV_DISK_SINGLE_VALUES; i++) + for (unsigned i = 0; i < GCOV_TOPN_VALUES; i++) { read_counters[2 * i] = gcov_get_counter_target (); read_counters[2 * i + 1] = gcov_get_counter_ignore_scaling (-1); @@ -109,13 +109,13 @@ merge_single_value_set (gcov_type *counters) return; } - for (unsigned i = 0; i < GCOV_DISK_SINGLE_VALUES; i++) + for (unsigned i = 0; i < GCOV_TOPN_VALUES; i++) { if (read_counters[2 * i + 1] == 0) return; unsigned j; - for (j = 0; j < GCOV_DISK_SINGLE_VALUES; j++) + for (j = 0; j < GCOV_TOPN_VALUES; j++) { if (counters[2 * j] == read_counters[2 * i]) { @@ -131,7 +131,7 @@ merge_single_value_set (gcov_type *counters) } /* We haven't found a slot, bail out. */ - if (j == GCOV_DISK_SINGLE_VALUES) + if (j == GCOV_TOPN_VALUES) { counters[1] = -1; return; @@ -149,13 +149,13 @@ merge_single_value_set (gcov_type *counters) -- counter */ void -__gcov_merge_single (gcov_type *counters, unsigned n_counters) +__gcov_merge_topn (gcov_type *counters, unsigned n_counters) { - gcc_assert (!(n_counters % GCOV_SINGLE_VALUE_COUNTERS)); + gcc_assert (!(n_counters % GCOV_TOPN_VALUES_COUNTERS)); - for (unsigned i = 0; i < (n_counters / GCOV_SINGLE_VALUE_COUNTERS); i++) - merge_single_value_set (counters + (i * GCOV_SINGLE_VALUE_COUNTERS)); + for (unsigned i = 0; i < (n_counters / GCOV_TOPN_VALUES_COUNTERS); i++) + merge_topn_values_set (counters + (i * GCOV_TOPN_VALUES_COUNTERS)); } -#endif /* L_gcov_merge_single */ +#endif /* L_gcov_merge_topn */ #endif /* inhibit_libc */ diff --git a/libgcc/libgcov-profiler.c b/libgcc/libgcov-profiler.c index 04d6f9c..8f877a9 100644 --- a/libgcc/libgcov-profiler.c +++ b/libgcc/libgcov-profiler.c @@ -106,17 +106,11 @@ __gcov_pow2_profiler_atomic (gcov_type *counters, gcov_type value) #endif -/* Tries to determine the most common value among its inputs. Checks if the - value stored in COUNTERS[0] matches VALUE. If this is the case, COUNTERS[1] - is incremented. If this is not the case and COUNTERS[1] is not zero, - COUNTERS[1] is decremented. Otherwise COUNTERS[1] is set to one and - VALUE is stored to COUNTERS[0]. This algorithm guarantees that if this - function is called more than 50% of the time with one value, this value - will be in COUNTERS[0] in the end. */ +/* Tries to determine N most commons value among its inputs. */ static inline void -__gcov_one_value_profiler_body (gcov_type *counters, gcov_type value, - int use_atomic) +__gcov_topn_values_profiler_body (gcov_type *counters, gcov_type value, + int use_atomic) { if (use_atomic) __atomic_fetch_add (&counters[0], 1, __ATOMIC_RELAXED); @@ -125,11 +119,11 @@ __gcov_one_value_profiler_body (gcov_type *counters, gcov_type value, ++counters; - /* We have GCOV_DISK_SINGLE_VALUES as we can keep multiple values + /* We have GCOV_TOPN_VALUES as we can keep multiple values next to each other. */ unsigned sindex = 0; - for (unsigned i = 0; i < GCOV_DISK_SINGLE_VALUES; i++) + for (unsigned i = 0; i < GCOV_TOPN_VALUES; i++) { if (value == counters[2 * i]) { @@ -158,15 +152,15 @@ __gcov_one_value_profiler_body (gcov_type *counters, gcov_type value, counters[2 * sindex + 1]--; } -#ifdef L_gcov_one_value_profiler_v2 +#ifdef L_gcov_topn_values_profiler void -__gcov_one_value_profiler_v2 (gcov_type *counters, gcov_type value) +__gcov_topn_values_profiler (gcov_type *counters, gcov_type value) { - __gcov_one_value_profiler_body (counters, value, 0); + __gcov_topn_values_profiler_body (counters, value, 0); } #endif -#if defined(L_gcov_one_value_profiler_v2_atomic) && GCOV_SUPPORTS_ATOMIC +#if defined(L_gcov_topn_values_profiler_atomic) && GCOV_SUPPORTS_ATOMIC /* Update one value profilers (COUNTERS) for a given VALUE. @@ -178,9 +172,9 @@ __gcov_one_value_profiler_v2 (gcov_type *counters, gcov_type value) https://gcc.gnu.org/ml/gcc-patches/2016-08/msg00024.html. */ void -__gcov_one_value_profiler_v2_atomic (gcov_type *counters, gcov_type value) +__gcov_topn_values_profiler_atomic (gcov_type *counters, gcov_type value) { - __gcov_one_value_profiler_body (counters, value, 1); + __gcov_topn_values_profiler_body (counters, value, 1); } #endif @@ -214,7 +208,7 @@ __gcov_indirect_call_profiler_v4 (gcov_type value, void* cur_func) if (cur_func == __gcov_indirect_call.callee || (__LIBGCC_VTABLE_USES_DESCRIPTORS__ && *(void **) cur_func == *(void **) __gcov_indirect_call.callee)) - __gcov_one_value_profiler_body (__gcov_indirect_call.counters, value, 0); + __gcov_topn_values_profiler_body (__gcov_indirect_call.counters, value, 0); __gcov_indirect_call.callee = NULL; } diff --git a/libgcc/libgcov-util.c b/libgcc/libgcov-util.c index 94d4575..32b3f82 100644 --- a/libgcc/libgcov-util.c +++ b/libgcc/libgcov-util.c @@ -725,11 +725,11 @@ __gcov_time_profile_counter_op (gcov_type *counters ATTRIBUTE_UNUSED, /* Do nothing. */ } -/* Performing FN upon single counters. */ +/* Performing FN upon TOP N counters. */ static void -__gcov_single_counter_op (gcov_type *counters, unsigned n_counters, - counter_op_fn fn, void *data1, void *data2) +__gcov_topn_counter_op (gcov_type *counters, unsigned n_counters, + counter_op_fn fn, void *data1, void *data2) { unsigned i, n_measures; diff --git a/libgcc/libgcov.h b/libgcc/libgcov.h index 7f31614..30a8a11 100644 --- a/libgcc/libgcov.h +++ b/libgcc/libgcov.h @@ -126,7 +126,7 @@ typedef unsigned gcov_position_t; #define L_gcov 1 #define L_gcov_merge_add 1 -#define L_gcov_merge_single 1 +#define L_gcov_merge_topn 1 #define L_gcov_merge_ior 1 #define L_gcov_merge_time_profile 1 @@ -259,8 +259,8 @@ extern void __gcov_merge_add (gcov_type *, unsigned) ATTRIBUTE_HIDDEN; /* The merge function to select the minimum valid counter value. */ extern void __gcov_merge_time_profile (gcov_type *, unsigned) ATTRIBUTE_HIDDEN; -/* The merge function to choose the most common value. */ -extern void __gcov_merge_single (gcov_type *, unsigned) ATTRIBUTE_HIDDEN; +/* The merge function to choose the most common N values. */ +extern void __gcov_merge_topn (gcov_type *, unsigned) ATTRIBUTE_HIDDEN; /* The merge function that just ors the counters together. */ extern void __gcov_merge_ior (gcov_type *, unsigned) ATTRIBUTE_HIDDEN; @@ -271,8 +271,8 @@ extern void __gcov_interval_profiler_atomic (gcov_type *, gcov_type, int, unsigned); extern void __gcov_pow2_profiler (gcov_type *, gcov_type); extern void __gcov_pow2_profiler_atomic (gcov_type *, gcov_type); -extern void __gcov_one_value_profiler_v2 (gcov_type *, gcov_type); -extern void __gcov_one_value_profiler_v2_atomic (gcov_type *, gcov_type); +extern void __gcov_topn_values_profiler (gcov_type *, gcov_type); +extern void __gcov_topn_values_profiler_atomic (gcov_type *, gcov_type); extern void __gcov_indirect_call_profiler_v4 (gcov_type, void *); extern void __gcov_time_profiler (gcov_type *); extern void __gcov_time_profiler_atomic (gcov_type *); -- cgit v1.1