https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107931
Richard Biener <rguenth at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Keywords| |missed-optimization
Target Milestone|--- |12.3
CC| |hubicka at gcc dot gnu.org
--- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> ---
always-inline and indirect function calls do not mix well, whether they are
inlined or not depends on what optimization is performed.
The re-ordering fixes things because the topological ordering of functions
for the early inlining "breaks" for indirect call edges (I wonder if we can
try to conservatively assume address-takens as calls here?)
It's considered a user error when at IPA time not all always-inline functions
are inlined.
The regression happens because we do not special-case always_inline. With -O0
fun4 isn't inlined either but we do not diagnose that since the call
doesn't end up direct and we sofar refrain from not outputting the body
of fun4, making this a link error at -O0.
fun2:
.LFB1:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $16, %rsp
movq $fun4, -8(%rbp)
movq -8(%rbp), %rax
call *%rax
IMHO there's nothing to fix here. Don't use always-inline if you have
indirect calls.