From: Jan Hubicka Date: Tue, 10 Jun 2014 06:30:50 +0000 (+0200) Subject: ipa-reference.c (is_proper_for_analysis): Exclude addressable and public vars. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=1685ecf3bf96cba4840ea4ef7b0f87b4f92b4898;p=gcc.git ipa-reference.c (is_proper_for_analysis): Exclude addressable and public vars. * ipa-reference.c (is_proper_for_analysis): Exclude addressable and public vars. (intersect_static_var_sets): Remove. (propagate): Do not prune local statics. From-SVN: r211398 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e277f229b13..4841582fb5e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2014-06-10 Jan Hubicka + + * 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 PR fortran/60928 diff --git a/gcc/ipa-reference.c b/gcc/ipa-reference.c index bc58cfa25ec..e815454162b 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