On 3/26/25 14:54, Jan Hubicka wrote:
Hello,
I apologize for late reply here. I went thru the paper in gereater
detail. While I originally though the usual path-profiling can be
reasonably merged with the prime math profiling, so it is useful both
for optimizaiton and coverage testing, I think it is better to not do
that - the requirements of prime path profiling are rather specific and
expensive to get right.
gcc/ChangeLog:
* Makefile.in (OBJS): Add prime-paths.o, path-coverage.o.
(GTFILES): Add prime-paths.cc, path-coverage.cc
(GCOV_OBJS): Add graphds.o, prime-paths.o, bitmap.o
* builtins.cc (expand_builtin_fork_or_exec): Check
path_coverage_flag.
* collect2.cc (main): Add -fno-path-coverage to OBSTACK.
* common.opt: Add new options -fpath-coverage,
-fpath-coverage-limit, -Wcoverage-too-many-paths
* doc/gcov.texi: Add --prime-paths, --prime-paths-lines,
--prime-paths-source documentation.
* doc/invoke.texi: Add -fpath-coverage, -fpath-coverage-limit,
-Wcoverage-too-many-paths documentation.
* gcc.cc: Link gcov on -fpath-coverage.
* gcov-counter.def (GCOV_COUNTER_PATHS): New.
* gcov-io.h (GCOV_TAG_PATHS): New.
(GCOV_TAG_PATHS_LENGTH): New.
(GCOV_TAG_PATHS_NUM): New.
* gcov.cc (class path_info): New.
(struct coverage_info): Add paths, paths_covered.
(find_prime_paths): New.
(add_path_counts): New.
(find_arc): New.
(print_usage): Add -e, --prime-paths, --prime-paths-lines,
--prime-paths-source.
(process_args): Likewise.
(json_set_prime_path_coverage): New.
(output_json_intermediate_file): Call
json_set_prime_path_coverage.
(process_all_functions): Call find_prime_paths.
(generate_results): Call add_path_counts.
(read_graph_file): Read path counters.
(read_count_file): Likewise.
(function_summary): Print path counts.
(file_summary): Likewise.
(print_source_line): New.
(print_prime_path_lines): New.
(print_inlined_separator): New.
(print_prime_path_source): New.
(output_path_coverage): New.
(output_lines): Print path coverage.
* ipa-inline.cc (can_early_inline_edge_p): Check
path_coverage_flag.
* passes.cc (finish_optimization_passes): Likewise.
* profile.cc (branch_prob): Likewise.
* selftest-run-tests.cc (selftest::run_tests): Run path coverage
tests.
* selftest.h (path_coverage_cc_tests): New declaration.
* tree-profile.cc (tree_profiling): Check path_coverage_flag.
(pass_ipa_tree_profile::gate): Likewise.
* path-coverage.cc: New file.
* prime-paths.cc: New file.
gcc/testsuite/ChangeLog:
* lib/gcov.exp: Add prime paths test function.
* g++.dg/gcov/gcov-22.C: New test.
* g++.dg/gcov/gcov-23-1.h: New test.
* g++.dg/gcov/gcov-23-2.h: New test.
* g++.dg/gcov/gcov-23.C: New test.
* gcc.misc-tests/gcov-29.c: New test.
* gcc.misc-tests/gcov-30.c: New test.
* gcc.misc-tests/gcov-31.c: New test.
* gcc.misc-tests/gcov-32.c: New test.
* gcc.misc-tests/gcov-33.c: New test.
* gcc.misc-tests/gcov-34.c: New test.
---
gcc/Makefile.in | 6 +-
gcc/builtins.cc | 2 +-
gcc/collect2.cc | 6 +-
gcc/common.opt | 16 +
gcc/doc/gcov.texi | 187 +++
gcc/doc/invoke.texi | 36 +
gcc/gcc.cc | 4 +-
gcc/gcov-counter.def | 3 +
gcc/gcov-io.h | 3 +
gcc/gcov.cc | 487 +++++-
gcc/ipa-inline.cc | 2 +-
gcc/passes.cc | 4 +-
gcc/path-coverage.cc | 776 +++++++++
gcc/prime-paths.cc | 2052 ++++++++++++++++++++++++
gcc/profile.cc | 6 +-
gcc/selftest-run-tests.cc | 1 +
gcc/selftest.h | 1 +
gcc/testsuite/g++.dg/gcov/gcov-22.C | 170 ++
gcc/testsuite/g++.dg/gcov/gcov-23-1.h | 9 +
gcc/testsuite/g++.dg/gcov/gcov-23-2.h | 9 +
gcc/testsuite/g++.dg/gcov/gcov-23.C | 30 +
gcc/testsuite/gcc.misc-tests/gcov-29.c | 869 ++++++++++
gcc/testsuite/gcc.misc-tests/gcov-30.c | 869 ++++++++++
gcc/testsuite/gcc.misc-tests/gcov-31.c | 35 +
gcc/testsuite/gcc.misc-tests/gcov-32.c | 24 +
gcc/testsuite/gcc.misc-tests/gcov-33.c | 27 +
gcc/testsuite/gcc.misc-tests/gcov-34.c | 29 +
gcc/testsuite/lib/gcov.exp | 118 +-
gcc/tree-profile.cc | 11 +-
29 files changed, 5775 insertions(+), 17 deletions(-)
create mode 100644 gcc/path-coverage.cc
create mode 100644 gcc/prime-paths.cc
create mode 100644 gcc/testsuite/g++.dg/gcov/gcov-22.C
create mode 100644 gcc/testsuite/g++.dg/gcov/gcov-23-1.h
create mode 100644 gcc/testsuite/g++.dg/gcov/gcov-23-2.h
create mode 100644 gcc/testsuite/g++.dg/gcov/gcov-23.C
create mode 100644 gcc/testsuite/gcc.misc-tests/gcov-29.c
create mode 100644 gcc/testsuite/gcc.misc-tests/gcov-30.c
create mode 100644 gcc/testsuite/gcc.misc-tests/gcov-31.c
create mode 100644 gcc/testsuite/gcc.misc-tests/gcov-32.c
create mode 100644 gcc/testsuite/gcc.misc-tests/gcov-33.c
create mode 100644 gcc/testsuite/gcc.misc-tests/gcov-34.c
diff --git a/gcc/builtins.cc b/gcc/builtins.cc
index 9d106405f79..e70a8132337 100644
--- a/gcc/builtins.cc
+++ b/gcc/builtins.cc
@@ -6362,7 +6362,7 @@ expand_builtin_fork_or_exec (tree fn, tree exp, rtx
target, int ignore)
tree call;
/* If we are not profiling, just call the function. */
- if (!profile_arc_flag && !condition_coverage_flag)
+ if (!profile_arc_flag && !condition_coverage_flag && !path_coverage_flag)
It is somewhat ugly to keep adding new flags in many places. Can you
please add predicate profile_instrumentation_p () (better neame welcome)
and use it on all places?
Yes, absolutely.
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index 18322247fb4..a754405ada6 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -659,6 +659,7 @@ Objective-C and Objective-C++ Dialects}.
@xref{Instrumentation Options,,Program Instrumentation Options}.
@gccoptlist{-p -pg -fprofile-arcs --coverage -ftest-coverage
-fcondition-coverage
+-fpath-coverage
-fprofile-abs-path
-fprofile-dir=@var{path} -fprofile-generate -fprofile-generate=@var{path}
-fprofile-info-section -fprofile-info-section=@var{name}
@@ -6689,6 +6690,13 @@ terms and GCC gives up coverage. Coverage is given up
when there are more
terms in the conditional than there are bits in a @code{gcov_type_unsigned}.
This warning is enabled by default.
+@opindex Wno-coverage-too-many-paths
+@opindex Wcoverage-too-many-paths
+@item -Wno-coverage-too-many-paths
+Warn if @option{-fpath-coverage} is used and a function has too many
+paths and GCC gives up coverage. Giving up is controlled by
+@option{-fpath-coverage-limit}. This warning is enabled by default.
+
@opindex Wno-coverage-invalid-line-number
@opindex Wcoverage-invalid-line-number
@item -Wno-coverage-invalid-line-number
@@ -17464,6 +17472,26 @@ can be used to verify that all terms in a Boolean
function are tested and have
an independent effect on the outcome of a decision. The result can be read
with @code{gcov --conditions}.
+@item -fpath-coverage
+@opindex fpath-coverage
+Add code so that the paths taken are tracked. During execution the
+program records the prime paths taken. The number of paths grows very
+fast with complexity, and to avoid exploding compile times GCC will give
+up instrumentation if the approximate number of paths exceeds the limit
+controlled by @option{-fpath-coverage-limit}. The result can be read
+with @code{gcov --prime-paths --prime-paths-lines --prime-paths-source}.
Do we have a way to link the section of gcov manual? (I am not quite
sure - my texinfo skills are rather pedestrian).
I don't know, but I will see what I can figure out.
Patch is OK with this change. Do you plan more profiling work next
stage1? I realize that this is second time I left long patch from you
to slip for many months, which is not good. Contributions are welcome
and I will try to do better.
Thanks, I'll apply the flag and maybe info fixes and merge it.
The project is over and I have no plans currently for more profiling
work, other than following up on potential problems and minor fixes.
Thanks,
Jørgen
Honza