On Thu, Dec 4, 2025 at 6:05 AM Richard Biener
<[email protected]> wrote:
>
> On Fri, Nov 28, 2025 at 2:04 AM Daniel Barboza
> <[email protected]> wrote:
> >
> > Add a single pattern to reduce these patterns to "x ^ c":
> >
> > x & c ? (x - c) | (x | c)
> > x & c ? (x & ~c) | (x | c)
> >
> > As long as "c" has a single bit set.
>
> OK

Pushed as r16-5896-g73824bffde7a2226a864313546f8f0bd127a22b7 (with
whitespaces fixes in the commit message for the changelog; should be
tabs).

Thanks,
Andrew

>
> Thanks,
> Richard.
>
> >         PR 122615
> >         PR 122616
> >
> > gcc/ChangeLog:
> >
> >         * match.pd (`x & c ? (x - c) | (x | c)`): New pattern.
> >         (`x & c ? (x & ~c) | (x | c)`): Likewise.
> >
> > gcc/testsuite/ChangeLog:
> >
> >         * gcc.dg/torture/pr122615.c: New test.
> >         * gcc.dg/torture/pr122616.c: Likewise.
> >
> > Co-authored-by: Jeff Law <[email protected]>
> > Signed-off-by: Daniel Barboza <[email protected]>
> > ---
> > Changes since v1, all suggested by Andrwe Pinski:
> >   - changed 'match.pd' ChangeLog commit msg
> >   - replaced second INTEGER_CST@1 with @1
> >   - changed "with {...}" style
> >
> >  gcc/match.pd                            | 16 ++++++++++++++++
> >  gcc/testsuite/gcc.dg/torture/pr122615.c | 22 ++++++++++++++++++++++
> >  gcc/testsuite/gcc.dg/torture/pr122616.c | 22 ++++++++++++++++++++++
> >  3 files changed, 60 insertions(+)
> >  create mode 100644 gcc/testsuite/gcc.dg/torture/pr122615.c
> >  create mode 100644 gcc/testsuite/gcc.dg/torture/pr122616.c
> >
> > diff --git a/gcc/match.pd b/gcc/match.pd
> > index 05c8b59eb9e..d2b55aad5a7 100644
> > --- a/gcc/match.pd
> > +++ b/gcc/match.pd
> > @@ -6627,6 +6627,22 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
> >         (convert (minus { arg; } (convert:type1 @0))))))))))
> >  #endif
> >
> > +/* X & C1 ? (X + -C1) : (X | C1) -> X ^ C1
> > +   X & C1 ? (X & ~C1) : (X | C1) -> X ^ C1
> > +   when C1 has a single bit set.  */
> > +(for op (plus bit_and)
> > + (simplify
> > +  (cond (ne (bit_and @0 INTEGER_CST@1) integer_zerop)
> > +            (op @0 INTEGER_CST@2) (bit_ior @0 @1))
> > +   (with {
> > +     auto c1 = wi::to_wide (@1);
> > +     auto c2 = wi::to_wide (@2);
> > +    }
> > +    (if (wi::popcount (c1) == 1
> > +         && ((op == PLUS_EXPR && wi::eq_p (wi::neg (c2), c1))
> > +              || (op == BIT_AND_EXPR && wi::eq_p (wi::bit_not (c2), c1))))
> > +         (bit_xor @0 @1)))))
> > +
> >  (simplify
> >   (convert (cond@0 @1 INTEGER_CST@2 INTEGER_CST@3))
> >   (if (INTEGRAL_TYPE_P (type)
> > diff --git a/gcc/testsuite/gcc.dg/torture/pr122615.c 
> > b/gcc/testsuite/gcc.dg/torture/pr122615.c
> > new file mode 100644
> > index 00000000000..9f4f3c49a01
> > --- /dev/null
> > +++ b/gcc/testsuite/gcc.dg/torture/pr122615.c
> > @@ -0,0 +1,22 @@
> > +/* { dg-do compile } */
> > +/* { dg-options "-fdump-tree-original" } */
> > +/* { dg-skip-if "" { *-*-* } { "-O0" } { "" } } */
> > +
> > +int f1 (int x)
> > +{
> > +  return x & 1 ? (x & ~1) : (x | 1);
> > +}
> > +
> > +int f2 (int x)
> > +{
> > +  return x & 2 ? (x & ~2) : (x | 2);
> > +}
> > +
> > +int f3 (int x)
> > +{
> > +  return x & 3 ? (x & ~3) : (x | 3);
> > +}
> > +
> > +/* { dg-final { scan-tree-dump-times "x \\^ 1" 1 "original" } } */
> > +/* { dg-final { scan-tree-dump-times "x \\^ 2" 1 "original" } } */
> > +/* { dg-final { scan-tree-dump-times "x \\^ 3" 0 "original" } } */
> > diff --git a/gcc/testsuite/gcc.dg/torture/pr122616.c 
> > b/gcc/testsuite/gcc.dg/torture/pr122616.c
> > new file mode 100644
> > index 00000000000..77d364ef2f4
> > --- /dev/null
> > +++ b/gcc/testsuite/gcc.dg/torture/pr122616.c
> > @@ -0,0 +1,22 @@
> > +/* { dg-do compile } */
> > +/* { dg-options "-fdump-tree-original" } */
> > +/* { dg-skip-if "" { *-*-* } { "-O0" } { "" } } */
> > +
> > +int f1 (int x)
> > +{
> > +  return x & 1 ? (x - 1) : (x | 1);
> > +}
> > +
> > +int f2 (int x)
> > +{
> > +  return x & 2 ? (x - 2) : (x | 2);
> > +}
> > +
> > +int f3 (int x)
> > +{
> > +  return x & 3 ? (x - 3) : (x | 3);
> > +}
> > +
> > +/* { dg-final { scan-tree-dump-times "x \\^ 1" 1 "original" } } */
> > +/* { dg-final { scan-tree-dump-times "x \\^ 2" 1 "original" } } */
> > +/* { dg-final { scan-tree-dump-times "x \\^ 3" 0 "original" } } */
> > --
> > 2.43.0
> >

Reply via email to