aboutsummaryrefslogtreecommitdiff
path: root/gcc/combine.cc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2023-10-04 09:27:40 +0200
committerJakub Jelinek <jakub@redhat.com>2023-10-04 09:29:48 +0200
commit7ab01269396203d5200fff8579768da54dcfde5d (patch)
tree3a80370b7b3feb3b0572be039b22142361d05690 /gcc/combine.cc
parent84284e1c490e9235fca5cb85269ecfcb87eef4f1 (diff)
downloadgcc-7ab01269396203d5200fff8579768da54dcfde5d.zip
gcc-7ab01269396203d5200fff8579768da54dcfde5d.tar.gz
gcc-7ab01269396203d5200fff8579768da54dcfde5d.tar.bz2
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 <jakub@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.
Diffstat (limited to 'gcc/combine.cc')
0 files changed, 0 insertions, 0 deletions