Commit 67e469d7 by Alan Modra Committed by Alan Modra

combine.c (simplify_comparison <ASHIFTRT, LSHIFTRT>): Correct test for overflow of constant.

	* combine.c (simplify_comparison <ASHIFTRT, LSHIFTRT>): Correct
	test for overflow of constant.

From-SVN: r51349
parent bbffa101
2002-03-26 Alan Modra <amodra@bigpond.net.au>
* combine.c (simplify_comparison <ASHIFTRT, LSHIFTRT>): Correct
test for overflow of constant.
2002-03-25 Richard Earnshaw <rearnsha@arm.com> 2002-03-25 Richard Earnshaw <rearnsha@arm.com>
PR target/2623 PR target/2623
......
...@@ -10843,9 +10843,9 @@ simplify_comparison (code, pop0, pop1) ...@@ -10843,9 +10843,9 @@ simplify_comparison (code, pop0, pop1)
&& XEXP (op0, 1) == XEXP (XEXP (op0, 0), 1) && XEXP (op0, 1) == XEXP (XEXP (op0, 0), 1)
&& (tmode = mode_for_size (mode_width - INTVAL (XEXP (op0, 1)), && (tmode = mode_for_size (mode_width - INTVAL (XEXP (op0, 1)),
MODE_INT, 1)) != BLKmode MODE_INT, 1)) != BLKmode
&& ((unsigned HOST_WIDE_INT) const_op <= GET_MODE_MASK (tmode) && (((unsigned HOST_WIDE_INT) const_op
|| ((unsigned HOST_WIDE_INT) -const_op + (GET_MODE_MASK (tmode) >> 1) + 1)
<= GET_MODE_MASK (tmode)))) <= GET_MODE_MASK (tmode)))
{ {
op0 = gen_lowpart_for_combine (tmode, XEXP (XEXP (op0, 0), 0)); op0 = gen_lowpart_for_combine (tmode, XEXP (XEXP (op0, 0), 0));
continue; continue;
...@@ -10862,9 +10862,9 @@ simplify_comparison (code, pop0, pop1) ...@@ -10862,9 +10862,9 @@ simplify_comparison (code, pop0, pop1)
&& XEXP (op0, 1) == XEXP (XEXP (XEXP (op0, 0), 0), 1) && XEXP (op0, 1) == XEXP (XEXP (XEXP (op0, 0), 0), 1)
&& (tmode = mode_for_size (mode_width - INTVAL (XEXP (op0, 1)), && (tmode = mode_for_size (mode_width - INTVAL (XEXP (op0, 1)),
MODE_INT, 1)) != BLKmode MODE_INT, 1)) != BLKmode
&& ((unsigned HOST_WIDE_INT) const_op <= GET_MODE_MASK (tmode) && (((unsigned HOST_WIDE_INT) const_op
|| ((unsigned HOST_WIDE_INT) -const_op + (GET_MODE_MASK (tmode) >> 1) + 1)
<= GET_MODE_MASK (tmode)))) <= GET_MODE_MASK (tmode)))
{ {
rtx inner = XEXP (XEXP (XEXP (op0, 0), 0), 0); rtx inner = XEXP (XEXP (XEXP (op0, 0), 0), 0);
rtx add_const = XEXP (XEXP (op0, 0), 1); rtx add_const = XEXP (XEXP (op0, 0), 1);
...@@ -10889,9 +10889,12 @@ simplify_comparison (code, pop0, pop1) ...@@ -10889,9 +10889,12 @@ simplify_comparison (code, pop0, pop1)
&& mode_width <= HOST_BITS_PER_WIDE_INT && mode_width <= HOST_BITS_PER_WIDE_INT
&& (nonzero_bits (XEXP (op0, 0), mode) && (nonzero_bits (XEXP (op0, 0), mode)
& (((HOST_WIDE_INT) 1 << INTVAL (XEXP (op0, 1))) - 1)) == 0 & (((HOST_WIDE_INT) 1 << INTVAL (XEXP (op0, 1))) - 1)) == 0
&& (const_op == 0 && (((unsigned HOST_WIDE_INT) const_op
|| (floor_log2 (const_op) + INTVAL (XEXP (op0, 1)) + (GET_CODE (op0) != LSHIFTRT
< mode_width))) ? ((GET_MODE_MASK (mode) >> INTVAL (XEXP (op0, 1)) >> 1)
+ 1)
: 0))
<= GET_MODE_MASK (mode) >> INTVAL (XEXP (op0, 1))))
{ {
/* If the shift was logical, then we must make the condition /* If the shift was logical, then we must make the condition
unsigned. */ unsigned. */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment