The following fixes LTO bootstrap with IPA PTA enabled (the only
useful IPA PTA test we have).  The issue was that the cgraph
node with the body may not have used_from_other_partition set
but only one of its aliases (genrecog was miscompiled and the
function was a constructor and one of its aliases generated by
the C++ FE).

LTO bootstrapped with IPA PTA enabled on x86_64-unknown-linux-gnu,
testing in progress.

Richard.

2016-04-27  Richard Biener  <rguent...@suse.de>

        PR ipa/70785
        * tree-ssa-structalias.c (refered_from_nonlocal_fn): New
        function cummulating used_from_other_partition, externally_visible
        and force_output from aliases.
        (refered_from_nonlocal_var): Likewise.
        (ipa_pta_execute): Use call_for_symbol_and_aliases to cummulate
        node flags properly.

Index: gcc/tree-ssa-structalias.c
===================================================================
--- gcc/tree-ssa-structalias.c  (revision 235443)
+++ gcc/tree-ssa-structalias.c  (working copy)
@@ -7486,7 +7486,7 @@ struct pt_solution ipa_escaped_pt
   = { true, false, false, false, false, false, false, false, NULL };
 
 /* Associate node with varinfo DATA. Worker for
-   cgraph_for_node_and_aliases.  */
+   cgraph_for_symbol_thunks_and_aliases.  */
 static bool
 associate_varinfo_to_alias (struct cgraph_node *node, void *data)
 {
@@ -7496,6 +7496,29 @@ associate_varinfo_to_alias (struct cgrap
   return false;
 }
 
+/* Compute whether node is refered to non-locally.  Worker for
+   cgraph_for_symbol_thunks_and_aliases.  */
+static bool
+refered_from_nonlocal_fn (struct cgraph_node *node, void *data)
+{
+  bool *nonlocal_p = (bool *)data;
+  *nonlocal_p |= (node->used_from_other_partition
+                 || node->externally_visible
+                 || node->force_output);
+  return false;
+}
+
+/* Same for varpool nodes.  */
+static bool
+refered_from_nonlocal_var (struct varpool_node *node, void *data)
+{
+  bool *nonlocal_p = (bool *)data;
+  *nonlocal_p |= (node->used_from_other_partition
+                 || node->externally_visible
+                 || node->force_output);
+  return false;
+}
+
 /* Execute the driver for IPA PTA.  */
 static unsigned int
 ipa_pta_execute (void)
@@ -7559,6 +7582,8 @@ ipa_pta_execute (void)
                         || node->externally_visible
                         || node->force_output
                         || node_address_taken);
+      node->call_for_symbol_thunks_and_aliases (refered_from_nonlocal_fn,
+                                               &nonlocal_p, true);
 
       vi = create_function_info_for (node->decl,
                                     alias_get_name (node->decl), false,
@@ -7596,6 +7621,8 @@ ipa_pta_execute (void)
       bool nonlocal_p = (var->used_from_other_partition
                         || var->externally_visible
                         || var->force_output);
+      var->call_for_symbol_and_aliases (refered_from_nonlocal_var,
+                                       &nonlocal_p, true);
       if (nonlocal_p)
        vi->is_ipa_escape_point = true;
     }

Reply via email to