https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77587
Jakub Jelinek <jakub at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |jakub at gcc dot gnu.org --- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> --- From what I can see, this happens because expand_call does: 2736 if (fndecl) 2737 { 2738 struct cgraph_rtl_info *i = cgraph_node::rtl_info (fndecl); 2739 /* Without automatic stack alignment, we can't increase preferred 2740 stack boundary. With automatic stack alignment, it is 2741 unnecessary since unless we can guarantee that all callers will 2742 align the outgoing stack properly, callee has to align its 2743 stack anyway. */ 2744 if (i 2745 && i->preferred_incoming_stack_boundary 2746 && i->preferred_incoming_stack_boundary < preferred_stack_boundary) 2747 preferred_stack_boundary = i->preferred_incoming_stack_boundary; and 1951 cgraph_rtl_info * 1952 cgraph_node::rtl_info (tree decl) 1953 { 1954 gcc_assert (TREE_CODE (decl) == FUNCTION_DECL); 1955 cgraph_node *node = get (decl); 1956 if (!node) 1957 return NULL; 1958 node = node->ultimate_alias_target (); 1959 if (node->decl != current_function_decl 1960 && !TREE_ASM_WRITTEN (node->decl)) 1961 return NULL; 1962 /* Allocate if it doesnt exist. */ 1963 if (node->ultimate_alias_target ()->rtl == NULL) 1964 node->ultimate_alias_target ()->rtl = ggc_cleared_alloc<cgraph_rtl_info> (); 1965 return node->ultimate_alias_target ()->rtl; First of all, it is confusing, because it calls ultimate_alias_target up to 3 times, wouldn't one call be enough? And the second issue is that ultimate_alias_target and its helpers return foo's node even when the alias is a weak alias (global) to a local routine, which could (and is in this case) be overridden with something different at link time. Honza, shall ultimate_alias_target ignore such aliases, something else?