PATTERN (q))))
{
/* We assume that a register is used exactly once per
- insn in the updates below. If this is not correct,
- no great harm is done. */
+ insn in the REG_N_REFS updates below. If this is not
+ correct, no great harm is done.
+
+
+ We do not undo this substitution if something later
+ fails. Therefore, we must update the other REG_N_*
+ counters now to keep them accurate. */
if (sregno >= FIRST_PSEUDO_REGISTER)
- REG_N_REFS (sregno) -= loop_depth;
+ {
+ REG_N_REFS (sregno) -= loop_depth;
+
+ if (REG_LIVE_LENGTH (sregno) >= 0)
+ {
+ REG_LIVE_LENGTH (sregno) -= length;
+ /* REG_LIVE_LENGTH is only an approximation after
+ combine if sched is not run, so make sure that
+ we still have a reasonable value. */
+ if (REG_LIVE_LENGTH (sregno) < 2)
+ REG_LIVE_LENGTH (sregno) = 2;
+ }
+
+ REG_N_CALLS_CROSSED (sregno) -= n_calls;
+ }
+
if (dregno >= FIRST_PSEUDO_REGISTER)
- REG_N_REFS (dregno) += loop_depth;
+ {
+ REG_N_REFS (dregno) += loop_depth;
+
+ if (REG_LIVE_LENGTH (dregno) >= 0)
+ REG_LIVE_LENGTH (dregno) += d_length;
+
+ REG_N_CALLS_CROSSED (dregno) += d_n_calls;
+ }
+
+ /* We've done a substitution, clear the counters. */
+ length = 0;
+ d_length = 0;
+ n_calls = 0;
+ d_n_calls = 0;
}
else
{