On Sun, May 10, 2026 at 4:03 PM Prathamesh Kulkarni <[email protected]> wrote:
> > > > -----Original Message----- > > From: Shivam Gupta <[email protected]> > > Sent: 10 May 2026 14:26 > > To: [email protected] > > Cc: [email protected]; Shivam Gupta > > <[email protected]> > > Subject: [PATCH] match.pd: Simplify ((~x) & y) ^ (x | y) > > > > External email: Use caution opening links or attachments > > > > > > This adds the simplification of: > > _1 = ~x_4(D); > > _2 = _1 & y_5(D); > > _3 = x_4(D) | y_5(D); > > _6 = _2 ^ _3; > > return _6; > > > > to: > > return x_1(D); > > > > also for ((~x) | y) ^ (x & y) version > > _1 = ~x_4(D); > > _2 = _1 | y_5(D); > > _3 = x_4(D) & y_5(D); > > _6 = _2 ^ _3; > > return _6; > > > > to: > > int _2; > > _2 = ~x_1(D); > > return _2; > > > > Bootstrapped and tested on aarch64-linux-gnu with RUNTESTFLAGS="tree- > > ssa.exp". > > > > PR tree-optimization/112095 > > > > gcc/ChangeLog: > > > > * match.pd: Simplify ((~x) & y) ^ (x | y) > > to x and ((~x) | y) ^ (x & y) to ~x. > > > > gcc/testsuite/ChangeLog: > > > > * gcc.dg/tree-ssa/pr112095.c: New test. > > > > Signed-off-by: Shivam Gupta <[email protected]> > > --- > > gcc/match.pd | 9 +++++++++ > > gcc/testsuite/gcc.dg/tree-ssa/pr112095.c | 19 +++++++++++++++++++ > > 2 files changed, 28 insertions(+) > > create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr112095.c > > > > diff --git a/gcc/match.pd b/gcc/match.pd index > > 7b652afb43d..08df727ea9d 100644 > > --- a/gcc/match.pd > > +++ b/gcc/match.pd > > @@ -2627,6 +2627,15 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) > > (negate (nop_convert? (bit_not @0))) > > (plus (view_convert @0) { build_each_one_cst (type); })) > > > > +/* ((~a) & b) ^ (a | b) -> a */ > > +/* ((~a) | b) ^ (a & b) -> ~a */ > > +(simplify > > + (bit_xor:c (bit_ior:c @0 @1) (bit_and:c @2 @1)) (with { bool > > wascmp; > > +} > > + (if (bitwise_inverted_equal_p (@0, @2, wascmp) > > + && (!wascmp || element_precision (type) == 1)) > > + @0))) > > + > > /* (a & b) ^ (a == b) -> !(a | b) */ > > /* (a & b) == (a ^ b) -> !(a | b) */ > > (for first_op (bit_xor eq) > > diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr112095.c > > b/gcc/testsuite/gcc.dg/tree-ssa/pr112095.c > > new file mode 100644 > > index 00000000000..126705d7731 > > --- /dev/null > > +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr112095.c > > @@ -0,0 +1,19 @@ > > +/* { dg-do compile } */ > > +/* { dg-options "-O -fdump-tree-optimized" } */ > > + > > +int > > +f (int a, int b) > > +{ > > + return ((~a) & b) ^ (a | b); > > +} > > + > > +int > > +g (int a, int b) > > +{ > > + return ((~a) | b) ^ (a & b); > > +} > > + > > +/* Above patterns should simplify to a and ~a respectively. */ > > +/* { dg-final { scan-tree-dump "return a_" "optimized" } } */ > > +/* { dg-final { scan-tree-dump "~a_" "optimized" } } */ > Hi, > I think the above test will apply for GENERIC folding. > To test folding on GIMPLE, you'd need to break it down into > sub-expressions: > For eg: > int f (int a, int b) > { > int t1 = (~a & b); > int t2 = (a | b); > return t1 ^ t2; > } > > Also, you might want to include tests for other types besides int. > > Thank you Prathamesh, updated the test case to verify other types in the v2 of patch. Also I am not quite sure how email threads works in GCC patch reviews. I guess v2 should be send in separate email, not just to the first version. Best, Shivam > Thanks, > Prathamesh > + > > -- > > 2.34.1 > >
