https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85656
--- Comment #7 from ro at CeBiTec dot Uni-Bielefeld.DE <ro at CeBiTec dot
Uni-Bielefeld.DE> ---
> --- Comment #6 from Martin Liška <marxin at gcc dot gnu.org> ---
[...]
> So can you please debug why we go into following branch:
> 1277 if (!create_wrapper
> 1278 && !alias->call_for_symbol_and_aliases
> (cgraph_node::has_thunk_p,
> 1279 NULL, true)
> 1280 && !alias->can_remove_if_no_direct_calls_p ())
> 1281 {
> 1282 if (dump_file)
> 1283 fprintf (dump_file, "Not unifying; can not make wrapper
> and
> "
> 1284 "function has other uses than direct calls\n\n");
> 1285 return false;
> 1286 }
>
> I'm curious why can_remove_if_no_direct_calls_p returns false.
It took me a bit figuring out which of the two lto1 invocations was the
interesting one, then rebuilding with -g3 -O0 to be able to see anything
useful in gdb.
Here's what I found:
ipa-icf.c:1280 (sem_function::merge)
&& !alias->can_remove_if_no_direct_calls_p ())
cgraph.c:2848 (cgraph_node::can_remove_if_no_direct_calls_p)
return !call_for_symbol_and_aliases (nonremovable_p, NULL, true);
cgraph.h:3213 (cgraph_node::call_for_symbol_and_aliases)
if (callback (this, data))
return true;
cgraph.c:2829 (nonremovable_p)
return !node->can_remove_if_no_direct_calls_and_refs_p ();
cgraph.h:2924 (cgraph_node::can_remove_if_no_direct_calls_and_refs_p)
/* Only COMDAT functions can be removed if externally visible. */
if (externally_visible
&& (!DECL_COMDAT (decl)
|| forced_by_abi
|| used_from_object_file_p ()))
return false;
externally_visible = 1 and If I'm not mistaken, decl is not comdat, thus
return false:
<function_decl fa527880 bar
type <function_type fa524ea0
type <integer_type faefb3c0 int public SI
size <integer_cst fa405910 constant 32>
unit-size <integer_cst fa405924 constant 4>
align:32 warn_if_not_align:0 symtab:0 alias-set 1 canonical-type
faefb3c0 precision:32 min <integer_cst fa405af0 -2147483648> max <integer_cst
fa405b04 2147483647>
pointer_to_this <pointer_type fa419060>>
QI
size <integer_cst fa405a14 constant 8>
unit-size <integer_cst fa405a28 constant 1>
align:8 warn_if_not_align:0 symtab:0 alias-set -1 structural-equality
arg-types <tree_list fa41c000 value <void_type faefb9c0 void>>
pointer_to_this <pointer_type fa524120>>
readonly addressable nothrow public static function-specific-target
function-specific-opt uninlinable QI
/vol/gcc/src/hg/trunk/local/gcc/testsuite/gcc.dg/ipa/ipa-icf-38a.c:6:5 align:8
warn_if_not_align:0 context <translation_unit_decl fa40f63c
/vol/gcc/src/hg/trunk/local/gcc/testsuite/gcc.dg/ipa/ipa-icf-38a.c>
attributes <tree_list fa526390
purpose <identifier_node fa5239f4 noinline>> initial <block fa52a0e0>
result <result_decl fa40f6d4 D.4264 type <integer_type faefb3c0 int>
ignored SI
/vol/gcc/src/hg/trunk/local/gcc/testsuite/gcc.dg/ipa/ipa-icf-38a.c:6:5 size
<integer_cst fa405910 32> unit-size <integer_cst fa405924 4>
align:32 warn_if_not_align:0 context <function_decl fa527880 bar>>
struct-function fa52b1a0>