aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2020-10-26 14:10:45 +0100
committerJan Hubicka <jh@suse.cz>2020-10-26 14:11:35 +0100
commit783dc02d89712f5219093d33ad7f08e1509a2134 (patch)
tree1db4b583f7cff5d77efdc88773e79d57f23800a5 /gcc
parent2d5aad691f5bd605cfc27ce16a1f2d023cd21f75 (diff)
downloadgcc-783dc02d89712f5219093d33ad7f08e1509a2134.zip
gcc-783dc02d89712f5219093d33ad7f08e1509a2134.tar.gz
gcc-783dc02d89712f5219093d33ad7f08e1509a2134.tar.bz2
Fix simdclones
gcc/ChangeLog: PR ipa/97576 * cgraphclones.c (cgraph_node::materialize_clone): Clear stmt references. * cgraphunit.c (mark_functions_to_output): Do not clear them here. * ipa-inline-transform.c (inline_transform): Clear stmt references. * symtab.c (symtab_node::clear_stmts_in_references): Make recursive for clones. * tree-ssa-structalias.c (ipa_pta_execute): Do not clear references. gcc/testsuite/ChangeLog: PR ipa/97576 * gcc.c-torture/compile/pr97576.c: New test.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cgraphclones.c1
-rw-r--r--gcc/cgraphunit.c1
-rw-r--r--gcc/ipa-inline-transform.c1
-rw-r--r--gcc/symtab.c10
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr97576.c18
-rw-r--r--gcc/tree-ssa-structalias.c4
6 files changed, 29 insertions, 6 deletions
diff --git a/gcc/cgraphclones.c b/gcc/cgraphclones.c
index 41c6efb..0ed6307 100644
--- a/gcc/cgraphclones.c
+++ b/gcc/cgraphclones.c
@@ -1115,6 +1115,7 @@ cgraph_node::materialize_clone ()
if (clone.param_adjustments)
clone.param_adjustments->dump (symtab->dump_file);
}
+ clear_stmts_in_references ();
/* Copy the OLD_VERSION_NODE function tree to the new version. */
tree_function_versioning (clone_of->decl, decl,
clone.tree_map, clone.param_adjustments,
diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c
index d2d98c8..08b93cb 100644
--- a/gcc/cgraphunit.c
+++ b/gcc/cgraphunit.c
@@ -1600,7 +1600,6 @@ mark_functions_to_output (void)
FOR_EACH_FUNCTION (node)
{
tree decl = node->decl;
- node->clear_stmts_in_references ();
gcc_assert (!node->process || node->same_comdat_group);
if (node->process)
diff --git a/gcc/ipa-inline-transform.c b/gcc/ipa-inline-transform.c
index 279ba2f..4df1b7f 100644
--- a/gcc/ipa-inline-transform.c
+++ b/gcc/ipa-inline-transform.c
@@ -716,6 +716,7 @@ inline_transform (struct cgraph_node *node)
if (n->decl != node->decl)
n->materialize_clone ();
}
+ node->clear_stmts_in_references ();
/* We might need the body of this function so that we can expand
it inline somewhere else. */
diff --git a/gcc/symtab.c b/gcc/symtab.c
index bc2865f..067ae2e 100644
--- a/gcc/symtab.c
+++ b/gcc/symtab.c
@@ -752,7 +752,8 @@ symtab_node::remove_stmt_references (gimple *stmt)
i++;
}
-/* Remove all stmt references in non-speculative references.
+/* Remove all stmt references in non-speculative references in THIS
+ and all clones.
Those are not maintained during inlining & cloning.
The exception are speculative references that are updated along
with callgraph edges associated with them. */
@@ -770,6 +771,13 @@ symtab_node::clear_stmts_in_references (void)
r->lto_stmt_uid = 0;
r->speculative_id = 0;
}
+ cgraph_node *cnode = dyn_cast <cgraph_node *> (this);
+ if (cnode)
+ {
+ if (cnode->clones)
+ for (cnode = cnode->clones; cnode; cnode = cnode->next_sibling_clone)
+ cnode->clear_stmts_in_references ();
+ }
}
/* Remove all references in ref list. */
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr97576.c b/gcc/testsuite/gcc.c-torture/compile/pr97576.c
new file mode 100644
index 0000000..28294c8
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr97576.c
@@ -0,0 +1,18 @@
+void
+pc (void);
+
+void __attribute__ ((simd))
+ty (void);
+
+void __attribute__ ((simd))
+gf ()
+{
+ ty ();
+}
+
+void __attribute__ ((simd))
+ty (void)
+{
+ gf (pc);
+ gf (gf);
+}
diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c
index 9bac06f..a4832b7 100644
--- a/gcc/tree-ssa-structalias.c
+++ b/gcc/tree-ssa-structalias.c
@@ -8138,10 +8138,6 @@ ipa_pta_execute (void)
from = constraints.length ();
}
- /* FIXME: Clone materialization is not preserving stmt references. */
- FOR_EACH_DEFINED_FUNCTION (node)
- node->clear_stmts_in_references ();
-
/* Build the constraints. */
FOR_EACH_DEFINED_FUNCTION (node)
{