aboutsummaryrefslogtreecommitdiff
path: root/gcc/combine.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@bigpond.net.au>2002-03-25 23:03:13 +0000
committerAlan Modra <amodra@gcc.gnu.org>2002-03-26 09:33:13 +1030
commit67e469d71a2e3376e0d98e6c6f8ed04b83e8ba9c (patch)
tree8fb0fe8238fd64e76c0397e1c05b6a62a5877d43 /gcc/combine.c
parentbbffa101d17ba138b52ec3b9fc6c2a3db4ca9659 (diff)
downloadgcc-67e469d71a2e3376e0d98e6c6f8ed04b83e8ba9c.zip
gcc-67e469d71a2e3376e0d98e6c6f8ed04b83e8ba9c.tar.gz
gcc-67e469d71a2e3376e0d98e6c6f8ed04b83e8ba9c.tar.bz2
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
Diffstat (limited to 'gcc/combine.c')
-rw-r--r--gcc/combine.c21
1 files changed, 12 insertions, 9 deletions
diff --git a/gcc/combine.c b/gcc/combine.c
index 88495a6..0a611870 100644
--- a/gcc/combine.c
+++ b/gcc/combine.c
@@ -10843,9 +10843,9 @@ simplify_comparison (code, pop0, pop1)
&& XEXP (op0, 1) == XEXP (XEXP (op0, 0), 1)
&& (tmode = mode_for_size (mode_width - INTVAL (XEXP (op0, 1)),
MODE_INT, 1)) != BLKmode
- && ((unsigned HOST_WIDE_INT) const_op <= GET_MODE_MASK (tmode)
- || ((unsigned HOST_WIDE_INT) -const_op
- <= GET_MODE_MASK (tmode))))
+ && (((unsigned HOST_WIDE_INT) const_op
+ + (GET_MODE_MASK (tmode) >> 1) + 1)
+ <= GET_MODE_MASK (tmode)))
{
op0 = gen_lowpart_for_combine (tmode, XEXP (XEXP (op0, 0), 0));
continue;
@@ -10862,9 +10862,9 @@ simplify_comparison (code, pop0, pop1)
&& XEXP (op0, 1) == XEXP (XEXP (XEXP (op0, 0), 0), 1)
&& (tmode = mode_for_size (mode_width - INTVAL (XEXP (op0, 1)),
MODE_INT, 1)) != BLKmode
- && ((unsigned HOST_WIDE_INT) const_op <= GET_MODE_MASK (tmode)
- || ((unsigned HOST_WIDE_INT) -const_op
- <= GET_MODE_MASK (tmode))))
+ && (((unsigned HOST_WIDE_INT) const_op
+ + (GET_MODE_MASK (tmode) >> 1) + 1)
+ <= GET_MODE_MASK (tmode)))
{
rtx inner = XEXP (XEXP (XEXP (op0, 0), 0), 0);
rtx add_const = XEXP (XEXP (op0, 0), 1);
@@ -10889,9 +10889,12 @@ simplify_comparison (code, pop0, pop1)
&& mode_width <= HOST_BITS_PER_WIDE_INT
&& (nonzero_bits (XEXP (op0, 0), mode)
& (((HOST_WIDE_INT) 1 << INTVAL (XEXP (op0, 1))) - 1)) == 0
- && (const_op == 0
- || (floor_log2 (const_op) + INTVAL (XEXP (op0, 1))
- < mode_width)))
+ && (((unsigned HOST_WIDE_INT) const_op
+ + (GET_CODE (op0) != LSHIFTRT
+ ? ((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
unsigned. */