[llvm-branch-commits] [llvm] [CodeGen] Add initial multi-def rematerialization support (PR #197580)
Matt Arsenault via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Wed Jun 10 03:54:08 PDT 2026
================
@@ -174,21 +176,50 @@ void Rematerializer::transferUserImpl(RegisterIdx FromRegIdx,
LLVM_DEBUG(dbgs() << "User transfer from " << printID(FromRegIdx) << " to "
<< printID(ToRegIdx) << ": " << printUser(&UserMI) << '\n');
- UserMI.substituteRegister(getReg(FromRegIdx).getDefReg(),
- getReg(ToRegIdx).getDefReg(), 0, TRI);
+ Register FromReg = getReg(FromRegIdx).getDefReg();
+ UserMI.substituteRegister(FromReg, getReg(ToRegIdx).getDefReg(), 0, TRI);
- // If the user is rematerializable, we must change its dependency to the
- // new register.
- if (RegisterIdx UserRegIdx = getDefRegIdx(UserMI); UserRegIdx != NoReg) {
- // Look for the user's dependency that matches the register.
- for (RegisterIdx &DepRegIdx : Regs[UserRegIdx].Dependencies) {
- if (DepRegIdx == FromRegIdx) {
- DepRegIdx = ToRegIdx;
+ RegisterIdx UserRegIdx = getDefRegIdx(UserMI);
+ if (UserRegIdx == NoReg)
+ return;
+
+ // When the user is rematerializable, we must reflect the change in its
+ // dependencies.
+ Reg &UserReg = Regs[UserRegIdx];
+ SmallVectorImpl<RegisterIdx> &UserDeps = Regs[UserRegIdx].Dependencies;
+ bool IsNewDep = true;
+ if (UserReg.Defs.size() > 1) {
+ // Other defining MIs might already be using the new register.
+ IsNewDep = find(UserDeps, ToRegIdx) == UserDeps.end();
+
+ auto MOIsFromReg = [FromReg](MachineOperand &MO) {
----------------
arsenm wrote:
Just inline this
https://github.com/llvm/llvm-project/pull/197580
More information about the llvm-branch-commits
mailing list