https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57971
Eelis <gcc-bugzilla at contacts dot eelis.net> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |gcc-bugzilla at contacts dot eelis | |.net --- Comment #1 from Eelis <gcc-bugzilla at contacts dot eelis.net> --- struct foo { foo(); foo(foo const &); }; foo bar(); foo fast(bool b) { if (b) return foo(); return bar(); } /* produces (with -O3): _Z4fastb: .LFB0: testb %sil, %sil pushq %rbx movq %rdi, %rbx jne .L6 call _Z3barv movq %rbx, %rax popq %rbx ret .p2align 4,,10 .p2align 3 .L6: call _ZN3fooC1Ev movq %rbx, %rax popq %rbx ret */ foo slow(bool b) { if (b) return foo(); foo f = bar(); return f; } /* produces (with -O3): _Z4slowb: .LFB1: pushq %rbx movq %rdi, %rbx subq $16, %rsp testb %sil, %sil jne .L11 leaq 15(%rsp), %rdi call _Z3barv leaq 15(%rsp), %rsi movq %rbx, %rdi call _ZN3fooC1ERKS_ addq $16, %rsp movq %rbx, %rax popq %rbx ret .p2align 4,,10 .p2align 3 .L11: call _ZN3fooC1Ev addq $16, %rsp movq %rbx, %rax popq %rbx ret */