On 06/10/2014 08:34 AM, Jan Hubicka wrote:
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.
Hi,
there is a link to chromium stats:
https://drive.google.com/file/d/0B0pisUJ80pO1VmNHeklCRWVkOUU/edit?usp=sharing
Both compilation were run with '-flto=6', where the upper graph adds
'-fprofile-generate'. Memory footprint is IMHO acceptable, but compilation
process takes twice longer with profile generation. Yeah, chromium contains a
really big code base :)
Martin
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