Hi, 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.
Bootstrapped and tested on x86_64-linux. OK for master and gcc 15, 14 and 13? Thanks, Martin 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. --- gcc/cgraphclones.cc | 10 +++++- gcc/testsuite/gcc.dg/ipa/pr119852.c | 50 +++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/ipa/pr119852.c diff --git a/gcc/cgraphclones.cc b/gcc/cgraphclones.cc index e6223fa1f5c..bf5bc41cde9 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 00000000000..eab8d21293c --- /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" } } */ -- 2.49.0