Commit 92d54592 by Richard Sandiford Committed by Richard Sandiford

reload1.c (emit_reload_insns): Pass the reload register for a non-spill output…

reload1.c (emit_reload_insns): Pass the reload register for a non-spill output reload through forget_old_reloads_1.

gcc/
	* reload1.c (emit_reload_insns): Pass the reload register
	for a non-spill output reload through forget_old_reloads_1.

From-SVN: r121105
parent 7122aa3b
2007-01-24 Richard Sandiford <richard@codesourcery.com>
* reload1.c (emit_reload_insns): Pass the reload register
for a non-spill output reload through forget_old_reloads_1.
2007-01-23 Joseph Myers <joseph@codesourcery.com>
* config/rs6000/rs6000-c.c (rs6000_cpu_cpp_builtins): Define
......
......@@ -7561,6 +7561,23 @@ emit_reload_insns (struct insn_chain *chain)
rtx out = ((rld[r].out && REG_P (rld[r].out))
? rld[r].out : rld[r].out_reg);
int nregno = REGNO (out);
/* REG_RTX is now set or clobbered by the main instruction.
As the comment above explains, forget_old_reloads_1 only
sees the original instruction, and there is no guarantee
that the original instruction also clobbered REG_RTX.
For example, if find_reloads sees that the input side of
a matched operand pair dies in this instruction, it may
use the input register as the reload register.
Calling forget_old_reloads_1 is a waste of effort if
REG_RTX is also the output register.
If we know that REG_RTX holds the value of a pseudo
register, the code after the call will record that fact. */
if (rld[r].reg_rtx && rld[r].reg_rtx != out)
forget_old_reloads_1 (rld[r].reg_rtx, NULL_RTX, NULL);
if (nregno >= FIRST_PSEUDO_REGISTER)
{
rtx src_reg, store_insn = NULL_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