Fix TOP N counter update.
authorMartin Liska <mliska@suse.cz>
Wed, 22 Jan 2020 12:40:12 +0000 (13:40 +0100)
committerMartin Liska <mliska@suse.cz>
Wed, 22 Jan 2020 12:40:12 +0000 (13:40 +0100)
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
libgcc/libgcov-profiler.c

index 441c8f0ccf17145de45f68e170200f26f8344722..76c994655295dd15befb1a6f560d493d06d21eb8 100644 (file)
@@ -1,3 +1,10 @@
+2020-01-22  Martin Liska  <mliska@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.
+
 2020-01-22  Martin Liska  <mliska@suse.cz>
 
        PR tree-optimization/92924
index f45ef498a6e18790394ec88545cd3e691ddfc77b..58784d18477b84e5b709eb2b42de3f4b669ec921 100644 (file)
@@ -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