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

--- Comment #5 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Roger Sayle <sa...@gcc.gnu.org>:

https://gcc.gnu.org/g:ef26c151c14a87177d46fd3d725e7f82e040e89f

commit r12-6106-gef26c151c14a87177d46fd3d725e7f82e040e89f
Author: Roger Sayle <ro...@nextmovesoftware.com>
Date:   Thu Dec 23 12:33:07 2021 +0000

    x86: PR target/103773: Fix wrong-code with -Oz from pop to memory.

    This is a fix to PR target/103773 where -Oz shouldn't use push/pop
    on x86 to shrink writing small integer constants to memory.
    Instead clang uses "andl $0, mem" for writing zero, and "orl $-1, mem"
    when writing -1 to memory when using -Oz.  This patch implements this
    via peephole2 where we can confirm that its ok to clobber the flags.

    2021-12-23  Roger Sayle  <ro...@nextmovesoftware.com>
                Uroš Bizjak  <ubiz...@gmail.com>

    gcc/ChangeLog
            PR target/103773
            * config/i386/i386.md (*mov<mode>_and): New define_insn for
            writing a zero to memory using AND.
            (*mov<mode>_or): Extend to allow memory destination and HImode.
            (*movdi_internal): Remove -Oz push/pop optimization from here.
            (*movsi_internal): Likewise.
            (peephole2): Perform -Oz push/pop optimization here, only for
            register destinations, values other than zero, and in functions
            that don't used the red zone.
            (peephole2): With -Oz, convert writes of 0 or -1 to memory into
            their clobber forms, i.e. *mov<mode>_and and *mov<mode>_or resp.

    gcc/testsuite/ChangeLog
            PR target/103773
            * gcc.target/i386/pr103773-2.c: New test case.
            * gcc.target/i386/pr103773.c: New test case.

Reply via email to