]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
match.pd: Add bitwise and pattern [PR106243]
authorSam Feifer <sfeifer@redhat.com>
Wed, 3 Aug 2022 14:31:03 +0000 (10:31 -0400)
committerSam Feifer <sfeifer@redhat.com>
Thu, 4 Aug 2022 13:35:14 +0000 (09:35 -0400)
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.

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
gcc/testsuite/gcc.dg/pr106243-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/pr106243.c [new file with mode: 0644]

index 562138a8034bffddd3b4feae8b10874eaba89ff2..d3d73e3f55c519aad167c30300b2afe2dcba8284 100644 (file)
@@ -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 (negate @0) integer_onep@1)
+  (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 (file)
index 0000000..b1dbe5c
--- /dev/null
@@ -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 (file)
index 0000000..ee2706f
--- /dev/null
@@ -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" } } */