From 5d595063ff7a2203d967ac9d10517f8e88bd13a7 Mon Sep 17 00:00:00 2001 From: Richard Kenner Date: Mon, 21 Apr 1997 16:30:16 -0400 Subject: [PATCH] (fold_rtx, case PLUS): When seeing if negative of constant is around, make sure not dealing with largest negative. From-SVN: r13953 --- gcc/cse.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/gcc/cse.c b/gcc/cse.c index f180075194d..260da29e2d0 100644 --- 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