Hi,
it seems that there is additional bug in merging which caused the extra
0 counts.
The attached patch imprves the stats on gcc dir of profiledbootstrap:

stats for indirect_call:
  total: 9876
  invalid: 705
  tracked values:
    0 values:     7189 times (72.79%)
    1 values:     1890 times (19.14%)
    2 values:       50 times (0.51%)
    3 values:       20 times (0.20%)
    4 values:       22 times (0.22%)

stats for topn:
  total: 1527
  invalid: 150
  tracked values:
    0 values:     1193 times (78.13%)
    1 values:      150 times (9.82%)
    2 values:       16 times (1.05%)
    3 values:        9 times (0.59%)
    4 values:        9 times (0.59%)

to:

stats for indirect_call:
  total: 9876
  invalid: 769
  tracked values:
    0 values:     6289 times (63.68%)
    1 values:     2383 times (24.13%)
    2 values:      293 times (2.97%)
    3 values:      142 times (1.44%)
    4 values:        0 times (0.00%)

stats for topn:
  total: 1527
  invalid: 205
  tracked values:
    0 values:     1038 times (67.98%)
    1 values:      166 times (10.87%)
    2 values:       65 times (4.26%)
    3 values:       51 times (3.34%)
    4 values:        2 times (0.13%)

I plan to commit it tomorrow.
It bootstraped x86_64-linux, regtesting is running.
Stll the number of invalidated counters outnumbers those sucesfully
tracked which are not trivial (0 or 1 val).

libgcc/ChangeLog:

2020-01-24  Jan Hubicka  <hubi...@ucw.cz>

        * libgcov-merge.c (merge_topn_values_set): Fix merging.

diff --git a/libgcc/libgcov-merge.c b/libgcc/libgcov-merge.c
index b658aec46c6..19b8ee72ae9 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;
+           }
        }
     }
 }

Reply via email to