https://gcc.gnu.org/g:51ffec744b513a71fe84373fb87a3c0125b7fffd

commit r14-11764-g51ffec744b513a71fe84373fb87a3c0125b7fffd
Author: Martin Jambor <mjam...@suse.cz>
Date:   Tue May 6 17:28:43 2025 +0200

    ipa: Do not emit info about temporary clones to ipa-clones dump (PR119852)
    
    As described in PR 119852, the output of -fdump-ipa-clones can contain
    "(null)" as the suffix/reason for cloning when we need to create a
    clone to hold the original function during recursive inlining.  Such
    clone is never output and so should not be part of the dump output
    either.
    
    gcc/ChangeLog:
    
    2025-04-23  Martin Jambor  <mjam...@suse.cz>
    
            PR ipa/119852
            * cgraphclones.cc (dump_callgraph_transformation): Document the
            function.  Do not dump if suffix is NULL.
    
    gcc/testsuite/ChangeLog:
    
    2025-04-23  Martin Jambor  <mjam...@suse.cz>
    
            PR ipa/119852
            * gcc.dg/ipa/pr119852.c: New test.
    
    (cherry picked from commit fb5829a01651d427a63a12c44ecc8baa47dbfc83)

Diff:
---
 gcc/cgraphclones.cc                 | 10 +++++++-
 gcc/testsuite/gcc.dg/ipa/pr119852.c | 50 +++++++++++++++++++++++++++++++++++++
 2 files changed, 59 insertions(+), 1 deletion(-)

diff --git a/gcc/cgraphclones.cc b/gcc/cgraphclones.cc
index 4fff6873a369..913c0a0a082f 100644
--- a/gcc/cgraphclones.cc
+++ b/gcc/cgraphclones.cc
@@ -307,12 +307,20 @@ cgraph_node::expand_all_artificial_thunks ()
       e = e->next_caller;
 }
 
+/* Dump information about creation of a call graph node clone to the dump file
+   created by the -fdump-ipa-clones option.  ORIGINAL is the function being
+   cloned, CLONE is the new clone.  SUFFIX is a string that helps identify the
+   reason for cloning, often it is the suffix used by a particular IPA pass to
+   create unique function names.  SUFFIX can be NULL and in that case the
+   dumping will not take place, which must be the case only for helper clones
+   which will never be emitted to the output.  */
+
 void
 dump_callgraph_transformation (const cgraph_node *original,
                               const cgraph_node *clone,
                               const char *suffix)
 {
-  if (symtab->ipa_clones_dump_file)
+  if (suffix && symtab->ipa_clones_dump_file)
     {
       fprintf (symtab->ipa_clones_dump_file,
               "Callgraph clone;%s;%d;%s;%d;%d;%s;%d;%s;%d;%d;%s\n",
diff --git a/gcc/testsuite/gcc.dg/ipa/pr119852.c 
b/gcc/testsuite/gcc.dg/ipa/pr119852.c
new file mode 100644
index 000000000000..eab8d21293cc
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/ipa/pr119852.c
@@ -0,0 +1,50 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -fdump-ipa-clones"  } */
+
+typedef struct rtx_def *rtx;
+enum rtx_code {
+  LAST_AND_UNUSED_RTX_CODE};
+extern const char * const rtx_format[((int) LAST_AND_UNUSED_RTX_CODE)];
+struct rtx_def {
+  enum rtx_code code;
+};
+typedef int (*rtx_function) (rtx *, void *);
+extern int for_each_rtx (rtx *, rtx_function, void *);
+int
+replace_label (rtx *x, void *data)
+{
+  rtx l = *x;
+  if (l == (rtx) 0)
+    {
+ {
+   rtx new_c, new_l;
+   for_each_rtx (&new_c, replace_label, data);
+ }
+    }
+}
+static int
+for_each_rtx_1 (rtx exp, int n, rtx_function f, void *data)
+{
+  int result, i, j;
+  const char *format = (rtx_format[(int) (((enum rtx_code) (exp)->code))]);
+  rtx *x;
+  for (; format[n] != '\0'; n++)
+    {
+      switch (format[n])
+ {
+ case 'e':
+   result = (*f) (x, data);
+     {
+       result = for_each_rtx_1 (*x, i, f, data);
+     }
+ }
+    }
+}
+int
+for_each_rtx (rtx *x, rtx_function f, void *data)
+{
+  int i;
+  return for_each_rtx_1 (*x, i, f, data);
+}
+
+/* { dg-final { scan-ipa-dump-not "(null)"  "ipa-clones"  } } */

Reply via email to