From 5daec2215bdb6f484956362d81e5923bb2bffd58 Mon Sep 17 00:00:00 2001 From: Jakob Stoklund Olesen Date: Fri, 3 Dec 2010 22:25:07 +0000 Subject: [PATCH] Coalesce debug locations when possible, causing less DBG_VALUE instructions to be emitted. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@120845 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/LiveDebugVariables.cpp | 36 ++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/lib/CodeGen/LiveDebugVariables.cpp b/lib/CodeGen/LiveDebugVariables.cpp index 4f48d766aef..588a24cba8d 100644 --- a/lib/CodeGen/LiveDebugVariables.cpp +++ b/lib/CodeGen/LiveDebugVariables.cpp @@ -188,6 +188,11 @@ class UserValue { /// 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 @@ void LDVImpl::print(raw_ostream &OS) { 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 @@ LiveDebugVariables::~LiveDebugVariables() { 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 @@ UserValue::rewriteLocations(VirtRegMap &VRM, const TargetRegisterInfo &TRI) { } else { Loc.Kind = Location::locUndef; } + coalesceLocation(LocNo); } DEBUG(print(dbgs(), &TRI)); }