From c8befe687f613b12a64b7145ef32fc5685e175b4 Mon Sep 17 00:00:00 2001 From: Sameer AbuAsal Date: Thu, 3 Aug 2017 02:41:17 +0000 Subject: [PATCH] [RegisterCoalescer] Add wrapper for Erasing Instructions Summary: To delete an instruction the coalescer needs to call eraseFromParent() on the MachineInstr, insert it in the ErasedInstrs list and update the Live Ranges structure. This patch re-factors the code to do all that in one function. This will also fix cases where previous code wasn't inserting deleted instructions in the ErasedList. Reviewers: qcolombet, kparzysz Reviewed By: qcolombet Subscribers: MatzeB, llvm-commits, qcolombet Differential Revision: https://reviews.llvm.org/D36204 llvm-svn: 309915 --- llvm/lib/CodeGen/RegisterCoalescer.cpp | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/llvm/lib/CodeGen/RegisterCoalescer.cpp b/llvm/lib/CodeGen/RegisterCoalescer.cpp index 1f4ecc9..4cc9345 100644 --- a/llvm/lib/CodeGen/RegisterCoalescer.cpp +++ b/llvm/lib/CodeGen/RegisterCoalescer.cpp @@ -248,6 +248,16 @@ namespace { } } + /// 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 @@ bool RegisterCoalescer::removeCopyByCommutingDef(const CoalescerPair &CP, 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 @@ bool RegisterCoalescer::removePartialRedundancy(const CoalescerPair &CP, // 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 @@ bool RegisterCoalescer::joinCopy(MachineInstr *CopyMI, bool &Again) { // Eliminate undefs. if (!CP.isPhys() && eliminateUndefCopy(CopyMI)) { - LIS->RemoveMachineInstrFromMaps(*CopyMI); - CopyMI->eraseFromParent(); + deleteInstr(CopyMI); return false; // Not coalescable. } @@ -1607,8 +1612,7 @@ bool RegisterCoalescer::joinCopy(MachineInstr *CopyMI, bool &Again) { } DEBUG(dbgs() << "\tMerged values: " << LI << '\n'); } - LIS->RemoveMachineInstrFromMaps(*CopyMI); - CopyMI->eraseFromParent(); + deleteInstr(CopyMI); return true; } @@ -1668,8 +1672,7 @@ bool RegisterCoalescer::joinCopy(MachineInstr *CopyMI, bool &Again) { 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 @@ bool RegisterCoalescer::joinReservedPhysReg(CoalescerPair &CP) { } } - LIS->RemoveMachineInstrFromMaps(*CopyMI); - CopyMI->eraseFromParent(); + deleteInstr(CopyMI); // We don't track kills for reserved registers. MRI->clearKillFlags(CP.getSrcReg()); -- 2.7.4