Commit 4908e508 by Richard Stallman

(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
parent 4d01c30f
......@@ -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));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment