From: Richard Stallman Date: Fri, 28 May 1993 22:40:33 +0000 (+0000) Subject: (fold_rtx): Correct check for associating shifts and ending up with a shift count... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=4908e5087063c4b310ab617e09230ad65f294efa;p=gcc.git (fold_rtx): Correct check for associating shifts and ending up with a shift count too large... (fold_rtx): Correct check for associating shifts and ending up with a shift count too large; convert to the largest valid for ASHIFTRT and don't fold all others. From-SVN: r4585 --- diff --git a/gcc/cse.c b/gcc/cse.c index 3d2702fbbe3..8ae97142760 100644 --- a/gcc/cse.c +++ b/gcc/cse.c @@ -5283,13 +5283,21 @@ fold_rtx (x, insn) break; /* If we are associating shift operations, don't let this - produce a shift of larger than the object. This could - occur when we following a sign-extend by a right shift on - a machine that does a sign-extend as a pair of shifts. */ + produce a shift of the size of the object or larger. + This could occur when we follow a sign-extend by a right + shift on a machine that does a sign-extend as a pair + of shifts. */ if (is_shift && GET_CODE (new_const) == CONST_INT - && INTVAL (new_const) > GET_MODE_BITSIZE (mode)) - break; + && INTVAL (new_const) >= GET_MODE_BITSIZE (mode)) + { + /* As an exception, we can turn an ASHIFTRT of this + form into a shift of the number of bits - 1. */ + if (code == ASHIFTRT) + new_const = GEN_INT (GET_MODE_BITSIZE (mode) - 1); + else + break; + } y = copy_rtx (XEXP (y, 0));