> diff --git a/gcc/ipa-icf.c b/gcc/ipa-icf.c > index f68d23c..b8e3aa4 100644 > --- a/gcc/ipa-icf.c > +++ b/gcc/ipa-icf.c > @@ -557,6 +557,69 @@ sem_function::equals_wpa (sem_item *item, > return true; > } > > +/* Update hash by address sensitive references. */ > + > +void > +sem_item::update_hash_by_addr_refs (hash_map <symtab_node *, > + sem_item *> &m_symtab_node_map) > +{ > + if (is_a <varpool_node *> (node) && DECL_VIRTUAL_P (node->decl))
Do not return early here, if reference goes to external symbol, we still want to record it as sensitive. ref->address_matters_p () should behave well here. > + return; > + > + ipa_ref* ref; > + inchash::hash hstate (hash); > + for (unsigned i = 0; i < node->num_references (); i++) > + { > + ref = node->iterate_reference (i, ref); > + if (ref->address_matters_p ()) ref->address_matters_p () || !m_symtab_node_map.get (ref->referred) if refernce goes to external symbol, it behaves like sensitive. You probably want to update topleve comment explaining what is sensitive and local reference and how the hashing is handled. > + hstate.add_ptr (ref->referred->ultimate_alias_target ()); > + } > + > + if (is_a <cgraph_node *> (node)) > + { > + for (cgraph_edge *e = dyn_cast <cgraph_node *> (node)->callers; e; > + e = e->next_caller) > + { > + sem_item **result = m_symtab_node_map.get (e->callee); > + if (!result) > + hstate.add_ptr (e->callee->ultimate_alias_target ()); > + } > + } > + > + hash = hstate.end (); > +} > + > +/* Update hash by computed local hash values taken from different > + semantic items. */ Please add TODO that stronger SCC based hashing would be desirable here. > @@ -2301,6 +2364,19 @@ sem_item_optimizer::add_item_to_class > (congruence_class *cls, sem_item *item) > item->cls = cls; > } > > +void > +sem_item_optimizer::update_hash_by_addr_refs () Add block comment ande xplain why the addr and local updates can not be performed at once or someone gets an idea to merge the loops. > +{ > + for (unsigned i = 0; i < m_items.length (); i++) > + m_items[i]->update_hash_by_addr_refs (m_symtab_node_map); > + > + for (unsigned i = 0; i < m_items.length (); i++) > + m_items[i]->update_hash_by_local_refs (m_symtab_node_map); > + > + for (unsigned i = 0; i < m_items.length (); i++) > + m_items[i]->hash = m_items[i]->global_hash; > +} > + OK with these changes. Honza