Fix PR94880: Failure to recognize andn pattern
authorPrzemyslaw Wirkus <Przemyslaw.Wirkus@arm.com>
Fri, 19 Jun 2020 15:48:55 +0000 (16:48 +0100)
committerAlex Coplan <alex.coplan@arm.com>
Fri, 19 Jun 2020 15:48:55 +0000 (16:48 +0100)
Pattern "(x | y) - y" can be optimized to simple "(x & ~y)" andn
pattern.

Bootstrapped and tested on aarch64-none-linux-gnu.

gcc/ChangeLog:

PR tree-optimization/94880
* match.pd (A | B) - B -> (A & ~B): New simplification.

gcc/testsuite/ChangeLog:

PR tree-optimization/94880
* gcc.dg/tree-ssa/pr94880.c: New Test.

gcc/match.pd
gcc/testsuite/gcc.dg/tree-ssa/pr94880.c [new file with mode: 0644]

index 53ced34..43f3d7a 100644 (file)
@@ -1109,6 +1109,11 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
       && !TYPE_SATURATING (type))
   (bit_ior @0 @1)))
 
+/* (x | y) - y -> (x & ~y) */
+(simplify
+ (minus (bit_ior:cs @0 @1) @1)
+ (bit_and @0 (bit_not @1)))
+
 /* (x | y) - (x ^ y) -> x & y */
 (simplify
  (minus (bit_ior @0 @1) (bit_xor @0 @1))
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr94880.c b/gcc/testsuite/gcc.dg/tree-ssa/pr94880.c
new file mode 100644 (file)
index 0000000..f721661
--- /dev/null
@@ -0,0 +1,29 @@
+/* PR tree-optimization/94786 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-optimized" } */
+/* { dg-final { scan-tree-dump-times "= ~\[xy\]_" 4 "optimized" } } */
+/* { dg-final { scan-tree-dump-times " & \[xy\]_" 4 "optimized" } } */
+
+unsigned
+foo_u(unsigned x, unsigned y)
+{
+  return (x | y) - y;
+}
+
+int
+foo_i(int x, int y)
+{
+  return (x | y) - y;
+}
+
+unsigned long long
+foo_ull(unsigned long long x, unsigned long long y)
+{
+  return (x | y) - y;
+}
+
+long long
+foo_ll(long long x, long long y)
+{
+  return (x | y) - y;
+}