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

--- Comment #7 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Igor Shevlyakov
<[email protected]>:

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

commit r17-5543-ga428c9c7cdea4ee8a13da70e73b14ca2f6197959
Author: Igor Shevlyakov <[email protected]>
Date:   Thu Oct 22 20:16:36 2026 -0700

    match.pd: Keep the ORDERED & NE to LTGT fold quiet [PR127785]

    ORDERED and NE do not raise an invalid operation exception for a quiet
    NaN, but LTGT does.  The (ordered & ne) -> ltgt rule added with
    "i386: Optimize ordered and nonequal" has no trapping-math check, so
    !__builtin_isunordered (a, b) & (a != b) raises FE_INVALID for a NaN
    operand even at -O0, since the rule also fires in GENERIC.  On x86 the
    result is a signaling comiss.

    Fold only with -fno-trapping-math or when NaNs are not honored, as the
    (ltgt @0 @0) rule next to it does.  GCC has no quiet comparison code
    for "ordered and not equal", so under the default flags the two
    comparisons stay separate, and x86 goes back to the quiet
    ucomiss/setp/setnp sequence that the rule replaced.

    The tests added with the rule check the fold itself, so they now pass
    -fno-trapping-math.  With that option GENERIC can already fold the &&
    forms through combine_comparisons, so opt-ordered-and-nonequal-1.c
    scans the optimized dump instead of forwprop1.  The new
    opt-ordered-and-nonequal-2.c checks that the default flags keep <> out,
    and cmp-of-cmp-fenv-1.c checks at run time that FE_INVALID is not
    raised.

    Assisted-by: Claude Opus 5.5

            PR middle-end/127785

    gcc/ChangeLog:

            * match.pd ((ordered @0 @1) & (ne @0 @1)): Only fold to LTGT
            without trapping math or when NaNs are not honored.

    gcc/testsuite/ChangeLog:

            * gcc.dg/opt-ordered-and-nonequal-1.c: Add -fno-trapping-math and
            scan the optimized dump.
            * gcc.dg/opt-ordered-and-nonequal-2.c: New test.
            * gcc.dg/torture/cmp-of-cmp-fenv-1.c: New test.
            * gcc.target/i386/opt-comi-1.c: Add -fno-trapping-math.
            * gcc.target/i386/avx10_2-compare-1b.c: Likewise.

    Signed-off-by: Igor Shevlyakov <[email protected]>

Reply via email to