On Wed, Aug 3, 2022 at 9:11 PM Sam Feifer via Gcc-patches <gcc-patches@gcc.gnu.org> wrote: > > This patch adds a new optimization to match.pd. The pattern, -x & 1, > now gets simplified to x & 1, reducing the number of instructions > produced. > > This patch also adds tests for the optimization rule. > > Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk? > > PR tree-optimization/106243 > > gcc/ChangeLog: > > * match.pd (-x & 1): New simplification. > > gcc/testsuite/ChangeLog: > > * gcc.dg/pr106243-1.c: New test. > * gcc.dg/pr106243.c: New test. > --- > gcc/match.pd | 5 ++++ > gcc/testsuite/gcc.dg/pr106243-1.c | 18 +++++++++++++ > gcc/testsuite/gcc.dg/pr106243.c | 43 +++++++++++++++++++++++++++++++ > 3 files changed, 66 insertions(+) > create mode 100644 gcc/testsuite/gcc.dg/pr106243-1.c > create mode 100644 gcc/testsuite/gcc.dg/pr106243.c > > diff --git a/gcc/match.pd b/gcc/match.pd > index 562138a8034..78b32567836 100644 > --- a/gcc/match.pd > +++ b/gcc/match.pd > @@ -8061,3 +8061,8 @@ and, > (if (TYPE_UNSIGNED (TREE_TYPE (@0))) > (bit_and @0 @1) > (cond (le @0 @1) @0 (bit_and @0 @1)))))) > + > +/* -x & 1 -> x & 1. */ > +(simplify > + (bit_and:c (negate @0) integer_onep@1)
Note the bit_and doesn't need :c because constant operands are always canonicalized second. OK with that change. Thanks, Richard. > + (bit_and @0 @1)) > diff --git a/gcc/testsuite/gcc.dg/pr106243-1.c > b/gcc/testsuite/gcc.dg/pr106243-1.c > new file mode 100644 > index 00000000000..b1dbe5cbe44 > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/pr106243-1.c > @@ -0,0 +1,18 @@ > +/* PR tree-optimization/106243 */ > +/* { dg-do run } */ > +/* { dg-options "-O2" } */ > + > +#include "pr106243.c" > + > +int main () { > + > + if (foo(3) != 1 > + || bar(-6) != 0 > + || baz(17) != 1 > + || qux(-128) != 0 > + || foo(127) != 1) { > + __builtin_abort(); > + } > + > + return 0; > +} > diff --git a/gcc/testsuite/gcc.dg/pr106243.c b/gcc/testsuite/gcc.dg/pr106243.c > new file mode 100644 > index 00000000000..ee2706f2bf9 > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/pr106243.c > @@ -0,0 +1,43 @@ > +/* PR tree-optimization/106243 */ > +/* { dg-do compile } */ > +/* { dg-options "-O2 -fdump-tree-optimized" } */ > + > +#define vector __attribute__((vector_size(4*sizeof(int)))) > + > +/* Test from PR. */ > +__attribute__((noipa)) int foo (int x) { > + return -x & 1; > +} > + > +/* Other test from PR. */ > +__attribute__((noipa)) int bar (int x) { > + return (0 - x) & 1; > +} > + > +/* Forward propogation. */ > +__attribute__((noipa)) int baz (int x) { > + x = -x; > + return x & 1; > +} > + > +/* Commutative property. */ > +__attribute__((noipa)) int qux (int x) { > + return 1 & -x; > +} > + > +/* Vector test case. */ > +__attribute__((noipa)) vector int waldo (vector int x) { > + return -x & 1; > +} > + > +/* Should not simplify. */ > +__attribute__((noipa)) int thud (int x) { > + return -x & 2; > +} > + > +/* Should not simplify. */ > +__attribute__((noipa)) int corge (int x) { > + return -x & -1; > +} > + > +/* { dg-final {scan-tree-dump-times "-" 2 "optimized" } } */ > > base-commit: 388fbbd895e72669909173c3003ae65c6483a3c2 > -- > 2.31.1 >