https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107704
--- Comment #9 from Richard Sandiford <rsandifo at gcc dot gnu.org> --- That's because clobbers of hard-coded registers have usually been treated as kind-of an earlyclobbers: ------------------------------------- When a @code{clobber} expression for a register appears inside a @code{parallel} with other side effects, the register allocator guarantees that the register is unoccupied both before and after that insn if it is a hard register clobber. ------------------------------------- This is also modelled by the ira-live.cc code: /* Mark early clobber hard registers of the current INSN as live (if LIVE_P) or dead. Return true if there are such registers. */ static bool mark_hard_reg_early_clobbers (rtx_insn *insn, bool live_p) { df_ref def; bool set_p = false; FOR_EACH_INSN_DEF (def, insn) if (DF_REF_FLAGS_IS_SET (def, DF_REF_MUST_CLOBBER)) { rtx dreg = DF_REF_REG (def); if (GET_CODE (dreg) == SUBREG) dreg = SUBREG_REG (dreg); if (! REG_P (dreg) || REGNO (dreg) >= FIRST_PSEUDO_REGISTER) continue; /* Hard register clobbers are believed to be early clobber because there is no way to say that non-operand hard register clobbers are not early ones. */ if (live_p) mark_ref_live (def); else mark_ref_dead (def); set_p = true; } return set_p; } I think the .md pattern either has to treat both appearances of the T register as operands or hard-code both of them.