[Bug middle-end/126418] [17 regression] PR113894 introduces new UB in optimized code

"cvs-commit at gcc dot gnu.org via Gcc-bugs" <[email protected]>
Newsgroups gmane.comp.gcc.bugs
Message-ID <[email protected]/bugzilla/>
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=126418

--- Comment #4 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The trunk branch has been updated by Andrea Pinski <[email protected]>:

https://gcc.gnu.org/g:610f1166538ad2e637c913be78b074100270cc5c

commit r17-3234-g610f1166538ad2e637c913be78b074100270cc5c
Author: Andrea Pinski <[email protected]>
Date:   Mon Jul 27 20:11:33 2026 -0700

    match: Fix recent pattern for signed integer overflow dealing with -
[PR126418]

    A recent match patterns were added that introduce signed integer overflow
where
    there was none before.  `cmp + (-cmp ^ x)` has no signed integer overflow
when
    x is INT_MIN when cmp is 0. This gets translated into cmp ? -x : x.
    But this has now introduced an signed integer overflow for INT_MIN.
    The fix is to use unsigned type for the negative.

    Bootstrapped and tested on x86_64-linux-gnu.

    Changes since v1:
    * v2: Remove the abs patterns since a signed integer overflow would have
happened anyways.

            PR tree-optimization/126418

    gcc/ChangeLog:

            * match.pd (`(A ^ -cmp) + cmp`): Cast to unsigned type
            before taking the negative.

    gcc/testsuite/ChangeLog:

            * gcc.dg/tree-ssa/pr126418-1.c: New test.

    Signed-off-by: Andrea Pinski <[email protected]>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.