aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Jambor <mjambor@suse.cz>2025-05-06 17:28:43 +0200
committerMartin Jambor <jamborm@gcc.gnu.org>2025-05-06 17:32:19 +0200
commitfb5829a01651d427a63a12c44ecc8baa47dbfc83 (patch)
treea84146d3e8552e18292905cf4d7b5c973efba6f8
parent6ecc2fee06bdd60da0e9b3fe6660b553dbdca3ca (diff)
downloadgcc-fb5829a01651d427a63a12c44ecc8baa47dbfc83.zip
gcc-fb5829a01651d427a63a12c44ecc8baa47dbfc83.tar.gz
gcc-fb5829a01651d427a63a12c44ecc8baa47dbfc83.tar.bz2
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 <mjambor@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 <mjambor@suse.cz> PR ipa/119852 * gcc.dg/ipa/pr119852.c: New test.
-rw-r--r--gcc/cgraphclones.cc10
-rw-r--r--gcc/testsuite/gcc.dg/ipa/pr119852.c50
2 files changed, 59 insertions, 1 deletions
diff --git a/gcc/cgraphclones.cc b/gcc/cgraphclones.cc
index e6223fa..bf5bc41 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 0000000..eab8d212
--- /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" } } */