On Mon, Nov 18, 2024 at 8:56 AM Andrew Pinski <quic_apin...@quicinc.com> wrote: > > For pointers I forgot that BIT_IOR_EXPR is not valid so when > I added the pattern to convert `max<a,b> != 0` (r15-5356), GCC > would start to ICEing saying pointer types were not valid for > BIT_IOR_EXPR. > This fixes the problem by casting to the unsigned type of the > inner type. There was another way of fixing this to handling it > as `a == 0 & b == 0` but both match and reassoication (for pointers) > will then convert it back into the form I am creating here so > let's just use that form instead.
OK. I'll note that at some point we discussed allowing all bit operations on pointers, not just BIT_AND. Richard. > Bootstrapped and tested on x86_64-linux-gnu. > > PR tree-optimization/117646 > > gcc/ChangeLog: > > * match.pd (`max<a,b>==0`): Add casts to `unsigned type`. > > gcc/testsuite/ChangeLog: > > * gcc.dg/torture/minmaxneeqptr-1.c: New test. > > Signed-off-by: Andrew Pinski <quic_apin...@quicinc.com> > --- > gcc/match.pd | 6 ++++-- > .../gcc.dg/torture/minmaxneeqptr-1.c | 21 +++++++++++++++++++ > 2 files changed, 25 insertions(+), 2 deletions(-) > create mode 100644 gcc/testsuite/gcc.dg/torture/minmaxneeqptr-1.c > > diff --git a/gcc/match.pd b/gcc/match.pd > index 4bec24a21b2..f5181325f3b 100644 > --- a/gcc/match.pd > +++ b/gcc/match.pd > @@ -4799,9 +4799,11 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) > MAX (A, B) != 0 -> (A|B) != 0 iff unsigned. */ > (for cmp (eq ne) > (simplify > - (cmp (max @0 @1) integer_zerop@2) > + (cmp (max @0 @1) integer_zerop) > (if (TYPE_UNSIGNED (TREE_TYPE (@0))) > - (cmp (bit_ior @0 @1) @2)))) > + (with { tree utype = unsigned_type_for (TREE_TYPE (@0)); } > + (cmp (bit_ior (convert:utype @0) (convert:utype @1)) > + { build_zero_cst (utype); } ))))) > > /* Undo fancy ways of writing max/min or other ?: expressions, like > a - ((a - b) & -(a < b)) and a - (a - b) * (a < b) into (a < b) ? b : a. > diff --git a/gcc/testsuite/gcc.dg/torture/minmaxneeqptr-1.c > b/gcc/testsuite/gcc.dg/torture/minmaxneeqptr-1.c > new file mode 100644 > index 00000000000..aa45722330f > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/torture/minmaxneeqptr-1.c > @@ -0,0 +1,21 @@ > +/* { dg-do compile } */ > + > +/* PR tree-optimization/117646 */ > + > +int maxeq(char *a, char *b) { > + char *p = a < b ? b : a; > + return p == (void*)0; > +} > +int maxne(char *a, char *b) { > + char *p = a < b ? b : a; > + return p == (void*)0; > +} > + > +int mineq(char *a, char *b) { > + char *p = a > b ? b : a; > + return p == (void*)0; > +} > +int minne(char *a, char *b) { > + char *p = a > b ? b : a; > + return p == (void*)0; > +} > -- > 2.43.0 >