re PR target/62254 (gcc-4.9 ICEs on linux kernel zlib for armv3)

PR target/62254
	* config/arm/arm.c (arm_reload_out_hi): Add code to handle the
	case where we are already provided with an SImode SUBREG.

From-SVN: r234568
This commit is contained in:
Nick Clifton 2016-03-30 12:48:42 +00:00 committed by Nick Clifton
parent 41ec61d3ef
commit 1f73ef6c45
2 changed files with 23 additions and 4 deletions

View File

@ -1,3 +1,9 @@
2016-03-30 Nick Clifton <nickc@redhat.com>
PR target/62254
* config/arm/arm.c (arm_reload_out_hi): Add code to handle the
case where we are already provided with an SImode SUBREG.
2016-03-30 Michael Matz <matz@suse.de> 2016-03-30 Michael Matz <matz@suse.de>
Richard Biener <rguenther@suse.de> Richard Biener <rguenther@suse.de>

View File

@ -15596,14 +15596,27 @@ arm_reload_out_hi (rtx *operands)
/* The slot is out of range, or was dressed up in a SUBREG. */ /* The slot is out of range, or was dressed up in a SUBREG. */
base = reg_equiv_address (REGNO (ref)); base = reg_equiv_address (REGNO (ref));
/* PR 62554: If there is no equivalent memory location then just move /* PR 62254: If there is no equivalent memory location then just move
the value as an SImode register move. This happens when the target the value as an SImode register move. This happens when the target
architecture variant does not have an HImode register move. */ architecture variant does not have an HImode register move. */
if (base == NULL) if (base == NULL)
{ {
gcc_assert (REG_P (outval)); gcc_assert (REG_P (outval) || SUBREG_P (outval));
emit_insn (gen_movsi (gen_rtx_SUBREG (SImode, ref, 0),
gen_rtx_SUBREG (SImode, outval, 0))); if (REG_P (outval))
{
emit_insn (gen_movsi (gen_rtx_SUBREG (SImode, ref, 0),
gen_rtx_SUBREG (SImode, outval, 0)));
}
else /* SUBREG_P (outval) */
{
if (GET_MODE (SUBREG_REG (outval)) == SImode)
emit_insn (gen_movsi (gen_rtx_SUBREG (SImode, ref, 0),
SUBREG_REG (outval)));
else
/* FIXME: Handle other cases ? */
gcc_unreachable ();
}
return; return;
} }
} }