Commit 312def2e by Richard Kenner

(num_sign_bit_copies): Properly handle case when MODE is narrower than that of X.

(num_sign_bit_copies): Properly handle case when MODE is narrower than that
of X.
(simplify_shift_const): Remove change of July 26.

From-SVN: r5110
parent 00aae7b1
...@@ -6687,6 +6687,11 @@ num_sign_bit_copies (x, mode) ...@@ -6687,6 +6687,11 @@ num_sign_bit_copies (x, mode)
bitwidth = GET_MODE_BITSIZE (mode); bitwidth = GET_MODE_BITSIZE (mode);
/* For a smaller object, just ignore the high bits. */
if (bitwidth < GET_MODE_BITSIZE (GET_MODE (x)))
return MAX (1, (num_sign_bit_copies (x, GET_MODE (x))
- (GET_MODE_BITSIZE (GET_MODE (x)) - bitwidth)));
switch (code) switch (code)
{ {
case REG: case REG:
...@@ -7181,31 +7186,25 @@ simplify_shift_const (x, code, result_mode, varop, count) ...@@ -7181,31 +7186,25 @@ simplify_shift_const (x, code, result_mode, varop, count)
else if (count < 0) else if (count < 0)
abort (); abort ();
/* If we have replaced VAROP with something wider /* An arithmetic right shift of a quantity known to be -1 or 0
(such as, the SUBREG_REG), then this won't work; is a no-op. */
num_sign_bit_copies will give the wrong answer in that case. */ if (code == ASHIFTRT
if (shift_mode == GET_MODE (varop)) && (num_sign_bit_copies (varop, shift_mode)
== GET_MODE_BITSIZE (shift_mode)))
{ {
/* An arithmetic right shift of a quantity known to be -1 or 0 count = 0;
is a no-op. */ break;
if (code == ASHIFTRT }
&& (num_sign_bit_copies (varop, shift_mode)
== GET_MODE_BITSIZE (shift_mode)))
{
count = 0;
break;
}
/* If we are doing an arithmetic right shift and discarding all but /* If we are doing an arithmetic right shift and discarding all but
the sign bit copies, this is equivalent to doing a shift by the the sign bit copies, this is equivalent to doing a shift by the
bitsize minus one. Convert it into that shift because it will often bitsize minus one. Convert it into that shift because it will often
allow other simplifications. */ allow other simplifications. */
if (code == ASHIFTRT if (code == ASHIFTRT
&& (count + num_sign_bit_copies (varop, shift_mode) && (count + num_sign_bit_copies (varop, shift_mode)
>= GET_MODE_BITSIZE (shift_mode))) >= GET_MODE_BITSIZE (shift_mode)))
count = GET_MODE_BITSIZE (shift_mode) - 1; count = GET_MODE_BITSIZE (shift_mode) - 1;
}
/* We simplify the tests below and elsewhere by converting /* We simplify the tests below and elsewhere by converting
ASHIFTRT to LSHIFTRT if we know the sign bit is clear. ASHIFTRT to LSHIFTRT if we know the sign bit is clear.
......
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