Index: lib/CodeGen/VirtRegMap.cpp =================================================================== --- lib/CodeGen/VirtRegMap.cpp +++ lib/CodeGen/VirtRegMap.cpp @@ -182,13 +182,14 @@ SlotIndexes *Indexes; LiveIntervals *LIS; VirtRegMap *VRM; + DenseSet 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(); + AU.addPreserved(); AU.addRequired(); AU.addPreserved(); AU.addRequired(); @@ -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) {