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

--- Comment #6 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by H.J. Lu <h...@gcc.gnu.org>:

https://gcc.gnu.org/g:846837c2406ae7a52d9123b29c13e4b8b9d14224

commit r15-7436-g846837c2406ae7a52d9123b29c13e4b8b9d14224
Author: H.J. Lu <hjl.to...@gmail.com>
Date:   Fri Feb 7 13:49:30 2025 +0800

    x86: Verify that PUSH/POP can be skipped

    For

    int f(int);

    int advance(int dz)
    {
        if (dz > 0)
            return (dz + dz) * dz;
        else
            return dz * f(dz);
    }

    Before r15-1619-g3b9b8d6cfdf593

    advance(int):
            push    rbx
            mov     ebx, edi
            test    edi, edi
            jle     .L2
            imul    ebx, edi
            lea     eax, [rbx+rbx]
            pop     rbx
            ret
    .L2:
            call    f(int)
            imul    eax, ebx
            pop     rbx
            ret

    After

     advance(int):
            test    edi, edi
            jle     .L2
            imul    edi, edi
            lea     eax, [rdi+rdi]
            ret
    .L2:
            sub     rsp, 24
            mov     DWORD PTR [rsp+12], edi
            call    f(int)
            imul    eax, DWORD PTR [rsp+12]
            add     rsp, 24
            ret

    There's no call in if branch, it's not optimal to push rbx at the entry
    of the function, it can be sinked to else branch. When "jle .L2" is not
    taken, it can save one push instruction.  Update pr111673.c to verify
    that this optimization isn't turned off.

            PR rtl-optimization/111673
            * gcc.target/i386/pr111673.c: Verify that PUSH/POP can be
            skipped.

    Signed-off-by: H.J. Lu <hjl.to...@gmail.com>

Reply via email to