re PR lto/54095 (Unnecessary static variable renaming)

PR lto/54095
	* symtab.c (insert_to_assembler_name_hash): Handle clones.
	(unlink_from_assembler_name_hash): Likewise.
	(symtab_prevail_in_asm_name_hash, symtab_register_node,
	symtab_unregister_node, symtab_initialize_asm_name_hash,
	change_decl_assembler_name): Update.

From-SVN: r198736
This commit is contained in:
Jan Hubicka 2013-05-09 11:51:52 +02:00 committed by Jan Hubicka
parent 12dc697479
commit c3167b004d
2 changed files with 39 additions and 10 deletions

View File

@ -1,3 +1,12 @@
2013-05-09 Jan Hubicka <jh@suse.cz>
PR lto/54095
* symtab.c (insert_to_assembler_name_hash): Handle clones.
(unlink_from_assembler_name_hash): Likewise.
(symtab_prevail_in_asm_name_hash, symtab_register_node,
symtab_unregister_node, symtab_initialize_asm_name_hash,
change_decl_assembler_name): Update.
2013-05-09 Sofiane Naci <sofiane.naci@arm.com>
* config/aarch64/aarch64.md: New movtf split.

View File

@ -102,7 +102,7 @@ eq_assembler_name (const void *p1, const void *p2)
/* Insert NODE to assembler name hash. */
static void
insert_to_assembler_name_hash (symtab_node node)
insert_to_assembler_name_hash (symtab_node node, bool with_clones)
{
if (is_a <varpool_node> (node) && DECL_HARD_REGISTER (node->symbol.decl))
return;
@ -111,6 +111,9 @@ insert_to_assembler_name_hash (symtab_node node)
if (assembler_name_hash)
{
void **aslot;
struct cgraph_node *cnode;
tree decl = node->symbol.decl;
tree name = DECL_ASSEMBLER_NAME (node->symbol.decl);
aslot = htab_find_slot_with_hash (assembler_name_hash, name,
@ -121,6 +124,13 @@ insert_to_assembler_name_hash (symtab_node node)
if (*aslot != NULL)
((symtab_node)*aslot)->symbol.previous_sharing_asm_name = node;
*aslot = node;
/* Update also possible inline clones sharing a decl. */
cnode = dyn_cast <cgraph_node> (node);
if (cnode && cnode->clones && with_clones)
for (cnode = cnode->clones; cnode; cnode = cnode->next_sibling_clone)
if (cnode->symbol.decl == decl)
insert_to_assembler_name_hash ((symtab_node) cnode, true);
}
}
@ -128,10 +138,13 @@ insert_to_assembler_name_hash (symtab_node node)
/* Remove NODE from assembler name hash. */
static void
unlink_from_assembler_name_hash (symtab_node node)
unlink_from_assembler_name_hash (symtab_node node, bool with_clones)
{
if (assembler_name_hash)
{
struct cgraph_node *cnode;
tree decl = node->symbol.decl;
if (node->symbol.next_sharing_asm_name)
node->symbol.next_sharing_asm_name->symbol.previous_sharing_asm_name
= node->symbol.previous_sharing_asm_name;
@ -155,6 +168,13 @@ unlink_from_assembler_name_hash (symtab_node node)
}
node->symbol.next_sharing_asm_name = NULL;
node->symbol.previous_sharing_asm_name = NULL;
/* Update also possible inline clones sharing a decl. */
cnode = dyn_cast <cgraph_node> (node);
if (cnode && cnode->clones && with_clones)
for (cnode = cnode->clones; cnode; cnode = cnode->next_sibling_clone)
if (cnode->symbol.decl == decl)
unlink_from_assembler_name_hash ((symtab_node) cnode, true);
}
}
@ -163,8 +183,8 @@ unlink_from_assembler_name_hash (symtab_node node)
void
symtab_prevail_in_asm_name_hash (symtab_node node)
{
unlink_from_assembler_name_hash (node);
insert_to_assembler_name_hash (node);
unlink_from_assembler_name_hash (node, false);
insert_to_assembler_name_hash (node, false);
}
@ -196,7 +216,7 @@ symtab_register_node (symtab_node node)
/* Be sure to do this last; C++ FE might create new nodes via
DECL_ASSEMBLER_NAME langhook! */
insert_to_assembler_name_hash (node);
insert_to_assembler_name_hash (node, false);
}
/* Make NODE to be the one symtab hash is pointing to. Used when reshaping tree
@ -259,7 +279,7 @@ symtab_unregister_node (symtab_node node)
else
*slot = replacement_node;
}
unlink_from_assembler_name_hash (node);
unlink_from_assembler_name_hash (node, false);
}
/* Return symbol table node associated with DECL, if any,
@ -312,7 +332,7 @@ symtab_initialize_asm_name_hash (void)
htab_create_ggc (10, hash_node_by_assembler_name, eq_assembler_name,
NULL);
FOR_EACH_SYMBOL (node)
insert_to_assembler_name_hash (node);
insert_to_assembler_name_hash (node, false);
}
}
@ -355,7 +375,7 @@ change_decl_assembler_name (tree decl, tree name)
{
SET_DECL_ASSEMBLER_NAME (decl, name);
if (node)
insert_to_assembler_name_hash (node);
insert_to_assembler_name_hash (node, true);
}
else
{
@ -363,14 +383,14 @@ change_decl_assembler_name (tree decl, tree name)
return;
if (node)
unlink_from_assembler_name_hash (node);
unlink_from_assembler_name_hash (node, true);
if (TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl))
&& DECL_RTL_SET_P (decl))
warning (0, "%D renamed after being referenced in assembly", decl);
SET_DECL_ASSEMBLER_NAME (decl, name);
if (node)
insert_to_assembler_name_hash (node);
insert_to_assembler_name_hash (node, true);
}
}