https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116027

--- Comment #2 from user202729 <user202729 at protonmail dot com> ---
Maybe this is a less artificial example.

__attribute__((pure)) long f(__int128 a, long b);

__int128 x;

long g(){
    __int128 y=x;
    long z=f(0, 0);
    x=1;
    return f(y, z);
}

long h(){
    long z=f(0, 0);
    __int128 y=x;
    x=1;
    return f(y, z);
}


Compile with -O2.

Assembly:

g():
        push    r14  // <-- redundant
        xor     edx, edx
        xor     edi, edi
        xor     esi, esi
        push    rbx  // <-- redundant
        sub     rsp, 8
        call    f(__int128, long)
        mov     rdi, QWORD PTR x[rip]
        mov     rsi, QWORD PTR x[rip+8]
        mov     QWORD PTR x[rip], 1
        mov     QWORD PTR x[rip+8], 0
        add     rsp, 8
        mov     rdx, rax
        pop     rbx  // <-- redundant
        pop     r14  // <-- redundant
        jmp     f(__int128, long)
h():
        sub     rsp, 8
        xor     edx, edx
        xor     edi, edi
        xor     esi, esi
        call    f(__int128, long)
        mov     rdi, QWORD PTR x[rip]
        mov     rsi, QWORD PTR x[rip+8]
        mov     QWORD PTR x[rip], 1
        mov     QWORD PTR x[rip+8], 0
        mov     rdx, rax
        add     rsp, 8
        jmp     f(__int128, long)

Godbolt: https://godbolt.org/z/E1cnrEWzs

Reply via email to