diff options
-rw-r--r-- | lib/CodeGen/LiveDebugVariables.cpp | 49 | ||||
-rw-r--r-- | lib/CodeGen/LiveDebugVariables.h | 3 | ||||
-rw-r--r-- | lib/CodeGen/SimpleRegisterCoalescing.cpp | 4 |
3 files changed, 56 insertions, 0 deletions
diff --git a/lib/CodeGen/LiveDebugVariables.cpp b/lib/CodeGen/LiveDebugVariables.cpp index 9a15a27..4b428f6 100644 --- a/lib/CodeGen/LiveDebugVariables.cpp +++ b/lib/CodeGen/LiveDebugVariables.cpp @@ -241,6 +241,10 @@ public: /// collecting all their def points. void computeIntervals(LiveIntervals &LIS, MachineDominatorTree &MDT); + /// renameRegister - Update locations to rewrite OldReg as NewReg:SubIdx. + void renameRegister(unsigned OldReg, unsigned NewReg, unsigned SubIdx, + const TargetRegisterInfo *TRI); + void print(raw_ostream&, const TargetRegisterInfo*); }; } // namespace @@ -269,6 +273,9 @@ class LDVImpl { /// getUserValue - Find or create a UserValue. UserValue *getUserValue(const MDNode *Var, unsigned Offset); + /// lookupVirtReg - Find the EC leader for VirtReg or null. + UserValue *lookupVirtReg(unsigned VirtReg); + /// mapVirtReg - Map virtual register to an equivalence class. void mapVirtReg(unsigned VirtReg, UserValue *EC); @@ -300,6 +307,9 @@ public: userVarMap.clear(); } + /// renameRegister - Replace all references to OldReg wiht NewReg:SubIdx. + void renameRegister(unsigned OldReg, unsigned NewReg, unsigned SubIdx); + void print(raw_ostream&); }; } // namespace @@ -379,6 +389,12 @@ void LDVImpl::mapVirtReg(unsigned VirtReg, UserValue *EC) { Leader = UserValue::merge(Leader, EC); } +UserValue *LDVImpl::lookupVirtReg(unsigned VirtReg) { + if (UserValue *UV = virtRegMap.lookup(VirtReg)) + return UV->getLeader(); + return 0; +} + bool LDVImpl::handleDebugValue(MachineInstr *MI, SlotIndex Idx) { // DBG_VALUE loc, offset, variable if (MI->getNumOperands() != 3 || @@ -551,3 +567,36 @@ LiveDebugVariables::~LiveDebugVariables() { if (pImpl) delete static_cast<LDVImpl*>(pImpl); } + +void UserValue:: +renameRegister(unsigned OldReg, unsigned NewReg, unsigned SubIdx, + const TargetRegisterInfo *TRI) { + for (unsigned i = 0, e = locations.size(); i != e; ++i) { + Location &Loc = locations[i]; + if (Loc.Kind != OldReg) + continue; + Loc.Kind = NewReg; + if (SubIdx && Loc.Data.SubIdx) + Loc.Data.SubIdx = TRI->composeSubRegIndices(SubIdx, Loc.Data.SubIdx); + } +} + +void LDVImpl:: +renameRegister(unsigned OldReg, unsigned NewReg, unsigned SubIdx) { + for (UserValue *UV = lookupVirtReg(OldReg); UV; UV = UV->getNext()) + UV->renameRegister(OldReg, NewReg, SubIdx, TRI); +} + +void LiveDebugVariables:: +renameRegister(unsigned OldReg, unsigned NewReg, unsigned SubIdx) { + if (pImpl) + static_cast<LDVImpl*>(pImpl)->renameRegister(OldReg, NewReg, SubIdx); +} + +#ifndef NDEBUG +void LiveDebugVariables::dump() { + if (pImpl) + static_cast<LDVImpl*>(pImpl)->print(dbgs()); +} +#endif + diff --git a/lib/CodeGen/LiveDebugVariables.h b/lib/CodeGen/LiveDebugVariables.h index 2e4b052..a69b974 100644 --- a/lib/CodeGen/LiveDebugVariables.h +++ b/lib/CodeGen/LiveDebugVariables.h @@ -44,6 +44,9 @@ public: /// that happened during register allocation. void emitDebugValues(); + /// dump - Print data structures to dbgs(). + void dump(); + private: virtual bool runOnMachineFunction(MachineFunction &); diff --git a/lib/CodeGen/SimpleRegisterCoalescing.cpp b/lib/CodeGen/SimpleRegisterCoalescing.cpp index bc5926c..74e72af 100644 --- a/lib/CodeGen/SimpleRegisterCoalescing.cpp +++ b/lib/CodeGen/SimpleRegisterCoalescing.cpp @@ -696,6 +696,9 @@ SimpleRegisterCoalescing::UpdateRegDefsUses(const CoalescerPair &CP) { unsigned DstReg = CP.getDstReg(); unsigned SubIdx = CP.getSubIdx(); + // Update LiveDebugVariables. + ldv_->renameRegister(SrcReg, DstReg, SubIdx); + for (MachineRegisterInfo::reg_iterator I = mri_->reg_begin(SrcReg); MachineInstr *UseMI = I.skipInstruction();) { // A PhysReg copy that won't be coalesced can perhaps be rematerialized @@ -1779,6 +1782,7 @@ bool SimpleRegisterCoalescing::runOnMachineFunction(MachineFunction &fn) { } DEBUG(dump()); + DEBUG(ldv_->dump()); return true; } |