Hi! As written in the PR, the sibcall-3.c testcase fails on Darwin, because !sem_item::target_supports_symbol_aliases_p () and we don't really try redirect_callers, even when that is the best way to perform ICF (both original and alias are local).
Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 2015-02-20 Jakub Jelinek <ja...@redhat.com> Martin Liska <mli...@suse.cz> PR target/63892 * ipa-icf.c (sem_function::merge): If DECL_COMDAT_GROUP (alias->decl), don't try to create_thunk if stdarg_p. If !sem_item::target_supports_symbol_aliases_p (), similarly, and try to redirect_callers if possible. (sem_item_optimizer::execute): Call unregister_hooks here... (ipa_icf_driver): ... instead of here. --- gcc/ipa-icf.c +++ gcc/ipa-icf.c @@ -651,7 +651,9 @@ sem_function::merge (sem_item *alias_item) section (or we risk link failures when section is discarded). */ if ((original_address_matters && alias_address_matters) - || original_discardable) + || original_discardable + || DECL_COMDAT_GROUP (alias->decl) + || !sem_item::target_supports_symbol_aliases_p ()) { create_thunk = !stdarg_p (TREE_TYPE (alias->decl)); create_alias = false; @@ -659,6 +661,7 @@ sem_function::merge (sem_item *alias_item) the extra thunk wrapper for direct calls. */ redirect_callers = (!original_discardable + && !DECL_COMDAT_GROUP (alias->decl) && alias->get_availability () > AVAIL_INTERPOSABLE && original->get_availability () > AVAIL_INTERPOSABLE && !alias->instrumented_version); @@ -670,13 +673,6 @@ sem_function::merge (sem_item *alias_item) redirect_callers = false; } - if (create_alias && (DECL_COMDAT_GROUP (alias->decl) - || !sem_item::target_supports_symbol_aliases_p ())) - { - create_alias = false; - create_thunk = true; - } - /* We want thunk to always jump to the local function body unless the body is comdat and may be optimized out. */ if ((create_thunk || redirect_callers) @@ -1717,6 +1713,8 @@ void sem_item_optimizer::execute (void) { filter_removed_items (); + unregister_hooks (); + build_hash_based_classes (); if (dump_file) @@ -2578,7 +2576,6 @@ ipa_icf_driver (void) gcc_assert (optimizer); optimizer->execute (); - optimizer->unregister_hooks (); delete optimizer; optimizer = NULL; Jakub