[DebugInfo][InstrRef] Honour too-much-debug-info cutouts
VarLoc based LiveDebugValues will abandon variable location propagation if there are too many blocks and variable assignments in the function. If it didn't, and we had (say) 1000 blocks and 1000 variables in scope, we'd end up with 1 million DBG_VALUEs just at the start of blocks. Instruction-referencing LiveDebugValues should honour this limitation too (because the same limitation applies to it). Hoist the relevant command line options into LiveDebugValues.cpp and pass it down into the implementation classes as an argument to ExtendRanges. I've duplicated all the run-lines in live-debug-values-cutoffs.mir to have an instruction-referencing flavour. Differential Revision: https://reviews.llvm.org/D107823
This commit is contained in:
@@ -1684,7 +1684,8 @@ private:
|
||||
/// RPOT block ordering.
|
||||
void initialSetup(MachineFunction &MF);
|
||||
|
||||
bool ExtendRanges(MachineFunction &MF, TargetPassConfig *TPC) override;
|
||||
bool ExtendRanges(MachineFunction &MF, TargetPassConfig *TPC,
|
||||
unsigned InputBBLimit, unsigned InputDbgValLimit) override;
|
||||
|
||||
public:
|
||||
/// Default construct and initialize the pass.
|
||||
@@ -3523,8 +3524,9 @@ void InstrRefBasedLDV::initialSetup(MachineFunction &MF) {
|
||||
|
||||
/// Calculate the liveness information for the given machine function and
|
||||
/// extend ranges across basic blocks.
|
||||
bool InstrRefBasedLDV::ExtendRanges(MachineFunction &MF,
|
||||
TargetPassConfig *TPC) {
|
||||
bool InstrRefBasedLDV::ExtendRanges(MachineFunction &MF, TargetPassConfig *TPC,
|
||||
unsigned InputBBLimit,
|
||||
unsigned InputDbgValLimit) {
|
||||
// No subprogram means this function contains no debuginfo.
|
||||
if (!MF.getFunction().getSubprogram())
|
||||
return false;
|
||||
@@ -3626,6 +3628,7 @@ bool InstrRefBasedLDV::ExtendRanges(MachineFunction &MF,
|
||||
|
||||
// To mirror old LiveDebugValues, enumerate variables in RPOT order. Otherwise
|
||||
// the order is unimportant, it just has to be stable.
|
||||
unsigned VarAssignCount = 0;
|
||||
for (unsigned int I = 0; I < OrderToBB.size(); ++I) {
|
||||
auto *MBB = OrderToBB[I];
|
||||
auto *VTracker = &vlocs[MBB->getNumber()];
|
||||
@@ -3643,9 +3646,21 @@ bool InstrRefBasedLDV::ExtendRanges(MachineFunction &MF,
|
||||
ScopeToVars[Scope].insert(Var);
|
||||
ScopeToBlocks[Scope].insert(VTracker->MBB);
|
||||
ScopeToDILocation[Scope] = ScopeLoc;
|
||||
++VarAssignCount;
|
||||
}
|
||||
}
|
||||
|
||||
// If we have an extremely large number of variable assignments and blocks,
|
||||
// bail out at this point. We've burnt some time doing analysis already,
|
||||
// however we should cut our losses.
|
||||
if (MaxNumBlocks > InputBBLimit && VarAssignCount > InputDbgValLimit) {
|
||||
LLVM_DEBUG(dbgs() << "Disabling InstrRefBasedLDV: " << MF.getName()
|
||||
<< " has " << MaxNumBlocks << " basic blocks and "
|
||||
<< VarAssignCount
|
||||
<< " variable assignments, exceeding limits.\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
// OK. Iterate over scopes: there might be something to be said for
|
||||
// ordering them by size/locality, but that's for the future. For each scope,
|
||||
// solve the variable value problem, producing a map of variables to values
|
||||
|
||||
@@ -40,6 +40,18 @@ static cl::opt<bool>
|
||||
"normal DBG_VALUE inputs"),
|
||||
cl::init(false));
|
||||
|
||||
// Options to prevent pathological compile-time behavior. If InputBBLimit and
|
||||
// InputDbgValueLimit are both exceeded, range extension is disabled.
|
||||
static cl::opt<unsigned> InputBBLimit(
|
||||
"livedebugvalues-input-bb-limit",
|
||||
cl::desc("Maximum input basic blocks before DBG_VALUE limit applies"),
|
||||
cl::init(10000), cl::Hidden);
|
||||
static cl::opt<unsigned> InputDbgValueLimit(
|
||||
"livedebugvalues-input-dbg-value-limit",
|
||||
cl::desc(
|
||||
"Maximum input DBG_VALUE insts supported by debug range extension"),
|
||||
cl::init(50000), cl::Hidden);
|
||||
|
||||
/// Generic LiveDebugValues pass. Calls through to VarLocBasedLDV or
|
||||
/// InstrRefBasedLDV to perform location propagation, via the LDVImpl
|
||||
/// base class.
|
||||
@@ -103,5 +115,5 @@ bool LiveDebugValues::runOnMachineFunction(MachineFunction &MF) {
|
||||
TheImpl = llvm::makeVarLocBasedLiveDebugValues();
|
||||
}
|
||||
|
||||
return TheImpl->ExtendRanges(MF, TPC);
|
||||
return TheImpl->ExtendRanges(MF, TPC, InputBBLimit, InputDbgValueLimit);
|
||||
}
|
||||
|
||||
@@ -23,7 +23,9 @@ inline namespace SharedLiveDebugValues {
|
||||
// implementation.
|
||||
class LDVImpl {
|
||||
public:
|
||||
virtual bool ExtendRanges(MachineFunction &MF, TargetPassConfig *TPC) = 0;
|
||||
virtual bool ExtendRanges(MachineFunction &MF, TargetPassConfig *TPC,
|
||||
unsigned InputBBLimit,
|
||||
unsigned InputDbgValLimit) = 0;
|
||||
virtual ~LDVImpl() {}
|
||||
};
|
||||
|
||||
|
||||
@@ -166,18 +166,6 @@ using namespace llvm;
|
||||
|
||||
STATISTIC(NumInserted, "Number of DBG_VALUE instructions inserted");
|
||||
|
||||
// Options to prevent pathological compile-time behavior. If InputBBLimit and
|
||||
// InputDbgValueLimit are both exceeded, range extension is disabled.
|
||||
static cl::opt<unsigned> InputBBLimit(
|
||||
"livedebugvalues-input-bb-limit",
|
||||
cl::desc("Maximum input basic blocks before DBG_VALUE limit applies"),
|
||||
cl::init(10000), cl::Hidden);
|
||||
static cl::opt<unsigned> InputDbgValueLimit(
|
||||
"livedebugvalues-input-dbg-value-limit",
|
||||
cl::desc(
|
||||
"Maximum input DBG_VALUE insts supported by debug range extension"),
|
||||
cl::init(50000), cl::Hidden);
|
||||
|
||||
/// If \p Op is a stack or frame register return true, otherwise return false.
|
||||
/// This is used to avoid basing the debug entry values on the registers, since
|
||||
/// we do not support it at the moment.
|
||||
@@ -1007,7 +995,8 @@ private:
|
||||
/// had their instruction creation deferred.
|
||||
void flushPendingLocs(VarLocInMBB &PendingInLocs, VarLocMap &VarLocIDs);
|
||||
|
||||
bool ExtendRanges(MachineFunction &MF, TargetPassConfig *TPC) override;
|
||||
bool ExtendRanges(MachineFunction &MF, TargetPassConfig *TPC,
|
||||
unsigned InputBBLimit, unsigned InputDbgValLimit) override;
|
||||
|
||||
public:
|
||||
/// Default construct and initialize the pass.
|
||||
@@ -2048,7 +2037,9 @@ void VarLocBasedLDV::recordEntryValue(const MachineInstr &MI,
|
||||
|
||||
/// Calculate the liveness information for the given machine function and
|
||||
/// extend ranges across basic blocks.
|
||||
bool VarLocBasedLDV::ExtendRanges(MachineFunction &MF, TargetPassConfig *TPC) {
|
||||
bool VarLocBasedLDV::ExtendRanges(MachineFunction &MF, TargetPassConfig *TPC,
|
||||
unsigned InputBBLimit,
|
||||
unsigned InputDbgValLimit) {
|
||||
LLVM_DEBUG(dbgs() << "\nDebug Range Extension\n");
|
||||
|
||||
if (!MF.getFunction().getSubprogram())
|
||||
@@ -2141,7 +2132,7 @@ bool VarLocBasedLDV::ExtendRanges(MachineFunction &MF, TargetPassConfig *TPC) {
|
||||
for (auto &MI : MBB)
|
||||
if (MI.isDebugValue())
|
||||
++NumInputDbgValues;
|
||||
if (NumInputDbgValues > InputDbgValueLimit) {
|
||||
if (NumInputDbgValues > InputDbgValLimit) {
|
||||
LLVM_DEBUG(dbgs() << "Disabling VarLocBasedLDV: " << MF.getName()
|
||||
<< " has " << RPONumber << " basic blocks and "
|
||||
<< NumInputDbgValues
|
||||
|
||||
@@ -5,21 +5,41 @@
|
||||
# RUN: -livedebugvalues-input-bb-limit=1 \
|
||||
# RUN: -livedebugvalues-input-dbg-value-limit=1 \
|
||||
# RUN: | FileCheck %s -check-prefix=LDV-DISABLED
|
||||
# RUN: llc %s -o - -run-pass=livedebugvalues -mtriple=x86_64-unknown-unknown \
|
||||
# RUN: -experimental-debug-variable-locations \
|
||||
# RUN: -livedebugvalues-input-bb-limit=1 \
|
||||
# RUN: -livedebugvalues-input-dbg-value-limit=1 \
|
||||
# RUN: | FileCheck %s -check-prefix=LDV-DISABLED
|
||||
|
||||
# RUN: llc %s -o - -run-pass=livedebugvalues -mtriple=x86_64-unknown-unknown \
|
||||
# RUN: -livedebugvalues-input-bb-limit=1 \
|
||||
# RUN: -livedebugvalues-input-dbg-value-limit=10 \
|
||||
# RUN: | FileCheck %s -check-prefix=LDV-ENABLED
|
||||
# RUN: llc %s -o - -run-pass=livedebugvalues -mtriple=x86_64-unknown-unknown \
|
||||
# RUN: -experimental-debug-variable-locations \
|
||||
# RUN: -livedebugvalues-input-bb-limit=1 \
|
||||
# RUN: -livedebugvalues-input-dbg-value-limit=10 \
|
||||
# RUN: | FileCheck %s -check-prefix=LDV-ENABLED
|
||||
|
||||
# RUN: llc %s -o - -run-pass=livedebugvalues -mtriple=x86_64-unknown-unknown \
|
||||
# RUN: -livedebugvalues-input-bb-limit=10 \
|
||||
# RUN: -livedebugvalues-input-dbg-value-limit=1 \
|
||||
# RUN: | FileCheck %s -check-prefix=LDV-ENABLED
|
||||
# RUN: llc %s -o - -run-pass=livedebugvalues -mtriple=x86_64-unknown-unknown \
|
||||
# RUN: -experimental-debug-variable-locations \
|
||||
# RUN: -livedebugvalues-input-bb-limit=10 \
|
||||
# RUN: -livedebugvalues-input-dbg-value-limit=1 \
|
||||
# RUN: | FileCheck %s -check-prefix=LDV-ENABLED
|
||||
|
||||
# RUN: llc %s -o - -run-pass=livedebugvalues -mtriple=x86_64-unknown-unknown \
|
||||
# RUN: -livedebugvalues-input-bb-limit=10 \
|
||||
# RUN: -livedebugvalues-input-dbg-value-limit=10 \
|
||||
# RUN: | FileCheck %s -check-prefix=LDV-ENABLED
|
||||
# RUN: llc %s -o - -run-pass=livedebugvalues -mtriple=x86_64-unknown-unknown \
|
||||
# RUN: -experimental-debug-variable-locations \
|
||||
# RUN: -livedebugvalues-input-bb-limit=10 \
|
||||
# RUN: -livedebugvalues-input-dbg-value-limit=10 \
|
||||
# RUN: | FileCheck %s -check-prefix=LDV-ENABLED
|
||||
|
||||
# LDV-DISABLED-LABEL: bb.1.exit
|
||||
# LDV-DISABLED-NEXT: $edi = MOV32rm
|
||||
|
||||
Reference in New Issue
Block a user