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
*/

Reply via email to