recog.c (validate_replace_rtx_1): Consider subregs when replacing a register with a constant inside a...

* recog.c (validate_replace_rtx_1): Consider subregs when
        replacing a register with a constant inside a sign/zero_extend.

From-SVN: r37352
This commit is contained in:
Richard Henderson 2000-11-09 16:07:52 -08:00 committed by Richard Henderson
parent 662f340b81
commit c0e3f87d49
2 changed files with 24 additions and 6 deletions

View File

@ -1,5 +1,8 @@
2000-11-09 Richard Henderson <rth@redhat.com>
* recog.c (validate_replace_rtx_1): Consider subregs when
replacing a register with a constant inside a sign/zero_extend.
* config/alpha/linux.h (HANDLE_PRAGMA_PACK_PUSH_POP): Define.
2000-11-09 Geoffrey Keating <geoffk@redhat.com>

View File

@ -480,14 +480,29 @@ validate_replace_rtx_1 (loc, from, to, object)
/* In these cases, the operation to be performed depends on the mode
of the operand. If we are replacing the operand with a VOIDmode
constant, we lose the information. So try to simplify the operation
in that case. If it fails, substitute in something that we know
won't be recognized. */
in that case. */
if (GET_MODE (to) == VOIDmode
&& rtx_equal_p (XEXP (x, 0), from))
&& (rtx_equal_p (XEXP (x, 0), from)
|| (GET_CODE (XEXP (x, 0)) == SUBREG
&& rtx_equal_p (SUBREG_REG (XEXP (x, 0)), from))))
{
rtx new = simplify_unary_operation (code, GET_MODE (x), to,
GET_MODE (from));
if (new == 0)
rtx new = NULL_RTX;
/* If there is a subreg involved, crop to the portion of the
constant that we are interested in. */
if (GET_CODE (XEXP (x, 0)) == SUBREG)
to = operand_subword (to, SUBREG_WORD (XEXP (x, 0)),
0, GET_MODE (from));
/* If the above didn't fail, perform the extension from the
mode of the operand (and not the mode of FROM). */
if (to)
new = simplify_unary_operation (code, GET_MODE (x), to,
GET_MODE (XEXP (x, 0)));
/* If any of the above failed, substitute in something that
we know won't be recognized. */
if (!new)
new = gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
validate_change (object, loc, new, 1);