ipa-reference.c (is_proper_for_analysis): Do not check flags that might change as result of global optimization.

* ipa-reference.c (is_proper_for_analysis): Do not check flags
	that might change as result of global optimization.
	(analyze_function): Do not check analyzed and externally_visible
	flags; be happy about address dereferences.
	(propagate): Prune all_module_statics so it really contains just
	statics; prune all the local summaries.
	(ipa_reference_write_optimization_summary): Simplify.

From-SVN: r187626
This commit is contained in:
Jan Hubicka 2012-05-17 11:22:02 +02:00 committed by Jan Hubicka
parent de7ee1e98d
commit 5264f487f0
2 changed files with 35 additions and 15 deletions

View file

@ -1,3 +1,13 @@
2012-05-17 Jan Hubicka <jh@suse.cz>
* ipa-reference.c (is_proper_for_analysis): Do not check flags
that might change as result of global optimization.
(analyze_function): Do not check analyzed and externally_visible
flags; be happy about address dereferences.
(propagate): Prune all_module_statics so it really contains just
statics; prune all the local summaries.
(ipa_reference_write_optimization_summary): Simplify.
2012-05-17 Kwok Cheung Yeung <kcy@codesourcery.com>
* config/m68k/m68k-devices.def: Add 51ag, 51je, 51jf, 51jg, 51mm,

View file

@ -247,10 +247,6 @@ add_static_var (tree var)
static inline bool
is_proper_for_analysis (tree t)
{
/* We handle only variables whose address is never taken. */
if (TREE_ADDRESSABLE (t))
return false;
/* If the variable has the "used" attribute, treat it as if it had a
been touched by the devil. */
if (DECL_PRESERVE_P (t))
@ -266,10 +262,6 @@ is_proper_for_analysis (tree t)
if (TREE_READONLY (t))
return false;
/* We cannot touch decls where the type needs constructing. */
if (TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (t)))
return false;
/* 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
@ -438,9 +430,7 @@ analyze_function (struct cgraph_node *fn)
if (!symtab_variable_p (ref->referred))
continue;
var = ipa_ref_varpool_node (ref)->symbol.decl;
if (ipa_ref_varpool_node (ref)->symbol.externally_visible
|| !ipa_ref_varpool_node (ref)->analyzed
|| !is_proper_for_analysis (var))
if (!is_proper_for_analysis (var))
continue;
switch (ref->use)
{
@ -453,7 +443,6 @@ analyze_function (struct cgraph_node *fn)
bitmap_set_bit (local->statics_written, DECL_UID (var));
break;
case IPA_REF_ADDR:
gcc_unreachable ();
break;
}
}
@ -613,6 +602,7 @@ static unsigned int
propagate (void)
{
struct cgraph_node *node;
struct varpool_node *vnode;
struct cgraph_node *w;
struct cgraph_node **order =
XCNEWVEC (struct cgraph_node *, cgraph_n_nodes);
@ -625,6 +615,28 @@ propagate (void)
ipa_discover_readonly_nonaddressable_vars ();
generate_summary ();
/* Now we know what vars are realy statics; prune out those that aren't. */
FOR_EACH_VARIABLE (vnode)
if (vnode->symbol.externally_visible
|| TREE_ADDRESSABLE (vnode->symbol.decl)
|| TREE_READONLY (vnode->symbol.decl)
|| !is_proper_for_analysis (vnode->symbol.decl)
|| !vnode->analyzed)
bitmap_clear_bit (all_module_statics, DECL_UID (vnode->symbol.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;
if (node_l->statics_read != all_module_statics)
bitmap_and_into (node_l->statics_read, all_module_statics);
if (node_l->statics_written != all_module_statics)
bitmap_and_into (node_l->statics_written, all_module_statics);
}
/* Propagate the local information thru 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
@ -1034,9 +1046,7 @@ ipa_reference_write_optimization_summary (cgraph_node_set set,
for (i = 0; i < lto_varpool_encoder_size (varpool_encoder); i++)
{
struct varpool_node *vnode = lto_varpool_encoder_deref (varpool_encoder, i);
if (!vnode->symbol.externally_visible
&& vnode->analyzed
&& bitmap_bit_p (all_module_statics, DECL_UID (vnode->symbol.decl))
if (bitmap_bit_p (all_module_statics, DECL_UID (vnode->symbol.decl))
&& referenced_from_this_partition_p (&vnode->symbol.ref_list, set, vset))
{
tree decl = vnode->symbol.decl;