Skip to content

Commit 1c1b670

Browse files
committed
Revert "[DebugInfo][InstrRef] Add a max-stack-slots-to-track cut-out"
This reverts commit 3fab2d1. Breaking PPC sanitizer build: https://lab.llvm.org/buildbot/#/builders/105/builds/20857
1 parent bbc5b62 commit 1c1b670

File tree

4 files changed

+45
-167
lines changed

4 files changed

+45
-167
lines changed

llvm/lib/CodeGen/LiveDebugValues/InstrRefBasedImpl.cpp

Lines changed: 35 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -148,20 +148,6 @@ static cl::opt<bool> EmulateOldLDV("emulate-old-livedebugvalues", cl::Hidden,
148148
cl::desc("Act like old LiveDebugValues did"),
149149
cl::init(false));
150150

151-
// Limit for the maximum number of stack slots we should track, past which we
152-
// will ignore any spills. InstrRefBasedLDV gathers detailed information on all
153-
// stack slots which leads to high memory consumption, and in some scenarios
154-
// (such as asan with very many locals) the working set of the function can be
155-
// very large, causing many spills. In these scenarios, it is very unlikely that
156-
// the developer has hundreds of variables live at the same time that they're
157-
// carefully thinking about -- instead, they probably autogenerated the code.
158-
// When this happens, gracefully stop tracking excess spill slots, rather than
159-
// consuming all the developer's memory.
160-
static cl::opt<unsigned>
161-
StackWorkingSetLimit("livedebugvalues-max-stack-slots", cl::Hidden,
162-
cl::desc("livedebugvalues-stack-ws-limit"),
163-
cl::init(250));
164-
165151
/// Tracker for converting machine value locations and variable values into
166152
/// variable locations (the output of LiveDebugValues), recorded as DBG_VALUEs
167153
/// specifying block live-in locations and transfers within blocks.
@@ -771,15 +757,9 @@ void MLocTracker::writeRegMask(const MachineOperand *MO, unsigned CurBB,
771757
Masks.push_back(std::make_pair(MO, InstID));
772758
}
773759

774-
Optional<SpillLocationNo> MLocTracker::getOrTrackSpillLoc(SpillLoc L) {
760+
SpillLocationNo MLocTracker::getOrTrackSpillLoc(SpillLoc L) {
775761
SpillLocationNo SpillID(SpillLocs.idFor(L));
776-
777762
if (SpillID.id() == 0) {
778-
// If there is no location, and we have reached the limit of how many stack
779-
// slots to track, then don't track this one.
780-
if (SpillLocs.size() >= StackWorkingSetLimit)
781-
return None;
782-
783763
// Spill location is untracked: create record for this one, and all
784764
// subregister slots too.
785765
SpillID = SpillLocationNo(SpillLocs.insert(L));
@@ -918,7 +898,7 @@ bool InstrRefBasedLDV::isCalleeSaved(LocIdx L) const {
918898
// void InstrRefBasedLDV::printVarLocInMBB(..)
919899
#endif
920900

921-
Optional<SpillLocationNo>
901+
SpillLocationNo
922902
InstrRefBasedLDV::extractSpillBaseRegAndOffset(const MachineInstr &MI) {
923903
assert(MI.hasOneMemOperand() &&
924904
"Spill instruction does not have exactly one memory operand?");
@@ -933,11 +913,8 @@ InstrRefBasedLDV::extractSpillBaseRegAndOffset(const MachineInstr &MI) {
933913
return MTracker->getOrTrackSpillLoc({Reg, Offset});
934914
}
935915

936-
Optional<LocIdx>
937-
InstrRefBasedLDV::findLocationForMemOperand(const MachineInstr &MI) {
938-
Optional<SpillLocationNo> SpillLoc = extractSpillBaseRegAndOffset(MI);
939-
if (!SpillLoc)
940-
return None;
916+
Optional<LocIdx> InstrRefBasedLDV::findLocationForMemOperand(const MachineInstr &MI) {
917+
SpillLocationNo SpillLoc = extractSpillBaseRegAndOffset(MI);
941918

942919
// Where in the stack slot is this value defined -- i.e., what size of value
943920
// is this? An important question, because it could be loaded into a register
@@ -953,7 +930,7 @@ InstrRefBasedLDV::findLocationForMemOperand(const MachineInstr &MI) {
953930
// occur, but the safe action is to indicate the variable is optimised out.
954931
return None;
955932

956-
unsigned SpillID = MTracker->getSpillIDWithIdx(*SpillLoc, IdxIt->second);
933+
unsigned SpillID = MTracker->getSpillIDWithIdx(SpillLoc, IdxIt->second);
957934
return MTracker->getSpillMLoc(SpillID);
958935
}
959936

@@ -1274,12 +1251,7 @@ bool InstrRefBasedLDV::transferDebugPHI(MachineInstr &MI) {
12741251
Register Base;
12751252
StackOffset Offs = TFI->getFrameIndexReference(*MI.getMF(), FI, Base);
12761253
SpillLoc SL = {Base, Offs};
1277-
Optional<SpillLocationNo> SpillNo = MTracker->getOrTrackSpillLoc(SL);
1278-
1279-
// We might be able to find a value, but have chosen not to, to avoid
1280-
// tracking too much stack information.
1281-
if (!SpillNo)
1282-
return true;
1254+
SpillLocationNo SpillNo = MTracker->getOrTrackSpillLoc(SL);
12831255

12841256
// Problem: what value should we extract from the stack? LLVM does not
12851257
// record what size the last store to the slot was, and it would become
@@ -1291,7 +1263,7 @@ bool InstrRefBasedLDV::transferDebugPHI(MachineInstr &MI) {
12911263
Optional<ValueIDNum> Result = None;
12921264
Optional<LocIdx> SpillLoc = None;
12931265
for (unsigned CS : CandidateSizes) {
1294-
unsigned SpillID = MTracker->getLocID(*SpillNo, {CS, 0});
1266+
unsigned SpillID = MTracker->getLocID(SpillNo, {CS, 0});
12951267
SpillLoc = MTracker->getSpillMLoc(SpillID);
12961268
ValueIDNum Val = MTracker->readMLoc(*SpillLoc);
12971269
// If this value was defined in it's own position, then it was probably
@@ -1308,7 +1280,7 @@ bool InstrRefBasedLDV::transferDebugPHI(MachineInstr &MI) {
13081280
// "supposed" to be is more complex, and benefits a small number of
13091281
// locations.
13101282
if (!Result) {
1311-
unsigned SpillID = MTracker->getLocID(*SpillNo, {64, 0});
1283+
unsigned SpillID = MTracker->getLocID(SpillNo, {64, 0});
13121284
SpillLoc = MTracker->getSpillMLoc(SpillID);
13131285
Result = MTracker->readMLoc(*SpillLoc);
13141286
}
@@ -1385,12 +1357,11 @@ void InstrRefBasedLDV::transferRegisterDef(MachineInstr &MI) {
13851357

13861358
// If this instruction writes to a spill slot, def that slot.
13871359
if (hasFoldedStackStore(MI)) {
1388-
if (Optional<SpillLocationNo> SpillNo = extractSpillBaseRegAndOffset(MI)) {
1389-
for (unsigned int I = 0; I < MTracker->NumSlotIdxes; ++I) {
1390-
unsigned SpillID = MTracker->getSpillIDWithIdx(*SpillNo, I);
1391-
LocIdx L = MTracker->getSpillMLoc(SpillID);
1392-
MTracker->setMLoc(L, ValueIDNum(CurBB, CurInst, L));
1393-
}
1360+
SpillLocationNo SpillNo = extractSpillBaseRegAndOffset(MI);
1361+
for (unsigned int I = 0; I < MTracker->NumSlotIdxes; ++I) {
1362+
unsigned SpillID = MTracker->getSpillIDWithIdx(SpillNo, I);
1363+
LocIdx L = MTracker->getSpillMLoc(SpillID);
1364+
MTracker->setMLoc(L, ValueIDNum(CurBB, CurInst, L));
13941365
}
13951366
}
13961367

@@ -1427,12 +1398,11 @@ void InstrRefBasedLDV::transferRegisterDef(MachineInstr &MI) {
14271398

14281399
// Tell TTracker about any folded stack store.
14291400
if (hasFoldedStackStore(MI)) {
1430-
if (Optional<SpillLocationNo> SpillNo = extractSpillBaseRegAndOffset(MI)) {
1431-
for (unsigned int I = 0; I < MTracker->NumSlotIdxes; ++I) {
1432-
unsigned SpillID = MTracker->getSpillIDWithIdx(*SpillNo, I);
1433-
LocIdx L = MTracker->getSpillMLoc(SpillID);
1434-
TTracker->clobberMloc(L, MI.getIterator(), true);
1435-
}
1401+
SpillLocationNo SpillNo = extractSpillBaseRegAndOffset(MI);
1402+
for (unsigned int I = 0; I < MTracker->NumSlotIdxes; ++I) {
1403+
unsigned SpillID = MTracker->getSpillIDWithIdx(SpillNo, I);
1404+
LocIdx L = MTracker->getSpillMLoc(SpillID);
1405+
TTracker->clobberMloc(L, MI.getIterator(), true);
14361406
}
14371407
}
14381408
}
@@ -1468,24 +1438,23 @@ void InstrRefBasedLDV::performCopy(Register SrcRegNum, Register DstRegNum) {
14681438
}
14691439
}
14701440

1471-
Optional<SpillLocationNo>
1472-
InstrRefBasedLDV::isSpillInstruction(const MachineInstr &MI,
1473-
MachineFunction *MF) {
1441+
bool InstrRefBasedLDV::isSpillInstruction(const MachineInstr &MI,
1442+
MachineFunction *MF) {
14741443
// TODO: Handle multiple stores folded into one.
14751444
if (!MI.hasOneMemOperand())
1476-
return None;
1445+
return false;
14771446

14781447
// Reject any memory operand that's aliased -- we can't guarantee its value.
14791448
auto MMOI = MI.memoperands_begin();
14801449
const PseudoSourceValue *PVal = (*MMOI)->getPseudoValue();
14811450
if (PVal->isAliased(MFI))
1482-
return None;
1451+
return false;
14831452

14841453
if (!MI.getSpillSize(TII) && !MI.getFoldedSpillSize(TII))
1485-
return None; // This is not a spill instruction, since no valid size was
1486-
// returned from either function.
1454+
return false; // This is not a spill instruction, since no valid size was
1455+
// returned from either function.
14871456

1488-
return extractSpillBaseRegAndOffset(MI);
1457+
return true;
14891458
}
14901459

14911460
bool InstrRefBasedLDV::isLocationSpill(const MachineInstr &MI,
@@ -1542,11 +1511,13 @@ bool InstrRefBasedLDV::transferSpillOrRestoreInst(MachineInstr &MI) {
15421511
// First, if there are any DBG_VALUEs pointing at a spill slot that is
15431512
// written to, terminate that variable location. The value in memory
15441513
// will have changed. DbgEntityHistoryCalculator doesn't try to detect this.
1545-
if (Optional<SpillLocationNo> Loc = isSpillInstruction(MI, MF)) {
1514+
if (isSpillInstruction(MI, MF)) {
1515+
SpillLocationNo Loc = extractSpillBaseRegAndOffset(MI);
1516+
15461517
// Un-set this location and clobber, so that earlier locations don't
15471518
// continue past this store.
15481519
for (unsigned SlotIdx = 0; SlotIdx < MTracker->NumSlotIdxes; ++SlotIdx) {
1549-
unsigned SpillID = MTracker->getSpillIDWithIdx(*Loc, SlotIdx);
1520+
unsigned SpillID = MTracker->getSpillIDWithIdx(Loc, SlotIdx);
15501521
Optional<LocIdx> MLoc = MTracker->getSpillMLoc(SpillID);
15511522
if (!MLoc)
15521523
continue;
@@ -1564,9 +1535,7 @@ bool InstrRefBasedLDV::transferSpillOrRestoreInst(MachineInstr &MI) {
15641535

15651536
// Try to recognise spill and restore instructions that may transfer a value.
15661537
if (isLocationSpill(MI, MF, Reg)) {
1567-
// isLocationSpill returning true should guarantee we can extract a
1568-
// location.
1569-
SpillLocationNo Loc = *extractSpillBaseRegAndOffset(MI);
1538+
SpillLocationNo Loc = extractSpillBaseRegAndOffset(MI);
15701539

15711540
auto DoTransfer = [&](Register SrcReg, unsigned SpillID) {
15721541
auto ReadValue = MTracker->readReg(SrcReg);
@@ -1593,9 +1562,10 @@ bool InstrRefBasedLDV::transferSpillOrRestoreInst(MachineInstr &MI) {
15931562
unsigned SpillID = MTracker->getLocID(Loc, {Size, 0});
15941563
DoTransfer(Reg, SpillID);
15951564
} else {
1596-
Optional<SpillLocationNo> Loc = isRestoreInstruction(MI, MF, Reg);
1597-
if (!Loc)
1565+
Optional<SpillLocationNo> OptLoc = isRestoreInstruction(MI, MF, Reg);
1566+
if (!OptLoc)
15981567
return false;
1568+
SpillLocationNo Loc = *OptLoc;
15991569

16001570
// Assumption: we're reading from the base of the stack slot, not some
16011571
// offset into it. It seems very unlikely LLVM would ever generate
@@ -1622,13 +1592,13 @@ bool InstrRefBasedLDV::transferSpillOrRestoreInst(MachineInstr &MI) {
16221592

16231593
for (MCSubRegIterator SRI(Reg, TRI, false); SRI.isValid(); ++SRI) {
16241594
unsigned Subreg = TRI->getSubRegIndex(Reg, *SRI);
1625-
unsigned SpillID = MTracker->getLocID(*Loc, Subreg);
1595+
unsigned SpillID = MTracker->getLocID(Loc, Subreg);
16261596
DoTransfer(*SRI, SpillID);
16271597
}
16281598

16291599
// Directly look up this registers slot idx by size, and transfer.
16301600
unsigned Size = TRI->getRegSizeInBits(Reg, *MRI);
1631-
unsigned SpillID = MTracker->getLocID(*Loc, {Size, 0});
1601+
unsigned SpillID = MTracker->getLocID(Loc, {Size, 0});
16321602
DoTransfer(Reg, SpillID);
16331603
}
16341604
return true;

llvm/lib/CodeGen/LiveDebugValues/InstrRefBasedImpl.h

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -616,9 +616,7 @@ class MLocTracker {
616616
void writeRegMask(const MachineOperand *MO, unsigned CurBB, unsigned InstID);
617617

618618
/// Find LocIdx for SpillLoc \p L, creating a new one if it's not tracked.
619-
/// Returns None when in scenarios where a spill slot could be tracked, but
620-
/// we would likely run into resource limitations.
621-
Optional<SpillLocationNo> getOrTrackSpillLoc(SpillLoc L);
619+
SpillLocationNo getOrTrackSpillLoc(SpillLoc L);
622620

623621
// Get LocIdx of a spill ID.
624622
LocIdx getSpillMLoc(unsigned SpillID) {
@@ -875,8 +873,7 @@ class InstrRefBasedLDV : public LDVImpl {
875873
StringRef StackProbeSymbolName;
876874

877875
/// Tests whether this instruction is a spill to a stack slot.
878-
Optional<SpillLocationNo> isSpillInstruction(const MachineInstr &MI,
879-
MachineFunction *MF);
876+
bool isSpillInstruction(const MachineInstr &MI, MachineFunction *MF);
880877

881878
/// Decide if @MI is a spill instruction and return true if it is. We use 2
882879
/// criteria to make this decision:
@@ -894,8 +891,7 @@ class InstrRefBasedLDV : public LDVImpl {
894891

895892
/// Given a spill instruction, extract the spill slot information, ensure it's
896893
/// tracked, and return the spill number.
897-
Optional<SpillLocationNo>
898-
extractSpillBaseRegAndOffset(const MachineInstr &MI);
894+
SpillLocationNo extractSpillBaseRegAndOffset(const MachineInstr &MI);
899895

900896
/// Observe a single instruction while stepping through a block.
901897
void process(MachineInstr &MI, ValueIDNum **MLiveOuts = nullptr,

llvm/test/DebugInfo/MIR/InstrRef/spill-slot-limits.mir

Lines changed: 0 additions & 88 deletions
This file was deleted.

0 commit comments

Comments
 (0)