[2/2] Rename SINGE_VALUE to TOPN_VALUES counters.

Message ID 92ed1dc9-0ecf-a794-a907-9f5bf9f8017f@suse.cz
State New
Headers show
Series
  • [RFC,PGO+LTO] Missed function specialization + partial devirtualization
Related show

Commit Message

Martin Liška June 20, 2019, 2:46 p.m.
And the second part is rename so that it reflect reality
that single value can actually track multiple values.

Patch can bootstrap on x86_64-linux-gnu and survives regression tests.

Ready to be installed?
Thanks,
Martin

Comments

Martin Liška July 1, 2019, 11:20 a.m. | #1
@Honza: PING^1

On 6/20/19 4:46 PM, Martin Liška wrote:
> And the second part is rename so that it reflect reality

> that single value can actually track multiple values.

> 

> Patch can bootstrap on x86_64-linux-gnu and survives regression tests.

> 

> Ready to be installed?

> Thanks,

> Martin

>
Jan Hubicka July 3, 2019, 9:09 a.m. | #2
> And the second part is rename so that it reflect reality

> that single value can actually track multiple values.

> 

> Patch can bootstrap on x86_64-linux-gnu and survives regression tests.

> 

> Ready to be installed?

> Thanks,

> Martin


> From cc9e93d43941176e92b5821e5a8134a5319a10b4 Mon Sep 17 00:00:00 2001

> From: Martin Liska <mliska@suse.cz>

> Date: Thu, 20 Jun 2019 14:50:23 +0200

> Subject: [PATCH 2/2] Rename SINGE_VALUE to TOPN_VALUES counters.

> 

> gcc/ChangeLog:

> 

> 2019-06-20  Martin Liska  <mliska@suse.cz>

> 

> 	* gcov-counter.def (GCOV_COUNTER_V_SINGLE): Remove.

> 	(GCOV_COUNTER_V_TOPN): New.

> 	(GCOV_COUNTER_V_INDIR): Use _topn.

> 	* gcov-io.h (GCOV_DISK_SINGLE_VALUES): Remove.

> 	(GCOV_TOPN_VALUES): New.

> 	(GCOV_SINGLE_VALUE_COUNTERS): Remove.

> 	(GCOV_TOPN_VALUES_COUNTERS): New.

> 	* profile.c (instrument_values): Use HIST_TYPE_TOPN_VALUES.

> 	* tree-profile.c:

> 	(gimple_init_gcov_profiler): Rename variables from one_value

> 	to topn_values.

> 	(gimple_gen_one_value_profiler): Remove.

> 	(gimple_gen_topn_values_profiler): New function.

> 	* value-prof.c (dump_histogram_value): Use TOPN_VALUES

> 	names instead of SINGLE_VALUE.

> 	(stream_out_histogram_value): Likewise.

> 	(stream_in_histogram_value): Likewise.

> 	(get_most_common_single_value): Likewise.

> 	(gimple_divmod_fixed_value_transform): Likewise.

> 	(gimple_stringops_transform): Likewise.

> 	(gimple_divmod_values_to_profile): Likewise.

> 	(gimple_stringops_values_to_profile): Likewise.

> 	(gimple_find_values_to_profile): Likewise.

> 	* value-prof.h (enum hist_type): Rename to TOPN.

> 	(gimple_gen_one_value_profiler): Remove.

> 	(gimple_gen_topn_values_profiler): New.

> 

> libgcc/ChangeLog:

> 

> 2019-06-20  Martin Liska  <mliska@suse.cz>

> 

> 	* Makefile.in: Use topn_values instead of one_value names.

> 	* libgcov-merge.c (__gcov_merge_single): Move to ...

> 	(__gcov_merge_topn): ... this.

> 	(merge_single_value_set): Move to ...

> 	(merge_topn_values_set): ... this.

> 	* libgcov-profiler.c (__gcov_one_value_profiler_body): Move to

> 	...

> 	(__gcov_topn_values_profiler_body): ... this.

> 	(__gcov_one_value_profiler_v2): Move to ...

> 	(__gcov_topn_values_profiler): ... this.

> 	(__gcov_one_value_profiler_v2_atomic): Move to ...

> 	(__gcov_topn_values_profiler_atomic): ... this.

> 	(__gcov_indirect_call_profiler_v4): Remove.

> 	* libgcov-util.c (__gcov_single_counter_op): Move to ...

> 	(__gcov_topn_counter_op): ... this.

> 	* libgcov.h (L_gcov_merge_single): Remove.

> 	(L_gcov_merge_topn): New.

> 	(__gcov_merge_single): Remove.

> 	(__gcov_merge_topn): New.

> 	(__gcov_one_value_profiler_v2): Move to ..

> 	(__gcov_topn_values_profiler): ... this.

> 	(__gcov_one_value_profiler_v2_atomic): Move to ...

> 	(__gcov_topn_values_profiler_atomic): ... this.


OK,
I would rename the __gcov_topn_values_profiler to _v2 since we had this
function before.

Honza
Martin Liška July 3, 2019, 12:40 p.m. | #3
On 7/3/19 11:09 AM, Jan Hubicka wrote:
> OK,

> I would rename the __gcov_topn_values_profiler to _v2 since we had this

> function before.


It's bit tricky, but we hadn't because I named that *_values_*. We used to
have *_value_* :)

Martin

Patch

From cc9e93d43941176e92b5821e5a8134a5319a10b4 Mon Sep 17 00:00:00 2001
From: Martin Liska <mliska@suse.cz>
Date: Thu, 20 Jun 2019 14:50:23 +0200
Subject: [PATCH 2/2] Rename SINGE_VALUE to TOPN_VALUES counters.

gcc/ChangeLog:

2019-06-20  Martin Liska  <mliska@suse.cz>

	* gcov-counter.def (GCOV_COUNTER_V_SINGLE): Remove.
	(GCOV_COUNTER_V_TOPN): New.
	(GCOV_COUNTER_V_INDIR): Use _topn.
	* gcov-io.h (GCOV_DISK_SINGLE_VALUES): Remove.
	(GCOV_TOPN_VALUES): New.
	(GCOV_SINGLE_VALUE_COUNTERS): Remove.
	(GCOV_TOPN_VALUES_COUNTERS): New.
	* profile.c (instrument_values): Use HIST_TYPE_TOPN_VALUES.
	* tree-profile.c:
	(gimple_init_gcov_profiler): Rename variables from one_value
	to topn_values.
	(gimple_gen_one_value_profiler): Remove.
	(gimple_gen_topn_values_profiler): New function.
	* value-prof.c (dump_histogram_value): Use TOPN_VALUES
	names instead of SINGLE_VALUE.
	(stream_out_histogram_value): Likewise.
	(stream_in_histogram_value): Likewise.
	(get_most_common_single_value): Likewise.
	(gimple_divmod_fixed_value_transform): Likewise.
	(gimple_stringops_transform): Likewise.
	(gimple_divmod_values_to_profile): Likewise.
	(gimple_stringops_values_to_profile): Likewise.
	(gimple_find_values_to_profile): Likewise.
	* value-prof.h (enum hist_type): Rename to TOPN.
	(gimple_gen_one_value_profiler): Remove.
	(gimple_gen_topn_values_profiler): New.

libgcc/ChangeLog:

2019-06-20  Martin Liska  <mliska@suse.cz>

	* Makefile.in: Use topn_values instead of one_value names.
	* libgcov-merge.c (__gcov_merge_single): Move to ...
	(__gcov_merge_topn): ... this.
	(merge_single_value_set): Move to ...
	(merge_topn_values_set): ... this.
	* libgcov-profiler.c (__gcov_one_value_profiler_body): Move to
	...
	(__gcov_topn_values_profiler_body): ... this.
	(__gcov_one_value_profiler_v2): Move to ...
	(__gcov_topn_values_profiler): ... this.
	(__gcov_one_value_profiler_v2_atomic): Move to ...
	(__gcov_topn_values_profiler_atomic): ... this.
	(__gcov_indirect_call_profiler_v4): Remove.
	* libgcov-util.c (__gcov_single_counter_op): Move to ...
	(__gcov_topn_counter_op): ... this.
	* libgcov.h (L_gcov_merge_single): Remove.
	(L_gcov_merge_topn): New.
	(__gcov_merge_single): Remove.
	(__gcov_merge_topn): New.
	(__gcov_one_value_profiler_v2): Move to ..
	(__gcov_topn_values_profiler): ... this.
	(__gcov_one_value_profiler_v2_atomic): Move to ...
	(__gcov_topn_values_profiler_atomic): ... this.
---
 gcc/gcov-counter.def      |  4 ++--
 gcc/gcov-io.h             |  7 +++----
 gcc/profile.c             |  4 ++--
 gcc/tree-profile.c        | 31 ++++++++++++++++---------------
 gcc/value-prof.c          | 35 ++++++++++++++++-------------------
 gcc/value-prof.h          |  6 +++---
 libgcc/Makefile.in        |  6 +++---
 libgcc/libgcov-merge.c    | 30 +++++++++++++++---------------
 libgcc/libgcov-profiler.c | 30 ++++++++++++------------------
 libgcc/libgcov-util.c     |  6 +++---
 libgcc/libgcov.h          | 10 +++++-----
 11 files changed, 80 insertions(+), 89 deletions(-)

diff --git a/gcc/gcov-counter.def b/gcc/gcov-counter.def
index b0596c8dc6b..1a2cbb27b31 100644
--- a/gcc/gcov-counter.def
+++ b/gcc/gcov-counter.def
@@ -36,10 +36,10 @@  DEF_GCOV_COUNTER(GCOV_COUNTER_V_INTERVAL, "interval", _add)
 DEF_GCOV_COUNTER(GCOV_COUNTER_V_POW2, "pow2", _add)
 
 /* The most common value of expression.  */
-DEF_GCOV_COUNTER(GCOV_COUNTER_V_SINGLE, "single", _single)
+DEF_GCOV_COUNTER(GCOV_COUNTER_V_TOPN, "topn", _topn)
 
 /* The most common indirect address.  */
-DEF_GCOV_COUNTER(GCOV_COUNTER_V_INDIR, "indirect_call", _single)
+DEF_GCOV_COUNTER(GCOV_COUNTER_V_INDIR, "indirect_call", _topn)
 
 /* Compute average value passed to the counter.  */
 DEF_GCOV_COUNTER(GCOV_COUNTER_AVERAGE, "average", _add)
diff --git a/gcc/gcov-io.h b/gcc/gcov-io.h
index 0f2905c17ec..7df578f8538 100644
--- a/gcc/gcov-io.h
+++ b/gcc/gcov-io.h
@@ -266,12 +266,11 @@  GCOV_COUNTERS
 #define GCOV_N_VALUE_COUNTERS \
   (GCOV_LAST_VALUE_COUNTER - GCOV_FIRST_VALUE_COUNTER + 1)
 
-/* Number of single value histogram values that live
-   on disk representation.  */
-#define GCOV_DISK_SINGLE_VALUES 4
+/* Number of top N value histogram.  */
+#define GCOV_TOPN_VALUES 4
 
 /* Total number of single value counters.  */
-#define GCOV_SINGLE_VALUE_COUNTERS (2 * GCOV_DISK_SINGLE_VALUES + 1)
+#define GCOV_TOPN_VALUES_COUNTERS (2 * GCOV_TOPN_VALUES + 1)
 
 /* Convert a counter index to a tag.  */
 #define GCOV_TAG_FOR_COUNTER(COUNT)				\
diff --git a/gcc/profile.c b/gcc/profile.c
index 9aff9ef2b21..e3f8c5542be 100644
--- a/gcc/profile.c
+++ b/gcc/profile.c
@@ -167,8 +167,8 @@  instrument_values (histogram_values values)
 	  gimple_gen_pow2_profiler (hist, t, 0);
 	  break;
 
-	case HIST_TYPE_SINGLE_VALUE:
-	  gimple_gen_one_value_profiler (hist, t, 0);
+	case HIST_TYPE_TOPN_VALUES:
+	  gimple_gen_topn_values_profiler (hist, t, 0);
 	  break;
 
  	case HIST_TYPE_INDIR_CALL:
diff --git a/gcc/tree-profile.c b/gcc/tree-profile.c
index 5ca4c3e80b6..554a8c98419 100644
--- a/gcc/tree-profile.c
+++ b/gcc/tree-profile.c
@@ -60,7 +60,7 @@  along with GCC; see the file COPYING3.  If not see
 static GTY(()) tree gcov_type_node;
 static GTY(()) tree tree_interval_profiler_fn;
 static GTY(()) tree tree_pow2_profiler_fn;
-static GTY(()) tree tree_one_value_profiler_fn;
+static GTY(()) tree tree_topn_values_profiler_fn;
 static GTY(()) tree tree_indirect_call_profiler_fn;
 static GTY(()) tree tree_average_profiler_fn;
 static GTY(()) tree tree_ior_profiler_fn;
@@ -117,7 +117,7 @@  gimple_init_gcov_profiler (void)
 {
   tree interval_profiler_fn_type;
   tree pow2_profiler_fn_type;
-  tree one_value_profiler_fn_type;
+  tree topn_values_profiler_fn_type;
   tree gcov_type_ptr;
   tree ic_profiler_fn_type;
   tree average_profiler_fn_type;
@@ -161,18 +161,18 @@  gimple_init_gcov_profiler (void)
 		     DECL_ATTRIBUTES (tree_pow2_profiler_fn));
 
       /* void (*) (gcov_type *, gcov_type)  */
-      one_value_profiler_fn_type
+      topn_values_profiler_fn_type
 	      = build_function_type_list (void_type_node,
 					  gcov_type_ptr, gcov_type_node,
 					  NULL_TREE);
-      fn_name = concat ("__gcov_one_value_profiler_v2", fn_suffix, NULL);
-      tree_one_value_profiler_fn = build_fn_decl (fn_name,
-						  one_value_profiler_fn_type);
+      fn_name = concat ("__gcov_topn_values_profiler", fn_suffix, NULL);
+      tree_topn_values_profiler_fn
+	= build_fn_decl (fn_name, topn_values_profiler_fn_type);
 
-      TREE_NOTHROW (tree_one_value_profiler_fn) = 1;
-      DECL_ATTRIBUTES (tree_one_value_profiler_fn)
+      TREE_NOTHROW (tree_topn_values_profiler_fn) = 1;
+      DECL_ATTRIBUTES (tree_topn_values_profiler_fn)
 	= tree_cons (get_identifier ("leaf"), NULL,
-		     DECL_ATTRIBUTES (tree_one_value_profiler_fn));
+		     DECL_ATTRIBUTES (tree_topn_values_profiler_fn));
 
       init_ic_make_global_vars ();
 
@@ -226,7 +226,7 @@  gimple_init_gcov_profiler (void)
          late, we need to initialize them by hand.  */
       DECL_ASSEMBLER_NAME (tree_interval_profiler_fn);
       DECL_ASSEMBLER_NAME (tree_pow2_profiler_fn);
-      DECL_ASSEMBLER_NAME (tree_one_value_profiler_fn);
+      DECL_ASSEMBLER_NAME (tree_topn_values_profiler_fn);
       DECL_ASSEMBLER_NAME (tree_indirect_call_profiler_fn);
       DECL_ASSEMBLER_NAME (tree_average_profiler_fn);
       DECL_ASSEMBLER_NAME (tree_ior_profiler_fn);
@@ -334,12 +334,13 @@  gimple_gen_pow2_profiler (histogram_value value, unsigned tag, unsigned base)
   gsi_insert_before (&gsi, call, GSI_NEW_STMT);
 }
 
-/* Output instructions as GIMPLE trees for code to find the most common value.
-   VALUE is the expression whose value is profiled.  TAG is the tag of the
-   section for counters, BASE is offset of the counter position.  */
+/* Output instructions as GIMPLE trees for code to find the most N common
+   values.  VALUE is the expression whose value is profiled.  TAG is the tag
+   of the section for counters, BASE is offset of the counter position.  */
 
 void
-gimple_gen_one_value_profiler (histogram_value value, unsigned tag, unsigned base)
+gimple_gen_topn_values_profiler (histogram_value value, unsigned tag,
+				 unsigned base)
 {
   gimple *stmt = value->hvalue.stmt;
   gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
@@ -350,7 +351,7 @@  gimple_gen_one_value_profiler (histogram_value value, unsigned tag, unsigned bas
   ref_ptr = force_gimple_operand_gsi (&gsi, ref_ptr,
 				      true, NULL_TREE, true, GSI_SAME_STMT);
   val = prepare_instrumented_value (&gsi, value);
-  call = gimple_build_call (tree_one_value_profiler_fn, 2, ref_ptr, val);
+  call = gimple_build_call (tree_topn_values_profiler_fn, 2, ref_ptr, val);
   gsi_insert_before (&gsi, call, GSI_NEW_STMT);
 }
 
diff --git a/gcc/value-prof.c b/gcc/value-prof.c
index 7289a698b71..66c4bbaad5c 100644
--- a/gcc/value-prof.c
+++ b/gcc/value-prof.c
@@ -257,23 +257,23 @@  dump_histogram_value (FILE *dump_file, histogram_value hist)
 		 (int64_t) hist->hvalue.counters[0]);
       break;
 
-    case HIST_TYPE_SINGLE_VALUE:
+    case HIST_TYPE_TOPN_VALUES:
     case HIST_TYPE_INDIR_CALL:
       if (hist->hvalue.counters)
 	{
 	  fprintf (dump_file,
-		   (hist->type == HIST_TYPE_SINGLE_VALUE
-		    ? "Single value counter " : "Indirect call counter"));
+		   (hist->type == HIST_TYPE_TOPN_VALUES
+		    ? "Top N value counter " : "Indirect call counter"));
 	  if (hist->hvalue.counters)
 	    {
 	      fprintf (dump_file, "all: %" PRId64 ", values: ",
 		       (int64_t) hist->hvalue.counters[0]);
-	      for (unsigned i = 0; i < GCOV_DISK_SINGLE_VALUES; i++)
+	      for (unsigned i = 0; i < GCOV_TOPN_VALUES; i++)
 		{
 		  fprintf (dump_file, "[%" PRId64 ":%" PRId64 "]",
 			   (int64_t) hist->hvalue.counters[2 * i + 1],
 			   (int64_t) hist->hvalue.counters[2 * i + 2]);
-		  if (i != GCOV_DISK_SINGLE_VALUES - 1)
+		  if (i != GCOV_TOPN_VALUES - 1)
 		    fprintf (dump_file, ", ");
 		}
 	      fprintf (dump_file, ".\n");
@@ -331,7 +331,7 @@  stream_out_histogram_value (struct output_block *ob, histogram_value hist)
       /* When user uses an unsigned type with a big value, constant converted
 	 to gcov_type (a signed type) can be negative.  */
       gcov_type value = hist->hvalue.counters[i];
-      if (hist->type == HIST_TYPE_SINGLE_VALUE && i > 0)
+      if (hist->type == HIST_TYPE_TOPN_VALUES && i > 0)
 	;
       else
 	gcc_assert (value >= 0);
@@ -374,9 +374,9 @@  stream_in_histogram_value (struct lto_input_block *ib, gimple *stmt)
 	  ncounters = 2;
 	  break;
 
-	case HIST_TYPE_SINGLE_VALUE:
+	case HIST_TYPE_TOPN_VALUES:
 	case HIST_TYPE_INDIR_CALL:
-	  ncounters = GCOV_SINGLE_VALUE_COUNTERS;
+	  ncounters = GCOV_TOPN_VALUES_COUNTERS;
 	  break;
 
 	case HIST_TYPE_IOR:
@@ -713,7 +713,7 @@  gimple_divmod_fixed_value (gassign *stmt, tree value, profile_probability prob,
   return tmp2;
 }
 
-/* Return most common value of SINGLE_VALUE histogram.  If
+/* Return most common value of TOPN_VALUE histogram.  If
    there's a unique value, return true and set VALUE and COUNT
    arguments.  */
 
@@ -731,7 +731,7 @@  get_most_common_single_value (gimple *stmt, const char *counter_type,
 
   gcov_type read_all = hist->hvalue.counters[0];
 
-  for (unsigned i = 0; i < GCOV_DISK_SINGLE_VALUES; i++)
+  for (unsigned i = 0; i < GCOV_TOPN_VALUES; i++)
     {
       gcov_type v = hist->hvalue.counters[2 * i + 1];
       gcov_type c = hist->hvalue.counters[2 * i + 2];
@@ -780,7 +780,7 @@  gimple_divmod_fixed_value_transform (gimple_stmt_iterator *si)
     return false;
 
   histogram = gimple_histogram_value_of_type (cfun, stmt,
-					      HIST_TYPE_SINGLE_VALUE);
+					      HIST_TYPE_TOPN_VALUES);
   if (!histogram)
     return false;
 
@@ -1654,7 +1654,7 @@  gimple_stringops_transform (gimple_stmt_iterator *gsi)
     return false;
 
   histogram = gimple_histogram_value_of_type (cfun, stmt,
-					      HIST_TYPE_SINGLE_VALUE);
+					      HIST_TYPE_TOPN_VALUES);
   if (!histogram)
     return false;
 
@@ -1808,7 +1808,7 @@  gimple_divmod_values_to_profile (gimple *stmt, histogram_values *values)
 	/* Check for the case where the divisor is the same value most
 	   of the time.  */
 	values->quick_push (gimple_alloc_histogram_value (cfun,
-						      HIST_TYPE_SINGLE_VALUE,
+						      HIST_TYPE_TOPN_VALUES,
 						      stmt, divisor));
 
       /* For mod, check whether it is not often a noop (or replaceable by
@@ -1887,7 +1887,7 @@  gimple_stringops_values_to_profile (gimple *gs, histogram_values *values)
   if (TREE_CODE (blck_size) != INTEGER_CST)
     {
       values->safe_push (gimple_alloc_histogram_value (cfun,
-						       HIST_TYPE_SINGLE_VALUE,
+						       HIST_TYPE_TOPN_VALUES,
 						       stmt, blck_size));
       values->safe_push (gimple_alloc_histogram_value (cfun, HIST_TYPE_AVERAGE,
 						       stmt, blck_size));
@@ -1936,12 +1936,9 @@  gimple_find_values_to_profile (histogram_values *values)
 	  hist->n_counters = 2;
 	  break;
 
-	case HIST_TYPE_SINGLE_VALUE:
-	  hist->n_counters = GCOV_SINGLE_VALUE_COUNTERS;
-	  break;
-
+	case HIST_TYPE_TOPN_VALUES:
 	case HIST_TYPE_INDIR_CALL:
-	  hist->n_counters = GCOV_SINGLE_VALUE_COUNTERS;
+	  hist->n_counters = GCOV_TOPN_VALUES_COUNTERS;
 	  break;
 
         case HIST_TYPE_TIME_PROFILE:
diff --git a/gcc/value-prof.h b/gcc/value-prof.h
index 25b03f7591a..9f69d7df6d1 100644
--- a/gcc/value-prof.h
+++ b/gcc/value-prof.h
@@ -26,8 +26,7 @@  enum hist_type
   HIST_TYPE_INTERVAL,	/* Measures histogram of values inside a specified
 			   interval.  */
   HIST_TYPE_POW2,	/* Histogram of power of 2 values.  */
-  HIST_TYPE_SINGLE_VALUE, /* Tries to identify the value that is (almost)
-			   always constant.  */
+  HIST_TYPE_TOPN_VALUES, /* Tries to identify the N most common values.  */
   HIST_TYPE_INDIR_CALL,   /* Tries to identify the function that is (almost)
 			    called in indirect call */
   HIST_TYPE_AVERAGE,	/* Compute average value (sum of all values).  */
@@ -101,7 +100,8 @@  extern void gimple_init_gcov_profiler (void);
 extern void gimple_gen_edge_profiler (int, edge);
 extern void gimple_gen_interval_profiler (histogram_value, unsigned, unsigned);
 extern void gimple_gen_pow2_profiler (histogram_value, unsigned, unsigned);
-extern void gimple_gen_one_value_profiler (histogram_value, unsigned, unsigned);
+extern void gimple_gen_topn_values_profiler (histogram_value, unsigned,
+					     unsigned);
 extern void gimple_gen_ic_profiler (histogram_value, unsigned, unsigned);
 extern void gimple_gen_ic_func_profiler (void);
 extern void gimple_gen_time_profiler (unsigned, unsigned);
diff --git a/libgcc/Makefile.in b/libgcc/Makefile.in
index 33b83809cfc..f9e6e6c8812 100644
--- a/libgcc/Makefile.in
+++ b/libgcc/Makefile.in
@@ -887,14 +887,14 @@  include $(iterator)
 
 # Build libgcov components.
 
-LIBGCOV_MERGE = _gcov_merge_add _gcov_merge_single			\
+LIBGCOV_MERGE = _gcov_merge_add _gcov_merge_topn			\
 	_gcov_merge_ior _gcov_merge_time_profile
 LIBGCOV_PROFILER = _gcov_interval_profiler				\
 	_gcov_interval_profiler_atomic					\
 	_gcov_pow2_profiler						\
 	_gcov_pow2_profiler_atomic					\
-	_gcov_one_value_profiler_v2					\
-	_gcov_one_value_profiler_v2_atomic					\
+	_gcov_topn_values_profiler					\
+	_gcov_topn_values_profiler_atomic					\
 	_gcov_average_profiler						\
 	_gcov_average_profiler_atomic					\
 	_gcov_ior_profiler						\
diff --git a/libgcc/libgcov-merge.c b/libgcc/libgcov-merge.c
index 84367005663..15f27aedb55 100644
--- a/libgcc/libgcov-merge.c
+++ b/libgcc/libgcov-merge.c
@@ -33,9 +33,9 @@  void __gcov_merge_add (gcov_type *counters  __attribute__ ((unused)),
                        unsigned n_counters __attribute__ ((unused))) {}
 #endif
 
-#ifdef L_gcov_merge_single
-void __gcov_merge_single (gcov_type *counters  __attribute__ ((unused)),
-			  unsigned n_counters __attribute__ ((unused))) {}
+#ifdef L_gcov_merge_topn
+void __gcov_merge_topn (gcov_type *counters  __attribute__ ((unused)),
+			unsigned n_counters __attribute__ ((unused))) {}
 #endif
 
 #else
@@ -84,10 +84,10 @@  __gcov_merge_time_profile (gcov_type *counters, unsigned n_counters)
 }
 #endif /* L_gcov_merge_time_profile */
 
-#ifdef L_gcov_merge_single
+#ifdef L_gcov_merge_topn
 
 static void
-merge_single_value_set (gcov_type *counters)
+merge_topn_values_set (gcov_type *counters)
 {
   /* First value is number of total executions of the profiler.  */
   gcov_type all = gcov_get_counter_ignore_scaling (-1);
@@ -95,9 +95,9 @@  merge_single_value_set (gcov_type *counters)
   ++counters;
 
   /* Read all part values.  */
-  gcov_type read_counters[2 * GCOV_DISK_SINGLE_VALUES];
+  gcov_type read_counters[2 * GCOV_TOPN_VALUES];
 
-  for (unsigned i = 0; i < GCOV_DISK_SINGLE_VALUES; i++)
+  for (unsigned i = 0; i < GCOV_TOPN_VALUES; i++)
     {
       read_counters[2 * i] = gcov_get_counter_target ();
       read_counters[2 * i + 1] = gcov_get_counter_ignore_scaling (-1);
@@ -109,13 +109,13 @@  merge_single_value_set (gcov_type *counters)
       return;
     }
 
-  for (unsigned i = 0; i < GCOV_DISK_SINGLE_VALUES; i++)
+  for (unsigned i = 0; i < GCOV_TOPN_VALUES; i++)
     {
       if (read_counters[2 * i + 1] == 0)
 	return;
 
       unsigned j;
-      for (j = 0; j < GCOV_DISK_SINGLE_VALUES; j++)
+      for (j = 0; j < GCOV_TOPN_VALUES; j++)
 	{
 	  if (counters[2 * j] == read_counters[2 * i])
 	    {
@@ -131,7 +131,7 @@  merge_single_value_set (gcov_type *counters)
 	}
 
       /* We haven't found a slot, bail out.  */
-      if (j == GCOV_DISK_SINGLE_VALUES)
+      if (j == GCOV_TOPN_VALUES)
 	{
 	  counters[1] = -1;
 	  return;
@@ -149,13 +149,13 @@  merge_single_value_set (gcov_type *counters)
    -- counter
    */
 void
-__gcov_merge_single (gcov_type *counters, unsigned n_counters)
+__gcov_merge_topn (gcov_type *counters, unsigned n_counters)
 {
-  gcc_assert (!(n_counters % GCOV_SINGLE_VALUE_COUNTERS));
+  gcc_assert (!(n_counters % GCOV_TOPN_VALUES_COUNTERS));
 
-  for (unsigned i = 0; i < (n_counters / GCOV_SINGLE_VALUE_COUNTERS); i++)
-    merge_single_value_set (counters + (i * GCOV_SINGLE_VALUE_COUNTERS));
+  for (unsigned i = 0; i < (n_counters / GCOV_TOPN_VALUES_COUNTERS); i++)
+    merge_topn_values_set (counters + (i * GCOV_TOPN_VALUES_COUNTERS));
 }
-#endif /* L_gcov_merge_single */
+#endif /* L_gcov_merge_topn */
 
 #endif /* inhibit_libc */
diff --git a/libgcc/libgcov-profiler.c b/libgcc/libgcov-profiler.c
index 04d6f9c0e40..8f877a95980 100644
--- a/libgcc/libgcov-profiler.c
+++ b/libgcc/libgcov-profiler.c
@@ -106,17 +106,11 @@  __gcov_pow2_profiler_atomic (gcov_type *counters, gcov_type value)
 #endif
 
 
-/* Tries to determine the most common value among its inputs.  Checks if the
-   value stored in COUNTERS[0] matches VALUE.  If this is the case, COUNTERS[1]
-   is incremented.  If this is not the case and COUNTERS[1] is not zero,
-   COUNTERS[1] is decremented.  Otherwise COUNTERS[1] is set to one and
-   VALUE is stored to COUNTERS[0].  This algorithm guarantees that if this
-   function is called more than 50% of the time with one value, this value
-   will be in COUNTERS[0] in the end.  */
+/* Tries to determine N most commons value among its inputs.  */
 
 static inline void
-__gcov_one_value_profiler_body (gcov_type *counters, gcov_type value,
-				int use_atomic)
+__gcov_topn_values_profiler_body (gcov_type *counters, gcov_type value,
+				  int use_atomic)
 {
   if (use_atomic)
     __atomic_fetch_add (&counters[0], 1, __ATOMIC_RELAXED);
@@ -125,11 +119,11 @@  __gcov_one_value_profiler_body (gcov_type *counters, gcov_type value,
 
   ++counters;
 
-  /* We have GCOV_DISK_SINGLE_VALUES as we can keep multiple values
+  /* We have GCOV_TOPN_VALUES as we can keep multiple values
      next to each other.  */
   unsigned sindex = 0;
 
-  for (unsigned i = 0; i < GCOV_DISK_SINGLE_VALUES; i++)
+  for (unsigned i = 0; i < GCOV_TOPN_VALUES; i++)
     {
       if (value == counters[2 * i])
 	{
@@ -158,15 +152,15 @@  __gcov_one_value_profiler_body (gcov_type *counters, gcov_type value,
     counters[2 * sindex + 1]--;
 }
 
-#ifdef L_gcov_one_value_profiler_v2
+#ifdef L_gcov_topn_values_profiler
 void
-__gcov_one_value_profiler_v2 (gcov_type *counters, gcov_type value)
+__gcov_topn_values_profiler (gcov_type *counters, gcov_type value)
 {
-  __gcov_one_value_profiler_body (counters, value, 0);
+  __gcov_topn_values_profiler_body (counters, value, 0);
 }
 #endif
 
-#if defined(L_gcov_one_value_profiler_v2_atomic) && GCOV_SUPPORTS_ATOMIC
+#if defined(L_gcov_topn_values_profiler_atomic) && GCOV_SUPPORTS_ATOMIC
 
 /* Update one value profilers (COUNTERS) for a given VALUE.
 
@@ -178,9 +172,9 @@  __gcov_one_value_profiler_v2 (gcov_type *counters, gcov_type value)
    https://gcc.gnu.org/ml/gcc-patches/2016-08/msg00024.html.  */
 
 void
-__gcov_one_value_profiler_v2_atomic (gcov_type *counters, gcov_type value)
+__gcov_topn_values_profiler_atomic (gcov_type *counters, gcov_type value)
 {
-  __gcov_one_value_profiler_body (counters, value, 1);
+  __gcov_topn_values_profiler_body (counters, value, 1);
 }
 #endif
 
@@ -214,7 +208,7 @@  __gcov_indirect_call_profiler_v4 (gcov_type value, void* cur_func)
   if (cur_func == __gcov_indirect_call.callee
       || (__LIBGCC_VTABLE_USES_DESCRIPTORS__
 	  && *(void **) cur_func == *(void **) __gcov_indirect_call.callee))
-    __gcov_one_value_profiler_body (__gcov_indirect_call.counters, value, 0);
+    __gcov_topn_values_profiler_body (__gcov_indirect_call.counters, value, 0);
 
   __gcov_indirect_call.callee = NULL;
 }
diff --git a/libgcc/libgcov-util.c b/libgcc/libgcov-util.c
index c794132c172..7faa59a6ea4 100644
--- a/libgcc/libgcov-util.c
+++ b/libgcc/libgcov-util.c
@@ -723,11 +723,11 @@  __gcov_time_profile_counter_op (gcov_type *counters ATTRIBUTE_UNUSED,
   /* Do nothing.  */
 }
 
-/* Performing FN upon single counters.  */
+/* Performing FN upon TOP N counters.  */
 
 static void
-__gcov_single_counter_op (gcov_type *counters, unsigned n_counters,
-                          counter_op_fn fn, void *data1, void *data2)
+__gcov_topn_counter_op (gcov_type *counters, unsigned n_counters,
+			counter_op_fn fn, void *data1, void *data2)
 {
   unsigned i, n_measures;
 
diff --git a/libgcc/libgcov.h b/libgcc/libgcov.h
index 7f316146d49..30a8a116fec 100644
--- a/libgcc/libgcov.h
+++ b/libgcc/libgcov.h
@@ -126,7 +126,7 @@  typedef unsigned gcov_position_t;
 
 #define L_gcov 1
 #define L_gcov_merge_add 1
-#define L_gcov_merge_single 1
+#define L_gcov_merge_topn 1
 #define L_gcov_merge_ior 1
 #define L_gcov_merge_time_profile 1
 
@@ -259,8 +259,8 @@  extern void __gcov_merge_add (gcov_type *, unsigned) ATTRIBUTE_HIDDEN;
 /* The merge function to select the minimum valid counter value.  */
 extern void __gcov_merge_time_profile (gcov_type *, unsigned) ATTRIBUTE_HIDDEN;
 
-/* The merge function to choose the most common value.  */
-extern void __gcov_merge_single (gcov_type *, unsigned) ATTRIBUTE_HIDDEN;
+/* The merge function to choose the most common N values.  */
+extern void __gcov_merge_topn (gcov_type *, unsigned) ATTRIBUTE_HIDDEN;
 
 /* The merge function that just ors the counters together.  */
 extern void __gcov_merge_ior (gcov_type *, unsigned) ATTRIBUTE_HIDDEN;
@@ -271,8 +271,8 @@  extern void __gcov_interval_profiler_atomic (gcov_type *, gcov_type, int,
 					     unsigned);
 extern void __gcov_pow2_profiler (gcov_type *, gcov_type);
 extern void __gcov_pow2_profiler_atomic (gcov_type *, gcov_type);
-extern void __gcov_one_value_profiler_v2 (gcov_type *, gcov_type);
-extern void __gcov_one_value_profiler_v2_atomic (gcov_type *, gcov_type);
+extern void __gcov_topn_values_profiler (gcov_type *, gcov_type);
+extern void __gcov_topn_values_profiler_atomic (gcov_type *, gcov_type);
 extern void __gcov_indirect_call_profiler_v4 (gcov_type, void *);
 extern void __gcov_time_profiler (gcov_type *);
 extern void __gcov_time_profiler_atomic (gcov_type *);
-- 
2.21.0