diff options
-rw-r--r-- | gcc/cgraphclones.c | 1 | ||||
-rw-r--r-- | gcc/cgraphunit.c | 1 | ||||
-rw-r--r-- | gcc/ipa-inline-transform.c | 1 | ||||
-rw-r--r-- | gcc/symtab.c | 10 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/compile/pr97576.c | 18 | ||||
-rw-r--r-- | gcc/tree-ssa-structalias.c | 4 |
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) { |