On Mon, Apr 28, 2025 at 4:10 PM Martin Jambor <mjam...@suse.cz> wrote: > > 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?
OK everywhere. Richard. > 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 >