reload.c (find_reloads_toplev): Reload a paradoxical subreg of a mem if the address is a mode_dependent_address_p.

* reload.c (find_reloads_toplev): Reload a paradoxical subreg of a
        mem if the address is a mode_dependent_address_p.

From-SVN: r35280
This commit is contained in:
Hans-Peter Nilsson 2000-07-27 01:45:41 +00:00 committed by Jeff Law
parent fc5f1cca41
commit ecbe6c619d
2 changed files with 25 additions and 1 deletions

View File

@ -1,3 +1,8 @@
Wed Jul 26 19:44:05 2000 Hans-Peter Nilsson <hp@axis.com>
* reload.c (find_reloads_toplev): Reload a paradoxical subreg of a
mem if the address is a mode_dependent_address_p.
2000-07-26 Kazu Hirata <kazu@hxi.com>
* h8300.c (print_operand): Print ":8" when the 'R' operand is

View File

@ -4335,6 +4335,25 @@ find_reloads_toplev (x, opnum, type, ind_levels, is_set_dest, insn,
x = find_reloads_subreg_address (x, 1, opnum, type, ind_levels,
insn);
}
else if (code == SUBREG && GET_CODE (SUBREG_REG (x)) == MEM
&& (GET_MODE_SIZE (GET_MODE (x))
> GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))
&& mode_dependent_address_p (XEXP (SUBREG_REG (x), 0)))
{
/* A paradoxical subreg will simply have the mode of the access
changed, so we need to reload such a memory operand to stabilize
the meaning of the memory access. */
enum machine_mode subreg_mode = GET_MODE (SUBREG_REG (x));
if (is_set_dest)
push_reload (NULL_RTX, SUBREG_REG (x), NULL_PTR, &SUBREG_REG (x),
find_valid_class (subreg_mode, SUBREG_WORD (x)),
VOIDmode, subreg_mode, 0, 0, opnum, type);
else
push_reload (SUBREG_REG (x), NULL_RTX, &SUBREG_REG (x), NULL_PTR,
find_valid_class (subreg_mode, SUBREG_WORD (x)),
subreg_mode, VOIDmode, 0, 0, opnum, type);
}
for (copied = 0, i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
{
@ -5530,7 +5549,7 @@ find_reloads_subreg_address (x, force_replace, opnum, type,
/* Substitute into the current INSN the registers into which we have reloaded
the things that need reloading. The array `replacements'
says contains the locations of all pointers that must be changed
contains the locations of all pointers that must be changed
and says what to replace them with.
Return the rtx that X translates into; usually X, but modified. */