From f79db4f66eba251456c2a9c2fc9d0daef1af9e90 Mon Sep 17 00:00:00 2001 From: Andrew Pinski Date: Sat, 23 Feb 2008 17:58:48 +0000 Subject: [PATCH] re PR tree-optimization/33512 (Simple bitwise simplification missed) 2008-02-23 Andrew Pinski 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 PR rtl-opt/33512 * gcc.dg/and-1.c: New test. From-SVN: r132575 --- gcc/ChangeLog | 6 ++++++ gcc/simplify-rtx.c | 13 +++++++++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/and-1.c | 10 ++++++++++ 4 files changed, 34 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/and-1.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 235208cc4f3..9bf9a9d915a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2008-02-23 Andrew Pinski + + 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 PR pch/35027 diff --git a/gcc/simplify-rtx.c b/gcc/simplify-rtx.c index f8756040ce0..03fbc750dcf 100644 --- a/gcc/simplify-rtx.c +++ b/gcc/simplify-rtx.c @@ -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; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b111ef4da71..e53852be3e6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2008-02-23 Andrew Pinski + + PR rtl-opt/33512 + * gcc.dg/and-1.c: New test. + 2008-02-23 Daniel Jacobowitz * 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 index 00000000000..c66e4e15fac --- /dev/null +++ b/gcc/testsuite/gcc.dg/and-1.c @@ -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); +} -- 2.30.2