[Bug target/107172] [13 Regression] wrong code with "-O1 -ftree-vrp" on x86_64-linux-gnu since r13-1268-g8c99e307b20c502e

cvs-commit at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Thu Oct 27 18:42:48 GMT 2022


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

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

https://gcc.gnu.org/g:0e36a9c6915c713d30016cbade97a4b31dcc1350

commit r13-3530-g0e36a9c6915c713d30016cbade97a4b31dcc1350
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Thu Oct 20 11:55:19 2022 -0700

    x86: Replace ne:CCC/ne:CCO with UNSPEC_CC_NE in neg patterns

    In i386.md, neg patterns which set MODE_CC register like

    (set (reg:CCC FLAGS_REG)
         (ne:CCC (match_operand:SWI48 1 "general_reg_operand") (const_int 0)))

    can lead to errors when operand 1 is a constant value.  If FLAGS_REG in

    (set (reg:CCC FLAGS_REG)
         (ne:CCC (const_int 2) (const_int 0)))

    is set to 1, RTX simplifiers may simplify

    (set (reg:SI 93)
         (neg:SI (ltu:SI (reg:CCC 17 flags) (const_int 0 [0]))))

    as

    (set (reg:SI 93)
         (neg:SI (ltu:SI (const_int 1) (const_int 0 [0]))))

    which leads to incorrect results since LTU on MODE_CC register isn't the
    same as "unsigned less than" in x86 backend.  To prevent RTL optimizers
    from setting MODE_CC register to a constant, use UNSPEC_CC_NE to replace
    ne:CCC/ne:CCO when setting FLAGS_REG in neg patterns.

    gcc/

            PR target/107172
            * config/i386/i386.md (UNSPEC_CC_NE): New.
            Replace ne:CCC/ne:CCO with UNSPEC_CC_NE in neg patterns.

    gcc/testsuite/

            PR target/107172
            * gcc.target/i386/pr107172.c: New test.


More information about the Gcc-bugs mailing list