diff options
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/ipa-reference.c | 51 |
2 files changed, 18 insertions, 40 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e277f22..4841582 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2014-06-10 Jan Hubicka <hubicka@ucw.cz> + + * ipa-reference.c (is_proper_for_analysis): Exclude addressable and public + vars. + (intersect_static_var_sets): Remove. + (propagate): Do not prune local statics. + 2014-06-10 Jakub Jelinek <jakub@redhat.com> PR fortran/60928 diff --git a/gcc/ipa-reference.c b/gcc/ipa-reference.c index bc58cfa..e815454 100644 --- a/gcc/ipa-reference.c +++ b/gcc/ipa-reference.c @@ -243,6 +243,17 @@ is_proper_for_analysis (tree t) if (TREE_READONLY (t)) return false; + /* We can not track variables with address taken. */ + if (TREE_ADDRESSABLE (t)) + return false; + + /* TODO: We could track public variables that are not addressable, but currently + frontends don't give us those. */ + if (TREE_PUBLIC (t)) + return false; + + /* TODO: Check aliases. */ + /* This is a variable we care about. Check if we have seen it before, and if not add it the set of variables we care about. */ if (all_module_statics @@ -312,26 +323,6 @@ union_static_var_sets (bitmap &x, bitmap y) return x == all_module_statics; } -/* Compute X &= Y, taking into account the possibility that - X may become the maximum set. */ - -static bool -intersect_static_var_sets (bitmap &x, bitmap y) -{ - if (x != all_module_statics) - { - bitmap_and_into (x, y); - /* As with union_static_var_sets, reducing to the maximum - set as early as possible is an overall win. */ - if (bitmap_equal_p (x, all_module_statics)) - { - BITMAP_FREE (x); - x = all_module_statics; - } - } - return x == all_module_statics; -} - /* Return a copy of SET on the bitmap obstack containing SET. But if SET is NULL or the maximum set, return that instead. */ @@ -669,7 +660,6 @@ static unsigned int propagate (void) { struct cgraph_node *node; - varpool_node *vnode; struct cgraph_node **order = XCNEWVEC (struct cgraph_node *, cgraph_n_nodes); int order_pos; @@ -681,25 +671,6 @@ propagate (void) ipa_discover_readonly_nonaddressable_vars (); generate_summary (); - /* Now we know what vars are really statics; prune out those that aren't. */ - FOR_EACH_VARIABLE (vnode) - if (vnode->externally_visible - || TREE_ADDRESSABLE (vnode->decl) - || TREE_READONLY (vnode->decl) - || !is_proper_for_analysis (vnode->decl) - || !vnode->definition) - bitmap_clear_bit (all_module_statics, DECL_UID (vnode->decl)); - - /* Forget info we collected "just for fun" on variables that turned out to be - non-local. */ - FOR_EACH_DEFINED_FUNCTION (node) - { - ipa_reference_local_vars_info_t node_l; - node_l = &get_reference_vars_info (node)->local; - intersect_static_var_sets (node_l->statics_read, all_module_statics); - intersect_static_var_sets (node_l->statics_written, all_module_statics); - } - /* Propagate the local information through the call graph to produce the global information. All the nodes within a cycle will have the same info so we collapse cycles first. Then we can do the |