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

--- 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:7ab01269396203d5200fff8579768da54dcfde5d

commit r14-4391-g7ab01269396203d5200fff8579768da54dcfde5d
Author: Jakub Jelinek <ja...@redhat.com>
Date:   Wed Oct 4 09:27:40 2023 +0200

    match.pd: Fix up a ? cst1 : cst2 regression on signed bool [PR111668]

    My relatively recent changes to these simplifiers to avoid
    doing build_nonstandard_integer_type (primarily for BITINT_TYPE)
    broke PR111668, a recurrence of the PR110487 bug.
    I thought the build_nonstandard_integer_type isn't ever needed there,
    but there is one special case where it is.
    For the a ? -1 : 0 and a ? 0 : -1 simplifications there are actually
    3 different cases.  One is for signed 1-bit precision types (signed
    kind of implied from integer_all_onesp, because otherwise it would
    match integer_onep earlier), where the simplifier wierdly was matching
    them using the a ? powerof2cst : 0 -> a << (log2(powerof2cst))
    simplification and then another simplifier optimizing away the left shift
    when log2(powerof2cst) was 0.  Another one is signed BOOLEAN_TYPE with
    precision > 1, where indeed we shouldn't be doing the negation in type,
    because it isn't well defined in that type, the type only has 2 valid
    values, 0 and -1.  As an alternative, we could also e.g. cast to
    signed 1-bit precision BOOLEAN_TYPE and then extend to type.
    And the last case is what we were doing for types which have both 1 and -1
    (all all ones) as valid values (i.e. all signed/unsigned ENUMERAL_TYPEs,
    INTEGRAL_TYPEs and BITINT_TYPEs with precision > 1).

    The following patch avoids the hops through << 0 for 1-bit precision
    and uses build_nonstandard_integer_type solely for the BOOLEAN_TYPE types
    (where we have a guarantee the precision is reasonably small, nothing ought
    to be created 129+ bit precision BOOLEAN_TYPEs).

    2023-10-04  Jakub Jelinek  <ja...@redhat.com>

            PR tree-optimization/111668
            * match.pd (a ? CST1 : CST2): Handle the a ? -1 : 0 and
            a ? 0 : -1 cases before the powerof2cst cases and differentiate
            between 1-bit precision types, larger precision boolean types
            and other integral types.  Fix comment pastos and formatting.

Reply via email to