From 7491c17fe01d8cf116f645532d46120029b26408 Mon Sep 17 00:00:00 2001 From: Martin Liska Date: Wed, 22 Jan 2020 13:40:12 +0100 Subject: [PATCH] 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. --- libgcc/ChangeLog | 7 +++++++ libgcc/libgcov-profiler.c | 46 ++++++++++++++++++++++++---------------------- 2 files changed, 31 insertions(+), 22 deletions(-) diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog index 441c8f0..76c9946 100644 --- a/libgcc/ChangeLog +++ b/libgcc/ChangeLog @@ -1,6 +1,13 @@ 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 * libgcov-driver.c (prune_topn_counter): New. (prune_counters): Likewise. (dump_one_gcov): Prune a run-time counter. diff --git a/libgcc/libgcov-profiler.c b/libgcc/libgcov-profiler.c index f45ef49..58784d1 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 -- 2.7.4