Commit 3cad5f64 by Kaz Kojima

re PR target/66591 ([SH] ICE: in get_reload_reg, at lra-constraints.c:633 with -mlra)

PR target/66591
* config/sh/sh.c (prepare_move_operands): Pre-allocate R0 for subreg
  index term for base and index addressing when LRA is used.

From-SVN: r224701
parent c1a569ef
2015-06-19 Kaz Kojima <kkojima@gcc.gnu.org>
PR target/66591
* config/sh/sh.c (prepare_move_operands): Replace subreg
index term with R0 for base and index addressing.
2015-06-19 Jim Wilson <jim.wilson@linaro.org> 2015-06-19 Jim Wilson <jim.wilson@linaro.org>
* config/aarch64/aarch64.md (mov<mode>:GPF): Don't call force_reg if * config/aarch64/aarch64.md (mov<mode>:GPF): Don't call force_reg if
......
...@@ -1775,10 +1775,14 @@ prepare_move_operands (rtx operands[], machine_mode mode) ...@@ -1775,10 +1775,14 @@ prepare_move_operands (rtx operands[], machine_mode mode)
target/55212. target/55212.
We split possible load/store to two move insns via r0 so as to We split possible load/store to two move insns via r0 so as to
shorten R0 live range. It will make some codes worse but will shorten R0 live range. It will make some codes worse but will
win on avarage for LRA. */ win on average for LRA.
Also when base+index addressing is used and the index term is
a subreg, LRA assumes that more hard registers can be available
in some situation. It isn't the case for SH in the problematic
case. We can pre-allocate R0 for that index term to avoid
the issue. See PR target/66591. */
else if (sh_lra_p () else if (sh_lra_p ()
&& TARGET_SH1 && ! TARGET_SH2A && TARGET_SH1 && ! TARGET_SH2A
&& (mode == QImode || mode == HImode)
&& ((REG_P (operands[0]) && MEM_P (operands[1])) && ((REG_P (operands[0]) && MEM_P (operands[1]))
|| (REG_P (operands[1]) && MEM_P (operands[0])))) || (REG_P (operands[1]) && MEM_P (operands[0]))))
{ {
...@@ -1786,7 +1790,8 @@ prepare_move_operands (rtx operands[], machine_mode mode) ...@@ -1786,7 +1790,8 @@ prepare_move_operands (rtx operands[], machine_mode mode)
rtx reg = operands[load_p ? 0 : 1]; rtx reg = operands[load_p ? 0 : 1];
rtx adr = XEXP (operands[load_p ? 1 : 0], 0); rtx adr = XEXP (operands[load_p ? 1 : 0], 0);
if (REGNO (reg) >= FIRST_PSEUDO_REGISTER if ((mode == QImode || mode == HImode)
&& REGNO (reg) >= FIRST_PSEUDO_REGISTER
&& GET_CODE (adr) == PLUS && GET_CODE (adr) == PLUS
&& REG_P (XEXP (adr, 0)) && REG_P (XEXP (adr, 0))
&& (REGNO (XEXP (adr, 0)) >= FIRST_PSEUDO_REGISTER) && (REGNO (XEXP (adr, 0)) >= FIRST_PSEUDO_REGISTER)
...@@ -1798,6 +1803,17 @@ prepare_move_operands (rtx operands[], machine_mode mode) ...@@ -1798,6 +1803,17 @@ prepare_move_operands (rtx operands[], machine_mode mode)
emit_move_insn (r0_rtx, operands[1]); emit_move_insn (r0_rtx, operands[1]);
operands[1] = r0_rtx; operands[1] = r0_rtx;
} }
if (REGNO (reg) >= FIRST_PSEUDO_REGISTER
&& GET_CODE (adr) == PLUS
&& REG_P (XEXP (adr, 0))
&& (REGNO (XEXP (adr, 0)) >= FIRST_PSEUDO_REGISTER)
&& SUBREG_P (XEXP (adr, 1))
&& REG_P (SUBREG_REG (XEXP (adr, 1))))
{
rtx r0_rtx = gen_rtx_REG (GET_MODE (XEXP (adr, 1)), R0_REG);
emit_move_insn (r0_rtx, XEXP (adr, 1));
XEXP (adr, 1) = r0_rtx;
}
} }
} }
......
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