On Wed, Jan 28, 2026 at 8:49 PM Jørgen Kvalsvik <[email protected]> wrote:
>
> Relax the (accidental) requirement and permit that function-local
> counters don't have SSA names. We really only look up the def
> statement to check if it is a phi node, in which case we need to
> resolve the counter from there. This obviously doesn't apply when it
> is a constant.
OK.
Thanks,
Richard.
> PR gcov-profile/123855
>
> gcc/ChangeLog:
>
> * path-coverage.cc (flush_on_edges): Only look up SSA name def
> stmt when counter is non-const.
>
> gcc/testsuite/ChangeLog:
>
> * gcc.misc-tests/gcov-pr123855.c: New test.
> ---
> gcc/path-coverage.cc | 4 ++--
> gcc/testsuite/gcc.misc-tests/gcov-pr123855.c | 13 +++++++++++++
> 2 files changed, 15 insertions(+), 2 deletions(-)
> create mode 100644 gcc/testsuite/gcc.misc-tests/gcov-pr123855.c
>
> diff --git a/gcc/path-coverage.cc b/gcc/path-coverage.cc
> index 7ce662ce007..68a30d5a8ee 100644
> --- a/gcc/path-coverage.cc
> +++ b/gcc/path-coverage.cc
> @@ -379,8 +379,8 @@ void
> flush_on_edges (basic_block bb, size_t bucket, tree local, tree mask,
> tree atomic_ior, tree gcov_type_node)
> {
> - gimple *def = SSA_NAME_DEF_STMT (local);
> - gphi *phi = dyn_cast <gphi *> (def);
> + gimple *def = !constant_p (local) ? SSA_NAME_DEF_STMT (local) : NULL;
> + gphi *phi = safe_dyn_cast <gphi *> (def);
>
> tree relaxed = nullptr;
> if (atomic_ior)
> diff --git a/gcc/testsuite/gcc.misc-tests/gcov-pr123855.c
> b/gcc/testsuite/gcc.misc-tests/gcov-pr123855.c
> new file mode 100644
> index 00000000000..16fc27a850f
> --- /dev/null
> +++ b/gcc/testsuite/gcc.misc-tests/gcov-pr123855.c
> @@ -0,0 +1,13 @@
> +/* { dg-options "--coverage -fpath-coverage" } */
> +
> +__attribute__((__returns_twice__)) void
> +foo ()
> +{
> + foo ();
> + for (;;)
> + ;
> +}
> +
> +int main () {}
> +
> +/* { dg-final { run-gcov prime-paths gcov-pr123855.c } } */
> --
> 2.47.3
>