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

--- Comment #6 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Jakub Jelinek <ja...@gcc.gnu.org>:

https://gcc.gnu.org/g:7ca24ae5701769fccabf8cca4cad6987cb2187c6

commit r12-7556-g7ca24ae5701769fccabf8cca4cad6987cb2187c6
Author: Jakub Jelinek <ja...@redhat.com>
Date:   Wed Mar 9 09:12:38 2022 +0100

    simplify-rtx: Fix up SUBREG_PROMOTED_SET arguments [PR104839]

    The following testcase is miscompiled on powerpc64le-linux at -O1 and
higher
    (except for -Og).  The bug was introduced in r12-3252-gcad36f38576a6a7
    which for SIGN_EXTEND from SUBREG_PROMOTED_SIGNED_P SUBREG used
    SUBREG_PROMOTED_SET (temp, 1) (but that makes temp
    SUBREG_PROMOTED_UNSIGNED_P because SRP_UNSIGNED is 1) and similarly the
    ZERO_EXTEND from SUBREG_PROMOTED_UNSIGNED_P SUBREG used
    SUBREG_PROMOTED_SET (temp, 0) (but that makes temp
    SUBREG_PROMOTED_SIGNED_P because SRP_SIGNED is 0).
    The following patch fixes that (swaps the 0s and 1s), but for better
    readability uses the SRP_* constants.
    rtl.h has:
    /* Valid for subregs which are SUBREG_PROMOTED_VAR_P().  In that case
       this gives the necessary extensions:
       0  - signed (SPR_SIGNED)
       1  - normal unsigned (SPR_UNSIGNED)
       2  - value is both sign and unsign extended for mode
            (SPR_SIGNED_AND_UNSIGNED).
       -1 - pointer unsigned, which most often can be handled like unsigned
            extension, except for generating instructions where we need to
            emit special code (ptr_extend insns) on some architectures
            (SPR_POINTER). */
    The expr.c change in the same commit looks ok to me (passes unsignedp
    to SUBREG_PROMOTED_SET, so 0 for signed, 1 for unsigned).

    2022-03-09  Jakub Jelinek  <ja...@redhat.com>

            PR rtl-optimization/104839
            * simplify-rtx.cc (simplify_unary_operation_1) <case SIGN_EXTEND>:
            Use SRP_SIGNED instead of incorrect 1 in SUBREG_PROMOTED_SET.
            (simplify_unary_operation_1) <case ZERO_EXTEND>: Use SRP_UNSIGNED
            instead of incorrect 0 in SUBREG_PROMOTED_SET.

            * gcc.c-torture/execute/pr104839.c: New test.

Reply via email to