Skip to content

Commit db02d3d

Browse files
committed
[MachineCopyPropagation] Rework how we manage RegMask clobbers
Instead of updating the CopyTracker's maps each time we come across a RegMask, defer checking for this kind of interference until we're actually trying to propagate a copy. This avoids the need to repeatedly iterate over maps in the cases where we don't end up doing any work. This is a slight compile time improvement for MachineCopyPropagation as is, but it also enables a much bigger improvement that I'll follow up with soon. Differential Revision: https://reviews.llvm.org/D52370 llvm-svn: 342940
1 parent 0e5b603 commit db02d3d

File tree

1 file changed

+23
-35
lines changed

1 file changed

+23
-35
lines changed

llvm/lib/CodeGen/MachineCopyPropagation.cpp

Lines changed: 23 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -99,33 +99,6 @@ class CopyTracker {
9999
}
100100
}
101101

102-
/// Remove any entry in the tracker's copy maps that is marked clobbered in \p
103-
/// RegMask. The map will typically have a lot fewer entries than the regmask
104-
/// clobbers, so this is more efficient than iterating the clobbered registers
105-
/// and calling ClobberRegister() on them.
106-
void removeClobberedRegs(const MachineOperand &RegMask,
107-
const TargetRegisterInfo &TRI) {
108-
auto RemoveFromMap = [&RegMask](Reg2MIMap &Map) {
109-
for (Reg2MIMap::iterator I = Map.begin(), E = Map.end(), Next; I != E;
110-
I = Next) {
111-
Next = std::next(I);
112-
if (RegMask.clobbersPhysReg(I->first))
113-
Map.erase(I);
114-
}
115-
};
116-
RemoveFromMap(AvailCopyMap);
117-
RemoveFromMap(CopyMap);
118-
119-
for (SourceMap::iterator I = SrcMap.begin(), E = SrcMap.end(), Next; I != E;
120-
I = Next) {
121-
Next = std::next(I);
122-
if (RegMask.clobbersPhysReg(I->first)) {
123-
markRegsUnavailable(I->second, TRI);
124-
SrcMap.erase(I);
125-
}
126-
}
127-
}
128-
129102
/// Clobber a single register, removing it from the tracker's copy maps.
130103
void clobberRegister(unsigned Reg, const TargetRegisterInfo &TRI) {
131104
for (MCRegAliasIterator AI(Reg, &TRI, true); AI.isValid(); ++AI) {
@@ -163,11 +136,24 @@ class CopyTracker {
163136

164137
bool hasAvailableCopies() { return !AvailCopyMap.empty(); }
165138

166-
MachineInstr *findAvailCopy(unsigned Reg) {
139+
MachineInstr *findAvailCopy(MachineInstr &DestCopy, unsigned Reg) {
167140
auto CI = AvailCopyMap.find(Reg);
168-
if (CI != AvailCopyMap.end())
169-
return CI->second;
170-
return nullptr;
141+
if (CI == AvailCopyMap.end())
142+
return nullptr;
143+
MachineInstr &AvailCopy = *CI->second;
144+
145+
// Check that the available copy isn't clobbered by any regmasks between
146+
// itself and the destination.
147+
unsigned AvailSrc = AvailCopy.getOperand(1).getReg();
148+
unsigned AvailDef = AvailCopy.getOperand(0).getReg();
149+
for (const MachineInstr &MI :
150+
make_range(AvailCopy.getIterator(), DestCopy.getIterator()))
151+
for (const MachineOperand &MO : MI.operands())
152+
if (MO.isRegMask())
153+
if (MO.clobbersPhysReg(AvailSrc) || MO.clobbersPhysReg(AvailDef))
154+
return nullptr;
155+
156+
return &AvailCopy;
171157
}
172158

173159
MachineInstr *findCopy(unsigned Reg) {
@@ -277,7 +263,7 @@ bool MachineCopyPropagation::eraseIfRedundant(MachineInstr &Copy, unsigned Src,
277263
return false;
278264

279265
// Search for an existing copy.
280-
MachineInstr *PrevCopy = Tracker.findAvailCopy(Def);
266+
MachineInstr *PrevCopy = Tracker.findAvailCopy(Copy, Def);
281267
if (!PrevCopy)
282268
return false;
283269

@@ -398,7 +384,7 @@ void MachineCopyPropagation::forwardUses(MachineInstr &MI) {
398384
if (!MOUse.isRenamable())
399385
continue;
400386

401-
MachineInstr *Copy = Tracker.findAvailCopy(MOUse.getReg());
387+
MachineInstr *Copy = Tracker.findAvailCopy(MI, MOUse.getReg());
402388
if (!Copy)
403389
continue;
404390

@@ -586,15 +572,17 @@ void MachineCopyPropagation::CopyPropagateBlock(MachineBasicBlock &MBB) {
586572
LLVM_DEBUG(dbgs() << "MCP: Removing copy due to regmask clobbering: ";
587573
MaybeDead->dump());
588574

575+
// Make sure we invalidate any entries in the copy maps before erasing
576+
// the instruction.
577+
Tracker.clobberRegister(Reg, *TRI);
578+
589579
// erase() will return the next valid iterator pointing to the next
590580
// element after the erased one.
591581
DI = MaybeDeadCopies.erase(DI);
592582
MaybeDead->eraseFromParent();
593583
Changed = true;
594584
++NumDeletes;
595585
}
596-
597-
Tracker.removeClobberedRegs(*RegMask, *TRI);
598586
}
599587

600588
// Any previous copy definition or reading the Defs is no longer available.

0 commit comments

Comments
 (0)