> You mean this piece of nice code: > > /* Step 4: Close chains for registers that die here, unless > the register is mentioned in a REG_UNUSED note. In that > case we keep the chain open until step #7 below to ensure > it conflicts with other output operands of this insn. > See PR 52573. Arguably the insn should not have both > notes; it has proven difficult to fix that without > other undesirable side effects. */ > for (note = REG_NOTES (insn); note; note = XEXP (note, 1)) > if (REG_NOTE_KIND (note) == REG_DEAD > && !find_regno_note (insn, REG_UNUSED, REGNO (XEXP (note, > 0)))) { > remove_from_hard_reg_set (&live_hard_regs, > GET_MODE (XEXP (note, 0)), > REGNO (XEXP (note, 0))); > scan_rtx (insn, &XEXP (note, 0), NO_REGS, terminate_dead, > OP_IN); > } > > ?
That one is fairly recent, but I was rather referring to: /* Process the insn, determining its effect on the def-use chains and live hard registers. We perform the following steps with the register references in the insn, simulating its effect: (1) Deal with earlyclobber operands and CLOBBERs of non-operands by creating chains and marking hard regs live. [...] (7) For any REG_UNUSED, close any chains we just opened. (7) does actually more than advertised above: /* Step 7: Close chains for registers that were never really used here. */ for (note = REG_NOTES (insn); note; note = XEXP (note, 1)) if (REG_NOTE_KIND (note) == REG_UNUSED) { remove_from_hard_reg_set (&live_hard_regs, GET_MODE (XEXP (note, 0)), REGNO (XEXP (note, 0))); So (7) also closes the live ranges of hard regs opened in (1). -- Eric Botcazou