diff options
author | bernds <bernds@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-04-24 16:19:36 +0000 |
---|---|---|
committer | bernds <bernds@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-04-24 16:19:36 +0000 |
commit | c79d4a4d3a67c8ed7b97ef4ba1f5d1ea6dfae76c (patch) | |
tree | b034cf35f9cf26b923ad93cd826a4344a685366e /gcc/simplify-rtx.c | |
parent | bb4d85a35e7223a61e12b65b0c7a43c5371e3f97 (diff) | |
download | gcc-c79d4a4d3a67c8ed7b97ef4ba1f5d1ea6dfae76c.tar.gz |
* simplify-rtx.c (simplify_binary_operation_1, case AND): Result is
zero if no overlap in nonzero bits between the operands.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@146738 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/simplify-rtx.c')
-rw-r--r-- | gcc/simplify-rtx.c | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/gcc/simplify-rtx.c b/gcc/simplify-rtx.c index b8b6ad81763..e2b1673a8dd 100644 --- a/gcc/simplify-rtx.c +++ b/gcc/simplify-rtx.c @@ -2304,17 +2304,22 @@ simplify_binary_operation_1 (enum rtx_code code, enum machine_mode mode, case AND: if (trueop1 == CONST0_RTX (mode) && ! side_effects_p (op0)) return trueop1; - if (GET_CODE (trueop1) == CONST_INT - && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT) + if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT) { HOST_WIDE_INT nzop0 = nonzero_bits (trueop0, mode); - HOST_WIDE_INT val1 = INTVAL (trueop1); - /* If we are turning off bits already known off in OP0, we need - not do an AND. */ - if ((nzop0 & ~val1) == 0) - return op0; + HOST_WIDE_INT nzop1; + if (GET_CODE (trueop1) == CONST_INT) + { + HOST_WIDE_INT val1 = INTVAL (trueop1); + /* If we are turning off bits already known off in OP0, we need + not do an AND. */ + if ((nzop0 & ~val1) == 0) + return op0; + } + nzop1 = nonzero_bits (trueop1, mode); /* If we are clearing all the nonzero bits, the result is zero. */ - if ((val1 & nzop0) == 0 && !side_effects_p (op0)) + if ((nzop1 & nzop0) == 0 + && !side_effects_p (op0) && !side_effects_p (op1)) return CONST0_RTX (mode); } if (rtx_equal_p (trueop0, trueop1) && ! side_effects_p (op0) |