lto-symtab.c (lto_cgraph_replace_node): Do not remove edges; node will be removed anyway.
* lto-symtab.c (lto_cgraph_replace_node): Do not remove edges; node will be removed anyway. (lto_varpool_replace_node): Allow also unanalyzed nodes; relink aliases of node into prevailing node. * varpool.c (varpool_remove_node): Remove aliases properly; when removing node, remove all its aliases too; remove DECL_INITIAL of removed node; ggc_free the varpool node. From-SVN: r159031
This commit is contained in:
parent
4ac4b59698
commit
688a10c2b9
3 changed files with 47 additions and 14 deletions
|
@ -1,3 +1,13 @@
|
|||
2010-05-04 Jan Hubicka <jh@suse.cz>
|
||||
|
||||
* lto-symtab.c (lto_cgraph_replace_node): Do not remove edges;
|
||||
node will be removed anyway.
|
||||
(lto_varpool_replace_node): Allow also unanalyzed nodes;
|
||||
relink aliases of node into prevailing node.
|
||||
* varpool.c (varpool_remove_node): Remove aliases properly;
|
||||
when removing node, remove all its aliases too; remove DECL_INITIAL
|
||||
of removed node; ggc_free the varpool node.
|
||||
|
||||
2010-05-04 Richard Guenther <rguenther@suse.de>
|
||||
|
||||
PR tree-optimization/43879
|
||||
|
|
|
@ -215,15 +215,6 @@ lto_cgraph_replace_node (struct cgraph_node *node,
|
|||
cgraph_redirect_edge_callee (e, prevailing_node);
|
||||
}
|
||||
|
||||
/* There are not supposed to be any outgoing edges from a node we
|
||||
replace. Still this can happen for multiple instances of weak
|
||||
functions. */
|
||||
for (e = node->callees; e; e = next)
|
||||
{
|
||||
next = e->next_callee;
|
||||
cgraph_remove_edge (e);
|
||||
}
|
||||
|
||||
if (node->same_body)
|
||||
{
|
||||
struct cgraph_node *alias;
|
||||
|
@ -257,9 +248,28 @@ lto_varpool_replace_node (struct varpool_node *vnode,
|
|||
/* Merge node flags. */
|
||||
if (vnode->needed)
|
||||
{
|
||||
gcc_assert (prevailing_node->analyzed);
|
||||
gcc_assert (!vnode->analyzed || prevailing_node->analyzed);
|
||||
varpool_mark_needed_node (prevailing_node);
|
||||
}
|
||||
/* Relink aliases. */
|
||||
if (vnode->extra_name && !vnode->alias)
|
||||
{
|
||||
struct varpool_node *alias, *last;
|
||||
for (alias = vnode->extra_name;
|
||||
alias; alias = alias->next)
|
||||
{
|
||||
last = alias;
|
||||
alias->extra_name = prevailing_node;
|
||||
}
|
||||
|
||||
if (prevailing_node->extra_name)
|
||||
{
|
||||
last->next = prevailing_node->extra_name;
|
||||
prevailing_node->extra_name->prev = last;
|
||||
}
|
||||
prevailing_node->extra_name = vnode->extra_name;
|
||||
vnode->extra_name = NULL;
|
||||
}
|
||||
gcc_assert (!vnode->finalized || prevailing_node->finalized);
|
||||
gcc_assert (!vnode->analyzed || prevailing_node->analyzed);
|
||||
|
||||
|
|
|
@ -157,14 +157,25 @@ varpool_remove_node (struct varpool_node *node)
|
|||
gcc_assert (*slot == node);
|
||||
htab_clear_slot (varpool_hash, slot);
|
||||
gcc_assert (!varpool_assembled_nodes_queue);
|
||||
if (!node->alias)
|
||||
while (node->extra_name)
|
||||
varpool_remove_node (node->extra_name);
|
||||
if (node->next)
|
||||
node->next->prev = node->prev;
|
||||
if (node->prev)
|
||||
node->prev->next = node->next;
|
||||
else if (node->next)
|
||||
else
|
||||
{
|
||||
gcc_assert (varpool_nodes == node);
|
||||
varpool_nodes = node->next;
|
||||
if (node->alias)
|
||||
{
|
||||
gcc_assert (node->extra_name->extra_name == node);
|
||||
node->extra_name->extra_name = node->next;
|
||||
}
|
||||
else
|
||||
{
|
||||
gcc_assert (varpool_nodes == node);
|
||||
varpool_nodes = node->next;
|
||||
}
|
||||
}
|
||||
if (varpool_first_unanalyzed_node == node)
|
||||
varpool_first_unanalyzed_node = node->next_needed;
|
||||
|
@ -182,7 +193,9 @@ varpool_remove_node (struct varpool_node *node)
|
|||
gcc_assert (varpool_nodes_queue == node);
|
||||
varpool_nodes_queue = node->next_needed;
|
||||
}
|
||||
node->decl = NULL;
|
||||
if (DECL_INITIAL (node->decl))
|
||||
DECL_INITIAL (node->decl) = error_mark_node;
|
||||
ggc_free (node);
|
||||
}
|
||||
|
||||
/* Dump given cgraph node. */
|
||||
|
|
Loading…
Add table
Reference in a new issue