Hi, ipa-reference is somewhat stupid and builds its data sets for all variables including addressable and public one just to prune them out after all bitmaps are constructed. This used to make sense when the profile generation happened at compile time, but since ipa_ref datastructure was intrdocued this is a nonsense.
Martin: It may be interesting to check if this solves the memory use issues with chrome. We also may be able to re-enable ipa-ref with profile-generate as I think all the datastructures are considered to have address taken. Honza Bootstrapped/regtested x86_64-linux. * ipa-reference.c (is_proper_for_analysis): Exclude addressable and public vars. (intersect_static_var_sets): Remove. (propagate): Do not prune local statics. Index: ipa-reference.c =================================================================== --- ipa-reference.c (revision 211364) +++ ipa-reference.c (working copy) @@ -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 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