diff options
author | Alan Modra <amodra@bigpond.net.au> | 2002-03-25 23:03:13 +0000 |
---|---|---|
committer | Alan Modra <amodra@gcc.gnu.org> | 2002-03-26 09:33:13 +1030 |
commit | 67e469d71a2e3376e0d98e6c6f8ed04b83e8ba9c (patch) | |
tree | 8fb0fe8238fd64e76c0397e1c05b6a62a5877d43 /gcc/combine.c | |
parent | bbffa101d17ba138b52ec3b9fc6c2a3db4ca9659 (diff) | |
download | gcc-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.c | 21 |
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. */ |