[gcc(refs/users/marxin/heads/marxin-gcc-benchmark-branch)] Fix TOP N counter update.

Martin Liska marxin@gcc.gnu.org
Mon Mar 30 10:21:48 GMT 2020


https://gcc.gnu.org/g:7491c17fe01d8cf116f645532d46120029b26408

commit 7491c17fe01d8cf116f645532d46120029b26408
Author: Martin Liska <mliska@suse.cz>
Date:   Wed Jan 22 13:40:12 2020 +0100

    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:
---
 libgcc/ChangeLog          |  7 +++++++
 libgcc/libgcov-profiler.c | 46 ++++++++++++++++++++++++----------------------
 2 files changed, 31 insertions(+), 22 deletions(-)

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  <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
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


More information about the Gcc-cvs mailing list