On Sat, Jul 1, 2023 at 10:23 AM Andrew Pinski via Gcc-patches <gcc-patches@gcc.gnu.org> wrote: > > This fixes the first part of this bug where `a ? -1 : 0` > would cause a value of 1 into the signed boolean value. > It fixes the problem by casting to an integer type of > the same size/signedness before doing the negative and > then casting to the type of expression. > > OK? Bootstrapped and tested on x86_64.
OK. Richard. > gcc/ChangeLog: > > * match.pd (a?-1:0): Cast type an integer type > rather the type before the negative. > (a?0:-1): Likewise. > --- > gcc/match.pd | 22 ++++++++++++++++++++-- > 1 file changed, 20 insertions(+), 2 deletions(-) > > diff --git a/gcc/match.pd b/gcc/match.pd > index 45c72e733a5..a0d114f6a16 100644 > --- a/gcc/match.pd > +++ b/gcc/match.pd > @@ -4703,7 +4703,12 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) > /* a ? -1 : 0 -> -a. No need to check the TYPE_PRECISION not being 1 > here as the powerof2cst case above will handle that case correctly. > */ > (if (INTEGRAL_TYPE_P (type) && integer_all_onesp (@1)) > - (negate (convert (convert:boolean_type_node @0)))))) > + (with { > + auto prec = TYPE_PRECISION (type); > + auto unsign = TYPE_UNSIGNED (type); > + tree inttype = build_nonstandard_integer_type (prec, unsign); > + } > + (convert (negate (convert:inttype (convert:boolean_type_node @0)))))))) > (if (integer_zerop (@1)) > (with { > tree booltrue = constant_boolean_node (true, boolean_type_node); > @@ -4722,7 +4727,20 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) > /* a ? -1 : 0 -> -(!a). No need to check the TYPE_PRECISION not being 1 > here as the powerof2cst case above will handle that case correctly. > */ > (if (INTEGRAL_TYPE_P (type) && integer_all_onesp (@2)) > - (negate (convert (bit_xor (convert:boolean_type_node @0) { booltrue; } > )))) > + (with { > + auto prec = TYPE_PRECISION (type); > + auto unsign = TYPE_UNSIGNED (type); > + tree inttype = build_nonstandard_integer_type (prec, unsign); > + } > + (convert > + (negate > + (convert:inttype > + (bit_xor (convert:boolean_type_node @0) { booltrue; } ) > + ) > + ) > + ) > + ) > + ) > ) > ) > ) > -- > 2.31.1 >