https://gcc.gnu.org/g:fb71d7c8e7ce4b061e40cd29cd77a4cfd7a256af

commit r15-8927-gfb71d7c8e7ce4b061e40cd29cd77a4cfd7a256af
Author: Jakub Jelinek <ja...@redhat.com>
Date:   Wed Mar 26 13:59:16 2025 +0100

    profile: Don't instrument fake exit edges after musttail [PR118442]
    
    When -fprofile-generate is used musttail often fails because the
    compiler adds instrumentation after the tail calls.
    
    This patch ignores EDGE_FAKE edges added from musttail calls to EXIT.
    
    2025-03-26  Jakub Jelinek  <ja...@redhat.com>
                Andi Kleen  <a...@gcc.gnu.org>
    
            PR gcov-profile/118442
            * profile.cc (branch_prob): Ignore EDGE_FAKE edges from musttail 
calls
            to EXIT.
    
            * c-c++-common/pr118442.c: New test.

Diff:
---
 gcc/profile.cc                        | 14 ++++++++++++++
 gcc/testsuite/c-c++-common/pr118442.c | 17 +++++++++++++++++
 2 files changed, 31 insertions(+)

diff --git a/gcc/profile.cc b/gcc/profile.cc
index acc0ae0cc201..76fed352f00a 100644
--- a/gcc/profile.cc
+++ b/gcc/profile.cc
@@ -1340,6 +1340,20 @@ branch_prob (bool thunk)
          EDGE_INFO (e)->ignore = 1;
          ignored_edges++;
        }
+      /* Ignore fake edges after musttail calls.  */
+      if ((e->flags & EDGE_FAKE)
+         && e->dest == EXIT_BLOCK_PTR_FOR_FN (cfun))
+       {
+         gimple_stmt_iterator gsi = gsi_last_bb (e->src);
+         gimple *stmt = gsi_stmt (gsi);
+         if (stmt
+             && is_gimple_call (stmt)
+             && gimple_call_must_tail_p (as_a <const gcall *> (stmt)))
+           {
+             EDGE_INFO (e)->ignore = 1;
+             ignored_edges++;
+           }
+       }
     }
 
   /* Create spanning tree from basic block graph, mark each edge that is
diff --git a/gcc/testsuite/c-c++-common/pr118442.c 
b/gcc/testsuite/c-c++-common/pr118442.c
new file mode 100644
index 000000000000..2472aa6ea8b0
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/pr118442.c
@@ -0,0 +1,17 @@
+/* PR118442 */
+/* { dg-do compile { target { struct_musttail && { external_musttail && { c || 
c++11 } } } } } */
+/* { dg-options "-fprofile-generate -O2" } */
+/* { dg-require-profiling "-fprofile-generate" } */
+
+struct Span {
+  int test[5];
+};
+
+extern void resolveToBufferSlow (struct Span *buffer);
+
+void
+resolveToBuffer (struct Span *buffer)
+{
+  buffer->test[0] = 4;
+  [[clang::musttail]] return resolveToBufferSlow (buffer);
+}

Reply via email to