[PATCH] D55287: VirtRegMap: Support partially allocated virtual registers
Matt Arsenault via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Dec 4 10:10:30 PST 2018
arsenm created this revision.
arsenm added a reviewer: MatzeB.
Herald added a subscriber: wdng.
Don't assert if there are unassigned virtual registers.
Maintain LiveIntervals by removing the RegUnits for allocated
registers, since they should not longer be necessary.
One part I find somewhat questionable is the special
handling necessary for handleIdentityCopy. The LiveIntervals
for the relevant regunits needs to be removed.
https://reviews.llvm.org/D55287
Files:
lib/CodeGen/VirtRegMap.cpp
Index: lib/CodeGen/VirtRegMap.cpp
===================================================================
--- lib/CodeGen/VirtRegMap.cpp
+++ lib/CodeGen/VirtRegMap.cpp
@@ -182,13 +182,14 @@
SlotIndexes *Indexes;
LiveIntervals *LIS;
VirtRegMap *VRM;
+ DenseSet<unsigned> RewriteRegs;
bool ClearVirtRegs;
void rewrite();
void addMBBLiveIns();
bool readsUndefSubreg(const MachineOperand &MO) const;
void addLiveInsForSubRanges(const LiveInterval &LI, unsigned PhysReg) const;
- void handleIdentityCopy(MachineInstr &MI) const;
+ void handleIdentityCopy(MachineInstr &MI);
void expandCopyBundle(MachineInstr &MI) const;
bool subRegLiveThrough(const MachineInstr &MI, unsigned SuperPhysReg) const;
@@ -231,6 +232,7 @@
void VirtRegRewriter::getAnalysisUsage(AnalysisUsage &AU) const {
AU.setPreservesCFG();
AU.addRequired<LiveIntervals>();
+ AU.addPreserved<LiveIntervals>();
AU.addRequired<SlotIndexes>();
AU.addPreserved<SlotIndexes>();
AU.addRequired<LiveDebugVariables>();
@@ -331,7 +333,12 @@
// This is a virtual register that is live across basic blocks. Its
// assigned PhysReg must be marked as live-in to those blocks.
unsigned PhysReg = VRM->getPhys(VirtReg);
- assert(PhysReg != VirtRegMap::NO_PHYS_REG && "Unmapped virtual register.");
+ if (PhysReg == VirtRegMap::NO_PHYS_REG) {
+ // There may be no physical register assigned if only some register
+ // classes were already allocated.
+ assert(!ClearVirtRegs && "Unmapped virtual register");
+ continue;
+ }
if (LI.hasSubRanges()) {
addLiveInsForSubRanges(LI, PhysReg);
@@ -382,12 +389,14 @@
return true;
}
-void VirtRegRewriter::handleIdentityCopy(MachineInstr &MI) const {
+void VirtRegRewriter::handleIdentityCopy(MachineInstr &MI) {
if (!MI.isIdentityCopy())
return;
LLVM_DEBUG(dbgs() << "Identity copy: " << MI);
++NumIdCopies;
+ RewriteRegs.insert(MI.getOperand(0).getReg());
+
// Copies like:
// %r0 = COPY undef %r0
// %al = COPY %al, implicit-def %eax
@@ -527,8 +536,11 @@
continue;
unsigned VirtReg = MO.getReg();
unsigned PhysReg = VRM->getPhys(VirtReg);
- assert(PhysReg != VirtRegMap::NO_PHYS_REG &&
- "Instruction uses unmapped VirtReg");
+
+ if (PhysReg == VirtRegMap::NO_PHYS_REG)
+ continue;
+
+ RewriteRegs.insert(PhysReg);
assert(!MRI->isReserved(PhysReg) && "Reserved register assignment");
// Preserve semantics of sub-register operands.
@@ -600,6 +612,19 @@
handleIdentityCopy(*MI);
}
}
+
+ if (LIS) {
+ // Don't bother maintaining accurate LiveIntervals for registers which were
+ // already allocated.
+ for (unsigned PhysReg : RewriteRegs) {
+ for (MCRegUnitIterator Units(PhysReg, TRI); Units.isValid();
+ ++Units) {
+ LIS->removeRegUnit(*Units);
+ }
+ }
+ }
+
+ RewriteRegs.clear();
}
FunctionPass *llvm::createVirtRegRewriter(bool ClearVirtRegs) {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D55287.176668.patch
Type: text/x-patch
Size: 3035 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20181204/af62c121/attachment.bin>
More information about the llvm-commits
mailing list