reload.c (reload_inner_reg_of_subreg): Return 1 for PLUS.
* reload.c (reload_inner_reg_of_subreg): Return 1 for PLUS. (push_reload): Handle non-REG in reload_inner_reg_of_subreg case. From-SVN: r42843
This commit is contained in:
parent
b91455de3d
commit
35fb60c476
|
@ -1,3 +1,8 @@
|
||||||
|
Sun Jun 3 21:59:51 2001 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
|
||||||
|
|
||||||
|
* reload.c (reload_inner_reg_of_subreg): Return 1 for PLUS.
|
||||||
|
(push_reload): Handle non-REG in reload_inner_reg_of_subreg case.
|
||||||
|
|
||||||
2001-06-03 kaz Kojima <kkojima@rr.iij4u.or.jp>
|
2001-06-03 kaz Kojima <kkojima@rr.iij4u.or.jp>
|
||||||
|
|
||||||
* gcc/config/sh/sh.c (print_operand_address, print_operand): Call
|
* gcc/config/sh/sh.c (print_operand_address, print_operand): Call
|
||||||
|
|
24
gcc/reload.c
24
gcc/reload.c
|
@ -690,6 +690,7 @@ find_valid_class (m1, n)
|
||||||
combine. P_IN points to the corresponding value of IN, which can be
|
combine. P_IN points to the corresponding value of IN, which can be
|
||||||
modified by this function.
|
modified by this function.
|
||||||
DONT_SHARE is nonzero if we can't share any input-only reload for IN. */
|
DONT_SHARE is nonzero if we can't share any input-only reload for IN. */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
find_reusable_reload (p_in, out, class, type, opnum, dont_share)
|
find_reusable_reload (p_in, out, class, type, opnum, dont_share)
|
||||||
rtx *p_in, out;
|
rtx *p_in, out;
|
||||||
|
@ -780,8 +781,8 @@ reload_inner_reg_of_subreg (x, mode)
|
||||||
|
|
||||||
inner = SUBREG_REG (x);
|
inner = SUBREG_REG (x);
|
||||||
|
|
||||||
/* If INNER is a constant, then INNER must be reloaded. */
|
/* If INNER is a constant or PLUS, then INNER must be reloaded. */
|
||||||
if (CONSTANT_P (inner))
|
if (CONSTANT_P (inner) || GET_CODE (inner) == PLUS)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
/* If INNER is not a hard register, then INNER will not need to
|
/* If INNER is not a hard register, then INNER will not need to
|
||||||
|
@ -1030,18 +1031,23 @@ push_reload (in, out, inloc, outloc, class,
|
||||||
|
|
||||||
if (in != 0 && reload_inner_reg_of_subreg (in, inmode))
|
if (in != 0 && reload_inner_reg_of_subreg (in, inmode))
|
||||||
{
|
{
|
||||||
|
enum reg_class in_class = class;
|
||||||
|
|
||||||
|
if (GET_CODE (SUBREG_REG (in)) == REG)
|
||||||
|
in_class
|
||||||
|
= find_valid_class (inmode,
|
||||||
|
subreg_regno_offset (REGNO (SUBREG_REG (in)),
|
||||||
|
GET_MODE (SUBREG_REG (in)),
|
||||||
|
SUBREG_BYTE (in),
|
||||||
|
GET_MODE (in)));
|
||||||
|
|
||||||
/* This relies on the fact that emit_reload_insns outputs the
|
/* This relies on the fact that emit_reload_insns outputs the
|
||||||
instructions for input reloads of type RELOAD_OTHER in the same
|
instructions for input reloads of type RELOAD_OTHER in the same
|
||||||
order as the reloads. Thus if the outer reload is also of type
|
order as the reloads. Thus if the outer reload is also of type
|
||||||
RELOAD_OTHER, we are guaranteed that this inner reload will be
|
RELOAD_OTHER, we are guaranteed that this inner reload will be
|
||||||
output before the outer reload. */
|
output before the outer reload. */
|
||||||
push_reload (SUBREG_REG (in), NULL_RTX, &SUBREG_REG (in), (rtx*)0,
|
push_reload (SUBREG_REG (in), NULL_RTX, &SUBREG_REG (in), NULL_RTX,
|
||||||
find_valid_class (inmode,
|
in_class, VOIDmode, VOIDmode, 0, 0, opnum, type);
|
||||||
subreg_regno_offset (REGNO (SUBREG_REG (in)),
|
|
||||||
GET_MODE (SUBREG_REG (in)),
|
|
||||||
SUBREG_BYTE (in),
|
|
||||||
GET_MODE (in))),
|
|
||||||
VOIDmode, VOIDmode, 0, 0, opnum, type);
|
|
||||||
dont_remove_subreg = 1;
|
dont_remove_subreg = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue