public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc(refs/users/kubaneko/heads/histogram)] changed from total size to exponential size
@ 2023-04-25  8:10 Ondrej Kubanek
  0 siblings, 0 replies; only message in thread
From: Ondrej Kubanek @ 2023-04-25  8:10 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:9a22679c15e02516b80d632401d46a8af2f1a865

commit 9a22679c15e02516b80d632401d46a8af2f1a865
Author: kubaneko <kubanek0ondrej@gmail.com>
Date:   Mon Apr 24 07:54:30 2023 +0000

    changed from total size to exponential size

Diff:
---
 gcc/cfgloop.cc            |  8 +++++---
 gcc/lto-streamer-in.cc    |  7 +++++--
 gcc/lto-streamer-out.cc   |  4 +++-
 gcc/params.opt            | 12 ++++++++----
 gcc/profile.cc            |  7 +++++--
 gcc/tree-profile.cc       |  7 +++----
 gcc/value-prof.cc         | 10 +++++-----
 libgcc/libgcov-profiler.c |  6 ++++--
 8 files changed, 38 insertions(+), 23 deletions(-)

diff --git a/gcc/cfgloop.cc b/gcc/cfgloop.cc
index c8a010ca08b..e2c1bab996f 100644
--- a/gcc/cfgloop.cc
+++ b/gcc/cfgloop.cc
@@ -2189,7 +2189,7 @@ unsigned int
 hist_index (gcov_type_unsigned val)
 {
   unsigned int lin_size = param_profile_histogram_size_lin;
-  unsigned int tot_size = param_profile_histogram_size;
+  unsigned int tot_size = lin_size + param_profile_histogram_size_exp;
   if (val < lin_size)
     {
       return val;
@@ -2230,7 +2230,8 @@ histogram_counters_minus_upper_bound (histogram_counters *&hist_c,
   hist_c->adjusted = true;
   auto &sum = hist_c->sum;
   unsigned int lin_size = param_profile_histogram_size_lin;
-  unsigned int tot_size = param_profile_histogram_size;
+  unsigned int tot_size
+    = param_profile_histogram_size_lin + param_profile_histogram_size_exp;
   // If the last linear counter does not contain other iterations
   unsigned int i = 1;
   for (; i < lin_size; i++)
@@ -2304,7 +2305,8 @@ histogram_counters_div_upper_bound (histogram_counters *&hist_c,
   auto &hist = *(hist_c->hist);
   hist_c->adjusted = true;
   unsigned int lin_size = param_profile_histogram_size_lin;
-  unsigned int tot_size = param_profile_histogram_size;
+  unsigned int tot_size
+    = param_profile_histogram_size_lin + param_profile_histogram_size_exp;
   unsigned int i = 1;
   for (; i < lin_size && i < tot_size - 1; i++)
     {
diff --git a/gcc/lto-streamer-in.cc b/gcc/lto-streamer-in.cc
index 110bffd0b4b..b08053d7ec3 100644
--- a/gcc/lto-streamer-in.cc
+++ b/gcc/lto-streamer-in.cc
@@ -1133,8 +1133,11 @@ input_cfg (class lto_input_block *ib, class data_in *data_in,
 	  loop->counters->sum = streamer_read_gcov_count (ib);
 	  loop->counters->hist = NULL;
 	  vec_safe_grow_cleared (loop->counters->hist,
-				 param_profile_histogram_size);
-	  for (int i = 0; i < param_profile_histogram_size; ++i)
+				 param_profile_histogram_size_lin
+				   + param_profile_histogram_size_exp);
+	  for (int i = 0; i < param_profile_histogram_size_lin
+				+ param_profile_histogram_size_exp;
+	       ++i)
 	    {
 	      (*loop->counters->hist)[i] = streamer_read_gcov_count (ib);
 	    }
diff --git a/gcc/lto-streamer-out.cc b/gcc/lto-streamer-out.cc
index 0908605ab8e..e6079c62af0 100644
--- a/gcc/lto-streamer-out.cc
+++ b/gcc/lto-streamer-out.cc
@@ -2186,7 +2186,9 @@ output_cfg (struct output_block *ob, struct function *fn)
 	{
 	  streamer_write_gcov_count (ob, loop->counters->sum);
 	  for (unsigned int i = 0;
-	       i < (unsigned int) param_profile_histogram_size; ++i)
+	       i < (unsigned int) param_profile_histogram_size_lin
+		     + param_profile_histogram_size_exp;
+	       ++i)
 	    {
 	      streamer_write_gcov_count (ob, (*loop->counters->hist)[i]);
 	    }
diff --git a/gcc/params.opt b/gcc/params.opt
index 1b035bdb3e1..3aa952c20c0 100644
--- a/gcc/params.opt
+++ b/gcc/params.opt
@@ -874,13 +874,17 @@ Min. ratio of insns to mem ops to enable prefetching in a loop.
 Common Joined UInteger Var(param_prefetch_minimum_stride) Init(-1) Param Optimization
 The minimum constant stride beyond which we should use prefetch hints for.
 
--param=profile-histogram-size=
-Common Joined UInteger Var(param_profile_histogram_size) Init(18) IntegerRange(0, 255) Param Optimization
-Total size of the histogram counter for profile feedback.
+-param=profile-histogram-size-exp=
+Common Joined UInteger Var(param_profile_histogram_size_exp) Init(1) IntegerRange(1, 255) Param Optimization
+Size of additional counters in exponential intervals after the linear section.
+
+-param=profile-histogram-size-mod=
+Common Joined UInteger Var(param_profile_histogram_size_mod) Init(32) IntegerRange(0, 255) Param Optimization
+Counts the modulo of loop iterations by its size.
 
 -param=profile-histogram-size-lin=
 Common Joined UInteger Var(param_profile_histogram_size_lin) Init(16) IntegerRange(0, 255) Param Optimization
-Size of the linear portion of the histogram counter for profile feedback. Less then total size
+Size of the linear portion of the histogram counter for profile feedback.
 
 -param=profile-histogram-peel-prcnt=
 Common Joined UInteger Var(param_profile_histogram_peel_prcnt) Init(6) Param Optimization
diff --git a/gcc/profile.cc b/gcc/profile.cc
index 5d87440af01..8199ed6350b 100644
--- a/gcc/profile.cc
+++ b/gcc/profile.cc
@@ -933,8 +933,11 @@ compute_value_histograms (histogram_values values, unsigned cfg_checksum,
 	      lp->counters->adjusted = false;
 	      lp->counters->hist = NULL;
 	      vec_safe_grow_cleared (lp->counters->hist,
-				     param_profile_histogram_size);
-	      for (int i = 0; i < param_profile_histogram_size; ++i)
+				     param_profile_histogram_size_lin
+				       + param_profile_histogram_size_exp);
+	      for (int i = 0; i < param_profile_histogram_size_lin
+				    + param_profile_histogram_size_exp;
+		   ++i)
 		{
 		  auto hst = lp->counters->hist;
 		  (*hst)[i] = act_count[t][i];
diff --git a/gcc/tree-profile.cc b/gcc/tree-profile.cc
index 0c1ceb3f758..a4ed11f2219 100644
--- a/gcc/tree-profile.cc
+++ b/gcc/tree-profile.cc
@@ -365,10 +365,9 @@ gimple_gen_histogram_profiler (histogram_value value,
   auto lp = value->hvalue.lp;
   gcc_assert (lp);
   tree ref_ptr = tree_coverage_counter_addr (tag, 0);
-  tree hist_size
-    = build_int_cst_type (gcov_type_node,
-			  param_profile_histogram_size_lin
-			    | (gcov_type (param_profile_histogram_size) << 32));
+  tree hist_size = build_int_cst_type (
+    gcov_type_node, param_profile_histogram_size_lin
+		      | (gcov_type (param_profile_histogram_size_exp) << 32));
   gcall *call;
   auto_vec<edge> exits = get_loop_exit_edges (lp);
   for (auto exit : exits)
diff --git a/gcc/value-prof.cc b/gcc/value-prof.cc
index 6a5ee0f5cab..d7d7cd18ce8 100644
--- a/gcc/value-prof.cc
+++ b/gcc/value-prof.cc
@@ -274,9 +274,7 @@ dump_histogram_value (FILE *dump_file, histogram_value hist)
 	    }
 	  int lin2_log = floor_log2 (param_profile_histogram_size_lin);
 	  for (int64_t i = lin2_log;
-	       i < param_profile_histogram_size
-		     - param_profile_histogram_size_lin + lin2_log;
-	       ++i)
+	       i < param_profile_histogram_size_exp + lin2_log; ++i)
 	    {
 	      fprintf (
 		dump_file,
@@ -405,7 +403,8 @@ stream_in_histogram_value (class lto_input_block *ib, gimple *stmt)
 	  break;
 
 	case HIST_TYPE_HISTOGRAM:
-	  ncounters = param_profile_histogram_size;
+	  ncounters = param_profile_histogram_size_lin
+		      + param_profile_histogram_size_exp;
 	  break;
 	case HIST_TYPE_POW2:
 	case HIST_TYPE_AVERAGE:
@@ -2010,7 +2009,8 @@ gimple_find_values_to_profile (histogram_values *values)
 	  break;
 
 	case HIST_TYPE_HISTOGRAM:
-	  hist->n_counters = param_profile_histogram_size;
+	  hist->n_counters = param_profile_histogram_size_lin
+			     + param_profile_histogram_size_exp;
 	  break;
 
 	default:
diff --git a/libgcc/libgcov-profiler.c b/libgcc/libgcov-profiler.c
index f0506e4b5f1..7063af3579f 100644
--- a/libgcc/libgcov-profiler.c
+++ b/libgcc/libgcov-profiler.c
@@ -62,9 +62,10 @@ void __gcov_histogram_profiler(gcov_type *counters, gcov_type value,
   gcc_assert(hist_sizes >= 0 && value >= 0);
   gcov_type_unsigned hist_size = hist_sizes;
   gcov_type_unsigned u_value = value;
-  gcov_type_unsigned tot_size = hist_size >> 32;
+  gcov_type_unsigned exp_size = hist_size >> 32;
   gcov_type_unsigned lin_size =
       hist_size & ((((gcov_type_unsigned)1) << 32) - 1);
+  gcov_type_unsigned tot_size = exp_size + lin_size;
   if (u_value < lin_size) {
     counters[value]++;
   } else {
@@ -91,9 +92,10 @@ void __gcov_histogram_profiler_atomic(gcov_type *counters, gcov_type value,
   gcc_assert(hist_sizes >= 0 && value >= 0);
   gcov_type_unsigned hist_size = hist_sizes;
   gcov_type_unsigned u_value = value;
-  gcov_type_unsigned tot_size = hist_size >> 32;
+  gcov_type_unsigned exp_size = hist_size >> 32;
   gcov_type_unsigned lin_size =
       hist_size & ((((gcov_type_unsigned)1) << 32) - 1);
+  gcov_type_unsigned tot_size = lin_size + tot_size;
   if (u_value < lin_size) {
     __atomic_fetch_add(&counters[value], 1, __ATOMIC_RELAXED);
   } else {

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2023-04-25  8:10 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-04-25  8:10 [gcc(refs/users/kubaneko/heads/histogram)] changed from total size to exponential size Ondrej Kubanek

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).