On Mon, Jan 25, 2021 at 4:54 AM Martin Liška <mli...@suse.cz> wrote: > > On 1/22/21 3:51 PM, Jan Hubicka wrote: > >> gcc/ChangeLog: > >> > >> PR gcov-profile/98739 > >> * common.opt: Add missing sign symbol. > >> * value-prof.c (get_nth_most_common_value): Restore handling > >> of PROFILE_REPRODUCIBILITY_PARALLEL_RUNS and > >> PROFILE_REPRODUCIBILITY_MULTITHREADED. > >> > >> libgcc/ChangeLog: > >> > >> PR gcov-profile/98739 > >> * libgcov-merge.c (__gcov_merge_topn): Mark when merging > >> ends with a dropped counter. > >> * libgcov.h (gcov_topn_add_value): Add return value. > >> --- > >> gcc/common.opt | 2 +- > >> gcc/value-prof.c | 26 ++++++++++++++++++++------ > >> libgcc/libgcov-merge.c | 11 ++++++++--- > >> libgcc/libgcov.h | 13 +++++++++---- > >> 4 files changed, 38 insertions(+), 14 deletions(-) > >> > >> diff --git a/gcc/common.opt b/gcc/common.opt > >> index bde1711870d..a8a2b67a99d 100644 > >> --- a/gcc/common.opt > >> +++ b/gcc/common.opt > >> @@ -2248,7 +2248,7 @@ Enum(profile_reproducibility) String(parallel-runs) > >> Value(PROFILE_REPRODUCIBILIT > >> EnumValue > >> Enum(profile_reproducibility) String(multithreaded) > >> Value(PROFILE_REPRODUCIBILITY_MULTITHREADED) > >> > >> -fprofile-reproducible > >> +fprofile-reproducible= > >> Common Joined RejectNegative Var(flag_profile_reproducible) > >> Enum(profile_reproducibility) Init(PROFILE_REPRODUCIBILITY_SERIAL) > >> -fprofile-reproducible=[serial|parallel-runs|multithreaded] > >> Control level of reproducibility of profile gathered by -fprofile-generate. > >> > >> diff --git a/gcc/value-prof.c b/gcc/value-prof.c > >> index 4c916f4994f..3e899a39b84 100644 > >> --- a/gcc/value-prof.c > >> +++ b/gcc/value-prof.c > >> @@ -747,8 +747,8 @@ gimple_divmod_fixed_value (gassign *stmt, tree value, > >> profile_probability prob, > >> > >> abs (counters[0]) is the number of executions > >> for i in 0 ... TOPN-1 > >> - counters[2 * i + 1] is target > >> - abs (counters[2 * i + 2]) is corresponding hitrate counter. > >> + counters[2 * i + 2] is target > >> + counters[2 * i + 3] is corresponding hitrate counter. > >> > >> Value of counters[0] negative when counter became > >> full during merging and some values are lost. */ > >> @@ -766,15 +766,29 @@ get_nth_most_common_value (gimple *stmt, const char > >> *counter_type, > >> *value = 0; > >> > >> gcov_type read_all = abs_hwi (hist->hvalue.counters[0]); > >> + gcov_type covered = 0; > >> + for (unsigned i = 0; i < counters; ++i) > >> + covered += hist->hvalue.counters[2 * i + 3]; > >> > >> gcov_type v = hist->hvalue.counters[2 * n + 2]; > >> gcov_type c = hist->hvalue.counters[2 * n + 3]; > >> > >> if (hist->hvalue.counters[0] < 0 > >> - && (flag_profile_reproducible == > >> PROFILE_REPRODUCIBILITY_PARALLEL_RUNS > >> - || (flag_profile_reproducible > >> - == PROFILE_REPRODUCIBILITY_MULTITHREADED))) > >> - return false; > >> + && flag_profile_reproducible == > >> PROFILE_REPRODUCIBILITY_PARALLEL_RUNS) > >> + { > >> + if (dump_file) > >> + fprintf (dump_file, "Histogram value dropped in %qs mode", > >> + "-fprofile-reproducible=parallel-runs"); > >> + return false; > >> + } > >> + else if (covered != read_all > >> + && flag_profile_reproducible == > >> PROFILE_REPRODUCIBILITY_MULTITHREADED) > >> + { > >> + if (dump_file) > >> + fprintf (dump_file, "Histogram value dropped in %qs mode", > >> + "-fprofile-reproducible=multithreaded"); > >> + return false; > >> + } > > > > We can do that incrementally, but having opt-info=missed to print > > warning when profile is rejected with info if it would be useful and how > > frequent it is would make it easy for me to track this with firefox > > builds. > > > > It also seems a reasonable user facing feature - we could mention that > > in documentation of profile-reproducibility flag and tell users they can > > look for warnings about disabled transformations. > >> > >> /* Indirect calls can't be verified. */ > >> if (stmt > >> diff --git a/libgcc/libgcov-merge.c b/libgcc/libgcov-merge.c > >> index 9306e8d688c..35936a8364b 100644 > >> --- a/libgcc/libgcov-merge.c > >> +++ b/libgcc/libgcov-merge.c > >> @@ -107,7 +107,9 @@ __gcov_merge_topn (gcov_type *counters, unsigned > >> n_counters) > >> gcov_type all = gcov_get_counter_ignore_scaling (-1); > >> gcov_type n = gcov_get_counter_ignore_scaling (-1); > >> > >> - counters[GCOV_TOPN_MEM_COUNTERS * i] += all; > >> + unsigned full = all < 0; > >> + gcov_type *total = &counters[GCOV_TOPN_MEM_COUNTERS * i]; > >> + *total += full ? -all : all; > >> > >> for (unsigned j = 0; j < n; j++) > >> { > >> @@ -115,9 +117,12 @@ __gcov_merge_topn (gcov_type *counters, unsigned > >> n_counters) > >> gcov_type count = gcov_get_counter_ignore_scaling (-1); > >> > >> // TODO: we should use atomic here > > Is the atomic possibly disasterou? > > This one should be quite safe. > > >> - gcov_topn_add_value (counters + GCOV_TOPN_MEM_COUNTERS * i, value, > >> - count, 0, 0); > >> + full |= gcov_topn_add_value (counters + GCOV_TOPN_MEM_COUNTERS * i, > >> + value, count, 0, 0); > >> } > >> + > >> + if (full) > >> + *total = -(*total); > > > > Please add comment somewhere in __gcov_merge_topn what the sign bit is > > useful for. > > Done. > > > > > OK with that change, thanks a lot! > > I've just installed the patch. >
This breaks GCC bootstrap: ../../src-master/gcc/value-prof.c: In function ??bool get_nth_most_common_value(gimple*, const char*, histogram_value, gcov_type*, gcov_type*, gcov_type*, unsigned int)??: ../../src-master/gcc/value-prof.c:780:29: error: ISO C++11 does not support the ??q?? gnu_printf length modifier [-Werror=format=] 780 | fprintf (dump_file, "Histogram value dropped in %qs mode", | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ../../src-master/gcc/value-prof.c:780:59: error: use of ??q?? length modifier with ??s?? type character has either no effect or undefined behavior [-Werror=format=] 780 | fprintf (dump_file, "Histogram value dropped in %qs mode", | ^ ../../src-master/gcc/value-prof.c:788:29: error: ISO C++11 does not support the ??q?? gnu_printf length modifier [-Werror=format=] 788 | fprintf (dump_file, "Histogram value dropped in %qs mode", | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ../../src-master/gcc/value-prof.c:788:59: error: use of ??q?? length modifier with ??s?? type character has either no effect or undefined behavior [-Werror=format=] 788 | fprintf (dump_file, "Histogram value dropped in %qs mode", | -- H.J.