summaryrefslogtreecommitdiff
path: root/gcc/simplify-rtx.c
diff options
context:
space:
mode:
authorbernds <bernds@138bc75d-0d04-0410-961f-82ee72b054a4>2009-04-24 16:19:36 +0000
committerbernds <bernds@138bc75d-0d04-0410-961f-82ee72b054a4>2009-04-24 16:19:36 +0000
commitc79d4a4d3a67c8ed7b97ef4ba1f5d1ea6dfae76c (patch)
treeb034cf35f9cf26b923ad93cd826a4344a685366e /gcc/simplify-rtx.c
parentbb4d85a35e7223a61e12b65b0c7a43c5371e3f97 (diff)
downloadgcc-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.c21
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)