(fold_rtx, case PLUS): When seeing if negative of constant is around,
authorRichard Kenner <kenner@gcc.gnu.org>
Mon, 21 Apr 1997 20:30:16 +0000 (16:30 -0400)
committerRichard Kenner <kenner@gcc.gnu.org>
Mon, 21 Apr 1997 20:30:16 +0000 (16:30 -0400)
make sure not dealing with largest negative.

From-SVN: r13953

gcc/cse.c

index f180075194d9b328751ef6fcd05326b7f1ca6e88..260da29e2d0cdd5ce6329333450bb95b798b5fad 100644 (file)
--- a/gcc/cse.c
+++ b/gcc/cse.c
@@ -5581,11 +5581,17 @@ fold_rtx (x, insn)
          /* If second operand is a register equivalent to a negative
             CONST_INT, see if we can find a register equivalent to the
             positive constant.  Make a MINUS if so.  Don't do this for
-            a negative constant since we might then alternate between
+            a non-negative constant since we might then alternate between
             chosing positive and negative constants.  Having the positive
-            constant previously-used is the more common case.  */
-         if (const_arg1 && GET_CODE (const_arg1) == CONST_INT
-             && INTVAL (const_arg1) < 0 && GET_CODE (folded_arg1) == REG)
+            constant previously-used is the more common case.  Be sure
+            the resulting constant is non-negative; if const_arg1 were
+            the smallest negative number this would overflow: depending
+            on the mode, this would either just be the same value (and
+            hence not save anything) or be incorrect.  */
+         if (const_arg1 != 0 && GET_CODE (const_arg1) == CONST_INT
+             && INTVAL (const_arg1) < 0
+             && - INTVAL (const_arg1) >= 0
+             && GET_CODE (folded_arg1) == REG)
            {
              rtx new_const = GEN_INT (- INTVAL (const_arg1));
              struct table_elt *p