[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
Thu May 14 04:38:44 PDT 2026
================
@@ -158,27 +159,62 @@ void Rematerializer::transferUserImpl(RegisterIdx FromRegIdx,
assert(FromRegIdx != ToRegIdx && "identical registers");
assert(getOriginOrSelf(FromRegIdx) == getOriginOrSelf(ToRegIdx) &&
"unrelated registers");
+ assert(any_of(getReg(FromRegIdx).Uses,
+ [&](const auto RegionUsers) {
+ return RegionUsers.second.contains(&UserMI);
+ }) &&
+ "not a user");
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(),
+ ToReg = getReg(ToRegIdx).getDefReg();
+ UserMI.substituteRegister(FromReg, ToReg, 0, TRI);
LISUpdates.insert(FromRegIdx);
LISUpdates.insert(ToRegIdx);
- // 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();
----------------
arsenm wrote:
is_contained
https://github.com/llvm/llvm-project/pull/197580
More information about the llvm-branch-commits
mailing list