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

--- Comment #6 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Alexandre Oliva <aol...@gcc.gnu.org>:

https://gcc.gnu.org/g:3768bedf7b5fcdd63a18871ecfce665ae1b8d87e

commit r15-7597-g3768bedf7b5fcdd63a18871ecfce665ae1b8d87e
Author: Alexandre Oliva <ol...@adacore.com>
Date:   Mon Feb 17 23:17:21 2025 -0300

    [ifcombine] cope with signbit tests of extended values

    A compare with zero may be taken as a sign bit test by
    fold_truth_andor_for_ifcombine, but the operand may be extended from a
    narrower field.  If the operand was narrower, the bitsize will reflect
    the narrowing conversion, but if it was wider, we'll only know whether
    the field is sign- or zero-extended from unsignedp, but we won't know
    whether it needed to be extended, because arg will have changed to the
    narrower variable when we get to the point in which we can compute the
    arg width.  If it's sign-extended, we're testing the right bit, but if
    it's zero-extended, there isn't any bit we can test.

    Instead of punting and leaving the foldable compare to be figured out
    by another pass, arrange for the sign bit resulting from the widening
    zero-extension to be taken as zero, so that the modified compare will
    yield the desired result.

    While at that, avoid swapping the right-hand compare operands when
    we've already determined that it was a signbit test: it no use to even
    try.


    for  gcc/ChangeLog

            PR tree-optimization/118805
            * gimple-fold.cc (fold_truth_andor_for_combine): Detect and
            cope with zero-extension in signbit tests.  Reject swapping
            right-compare operands if rsignbit.

    for  gcc/testsuite/ChangeLog

            PR tree-optimization/118805
            * gcc.dg/field-merge-26.c: New.

Reply via email to