Commit 51f0c3b7 by Jim Wilson

(emit_reload_insns): Call reload_reg_reaches_end_p for every reg of multi-reg spill register.

(emit_reload_insns): Call reload_reg_reaches_end_p for
every reg of multi-reg spill register.  Invalidate old info for multi
reg spill registers when only part survives to the end.

From-SVN: r11801
parent 9cca6a99
......@@ -6588,20 +6588,33 @@ emit_reload_insns (insn)
/* I is nonneg if this reload used one of the spill regs.
If reload_reg_rtx[r] is 0, this is an optional reload
that we opted to ignore.
that we opted to ignore. */
Also ignore reloads that don't reach the end of the insn,
since we will eventually see the one that does. */
if (i >= 0 && reload_reg_rtx[r] != 0)
{
int nr
= HARD_REGNO_NREGS (spill_regs[i], GET_MODE (reload_reg_rtx[r]));
int k;
int part_reaches_end = 0;
int all_reaches_end = 1;
if (i >= 0 && reload_reg_rtx[r] != 0
&& reload_reg_reaches_end_p (spill_regs[i], reload_opnum[r],
/* For a multi register reload, we need to check if all or part
of the value lives to the end. */
for (k = 0; k < nr; k++)
{
if (reload_reg_reaches_end_p (spill_regs[i] + k, reload_opnum[r],
reload_when_needed[r]))
part_reaches_end = 1;
else
all_reaches_end = 0;
}
/* Ignore reloads that don't reach the end of the insn in
entirety. */
if (all_reaches_end)
{
/* First, clear out memory of what used to be in this spill reg.
If consecutive registers are used, clear them all. */
int nr
= HARD_REGNO_NREGS (spill_regs[i], GET_MODE (reload_reg_rtx[r]));
int k;
for (k = 0; k < nr; k++)
{
......@@ -6629,7 +6642,8 @@ emit_reload_insns (insn)
if (nregno < FIRST_PSEUDO_REGISTER)
for (k = 1; k < nnr; k++)
reg_last_reload_reg[nregno + k]
= (nr == nnr ? gen_rtx (REG,
= (nr == nnr
? gen_rtx (REG,
reg_raw_mode[REGNO (reload_reg_rtx[r]) + k],
REGNO (reload_reg_rtx[r]) + k)
: 0);
......@@ -6638,7 +6652,8 @@ emit_reload_insns (insn)
for (k = 0; k < nr; k++)
{
reg_reloaded_contents[spill_reg_order[spill_regs[i] + k]]
= (nregno >= FIRST_PSEUDO_REGISTER || nr != nnr ? nregno
= (nregno >= FIRST_PSEUDO_REGISTER || nr != nnr
? nregno
: nregno + k);
reg_reloaded_insn[spill_reg_order[spill_regs[i] + k]] = insn;
}
......@@ -6671,7 +6686,8 @@ emit_reload_insns (insn)
if (nregno < FIRST_PSEUDO_REGISTER)
for (k = 1; k < nnr; k++)
reg_last_reload_reg[nregno + k]
= (nr == nnr ? gen_rtx (REG,
= (nr == nnr
? gen_rtx (REG,
reg_raw_mode[REGNO (reload_reg_rtx[r]) + k],
REGNO (reload_reg_rtx[r]) + k)
: 0);
......@@ -6684,7 +6700,8 @@ emit_reload_insns (insn)
for (k = 0; k < nr; k++)
{
reg_reloaded_contents[spill_reg_order[spill_regs[i] + k]]
= (nregno >= FIRST_PSEUDO_REGISTER || nr != nnr ? nregno
= (nregno >= FIRST_PSEUDO_REGISTER || nr != nnr
? nregno
: nregno + k);
reg_reloaded_insn[spill_reg_order[spill_regs[i] + k]]
= insn;
......@@ -6692,6 +6709,21 @@ emit_reload_insns (insn)
}
}
/* However, if part of the reload reaches the end, then we must
invalidate the old info for the part that survives to the end. */
else if (part_reaches_end)
{
for (k = 0; k < nr; k++)
if (reload_reg_reaches_end_p (spill_regs[i] + k,
reload_opnum[r],
reload_when_needed[r]))
{
reg_reloaded_contents[spill_reg_order[spill_regs[i] + k]] = -1;
reg_reloaded_insn[spill_reg_order[spill_regs[i] + k]] = 0;
}
}
}
/* The following if-statement was #if 0'd in 1.34 (or before...).
It's reenabled in 1.35 because supposedly nothing else
deals with this problem. */
......
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