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.

Reply via email to