On 3/26/25 20:49, Jørgen Kvalsvik wrote:
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.

It is quite possible -- I created a reference from the -fpath-coverage option to the example in the gcov manual.

Thanks,
Jørgen



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


Reply via email to