diff options
author | Roger Sayle <roger@eyesopen.com> | 2006-02-14 21:08:52 +0000 |
---|---|---|
committer | Roger Sayle <sayle@gcc.gnu.org> | 2006-02-14 21:08:52 +0000 |
commit | 03bebcacbedccd204bb09a4cfb75caf6cc8b21dd (patch) | |
tree | bdacffd2a9c579632752e1e9a4855d9be7b49879 /gcc/fold-const.c | |
parent | ce99d59440477170c00aa9ef2c2dfacb42e6f25f (diff) | |
download | gcc-03bebcacbedccd204bb09a4cfb75caf6cc8b21dd.zip gcc-03bebcacbedccd204bb09a4cfb75caf6cc8b21dd.tar.gz gcc-03bebcacbedccd204bb09a4cfb75caf6cc8b21dd.tar.bz2 |
re PR middle-end/23670 (Fold does not fold (a|b)&b to b likewise for (a&b) | b to b)
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.
From-SVN: r110997
Diffstat (limited to 'gcc/fold-const.c')
-rw-r--r-- | gcc/fold-const.c | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 03c9d1c..2683dab 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; |