@@ -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
922902InstrRefBasedLDV::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
14911460bool 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 ;
0 commit comments