diff options
author | Richard Biener <rguenther@suse.de> | 2016-04-27 10:42:08 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2016-04-27 10:42:08 +0000 |
commit | 2b78f22152e0af0612433f2bdf1d9eae76bfd843 (patch) | |
tree | 2d34bc0aec820121f34dc86520fb24811bd5eee2 /gcc/tree-ssa-structalias.c | |
parent | c1e1f4333b65cb99f2dbfff267a634448d947529 (diff) | |
download | gcc-2b78f22152e0af0612433f2bdf1d9eae76bfd843.zip gcc-2b78f22152e0af0612433f2bdf1d9eae76bfd843.tar.gz gcc-2b78f22152e0af0612433f2bdf1d9eae76bfd843.tar.bz2 |
re PR ipa/70785 (LTO bootstrap with IPA PTA is broken)
2016-04-27 Richard Biener <rguenther@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.
From-SVN: r235477
Diffstat (limited to 'gcc/tree-ssa-structalias.c')
-rw-r--r-- | gcc/tree-ssa-structalias.c | 29 |
1 files changed, 28 insertions, 1 deletions
diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c index 3fdde84..8c25af7 100644 --- a/gcc/tree-ssa-structalias.c +++ b/gcc/tree-ssa-structalias.c @@ -7508,7 +7508,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) { @@ -7624,6 +7624,29 @@ debug_varmap (void) dump_varmap (stderr); } +/* 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) @@ -7687,6 +7710,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, @@ -7724,6 +7749,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; } |