On Fri, Apr 12, 2024 at 6:53 AM Andrew Pinski <quic_apin...@quicinc.com> wrote: > > The problem is `!a?b:c` pattern will create a COND_EXPR with an 1bit signed > integer > which breaks patterns like `a?~t:t`. This rejects when we have a signed > operand for > both patterns. > > Note for GCC 15, I am going to look at the canonicalization of `a?~t:t` where > t > was a constant since I think keeping it a COND_EXPR might be more canonical > and > is what VPR produces from the same IR; if anything expand should handle which > one > is better. > > Bootstrapped and tested on x86_64-linux-gnu with no regressions.
OK. > PR tree-optimization/114666 > > gcc/ChangeLog: > > * match.pd (`!a?b:c`): Reject signed types for the condition. > (`a?~t:t`): Likewise. > > gcc/testsuite/ChangeLog: > > * gcc.c-torture/execute/bitfld-signed1-1.c: New test. > > Signed-off-by: Andrew Pinski <quic_apin...@quicinc.com> > --- > gcc/match.pd | 6 +++++- > .../gcc.c-torture/execute/bitfld-signed1-1.c | 13 +++++++++++++ > 2 files changed, 18 insertions(+), 1 deletion(-) > create mode 100644 gcc/testsuite/gcc.c-torture/execute/bitfld-signed1-1.c > > diff --git a/gcc/match.pd b/gcc/match.pd > index 15a1e7350d4..d401e7503e6 100644 > --- a/gcc/match.pd > +++ b/gcc/match.pd > @@ -5895,7 +5895,10 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) > /* !A ? B : C -> A ? C : B. */ > (simplify > (cnd (logical_inverted_value truth_valued_p@0) @1 @2) > - (cnd @0 @2 @1))) > + /* For CONDs, don't handle signed values here. */ > + (if (cnd == VEC_COND_EXPR > + || TYPE_UNSIGNED (TREE_TYPE (@0))) > + (cnd @0 @2 @1)))) > > /* abs/negative simplifications moved from fold_cond_expr_with_comparison. > > @@ -7095,6 +7098,7 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) > (cond @0 @1 @2) > (with { bool wascmp; } > (if (INTEGRAL_TYPE_P (type) > + && TYPE_UNSIGNED (TREE_TYPE (@0)) > && bitwise_inverted_equal_p (@1, @2, wascmp) > && (!wascmp || TYPE_PRECISION (type) == 1)) > (if ((!TYPE_UNSIGNED (type) && TREE_CODE (type) == BOOLEAN_TYPE) > diff --git a/gcc/testsuite/gcc.c-torture/execute/bitfld-signed1-1.c > b/gcc/testsuite/gcc.c-torture/execute/bitfld-signed1-1.c > new file mode 100644 > index 00000000000..b0ff120ea51 > --- /dev/null > +++ b/gcc/testsuite/gcc.c-torture/execute/bitfld-signed1-1.c > @@ -0,0 +1,13 @@ > +/* PR tree-optimization/114666 */ > +/* We used to miscompile this to be always aborting > + due to the use of the signed 1bit into the COND_EXPR. */ > + > +struct { > + signed a : 1; > +} b = {-1}; > +char c; > +int main() > +{ > + if ((b.a ^ 1UL) < 3) > + __builtin_abort(); > +} > -- > 2.43.0 >