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
>

Reply via email to