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

--- Comment #6 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Uros Bizjak <u...@gcc.gnu.org>:

https://gcc.gnu.org/g:44764984cf24e27cf7756cffd197283b9c62db8b

commit r14-8713-g44764984cf24e27cf7756cffd197283b9c62db8b
Author: Uros Bizjak <ubiz...@gmail.com>
Date:   Thu Feb 1 21:23:24 2024 +0100

    i386: Improve *cmp<dwi>_doubleword splitter [PR113701]

    The fix for PR70321 introduced a splitter that split a doubleword
    comparison into a pair of XORs followed by an IOR to set the (zero)
    flags register.  To help the reload, splitter forced SUBREG pieces of
    double-word input values to a pseudo, but this regressed
    gcc.target/i386/pr82580.c:

    int f0 (U x, U y) { return x == y; }

    from:
            xorq    %rdx, %rdi
            xorq    %rcx, %rsi
            xorl    %eax, %eax
            orq     %rsi, %rdi
            sete    %al
            ret

    to:
            xchgq   %rdi, %rsi
            movq    %rdx, %r8
            movq    %rcx, %rax
            movq    %rsi, %rdx
            movq    %rdi, %rcx
            xorq    %rax, %rcx
            xorq    %r8, %rdx
            xorl    %eax, %eax
            orq     %rcx, %rdx
            sete    %al
            ret

    To mitigate the regression, remove this legacy heuristic (workaround?).
    There have been many incremental changes and improvements to x86 TImode
    and register allocation, so this legacy workaround is not only no longer
    useful, but it actually hurts register allocation.  The patched compiler
    now produces:

            xchgq   %rdi, %rsi
            xorl    %eax, %eax
            xorq    %rsi, %rdx
            xorq    %rdi, %rcx
            orq     %rcx, %rdx
            sete    %al
            ret

            PR target/113701

    gcc/ChangeLog:

            * config/i386/i386.md (*cmp<dwi>_doubleword):
            Do not force SUBREG pieces to pseudos.

Reply via email to