Update LiveDebugVariables during coalescing.
authorJakob Stoklund Olesen <stoklund@2pi.dk>
Thu, 2 Dec 2010 18:15:44 +0000 (18:15 +0000)
committerJakob Stoklund Olesen <stoklund@2pi.dk>
Thu, 2 Dec 2010 18:15:44 +0000 (18:15 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@120720 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/LiveDebugVariables.cpp
lib/CodeGen/LiveDebugVariables.h
lib/CodeGen/SimpleRegisterCoalescing.cpp

index 9a15a2723daba601af6b3a0d2800f382766ff023..4b428f65896582225d9c6c86e3befbaf930b2db6 100644 (file)
@@ -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
+
index 2e4b05267ddabdad48c5ca263998231429f1b2ba..a69b974fe373c61466c7d8fea5d29f818e06162a 100644 (file)
@@ -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 &);
index bc5926c94dc8ddce01c4431cf85274405b23bc84..74e72af329307f64b47516248bac7b4dbabf1a00 100644 (file)
@@ -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;
 }