diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 29 | ||||
-rw-r--r-- | gcc/gcov-counter.def | 4 | ||||
-rw-r--r-- | gcc/gcov-io.h | 7 | ||||
-rw-r--r-- | gcc/profile.c | 4 | ||||
-rw-r--r-- | gcc/tree-profile.c | 31 | ||||
-rw-r--r-- | gcc/value-prof.c | 35 | ||||
-rw-r--r-- | gcc/value-prof.h | 6 |
7 files changed, 71 insertions, 45 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 <mliska@suse.cz> + + * 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 <ebotcazou@adacore.com> * 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); |