[llvm-commits] [llvm] r120845 - /llvm/trunk/lib/CodeGen/LiveDebugVariables.cpp

Jakob Stoklund Olesen stoklund at 2pi.dk
Fri Dec 3 14:25:07 PST 2010


Author: stoklund
Date: Fri Dec  3 16:25:07 2010
New Revision: 120845

URL: http://llvm.org/viewvc/llvm-project?rev=120845&view=rev
Log:
Coalesce debug locations when possible, causing less DBG_VALUE instructions to
be emitted.

Modified:
    llvm/trunk/lib/CodeGen/LiveDebugVariables.cpp

Modified: llvm/trunk/lib/CodeGen/LiveDebugVariables.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/LiveDebugVariables.cpp?rev=120845&r1=120844&r2=120845&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/LiveDebugVariables.cpp (original)
+++ llvm/trunk/lib/CodeGen/LiveDebugVariables.cpp Fri Dec  3 16:25:07 2010
@@ -188,6 +188,11 @@
   /// Map of slot indices where this value is live.
   LocMap locInts;
 
+  /// coalesceLocation - After LocNo was changed, check if it has become
+  /// identical to another location, and coalesce them. This may cause LocNo or
+  /// a later location to be erased, but no earlier location will be erased.
+  void coalesceLocation(unsigned LocNo);
+
   /// insertDebugValue - Insert a DBG_VALUE into MBB at Idx for LocNo.
   void insertDebugValue(MachineBasicBlock *MBB, SlotIndex Idx, unsigned LocNo,
                         LiveIntervals &LIS, const TargetInstrInfo &TII);
@@ -409,6 +414,30 @@
     userValues[i]->print(OS, TRI);
 }
 
+void UserValue::coalesceLocation(unsigned LocNo) {
+  unsigned KeepLoc = std::find(locations.begin(), locations.begin() + LocNo,
+                               locations[LocNo]) - locations.begin();
+  unsigned EraseLoc = LocNo;
+  if (KeepLoc == LocNo) {
+    EraseLoc = std::find(locations.begin() + LocNo + 1, locations.end(),
+                         locations[LocNo]) - locations.begin();
+    // No matches.
+    if (EraseLoc == locations.size())
+      return;
+  }
+  assert(KeepLoc < EraseLoc);
+  locations.erase(locations.begin() + EraseLoc);
+
+  // Rewrite values.
+  for (LocMap::iterator I = locInts.begin(); I.valid(); ++I) {
+    unsigned v = I.value();
+    if (v == EraseLoc)
+      I.setValue(KeepLoc);      // Coalesce when possible.
+    else if (v > EraseLoc)
+      I.setValueUnchecked(v-1); // Avoid coalescing with untransformed values.
+  }
+}
+
 UserValue *LDVImpl::getUserValue(const MDNode *Var, unsigned Offset) {
   UserValue *&Leader = userVarMap[Var];
   if (Leader) {
@@ -613,13 +642,15 @@
 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];
+  for (unsigned i = locations.size(); i; --i) {
+    unsigned LocNo = i - 1;
+    Location &Loc = locations[LocNo];
     if (Loc.Kind != OldReg)
       continue;
     Loc.Kind = NewReg;
     if (SubIdx && Loc.Data.SubIdx)
       Loc.Data.SubIdx = TRI->composeSubRegIndices(SubIdx, Loc.Data.SubIdx);
+    coalesceLocation(LocNo);
   }
 }
 
@@ -668,6 +699,7 @@
     } else {
       Loc.Kind = Location::locUndef;
     }
+    coalesceLocation(LocNo);
   }
   DEBUG(print(dbgs(), &TRI));
 }





More information about the llvm-commits mailing list