diff options
Diffstat (limited to 'llvm/lib/CodeGen/MachineCopyPropagation.cpp')
-rw-r--r-- | llvm/lib/CodeGen/MachineCopyPropagation.cpp | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/llvm/lib/CodeGen/MachineCopyPropagation.cpp b/llvm/lib/CodeGen/MachineCopyPropagation.cpp index 2bfd65019fc..3a6f2b5330e 100644 --- a/llvm/lib/CodeGen/MachineCopyPropagation.cpp +++ b/llvm/lib/CodeGen/MachineCopyPropagation.cpp @@ -285,18 +285,28 @@ void MachineCopyPropagation::CopyPropagateBlock(MachineBasicBlock &MBB) { // defined registers. if (RegMask) { // Erase any MaybeDeadCopies whose destination register is clobbered. - for (MachineInstr *MaybeDead : MaybeDeadCopies) { + for (SmallSetVector<MachineInstr *, 8>::iterator DI = + MaybeDeadCopies.begin(); + DI != MaybeDeadCopies.end();) { + MachineInstr *MaybeDead = *DI; unsigned Reg = MaybeDead->getOperand(0).getReg(); assert(!MRI->isReserved(Reg)); - if (!RegMask->clobbersPhysReg(Reg)) + + if (!RegMask->clobbersPhysReg(Reg)) { + ++DI; continue; + } + DEBUG(dbgs() << "MCP: Removing copy due to regmask clobbering: "; MaybeDead->dump()); + + // erase() will return the next valid iterator pointing to the next + // element after the erased one. + DI = MaybeDeadCopies.erase(DI); MaybeDead->eraseFromParent(); Changed = true; ++NumDeletes; } - MaybeDeadCopies.clear(); removeClobberedRegsFromMap(AvailCopyMap, *RegMask); removeClobberedRegsFromMap(CopyMap, *RegMask); @@ -348,3 +358,4 @@ bool MachineCopyPropagation::runOnMachineFunction(MachineFunction &MF) { return Changed; } + |