Skip to content

Commit c39311e

Browse files
committed
[RegisterCoalescer] Use LiveRangeEdit to handle rematerialization
This patch uses the API provided by LiveRangeEdit to handle rematerialization. It will make future maintenance and improvement more easier. No functional change. Differential Revision: https://reviews.llvm.org/D133610
1 parent 0f19c60 commit c39311e

File tree

3 files changed

+26
-24
lines changed

3 files changed

+26
-24
lines changed

llvm/include/llvm/CodeGen/LiveRangeEdit.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -210,12 +210,14 @@ class LiveRangeEdit : private MachineRegisterInfo::Delegate {
210210

211211
/// rematerializeAt - Rematerialize RM.ParentVNI into DestReg by inserting an
212212
/// instruction into MBB before MI. The new instruction is mapped, but
213-
/// liveness is not updated.
213+
/// liveness is not updated. If ReplaceIndexMI is not null it will be replaced
214+
/// by new MI in the index map.
214215
/// Return the SlotIndex of the new instruction.
215216
SlotIndex rematerializeAt(MachineBasicBlock &MBB,
216217
MachineBasicBlock::iterator MI, unsigned DestReg,
217218
const Remat &RM, const TargetRegisterInfo &,
218-
bool Late = false);
219+
bool Late = false, unsigned SubIdx = 0,
220+
MachineInstr *ReplaceIndexMI = nullptr);
219221

220222
/// markRematerialized - explicitly mark a value as rematerialized after doing
221223
/// it manually.

llvm/lib/CodeGen/LiveRangeEdit.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -183,14 +183,18 @@ SlotIndex LiveRangeEdit::rematerializeAt(MachineBasicBlock &MBB,
183183
unsigned DestReg,
184184
const Remat &RM,
185185
const TargetRegisterInfo &tri,
186-
bool Late) {
186+
bool Late,
187+
unsigned SubIdx,
188+
MachineInstr *ReplaceIndexMI) {
187189
assert(RM.OrigMI && "Invalid remat");
188-
TII.reMaterialize(MBB, MI, DestReg, 0, *RM.OrigMI, tri);
190+
TII.reMaterialize(MBB, MI, DestReg, SubIdx, *RM.OrigMI, tri);
189191
// DestReg of the cloned instruction cannot be Dead. Set isDead of DestReg
190192
// to false anyway in case the isDead flag of RM.OrigMI's dest register
191193
// is true.
192194
(*--MI).getOperand(0).setIsDead(false);
193195
Rematted.insert(RM.ParentVNI);
196+
if (ReplaceIndexMI)
197+
return LIS.ReplaceMachineInstrInMaps(*ReplaceIndexMI, *MI).getRegSlot();
194198
return LIS.getSlotIndexes()->insertMachineInstrInMaps(*MI, Late).getRegSlot();
195199
}
196200

llvm/lib/CodeGen/RegisterCoalescer.cpp

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -199,12 +199,7 @@ namespace {
199199
DenseMap<Register, unsigned long> LargeLIVisitCounter;
200200

201201
/// Recursively eliminate dead defs in DeadDefs.
202-
void eliminateDeadDefs();
203-
204-
/// allUsesAvailableAt - Return true if all registers used by OrigMI at
205-
/// OrigIdx are also available with the same value at UseIdx.
206-
bool allUsesAvailableAt(const MachineInstr *OrigMI, SlotIndex OrigIdx,
207-
SlotIndex UseIdx);
202+
void eliminateDeadDefs(LiveRangeEdit *Edit = nullptr);
208203

209204
/// LiveRangeEdit callback for eliminateDeadDefs().
210205
void LRE_WillEraseInstruction(MachineInstr *MI) override;
@@ -603,20 +598,16 @@ void RegisterCoalescer::getAnalysisUsage(AnalysisUsage &AU) const {
603598
MachineFunctionPass::getAnalysisUsage(AU);
604599
}
605600

606-
void RegisterCoalescer::eliminateDeadDefs() {
601+
void RegisterCoalescer::eliminateDeadDefs(LiveRangeEdit *Edit) {
602+
if (Edit) {
603+
Edit->eliminateDeadDefs(DeadDefs);
604+
return;
605+
}
607606
SmallVector<Register, 8> NewRegs;
608607
LiveRangeEdit(nullptr, NewRegs, *MF, *LIS,
609608
nullptr, this).eliminateDeadDefs(DeadDefs);
610609
}
611610

612-
bool RegisterCoalescer::allUsesAvailableAt(const MachineInstr *OrigMI,
613-
SlotIndex OrigIdx,
614-
SlotIndex UseIdx) {
615-
SmallVector<Register, 8> NewRegs;
616-
return LiveRangeEdit(nullptr, NewRegs, *MF, *LIS, nullptr, this)
617-
.allUsesAvailableAt(OrigMI, OrigIdx, UseIdx);
618-
}
619-
620611
void RegisterCoalescer::LRE_WillEraseInstruction(MachineInstr *MI) {
621612
// MI may be in WorkList. Make sure we don't visit it.
622613
ErasedInstrs.insert(MI);
@@ -1306,8 +1297,12 @@ bool RegisterCoalescer::reMaterializeTrivialDef(const CoalescerPair &CP,
13061297
}
13071298
if (!TII->isAsCheapAsAMove(*DefMI))
13081299
return false;
1309-
if (!TII->isTriviallyReMaterializable(*DefMI))
1300+
1301+
SmallVector<Register, 8> NewRegs;
1302+
LiveRangeEdit Edit(&SrcInt, NewRegs, *MF, *LIS, nullptr, this);
1303+
if (!Edit.checkRematerializable(ValNo, DefMI))
13101304
return false;
1305+
13111306
if (!definesFullReg(*DefMI, SrcReg))
13121307
return false;
13131308
bool SawStore = false;
@@ -1352,14 +1347,16 @@ bool RegisterCoalescer::reMaterializeTrivialDef(const CoalescerPair &CP,
13521347
}
13531348
}
13541349

1355-
if (!allUsesAvailableAt(DefMI, ValNo->def, CopyIdx))
1350+
LiveRangeEdit::Remat RM(ValNo);
1351+
RM.OrigMI = DefMI;
1352+
if (!Edit.canRematerializeAt(RM, ValNo, CopyIdx, true))
13561353
return false;
13571354

13581355
DebugLoc DL = CopyMI->getDebugLoc();
13591356
MachineBasicBlock *MBB = CopyMI->getParent();
13601357
MachineBasicBlock::iterator MII =
13611358
std::next(MachineBasicBlock::iterator(CopyMI));
1362-
TII->reMaterialize(*MBB, MII, DstReg, SrcIdx, *DefMI, *TRI);
1359+
Edit.rematerializeAt(*MBB, MII, DstReg, RM, *TRI, false, SrcIdx, CopyMI);
13631360
MachineInstr &NewMI = *std::prev(MII);
13641361
NewMI.setDebugLoc(DL);
13651362

@@ -1403,7 +1400,6 @@ bool RegisterCoalescer::reMaterializeTrivialDef(const CoalescerPair &CP,
14031400
}
14041401
}
14051402

1406-
LIS->ReplaceMachineInstrInMaps(*CopyMI, NewMI);
14071403
CopyMI->eraseFromParent();
14081404
ErasedInstrs.insert(CopyMI);
14091405

@@ -1597,7 +1593,7 @@ bool RegisterCoalescer::reMaterializeTrivialDef(const CoalescerPair &CP,
15971593
// The source interval can become smaller because we removed a use.
15981594
shrinkToUses(&SrcInt, &DeadDefs);
15991595
if (!DeadDefs.empty())
1600-
eliminateDeadDefs();
1596+
eliminateDeadDefs(&Edit);
16011597
} else {
16021598
ToBeUpdated.insert(SrcReg);
16031599
}

0 commit comments

Comments
 (0)