> 2020-01-22  Martin Liska  <mli...@suse.cz>
> 
>       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
> 

Reply via email to