On Sun, Jun 7, 2026 at 8:46 PM Souradipto Das <[email protected]> wrote: > > This patch introduces a simplification rule in match.pd to reduce bitwise > expressions against zero. Specifically, it simplifies patterns where a > variable checked against zero is combined via bitwise AND/OR with a compounded > bitwise OR check against zero. > > PR tree-optimization/125442 > > gcc/ChangeLog: > > * match.pd: Add simplification rules for > (a == 0) | ((a | b) == 0) -> (a == 0) and > (a != 0) & ((a | b) != 0) -> (a != 0).
Ok, pushed as https://gcc.gnu.org/pipermail/gcc-cvs/2026-June/455459.html . Thanks again for working on this and sorry it took me almost a week to review this version of the patch. Thanks, Andrea > > gcc/testsuite/ChangeLog: > > * gcc.dg/int-bwise-opt-3.c: New test. > * gcc.dg/int-bwise-opt-4.c: New test. > > Suggested-by: Andrew Pinski <[email protected]> > Signed-off-by: Souradipto Das <[email protected]> > --- > Changes in v3: > - Squashed the match.pd optimization rules and testcases into a single > unified patch. > Changes in v2: > - Added dedicated testcases for the new bitwise optimization rules as > suggested by Andrew Pinski. > gcc/match.pd | 9 +++++++++ > gcc/testsuite/gcc.dg/int-bwise-opt-3.c | 9 +++++++++ > gcc/testsuite/gcc.dg/int-bwise-opt-4.c | 9 +++++++++ > 3 files changed, 27 insertions(+) > create mode 100644 gcc/testsuite/gcc.dg/int-bwise-opt-3.c > create mode 100644 gcc/testsuite/gcc.dg/int-bwise-opt-4.c > > diff --git a/gcc/match.pd b/gcc/match.pd > index 8a2de136e..4a2f9a784 100644 > --- a/gcc/match.pd > +++ b/gcc/match.pd > @@ -6660,6 +6660,15 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) > (simplify > (bitop (neeql @0 @1) (neeqr (bit_ior @0 @1) integer_zerop)) > { constant_boolean_node (bitop == BIT_IOR_EXPR, type); })) > + > +/* (a == 0) | ((a | b) == 0) -> (a == 0) -- PR125442 > + (a != 0) & ((a | b) != 0) -> (a != 0) -- PR125442 */ > + > +(for bitop (bit_and bit_ior) > + neeq (ne eq) > +(simplify > + (bitop:c (neeq@2 @0 integer_zerop) (neeq (bit_ior:c @0 @1) integer_zerop)) > + @2)) > #endif > > /* These was part of minmax phiopt. */ > diff --git a/gcc/testsuite/gcc.dg/int-bwise-opt-3.c > b/gcc/testsuite/gcc.dg/int-bwise-opt-3.c > new file mode 100644 > index 000000000..199e85dbe > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/int-bwise-opt-3.c > @@ -0,0 +1,9 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O2 -fdump-tree-optimized" } */ > + > +int f1(int a, int b) > +{ > + return (a == 0) | ((a | b) == 0); > +} > + > +/* { dg-final { scan-tree-dump-times "\\\|" 0 "optimized" } } */ > diff --git a/gcc/testsuite/gcc.dg/int-bwise-opt-4.c > b/gcc/testsuite/gcc.dg/int-bwise-opt-4.c > new file mode 100644 > index 000000000..6989f71b8 > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/int-bwise-opt-4.c > @@ -0,0 +1,9 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O2 -fdump-tree-optimized" } */ > + > +int f2(int a, int b) > +{ > + return (a != 0) & ((a | b) != 0); > +} > + > +/* { dg-final { scan-tree-dump-times "\&" 0 "optimized" } } */ > -- > 2.43.0 >
