Skip to content

Commit

Permalink
cgraph.h (+varpool_can_remove_if_no_refs): Move here from ......
Browse files Browse the repository at this point in the history
	* cgraph.h (+varpool_can_remove_if_no_refs): Move here from ...;
	when !flag_toplevel_reorder do not remove unless variable is
	COMDAT or ARTIFICIAL.
	* ipa.c (varpool_can_remove_if_no_refs): ... here.
	(cgraph_remove_unreachable_nodes): Only analyzed nodes needs to stay.
	* cgraphunit.c (cgraph_analyze_functions): Dump varpool, too.
	* varpool.c (decide_is_variable_needed): Do not handle visibility issues.
	(varpool_finalize_decl): Likewise.
	(varpool_remove_unreferenced_decls): Use varpool_mark_needed_node; update
	outdated comment on DECL_RTL_SET_P check.

From-SVN: r166812
  • Loading branch information
Jan Hubicka authored and Jan Hubicka committed Nov 16, 2010
1 parent 3e794bf commit df7705b
Show file tree
Hide file tree
Showing 5 changed files with 41 additions and 38 deletions.
13 changes: 13 additions & 0 deletions gcc/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,16 @@
2010-11-16 Jan Hubicka <[email protected]>

* cgraph.h (+varpool_can_remove_if_no_refs): Move here from ...;
when !flag_toplevel_reorder do not remove unless variable is
COMDAT or ARTIFICIAL.
* ipa.c (varpool_can_remove_if_no_refs): ... here.
(cgraph_remove_unreachable_nodes): Only analyzed nodes needs to stay.
* cgraphunit.c (cgraph_analyze_functions): Dump varpool, too.
* varpool.c (decide_is_variable_needed): Do not handle visibility issues.
(varpool_finalize_decl): Likewise.
(varpool_remove_unreferenced_decls): Use varpool_mark_needed_node; update
outdated comment on DECL_RTL_SET_P check.

2010-11-16 Rainer Orth <[email protected]>

* config/sol2.h (NM_FLAGS): Define.
Expand Down
12 changes: 12 additions & 0 deletions gcc/cgraph.h
Original file line number Diff line number Diff line change
Expand Up @@ -928,6 +928,18 @@ cgraph_can_remove_if_no_direct_calls_p (struct cgraph_node *node)
return !node->address_taken && cgraph_can_remove_if_no_direct_calls_and_refs_p (node);
}

/* Return true when function NODE can be removed from callgraph
if all direct calls are eliminated. */

static inline bool
varpool_can_remove_if_no_refs (struct varpool_node *node)
{
return (!node->force_output && !node->used_from_other_partition
&& (flag_toplevel_reorder || DECL_COMDAT (node->decl)
|| DECL_ARTIFICIAL (node->decl))
&& (DECL_COMDAT (node->decl) || !node->externally_visible));
}

/* Return true when all references to VNODE must be visible in ipa_ref_list.
i.e. if the variable is not externally visible or not used in some magic
way (asm statement or such).
Expand Down
3 changes: 3 additions & 0 deletions gcc/cgraphunit.c
Original file line number Diff line number Diff line change
Expand Up @@ -943,6 +943,7 @@ cgraph_analyze_functions (void)
fprintf (cgraph_dump_file, " %s", cgraph_node_name (node));
fprintf (cgraph_dump_file, "\n\nInitial ");
dump_cgraph (cgraph_dump_file);
dump_varpool (cgraph_dump_file);
}

if (cgraph_dump_file)
Expand Down Expand Up @@ -972,6 +973,7 @@ cgraph_analyze_functions (void)
{
fprintf (cgraph_dump_file, "\n\nReclaimed ");
dump_cgraph (cgraph_dump_file);
dump_varpool (cgraph_dump_file);
}
bitmap_obstack_release (NULL);
first_analyzed = cgraph_nodes;
Expand Down Expand Up @@ -1816,6 +1818,7 @@ cgraph_optimize (void)
{
fprintf (cgraph_dump_file, "\nFinal ");
dump_cgraph (cgraph_dump_file);
dump_varpool (cgraph_dump_file);
}
#ifdef ENABLE_CHECKING
verify_cgraph ();
Expand Down
13 changes: 2 additions & 11 deletions gcc/ipa.c
Original file line number Diff line number Diff line change
Expand Up @@ -188,16 +188,6 @@ process_references (struct ipa_ref_list *list,
}
}

/* Return true when function NODE can be removed from callgraph
if all direct calls are eliminated. */

static inline bool
varpool_can_remove_if_no_refs (struct varpool_node *node)
{
return (!node->force_output && !node->used_from_other_partition
&& (DECL_COMDAT (node->decl) || !node->externally_visible));
}

/* Return true when function can be marked local. */

static bool
Expand Down Expand Up @@ -269,7 +259,8 @@ cgraph_remove_unreachable_nodes (bool before_inlining_p, FILE *file)
{
vnode->next_needed = NULL;
vnode->prev_needed = NULL;
if (!varpool_can_remove_if_no_refs (vnode))
if (vnode->analyzed
&& !varpool_can_remove_if_no_refs (vnode))
{
vnode->needed = false;
varpool_mark_needed_node (vnode);
Expand Down
38 changes: 11 additions & 27 deletions gcc/varpool.c
Original file line number Diff line number Diff line change
Expand Up @@ -331,31 +331,24 @@ varpool_reset_queue (void)
bool
decide_is_variable_needed (struct varpool_node *node, tree decl)
{
if (node->used_from_other_partition)
return true;
/* If the user told us it is used, then it must be so. */
if ((node->externally_visible && !DECL_COMDAT (decl))
|| node->force_output)
if (node->force_output)
return true;

gcc_assert (!DECL_EXTERNAL (decl));

/* Externally visible variables must be output. The exception is
COMDAT variables that must be output only when they are needed. */
if (TREE_PUBLIC (decl)
&& !flag_whole_program
&& !flag_lto
&& !DECL_COMDAT (decl)
&& !DECL_EXTERNAL (decl))
return true;

/* When not reordering top level variables, we have to assume that
we are going to keep everything. */
if (flag_toplevel_reorder)
return false;

/* We want to emit COMDAT variables only when absolutely necessary. */
if (DECL_COMDAT (decl))
return false;
return true;
if (!flag_toplevel_reorder)
return true;
return false;
}

/* Return if DECL is constant and its initial value is known (so we can do
Expand Down Expand Up @@ -427,11 +420,6 @@ varpool_finalize_decl (tree decl)

if (decide_is_variable_needed (node, decl))
varpool_mark_needed_node (node);
/* Since we reclaim unreachable nodes at the end of every language
level unit, we need to be conservative about possible entry points
there. */
else if (TREE_PUBLIC (decl) && !DECL_COMDAT (decl) && !DECL_EXTERNAL (decl))
varpool_mark_needed_node (node);
if (cgraph_global_info_ready)
varpool_assemble_pending_decls ();
}
Expand Down Expand Up @@ -557,18 +545,14 @@ varpool_remove_unreferenced_decls (void)

while (node)
{
tree decl = node->decl;
next = node->next_needed;
node->needed = 0;

if (node->finalized
&& (decide_is_variable_needed (node, decl)
/* ??? Cgraph does not yet rule the world with an iron hand,
and does not control the emission of debug information.
After a variable has its DECL_RTL set, we must assume that
it may be referenced by the debug information, and we can
no longer elide it. */
|| DECL_RTL_SET_P (decl)))
if (node->analyzed
&& (!varpool_can_remove_if_no_refs (node)
/* We just expanded all function bodies. See if any of
them needed the variable. */
|| DECL_RTL_SET_P (node->decl)))
varpool_mark_needed_node (node);

node = next;
Expand Down

0 comments on commit df7705b

Please sign in to comment.