diff options
author | Martin Liska <mliska@suse.cz> | 2020-01-22 13:40:12 +0100 |
---|---|---|
committer | Martin Liska <mliska@suse.cz> | 2020-01-22 13:40:12 +0100 |
commit | 7491c17fe01d8cf116f645532d46120029b26408 (patch) | |
tree | 37104109f9c68904d0fe7fcb04f4afd6fb790685 /libgcc/libgcov-profiler.c | |
parent | 9c4fb56578e0a66ec222e58bb89c1e8bc742ef5e (diff) |
Fix TOP N counter update.
PR tree-optimization/92924
* libgcov-profiler.c (__gcov_topn_values_profiler_body): First
try to find an existing value, then find an empty slot
if not found.
Diffstat (limited to 'libgcc/libgcov-profiler.c')
-rw-r--r-- | libgcc/libgcov-profiler.c | 46 |
1 files changed, 24 insertions, 22 deletions
diff --git a/libgcc/libgcov-profiler.c b/libgcc/libgcov-profiler.c index f45ef498a6e..58784d18477 100644 --- a/libgcc/libgcov-profiler.c +++ b/libgcc/libgcov-profiler.c @@ -119,35 +119,37 @@ __gcov_topn_values_profiler_body (gcov_type *counters, gcov_type value, ++counters; + /* First try to find an existing value. */ + int empty_counter = -1; + for (unsigned i = 0; i < GCOV_TOPN_VALUES; i++) + if (value == counters[2 * i]) + { + if (use_atomic) + __atomic_fetch_add (&counters[2 * i + 1], GCOV_TOPN_VALUES, + __ATOMIC_RELAXED); + else + counters[2 * i + 1] += GCOV_TOPN_VALUES; + return; + } + else if (counters[2 * i + 1] <= 0) + empty_counter = i; + + /* Find an empty slot for a new value. */ + if (empty_counter != -1) { - if (value == counters[2 * i]) - { - if (use_atomic) - __atomic_fetch_add (&counters[2 * i + 1], GCOV_TOPN_VALUES, - __ATOMIC_RELAXED); - else - counters[2 * i + 1] += GCOV_TOPN_VALUES; - return; - } - else if (counters[2 * i + 1] <= 0) - { - /* We found an empty slot. */ - counters[2 * i] = value; - counters[2 * i + 1] = GCOV_TOPN_VALUES; - return; - } + counters[2 * empty_counter] = value; + counters[2 * empty_counter + 1] = GCOV_TOPN_VALUES; + return; } /* 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]--; - } + if (use_atomic) + __atomic_fetch_sub (&counters[2 * i + 1], 1, __ATOMIC_RELAXED); + else + counters[2 * i + 1]--; } #ifdef L_gcov_topn_values_profiler |