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> 2013-05-09 Sofiane Naci <sofiane.naci@arm.com>
* config/aarch64/aarch64.md: New movtf split. * 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. */ /* Insert NODE to assembler name hash. */
static void 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)) if (is_a <varpool_node> (node) && DECL_HARD_REGISTER (node->symbol.decl))
return; return;
@ -111,6 +111,9 @@ insert_to_assembler_name_hash (symtab_node node)
if (assembler_name_hash) if (assembler_name_hash)
{ {
void **aslot; void **aslot;
struct cgraph_node *cnode;
tree decl = node->symbol.decl;
tree name = DECL_ASSEMBLER_NAME (node->symbol.decl); tree name = DECL_ASSEMBLER_NAME (node->symbol.decl);
aslot = htab_find_slot_with_hash (assembler_name_hash, name, 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) if (*aslot != NULL)
((symtab_node)*aslot)->symbol.previous_sharing_asm_name = node; ((symtab_node)*aslot)->symbol.previous_sharing_asm_name = node;
*aslot = 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. */ /* Remove NODE from assembler name hash. */
static void 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) if (assembler_name_hash)
{ {
struct cgraph_node *cnode;
tree decl = node->symbol.decl;
if (node->symbol.next_sharing_asm_name) if (node->symbol.next_sharing_asm_name)
node->symbol.next_sharing_asm_name->symbol.previous_sharing_asm_name node->symbol.next_sharing_asm_name->symbol.previous_sharing_asm_name
= node->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.next_sharing_asm_name = NULL;
node->symbol.previous_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 void
symtab_prevail_in_asm_name_hash (symtab_node node) symtab_prevail_in_asm_name_hash (symtab_node node)
{ {
unlink_from_assembler_name_hash (node); unlink_from_assembler_name_hash (node, false);
insert_to_assembler_name_hash (node); 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 /* Be sure to do this last; C++ FE might create new nodes via
DECL_ASSEMBLER_NAME langhook! */ 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 /* 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 else
*slot = replacement_node; *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, /* 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, htab_create_ggc (10, hash_node_by_assembler_name, eq_assembler_name,
NULL); NULL);
FOR_EACH_SYMBOL (node) 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); SET_DECL_ASSEMBLER_NAME (decl, name);
if (node) if (node)
insert_to_assembler_name_hash (node); insert_to_assembler_name_hash (node, true);
} }
else else
{ {
@ -363,14 +383,14 @@ change_decl_assembler_name (tree decl, tree name)
return; return;
if (node) if (node)
unlink_from_assembler_name_hash (node); unlink_from_assembler_name_hash (node, true);
if (TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)) if (TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl))
&& DECL_RTL_SET_P (decl)) && DECL_RTL_SET_P (decl))
warning (0, "%D renamed after being referenced in assembly", decl); warning (0, "%D renamed after being referenced in assembly", decl);
SET_DECL_ASSEMBLER_NAME (decl, name); SET_DECL_ASSEMBLER_NAME (decl, name);
if (node) if (node)
insert_to_assembler_name_hash (node); insert_to_assembler_name_hash (node, true);
} }
} }