From af55979c0c01542fe82f4da341f8748e1ca4e9ac Mon Sep 17 00:00:00 2001 From: sayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4> Date: Tue, 14 Feb 2006 21:08:52 +0000 Subject: [PATCH] PR middle-end/23670 * fold-const.c (fold_binary) <BIT_IOR_EXPR>: Optimize (X&Y)|Y into (X,Y) and the corresponding symmetry related transformations. (fold_binary) <BIT_AND_EXPR>: Likewise, optimize (X|Y)&Y into (X,Y) and its symmetry related transformations. * gcc.dg/tree-ssa/andor-2.c: New test case. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@110997 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 8 ++++ gcc/fold-const.c | 40 +++++++++++++++++++ gcc/testsuite/ChangeLog | 5 +++ gcc/testsuite/gcc.dg/tree-ssa/andor-2.c | 52 +++++++++++++++++++++++++ 4 files changed, 105 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/andor-2.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a5336bb9e231..a134098cc818 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2006-02-14 Roger Sayle <roger@eyesopen.com> + + PR middle-end/23670 + * fold-const.c (fold_binary) <BIT_IOR_EXPR>: Optimize (X&Y)|Y into + (X,Y) and the corresponding symmetry related transformations. + (fold_binary) <BIT_AND_EXPR>: Likewise, optimize (X|Y)&Y into + (X,Y) and its symmetry related transformations. + 2006-02-14 Roger Sayle <roger@eyesopen.com> * dojump.c (do_compare_rtx_and_jump): Also handle multi-word GTU diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 03c9d1c17e57..2683dab7d249 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -8161,6 +8161,26 @@ fold_binary (enum tree_code code, tree type, tree op0, tree op1) arg1); } + /* (X & Y) | Y is (X, Y). */ + if (TREE_CODE (arg0) == BIT_AND_EXPR + && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0)) + return omit_one_operand (type, arg1, TREE_OPERAND (arg0, 0)); + /* (X & Y) | X is (Y, X). */ + if (TREE_CODE (arg0) == BIT_AND_EXPR + && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0) + && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1)) + return omit_one_operand (type, arg1, TREE_OPERAND (arg0, 1)); + /* X | (X & Y) is (Y, X). */ + if (TREE_CODE (arg1) == BIT_AND_EXPR + && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0) + && reorder_operands_p (arg0, TREE_OPERAND (arg1, 1))) + return omit_one_operand (type, arg0, TREE_OPERAND (arg1, 1)); + /* X | (Y & X) is (Y, X). */ + if (TREE_CODE (arg1) == BIT_AND_EXPR + && operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0) + && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0))) + return omit_one_operand (type, arg0, TREE_OPERAND (arg1, 0)); + t1 = distribute_bit_expr (code, type, arg0, arg1); if (t1 != NULL_TREE) return t1; @@ -8313,6 +8333,26 @@ fold_binary (enum tree_code code, tree type, tree op0, tree op1) fold_build2 (BIT_AND_EXPR, type, TREE_OPERAND (arg0, 1), arg1)); + /* (X | Y) & Y is (X, Y). */ + if (TREE_CODE (arg0) == BIT_IOR_EXPR + && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0)) + return omit_one_operand (type, arg1, TREE_OPERAND (arg0, 0)); + /* (X | Y) & X is (Y, X). */ + if (TREE_CODE (arg0) == BIT_IOR_EXPR + && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0) + && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1)) + return omit_one_operand (type, arg1, TREE_OPERAND (arg0, 1)); + /* X & (X | Y) is (Y, X). */ + if (TREE_CODE (arg1) == BIT_IOR_EXPR + && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0) + && reorder_operands_p (arg0, TREE_OPERAND (arg1, 1))) + return omit_one_operand (type, arg0, TREE_OPERAND (arg1, 1)); + /* X & (Y | X) is (Y, X). */ + if (TREE_CODE (arg1) == BIT_IOR_EXPR + && operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0) + && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0))) + return omit_one_operand (type, arg0, TREE_OPERAND (arg1, 0)); + t1 = distribute_bit_expr (code, type, arg0, arg1); if (t1 != NULL_TREE) return t1; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 5d4bfafd87f9..d2319a10fbf5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2006-02-14 Roger Sayle <roger@eyesopen.com> + + PR middle-end/23670 + * gcc.dg/tree-ssa/andor-2.c: New test case. + 2006-02-14 Thomas Koenig <Thomas.Koenig@online.de> PR fortran/25045 diff --git a/gcc/testsuite/gcc.dg/tree-ssa/andor-2.c b/gcc/testsuite/gcc.dg/tree-ssa/andor-2.c new file mode 100644 index 000000000000..cdc00b7a4e9d --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/andor-2.c @@ -0,0 +1,52 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-original" } */ + +int test1(int a, int b) +{ + return (a & b) | b; +} + +int test2(int c, int d) +{ + return (c & d) | c; +} + +int test3(int e, int f) +{ + return e | (e & f); +} + +int test4(int g, int h) +{ + return g | (h & g); +} + +int test5(int i, int j) +{ + return (i | j) & j; +} + +int test6(int k, int l) +{ + return (k | l) & k; +} + +int test7(int m, int n) +{ + return m & (m | n); +} + +int test8(int o, int p) +{ + return o & (p | o); +} + +/* { dg-final { scan-tree-dump-times "return b;" 1 "original" } } */ +/* { dg-final { scan-tree-dump-times "return c;" 1 "original" } } */ +/* { dg-final { scan-tree-dump-times "return e;" 1 "original" } } */ +/* { dg-final { scan-tree-dump-times "return g;" 1 "original" } } */ +/* { dg-final { scan-tree-dump-times "return j;" 1 "original" } } */ +/* { dg-final { scan-tree-dump-times "return k;" 1 "original" } } */ +/* { dg-final { scan-tree-dump-times "return m;" 1 "original" } } */ +/* { dg-final { scan-tree-dump-times "return o;" 1 "original" } } */ +/* { dg-final { cleanup-tree-dump "original" } } */ -- GitLab