Skip to content

Commit

Permalink
[DebugInfo][InstrRef][NFC] Free resources at an earlier stage
Browse files Browse the repository at this point in the history
This patch releases some memory from InstrRefBasedLDV earlier that it would
otherwise. The underlying problem is:
 * We store a big table of "live in values for each block",
 * We translate that into DBG_VALUE instructions in each block,

And both exist in memory at the same time, which needlessly doubles that
information. The most of what this patch does is: as we progressively
translate live-in information into DBG_VALUEs, we free the variable-value /
machine-value tracking information as we go, which significantly reduces
peak memory.

While I'm here, also add a clear method to wipe variable assignments that
have been accumulated into VLocTracker objects, and turn a DenseMap into
a SmallDenseMap to avoid an initial allocation.

Differential Revision: https://reviews.llvm.org/D118453
  • Loading branch information
jmorse committed Feb 2, 2022
1 parent 73ed118 commit a80181a
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 8 deletions.
30 changes: 23 additions & 7 deletions llvm/lib/CodeGen/LiveDebugValues/InstrRefBasedImpl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1029,7 +1029,7 @@ bool InstrRefBasedLDV::transferDebugInstrRef(MachineInstr &MI,

// Only handle this instruction when we are building the variable value
// transfer function.
if (!VTracker)
if (!VTracker && !TTracker)
return false;

unsigned InstNo = MI.getOperand(0).getImm();
Expand Down Expand Up @@ -1185,7 +1185,8 @@ bool InstrRefBasedLDV::transferDebugInstrRef(MachineInstr &MI,
// for DBG_INSTR_REFs as DBG_VALUEs (just, the former can refer to values that
// aren't immediately available).
DbgValueProperties Properties(Expr, false);
VTracker->defVar(MI, Properties, NewID);
if (VTracker)
VTracker->defVar(MI, Properties, NewID);

// If we're on the final pass through the function, decompose this INSTR_REF
// into a plain DBG_VALUE.
Expand Down Expand Up @@ -2826,6 +2827,7 @@ void InstrRefBasedLDV::emitLocations(
const TargetPassConfig &TPC) {
TTracker = new TransferTracker(TII, MTracker, MF, *TRI, CalleeSavedRegs, TPC);
unsigned NumLocs = MTracker->getNumLocs();
VTracker = nullptr;

// For each block, load in the machine value locations and variable value
// live-ins, then step through each instruction in the block. New DBG_VALUEs
Expand All @@ -2844,6 +2846,15 @@ void InstrRefBasedLDV::emitLocations(
TTracker->checkInstForNewValues(CurInst, MI.getIterator());
++CurInst;
}

// Our block information has now been converted into DBG_VALUEs, to be
// inserted below. Free the memory we allocated to track variable / register
// values. If we don't, we needlessy record the same info in memory twice.
delete[] MInLocs[bbnum];
delete[] MOutLocs[bbnum];
MInLocs[bbnum] = nullptr;
MOutLocs[bbnum] = nullptr;
SavedLiveIns[bbnum].clear();
}

emitTransfers(AllVarsNumbering);
Expand Down Expand Up @@ -3080,6 +3091,12 @@ bool InstrRefBasedLDV::ExtendRanges(MachineFunction &MF,
<< " has " << MaxNumBlocks << " basic blocks and "
<< VarAssignCount
<< " variable assignments, exceeding limits.\n");

// Perform memory cleanup that emitLocations would do otherwise.
for (int Idx = 0; Idx < MaxNumBlocks; ++Idx) {
delete[] MOutLocs[Idx];
delete[] MInLocs[Idx];
}
} else {
// Compute the extended ranges, iterating over scopes. There might be
// something to be said for ordering them by size/locality, but that's for
Expand All @@ -3091,6 +3108,9 @@ bool InstrRefBasedLDV::ExtendRanges(MachineFunction &MF,
vlocs);
}

// Now that we've analysed variable assignments, free any tracking data.
vlocs.clear();

// Using the computed value locations and variable values for each block,
// create the DBG_VALUE instructions representing the extended variable
// locations.
Expand All @@ -3100,11 +3120,7 @@ bool InstrRefBasedLDV::ExtendRanges(MachineFunction &MF,
Changed = TTracker->Transfers.size() != 0;
}

// Common clean-up of memory.
for (int Idx = 0; Idx < MaxNumBlocks; ++Idx) {
delete[] MOutLocs[Idx];
delete[] MInLocs[Idx];
}
// Elements of these arrays will be deleted by emitLocations.
delete[] MOutLocs;
delete[] MInLocs;

Expand Down
7 changes: 6 additions & 1 deletion llvm/lib/CodeGen/LiveDebugValues/InstrRefBasedImpl.h
Original file line number Diff line number Diff line change
Expand Up @@ -680,7 +680,7 @@ class VLocTracker {
/// movement of values between locations inside of a block is handled at a
/// much later stage, in the TransferTracker class.
MapVector<DebugVariable, DbgValue> Vars;
DenseMap<DebugVariable, const DILocation *> Scopes;
SmallDenseMap<DebugVariable, const DILocation *, 8> Scopes;
MachineBasicBlock *MBB = nullptr;
const OverlapMap &OverlappingFragments;
DbgValueProperties EmptyProperties;
Expand Down Expand Up @@ -749,6 +749,11 @@ class VLocTracker {
Scopes[Overlapped] = Loc;
}
}

void clear() {
Vars.clear();
Scopes.clear();
}
};

// XXX XXX docs
Expand Down

0 comments on commit a80181a

Please sign in to comment.