* combine.c (simplify_comparison <ASHIFTRT, LSHIFTRT>): Correct
authoramodra <amodra@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 25 Mar 2002 23:03:13 +0000 (23:03 +0000)
committeramodra <amodra@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 25 Mar 2002 23:03:13 +0000 (23:03 +0000)
test for overflow of constant.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@51349 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/combine.c

index 4ef20e8..bab7fdd 100644 (file)
@@ -1,3 +1,8 @@
+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>
 
        PR target/2623
index 88495a6..0a61187 100644 (file)
@@ -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.  */