Index: llvm/trunk/lib/CodeGen/RegisterCoalescer.cpp =================================================================== --- llvm/trunk/lib/CodeGen/RegisterCoalescer.cpp +++ llvm/trunk/lib/CodeGen/RegisterCoalescer.cpp @@ -248,6 +248,16 @@ } } + /// Wrapper Method to do all the necessary work when an Instruction is + /// deleted. + /// Optimizations should use this to make sure that deleted instructions + /// are always accounted for. + void deleteInstr(MachineInstr* MI) { + ErasedInstrs.insert(MI); + LIS->RemoveMachineInstrFromMaps(*MI); + MI->eraseFromParent(); + } + public: static char ID; ///< Class identification, replacement for typeinfo RegisterCoalescer() : MachineFunctionPass(ID) { @@ -797,9 +807,7 @@ S.MergeValueNumberInto(SubDVNI, SubBValNo); } - ErasedInstrs.insert(UseMI); - LIS->RemoveMachineInstrFromMaps(*UseMI); - UseMI->eraseFromParent(); + deleteInstr(UseMI); } // Extend BValNo by merging in IntA live segments of AValNo. Val# definition @@ -993,10 +1001,8 @@ // Note: This is fine to remove the copy before updating the live-ranges. // While updating the live-ranges, we only look at slot indices and // never go back to the instruction. - LIS->RemoveMachineInstrFromMaps(CopyMI); // Mark instructions as deleted. - ErasedInstrs.insert(&CopyMI); - CopyMI.eraseFromParent(); + deleteInstr(&CopyMI); // Update the liveness. SmallVector EndPoints; @@ -1578,8 +1584,7 @@ // Eliminate undefs. if (!CP.isPhys() && eliminateUndefCopy(CopyMI)) { - LIS->RemoveMachineInstrFromMaps(*CopyMI); - CopyMI->eraseFromParent(); + deleteInstr(CopyMI); return false; // Not coalescable. } @@ -1607,8 +1612,7 @@ } DEBUG(dbgs() << "\tMerged values: " << LI << '\n'); } - LIS->RemoveMachineInstrFromMaps(*CopyMI); - CopyMI->eraseFromParent(); + deleteInstr(CopyMI); return true; } @@ -1668,8 +1672,7 @@ if (!CP.isPartial() && !CP.isPhys()) { if (adjustCopiesBackFrom(CP, CopyMI) || removeCopyByCommutingDef(CP, CopyMI)) { - LIS->RemoveMachineInstrFromMaps(*CopyMI); - CopyMI->eraseFromParent(); + deleteInstr(CopyMI); DEBUG(dbgs() << "\tTrivial!\n"); return true; } @@ -1855,8 +1858,7 @@ } } - LIS->RemoveMachineInstrFromMaps(*CopyMI); - CopyMI->eraseFromParent(); + deleteInstr(CopyMI); // We don't track kills for reserved registers. MRI->clearKillFlags(CP.getSrcReg());