Hi,
this patch makes cleaning of stmt pointers in references more robust so
late IPA passes do not break.

Bootstrapped/regtested x86_64-linux, comitted.

Honza

gcc/ChangeLog:

2020-10-26  Jan Hubicka  <hubi...@ucw.cz>

        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:

2020-10-26  Jan Hubicka  <hubi...@ucw.cz>

        PR ipa/97576
        * gcc.c-torture/compile/pr97576.c: New test.

diff --git a/gcc/cgraphclones.c b/gcc/cgraphclones.c
index 41c6efb10ac..0ed63078c91 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 d2d98c8dc8a..08b93cb00ee 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 279ba2f7cb0..4df1b7fb9ee 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 bc2865f4121..067ae2e28a0 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 00000000000..8d6a6c6d634
--- /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 9bac06f97af..a4832b75436 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)
     {

Reply via email to