From: Martin Liska Date: Wed, 22 Jan 2020 12:40:12 +0000 (+0100) Subject: Fix TOP N counter update. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=7491c17fe01d8cf116f645532d46120029b26408;p=gcc.git 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. --- diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog index 441c8f0ccf1..76c99465529 100644 --- a/libgcc/ChangeLog +++ b/libgcc/ChangeLog @@ -1,3 +1,10 @@ +2020-01-22 Martin Liska + + 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. + 2020-01-22 Martin Liska PR tree-optimization/92924 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