On Tue, Jul 30, 2024 at 5:25 PM Andrew Pinski <quic_apin...@quicinc.com> wrote: > > The problem here is that in generic types of comparisons don't need > to be boolean types (or vector boolean types). And fixes that by making > sure the types of the conditions match before doing the optimization. > > Bootstrapped and tested on x86_64-linux-gnu with no regressions.
OK > PR middle-end/116134 > > gcc/ChangeLog: > > * match.pd (`(a ? x : y) eq/ne (b ? x : y)`): Check that > a and b types match. > (`(a ? x : y) eq/ne (b ? y : x)`): Likewise. > > gcc/testsuite/ChangeLog: > > * gcc.dg/torture/pr116134-1.c: New test. > > Signed-off-by: Andrew Pinski <quic_apin...@quicinc.com> > --- > gcc/match.pd | 10 ++++++---- > gcc/testsuite/gcc.dg/torture/pr116134-1.c | 9 +++++++++ > 2 files changed, 15 insertions(+), 4 deletions(-) > create mode 100644 gcc/testsuite/gcc.dg/torture/pr116134-1.c > > diff --git a/gcc/match.pd b/gcc/match.pd > index 1c8601229e3..881a827860f 100644 > --- a/gcc/match.pd > +++ b/gcc/match.pd > @@ -5640,12 +5640,14 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) > (for eqne (eq ne) > (simplify > (eqne:c (cnd @0 @1 @2) (cnd @3 @1 @2)) > - (cnd (bit_xor @0 @3) { constant_boolean_node (eqne == NE_EXPR, type); } > - { constant_boolean_node (eqne != NE_EXPR, type); })) > + (if (types_match (TREE_TYPE (@0), TREE_TYPE (@3))) > + (cnd (bit_xor @0 @3) { constant_boolean_node (eqne == NE_EXPR, type); } > + { constant_boolean_node (eqne != NE_EXPR, type); }))) > (simplify > (eqne:c (cnd @0 @1 @2) (cnd @3 @2 @1)) > - (cnd (bit_xor @0 @3) { constant_boolean_node (eqne != NE_EXPR, type); } > - { constant_boolean_node (eqne == NE_EXPR, type); })))) > + (if (types_match (TREE_TYPE (@0), TREE_TYPE (@3))) > + (cnd (bit_xor @0 @3) { constant_boolean_node (eqne != NE_EXPR, type); } > + { constant_boolean_node (eqne == NE_EXPR, type); }))))) > > /* Canonicalize mask ? { 0, ... } : { -1, ...} to ~mask if the mask > types are compatible. */ > diff --git a/gcc/testsuite/gcc.dg/torture/pr116134-1.c > b/gcc/testsuite/gcc.dg/torture/pr116134-1.c > new file mode 100644 > index 00000000000..ab595f99680 > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/torture/pr116134-1.c > @@ -0,0 +1,9 @@ > +/* { dg-do compile } */ > + > +/* This used to ICE as comparisons on generic can be different types. */ > +/* PR middle-end/116134 */ > + > +int a; > +int b; > +int d; > +void c() { 1UL <= (d < b) != (1UL & (0 < a | 0L)); } > -- > 2.43.0 >