re PR tree-optimization/33512 (Simple bitwise simplification missed)
authorAndrew Pinski <andrew_pinski@playstation.sony.com>
Sat, 23 Feb 2008 17:58:48 +0000 (17:58 +0000)
committerAndrew Pinski <pinskia@gcc.gnu.org>
Sat, 23 Feb 2008 17:58:48 +0000 (09:58 -0800)
2008-02-23  Andrew Pinski  <andrew_pinski@playstation.sony.com>

        PR rtl-opt/33512
        * simplify-rtx.c (simplify_binary_operation_1): Add simplification
        of (and X (ior (not X) Y) and (and (ior (not X) Y) X).

2008-02-23  Andrew Pinski  <andrew_pinski@playstation.sony.com>

        PR rtl-opt/33512
        * gcc.dg/and-1.c: New test.

From-SVN: r132575

gcc/ChangeLog
gcc/simplify-rtx.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/and-1.c [new file with mode: 0644]

index 235208cc4f35b8a9c8de8451f20c5f5d11eda877..9bf9a9d915a1603ae4f50d736494e52cb0f30579 100644 (file)
@@ -1,3 +1,9 @@
+2008-02-23  Andrew Pinski  <andrew_pinski@playstation.sony.com>
+
+       PR rtl-opt/33512
+       * simplify-rtx.c (simplify_binary_operation_1): Add simplification
+       of (and X (ior (not X) Y) and (and (ior (not X) Y) X).
+
 2008-02-23  Andrew Pinski  <andrew_pinski@playstation.sony.com>
 
        PR pch/35027
index f8756040ce0f17d6e6162ecf474f5a08d5268d6e..03fbc750dcf93235682986b27546cc5b9b8d6f0c 100644 (file)
@@ -2428,6 +2428,19 @@ simplify_binary_operation_1 (enum rtx_code code, enum machine_mode mode,
              return simplify_gen_binary (code, mode, tem, op1);
            }
        }
+
+      /* (and X (ior (not X) Y) -> (and X Y) */
+      if (GET_CODE (op1) == IOR
+         && GET_CODE (XEXP (op1, 0)) == NOT
+         && op0 == XEXP (XEXP (op1, 0), 0))
+       return simplify_gen_binary (AND, mode, op0, XEXP (op1, 1));
+
+      /* (and (ior (not X) Y) X) -> (and X Y) */
+      if (GET_CODE (op0) == IOR
+         && GET_CODE (XEXP (op0, 0)) == NOT
+         && op1 == XEXP (XEXP (op0, 0), 0))
+       return simplify_gen_binary (AND, mode, op1, XEXP (op0, 1));
+
       tem = simplify_associative_operation (code, mode, op0, op1);
       if (tem)
        return tem;
index b111ef4da71e89e1a89f8c4bedca75e2f1c8ee9e..e53852be3e6427bcb5e96fbb1c51e643fc0a325d 100644 (file)
@@ -1,3 +1,8 @@
+2008-02-23  Andrew Pinski  <andrew_pinski@playstation.sony.com>
+
+       PR rtl-opt/33512
+       * gcc.dg/and-1.c: New test.
+
 2008-02-23  Daniel Jacobowitz  <dan@codesourcery.com>
 
        * gcc.c-torture/execute/20080222-1.c: New test.
diff --git a/gcc/testsuite/gcc.dg/and-1.c b/gcc/testsuite/gcc.dg/and-1.c
new file mode 100644 (file)
index 0000000..c66e4e1
--- /dev/null
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+/* { dg-final { scan-assembler "and" { target powerpc*-*-* spu-*-* } } } */
+/* There should be no nand for this testcase (for either PPC or SPU). */
+/* { dg-final { scan-assembler-not "nand" { target powerpc*-*-* spu-*-* } } } */
+
+int f(int y)
+{
+  return y & ~(y & -y);
+}