Commit 35fb60c4 by Richard Kenner Committed by Richard Kenner

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
parent b91455de
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
......
...@@ -690,6 +690,7 @@ find_valid_class (m1, n) ...@@ -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) ...@@ -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, ...@@ -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;
} }
......
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