From 67e469d71a2e3376e0d98e6c6f8ed04b83e8ba9c Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Mon, 25 Mar 2002 23:03:13 +0000 Subject: [PATCH] combine.c (simplify_comparison ): Correct test for overflow of constant. * combine.c (simplify_comparison ): Correct test for overflow of constant. From-SVN: r51349 --- gcc/ChangeLog | 5 +++++ gcc/combine.c | 21 ++++++++++++--------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4ef20e8b7cc..bab7fdddbb8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2002-03-26 Alan Modra + + * combine.c (simplify_comparison ): Correct + test for overflow of constant. + 2002-03-25 Richard Earnshaw PR target/2623 diff --git a/gcc/combine.c b/gcc/combine.c index 88495a69fbd..0a61187071e 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. */ -- 2.30.2