From e3fe0070c189e214d51cfc314591b6ffa526fb2f Mon Sep 17 00:00:00 2001
From: Jan Hubicka <jh@suse.cz>
Date: Fri, 24 Jan 2020 12:12:17 +0100
Subject: [PATCH] libgcov: Fix merging of topn [PR92924]

	PR tree-optimization/92924
	* libgcov-merge.c (merge_topn_values_set): Fix merging.
---
 libgcc/libgcov-merge.c | 25 ++++++++++++++++---------
 1 file changed, 16 insertions(+), 9 deletions(-)

diff --git a/libgcc/libgcov-merge.c b/libgcc/libgcov-merge.c
index b658aec46c65..19b8ee72ae99 100644
--- a/libgcc/libgcov-merge.c
+++ b/libgcc/libgcov-merge.c
@@ -112,9 +112,11 @@ merge_topn_values_set (gcov_type *counters)
   for (unsigned i = 0; i < GCOV_TOPN_VALUES; i++)
     {
       if (read_counters[2 * i + 1] == 0)
-	return;
+	continue;
 
       unsigned j;
+      int slot = -1;
+
       for (j = 0; j < GCOV_TOPN_VALUES; j++)
 	{
 	  if (counters[2 * j] == read_counters[2 * i])
@@ -123,18 +125,23 @@ merge_topn_values_set (gcov_type *counters)
 	      break;
 	    }
 	  else if (counters[2 * j + 1] == 0)
-	    {
-	      counters[2 * j] += read_counters[2 * i];
-	      counters[2 * j + 1] += read_counters[2 * i + 1];
-	      break;
-	    }
+	    slot = j;
 	}
 
-      /* We haven't found a slot, bail out.  */
       if (j == GCOV_TOPN_VALUES)
 	{
-	  counters[1] = -1;
-	  return;
+	  if (slot > 0)
+	    {
+	      /* If we found empty slot, add the value.  */
+	      counters[2 * slot] = read_counters[2 * i];
+	      counters[2 * slot + 1] = read_counters[2 * i + 1];
+	    }
+	  else
+	    {
+	      /* We haven't found a slot, bail out.  */
+	      counters[1] = -1;
+	      return;
+	    }
 	}
     }
 }