match.pd: New simplification patterns.
authorRasmus Villemoes <rv@rasmusvillemoes.dk>
Fri, 1 May 2015 18:25:12 +0000 (20:25 +0200)
committerJeff Law <law@gcc.gnu.org>
Fri, 1 May 2015 18:25:12 +0000 (12:25 -0600)
* match.pd: New simplification patterns.
(x + (x & 1))  -> ((x + 1) & ~1)
(x & ~(x & y)) -> ((x & ~y))
(x | ~(x | y)) -> ((x | ~y))

* gcc.dg/20150120-1.c: New test.
* gcc.dg/20150120-2.c: New test.
* gcc.dg/20150120-3.c: New test.

From-SVN: r222697

gcc/ChangeLog
gcc/match.pd
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/20150120-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/20150120-2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/20150120-3.c [new file with mode: 0644]

index 65816c75f6985346364ebfb2fd418e8b4bc0def5..e006b26fee90b15fe654d87a209dd09977d4f232 100644 (file)
@@ -1,3 +1,10 @@
+2015-05-01  Rasmus Villemoes  <rv@rasmusvillemoes.dk>
+
+       * match.pd: New simplification patterns.
+       (x + (x & 1))  -> ((x + 1) & ~1)
+       (x & ~(x & y)) -> ((x & ~y))
+       (x | ~(x | y)) -> ((x | ~y))
+
 2015-05-01  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
        * target.def (attribute_table): Mention that struct attribute_spec
index fc374de4121b98d990c336f1348f4b743157bfb6..87ecaf10140780243c58b90d0909d4b6c55799c9 100644 (file)
@@ -255,6 +255,20 @@ along with GCC; see the file COPYING3.  If not see
   (bitop @0 @0)
   (non_lvalue @0)))
 
+/* x + (x & 1) -> (x + 1) & ~1 */
+(simplify
+ (plus:c @0 (bit_and@2 @0 integer_onep@1))
+ (if (TREE_CODE (@2) != SSA_NAME || has_single_use (@2))
+  (bit_and (plus @0 @1) (bit_not @1))))
+
+/* x & ~(x & y) -> x & ~y */
+/* x | ~(x | y) -> x | ~y  */
+(for bitop (bit_and bit_ior)
+  (simplify
+    (bitop:c @0 (bit_not (bitop:c@2 @0 @1)))
+      (if (TREE_CODE (@2) != SSA_NAME || has_single_use (@2))
+       (bitop @0 (bit_not @1)))))
+
 (simplify
  (abs (negate @0))
  (abs @0))
index bfdde3b87ba505c1f0ddc8fa29b943d01186e4f0..2aedc46e74d52c35a801604bf04b0b61834586bc 100644 (file)
@@ -1,3 +1,9 @@
+2015-05-01  Rasmus Villemoes  <rv@rasmusvillemoes.dk>
+
+       * gcc.dg/20150120-1.c: New test.
+       * gcc.dg/20150120-2.c: New test.
+       * gcc.dg/20150120-3.c: New test.
+
 2015-05-01  David Edelsohn  <dje.gcc@gmail.com>
 
        * gcc.dg/debug/pr65771.c: Add "dg-add-options tls".
diff --git a/gcc/testsuite/gcc.dg/20150120-1.c b/gcc/testsuite/gcc.dg/20150120-1.c
new file mode 100644 (file)
index 0000000..18906c4
--- /dev/null
@@ -0,0 +1,51 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-original" } */
+
+/* x + (x & 1) -> (x + 1) & ~1 */
+int
+fn1 (int x)
+{
+       return x + (x & 1);
+}
+int
+fn2 (int x)
+{
+       return (x & 1) + x;
+}
+int
+fn3 (int x)
+{
+       return x + (1 & x);
+}
+int
+fn4 (int x)
+{
+       return (1 & x) + x;
+}
+unsigned int
+fn5 (unsigned int x)
+{
+       return x + (x & 1);
+}
+unsigned int
+fn6 (unsigned int x)
+{
+       return (x & 1) + x;
+}
+unsigned int
+fn7 (unsigned int x)
+{
+       return x + (x % 2);
+}
+unsigned int
+fn8 (unsigned int x)
+{
+       return (x % 2) + x;
+}
+unsigned int
+fn9 (unsigned int x)
+{
+       return (1LL & x) + x;
+}
+
+/* { dg-final { scan-tree-dump-times "x \\+ 1" 9 "original" } } */
diff --git a/gcc/testsuite/gcc.dg/20150120-2.c b/gcc/testsuite/gcc.dg/20150120-2.c
new file mode 100644 (file)
index 0000000..976b654
--- /dev/null
@@ -0,0 +1,32 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-original" } */
+
+/* x & ~(x & y) -> x & ~y */
+int fn1 (int x, int y)
+{
+       return x & ~(x & y);
+}
+int fn2 (int x, int y)
+{
+       return ~(x & y) & x;
+}
+int fn3 (int x, int y)
+{
+       return x & ~(y & x);
+}
+int fn4 (int x, int y)
+{
+       return ~(y & x) & x;
+}
+int fn5 (int z)
+{
+       return z & ~(z & 3);
+}
+int fn6 (int z)
+{
+       return ~(z & 3) & z;
+}
+
+
+/* { dg-final { scan-tree-dump-times "~y & x" 4 "original" } } */
+/* { dg-final { scan-tree-dump-times "z & -4" 2 "original" } } */
diff --git a/gcc/testsuite/gcc.dg/20150120-3.c b/gcc/testsuite/gcc.dg/20150120-3.c
new file mode 100644 (file)
index 0000000..322556f
--- /dev/null
@@ -0,0 +1,32 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-original" } */
+
+/* x | ~(x | y) -> x | ~y */
+int fn1 (int x, int y)
+{
+       return x | ~(x | y);
+}
+int fn2 (int x, int y)
+{
+       return ~(x | y) | x;
+}
+int fn3 (int x, int y)
+{
+       return x | ~(y | x);
+}
+int fn4 (int x, int y)
+{
+       return ~(y | x) | x;
+}
+int fn5 (int z)
+{
+       return z | ~(z | 3);
+}
+int fn6 (int z)
+{
+       return ~(z | 3) | z;
+}
+
+
+/* { dg-final { scan-tree-dump-times "~y \\| x" 4 "original" } } */
+/* { dg-final { scan-tree-dump-times "z \\| -4" 2 "original" } } */