aboutsummaryrefslogtreecommitdiff
path: root/libgcc/libgcov-profiler.c
diff options
context:
space:
mode:
authorMartin Liska <mliska@suse.cz>2020-01-22 12:08:11 +0100
committerMartin Liska <mliska@suse.cz>2020-01-22 12:08:11 +0100
commit5f32f9cf13f99f6295591927950aaf98aa8dba91 (patch)
tree59ab45c6e2d886178d1ca9e17317ffdc1c043c31 /libgcc/libgcov-profiler.c
parentf96af171bee93486896407ccad0e1e4dc200bc0c (diff)
downloadgcc-5f32f9cf13f99f6295591927950aaf98aa8dba91.zip
gcc-5f32f9cf13f99f6295591927950aaf98aa8dba91.tar.gz
gcc-5f32f9cf13f99f6295591927950aaf98aa8dba91.tar.bz2
Smart relaxation of TOP N counter.
PR tree-optimization/92924 * profile.c (compute_value_histograms): Divide all counter values. PR tree-optimization/92924 * libgcov-driver.c (prune_topn_counter): New. (prune_counters): Likewise. (dump_one_gcov): Prune a run-time counter. * libgcov-profiler.c (__gcov_topn_values_profiler_body): For a known value, add GCOV_TOPN_VALUES to value. Otherwise, decrement all counters by one.
Diffstat (limited to 'libgcc/libgcov-profiler.c')
-rw-r--r--libgcc/libgcov-profiler.c30
1 files changed, 14 insertions, 16 deletions
diff --git a/libgcc/libgcov-profiler.c b/libgcc/libgcov-profiler.c
index 9417904..f45ef49 100644
--- a/libgcc/libgcov-profiler.c
+++ b/libgcc/libgcov-profiler.c
@@ -119,37 +119,35 @@ __gcov_topn_values_profiler_body (gcov_type *counters, gcov_type value,
++counters;
- /* We have GCOV_TOPN_VALUES as we can keep multiple values
- next to each other. */
- unsigned sindex = 0;
-
for (unsigned i = 0; i < GCOV_TOPN_VALUES; i++)
{
if (value == counters[2 * i])
{
if (use_atomic)
- __atomic_fetch_add (&counters[2 * i + 1], 1, __ATOMIC_RELAXED);
+ __atomic_fetch_add (&counters[2 * i + 1], GCOV_TOPN_VALUES,
+ __ATOMIC_RELAXED);
else
- counters[2 * i + 1]++;
+ counters[2 * i + 1] += GCOV_TOPN_VALUES;
return;
}
- else if (counters[2 * i + 1] == 0)
+ else if (counters[2 * i + 1] <= 0)
{
/* We found an empty slot. */
counters[2 * i] = value;
- counters[2 * i + 1] = 1;
+ counters[2 * i + 1] = GCOV_TOPN_VALUES;
return;
}
-
- if (counters[2 * i + 1] < counters[2 * sindex + 1])
- sindex = i;
}
- /* We haven't found an empty slot, then decrement the smallest. */
- if (use_atomic)
- __atomic_fetch_sub (&counters[2 * sindex + 1], 1, __ATOMIC_RELAXED);
- else
- counters[2 * sindex + 1]--;
+ /* We haven't found an empty slot, then decrement all
+ counter values by one. */
+ for (unsigned i = 0; i < GCOV_TOPN_VALUES; i++)
+ {
+ if (use_atomic)
+ __atomic_fetch_sub (&counters[2 * i + 1], 1, __ATOMIC_RELAXED);
+ else
+ counters[2 * i + 1]--;
+ }
}
#ifdef L_gcov_topn_values_profiler