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.