> 2020-01-22 Martin Liska <[email protected]>
>
> 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.
This looks good, one nit below.
> ---
> libgcc/libgcov-profiler.c | 46 ++++++++++++++++++++-------------------
> 1 file changed, 24 insertions(+), 22 deletions(-)
>
> diff --git a/libgcc/libgcov-profiler.c b/libgcc/libgcov-profiler.c
> index f45ef498a6e..506a9b68022 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 == -1)
> + empty_counter = i;
I think you can save an instruction in the loop if you drop "&& empty_counter
== -1"
Thanks!
Honza
> +
> + /* 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.24.1
>