Hello. Following patch skips all variable aliases as potential merge candidates. Tested on x86_64-linux.
Ready for trunk? Thanks, Martin
>From fbde2e98f98a71105d18cf3e91e8032d0c657139 Mon Sep 17 00:00:00 2001 From: mliska <mli...@suse.cz> Date: Fri, 27 Feb 2015 22:42:49 +0100 Subject: [PATCH 2/4] ICF: Do not consider variable aliases for merge operation. gcc/ChangeLog: 2015-02-28 Martin Liska <mli...@suse.cz> Jan Hubicka <hubi...@ucw.cz> PR ipa/65245 * ipa-icf.c (sem_function::parse): Do not consider aliases. (sem_variable::parse): Likewise. (sem_item_optimizer::build_graph): Consider ultimate aliases for references. --- gcc/ipa-icf.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/gcc/ipa-icf.c b/gcc/ipa-icf.c index 92133fc..864a5d0 100644 --- a/gcc/ipa-icf.c +++ b/gcc/ipa-icf.c @@ -1095,7 +1095,7 @@ sem_function::parse (cgraph_node *node, bitmap_obstack *stack) tree fndecl = node->decl; function *func = DECL_STRUCT_FUNCTION (fndecl); - /* TODO: add support for thunks and aliases. */ + /* TODO: add support for thunks. */ if (!func || !node->has_gimple_body_p ()) return NULL; @@ -1407,6 +1407,9 @@ sem_variable::parse (varpool_node *node, bitmap_obstack *stack) { tree decl = node->decl; + if (node->alias) + return NULL; + bool readonly = TYPE_P (decl) ? TYPE_READONLY (decl) : TREE_READONLY (decl); if (!readonly) return NULL; @@ -2057,7 +2060,8 @@ sem_item_optimizer::build_graph (void) cgraph_edge *e = cnode->callees; while (e) { - sem_item **slot = m_symtab_node_map.get (e->callee); + sem_item **slot = m_symtab_node_map.get + (e->callee->ultimate_alias_target ()); if (slot) item->add_reference (*slot); @@ -2068,7 +2072,8 @@ sem_item_optimizer::build_graph (void) ipa_ref *ref = NULL; for (unsigned i = 0; item->node->iterate_reference (i, ref); i++) { - sem_item **slot = m_symtab_node_map.get (ref->referred); + sem_item **slot = m_symtab_node_map.get + (ref->referred->ultimate_alias_target ()); if (slot) item->add_reference (*slot); } -- 2.1.2