48#include "llvm/Config/llvm-config.h"
68#define DEBUG_TYPE "livedebugvars"
74STATISTIC(NumInsertedDebugValues,
"Number of DBG_VALUEs inserted");
75STATISTIC(NumInsertedDebugLabels,
"Number of DBG_LABELs inserted");
76STATISTIC(NumStaleIndexes,
"Number of stale SlotIndexes repaired");
78 "Number of debug value intervals merged while repairing indexes");
83 "Debug Variable Analysis",
false,
false)
103class DbgVariableValue {
105 DbgVariableValue(ArrayRef<unsigned> NewLocs,
bool WasIndirect,
bool WasList,
106 const DIExpression &Expr)
107 : WasIndirect(WasIndirect), WasList(WasList), Expression(&Expr) {
108 assert(!(WasIndirect && WasList) &&
109 "DBG_VALUE_LISTs should not be indirect.");
110 SmallVector<unsigned> LocNoVec;
111 for (
unsigned LocNo : NewLocs) {
112 auto It =
find(LocNoVec, LocNo);
113 if (It == LocNoVec.
end())
118 unsigned OpIdx = LocNoVec.
size();
119 unsigned DuplicatingIdx = std::distance(LocNoVec.
begin(), It);
130 if (LocNoVec.
size() < 64) {
131 LocNoCount = LocNoVec.
size();
132 if (LocNoCount > 0) {
133 LocNos = std::make_unique<unsigned[]>(LocNoCount);
138 "locations, dropping...\n");
143 DIExpression::get(Expr.
getContext(), {dwarf::DW_OP_LLVM_arg, 0});
146 Expression, FragmentInfoOpt->OffsetInBits,
147 FragmentInfoOpt->SizeInBits);
148 LocNos = std::make_unique<unsigned[]>(LocNoCount);
153 DbgVariableValue() : LocNoCount(0), WasIndirect(
false), WasList(
false) {}
154 DbgVariableValue(
const DbgVariableValue &
Other)
155 : LocNoCount(
Other.LocNoCount), WasIndirect(
Other.getWasIndirect()),
156 WasList(
Other.getWasList()), Expression(
Other.getExpression()) {
157 if (
Other.getLocNoCount()) {
158 LocNos.reset(new unsigned[Other.getLocNoCount()]);
159 std::copy(Other.loc_nos_begin(), Other.loc_nos_end(), loc_nos_begin());
163 DbgVariableValue &operator=(
const DbgVariableValue &
Other) {
166 if (
Other.getLocNoCount()) {
167 LocNos.reset(
new unsigned[
Other.getLocNoCount()]);
168 std::copy(
Other.loc_nos_begin(),
Other.loc_nos_end(), loc_nos_begin());
172 LocNoCount =
Other.getLocNoCount();
173 WasIndirect =
Other.getWasIndirect();
174 WasList =
Other.getWasList();
175 Expression =
Other.getExpression();
179 const DIExpression *getExpression()
const {
return Expression; }
180 uint8_t getLocNoCount()
const {
return LocNoCount; }
181 bool containsLocNo(
unsigned LocNo)
const {
184 bool getWasIndirect()
const {
return WasIndirect; }
185 bool getWasList()
const {
return WasList; }
188 DbgVariableValue decrementLocNosAfterPivot(
unsigned Pivot)
const {
189 SmallVector<unsigned, 4> NewLocNos;
190 for (
unsigned LocNo : loc_nos())
193 return DbgVariableValue(NewLocNos, WasIndirect, WasList, *Expression);
196 DbgVariableValue remapLocNos(ArrayRef<unsigned> LocNoMap)
const {
197 SmallVector<unsigned> NewLocNos;
198 for (
unsigned LocNo : loc_nos())
202 return DbgVariableValue(NewLocNos, WasIndirect, WasList, *Expression);
205 DbgVariableValue changeLocNo(
unsigned OldLocNo,
unsigned NewLocNo)
const {
206 SmallVector<unsigned> NewLocNos;
207 NewLocNos.
assign(loc_nos_begin(), loc_nos_end());
208 auto OldLocIt =
find(NewLocNos, OldLocNo);
209 assert(OldLocIt != NewLocNos.
end() &&
"Old location must be present.");
210 *OldLocIt = NewLocNo;
211 return DbgVariableValue(NewLocNos, WasIndirect, WasList, *Expression);
214 bool hasLocNoGreaterThan(
unsigned LocNo)
const {
216 [LocNo](
unsigned ThisLocNo) {
return ThisLocNo > LocNo; });
219 void printLocNos(llvm::raw_ostream &OS)
const {
220 for (
const unsigned &Loc : loc_nos())
221 OS << (&Loc == loc_nos_begin() ?
" " :
", ") << Loc;
225 const DbgVariableValue &
RHS) {
226 if (std::tie(
LHS.LocNoCount,
LHS.WasIndirect,
LHS.WasList,
228 std::tie(
RHS.LocNoCount,
RHS.WasIndirect,
RHS.WasList,
RHS.Expression))
230 return std::equal(
LHS.loc_nos_begin(),
LHS.loc_nos_end(),
231 RHS.loc_nos_begin());
235 const DbgVariableValue &
RHS) {
239 unsigned *loc_nos_begin() {
return LocNos.get(); }
240 const unsigned *loc_nos_begin()
const {
return LocNos.get(); }
241 unsigned *loc_nos_end() {
return LocNos.get() + LocNoCount; }
242 const unsigned *loc_nos_end()
const {
return LocNos.get() + LocNoCount; }
243 ArrayRef<unsigned> loc_nos()
const {
244 return ArrayRef<unsigned>(LocNos.get(), LocNoCount);
253 std::unique_ptr<unsigned[]> LocNos;
254 uint8_t LocNoCount : 6;
255 bool WasIndirect : 1;
257 const DIExpression *Expression =
nullptr;
291 const std::optional<DIExpression::FragmentInfo>
Fragment;
295 UserValue *next =
nullptr;
330 UserValue *getLeader() {
331 UserValue *l = leader;
332 while (l != l->leader)
338 UserValue *getNext()
const {
return next; }
341 static UserValue *
merge(UserValue *L1, UserValue *L2) {
342 L2 = L2->getLeader();
345 L1 = L1->getLeader();
355 End->next = L1->next;
371 for (
unsigned i = 0, e = locations.
size(); i != e; ++i)
372 if (locations[i].
isReg() &&
374 locations[i].getSubReg() == LocMO.
getSubReg())
377 for (
unsigned i = 0, e = locations.
size(); i != e; ++i)
382 locations.
back().clearParent();
384 if (locations.
back().isReg()) {
385 if (locations.
back().isDef())
386 locations.
back().setIsDead(
false);
387 locations.
back().setIsUse();
389 return locations.
size() - 1;
394 void removeLocationIfUnused(
unsigned LocNo) {
396 for (LocMap::const_iterator
I = locInts.
begin();
I.valid(); ++
I) {
397 const DbgVariableValue &
DbgValue =
I.value();
404 for (LocMap::iterator
I = locInts.
begin();
I.valid(); ++
I) {
405 const DbgVariableValue &
DbgValue =
I.value();
406 if (
DbgValue.hasLocNoGreaterThan(LocNo))
407 I.setValueUnchecked(
DbgValue.decrementLocNosAfterPivot(LocNo));
412 void mapVirtRegs(
LDVImpl *LDV);
420 DbgVariableValue
DbgValue(Locs, IsIndirect, IsList, Expr);
422 LocMap::iterator
I = locInts.
find(Idx);
423 if (!
I.valid() ||
I.start() != Idx)
424 I.insert(Idx, Idx.getNextSlot(), std::move(
DbgValue));
447 SmallDenseMap<
unsigned, std::pair<LiveRange *, const VNInfo *>>
461 void addDefsFromCopies(
517 : Label(label), dl(std::move(L)), loc(Idx) {}
522 return Label == L && dl->getInlinedAt() == IA && loc == Index;
531 bool WasStale =
SI.isStaleIndex(loc);
532 loc =
SI.canonicalizeIndex(loc);
534 "Canonicalized label still refers to an erased instruction");
562 std::map<unsigned, PHIValPos> PHIValToPos;
581 bool EmitDone =
false;
584 bool ModifiedMF =
false;
594 VRMap virtRegToEqClass;
602 std::optional<DIExpression::FragmentInfo>
Fragment,
606 UserValue *lookupVirtReg(
Register VirtReg);
649 void computeIntervals();
661 StashedDebugInstrs.clear();
664 virtRegToEqClass.clear();
667 assert((!ModifiedMF || EmitDone) &&
668 "Dbg values are not emitted in LDV");
707 CommentOS << Scope->getFilename();
708 CommentOS <<
':' <<
DL.getLine();
709 if (
DL.getCol() != 0)
710 CommentOS <<
':' <<
DL.getCol();
735 OS << Res <<
"," << Line;
736 auto *InlinedAt =
DL ?
DL->getInlinedAt() :
nullptr;
738 if (
DebugLoc InlinedAtDL = InlinedAt) {
751 for (LocMap::const_iterator
I = locInts.begin();
I.valid(); ++
I) {
752 OS <<
" [" <<
I.start() <<
';' <<
I.stop() <<
"):";
753 if (
I.value().isUndef())
756 I.value().printLocNos(OS);
757 if (
I.value().getWasIndirect())
759 else if (
I.value().getWasList())
763 for (
unsigned i = 0, e = locations.size(); i != e; ++i) {
764 OS <<
" Loc" << i <<
'=';
765 locations[i].print(OS,
TRI);
780 OS <<
"********** DEBUG VARIABLES **********\n";
781 for (
auto &userValue : userValues)
782 userValue->print(OS, TRI);
783 OS <<
"********** DEBUG LABELS **********\n";
784 for (
auto &userLabel : userLabels)
785 userLabel->print(OS, TRI);
790 if (MO.isReg() && MO.getReg().isVirtual())
794UserValue *LiveDebugVariables::LDVImpl::getUserValue(
800 UserValue *&UV = userVarMap[ID];
802 userValues.push_back(
804 UV = userValues.back().get();
811 UserValue *&Leader = virtRegToEqClass[VirtReg];
812 Leader = UserValue::merge(Leader, EC);
815UserValue *LiveDebugVariables::LDVImpl::lookupVirtReg(
Register VirtReg) {
816 if (UserValue *UV = virtRegToEqClass.lookup(VirtReg))
817 return UV->getLeader();
821bool LiveDebugVariables::LDVImpl::handleDebugValue(
MachineInstr &
MI,
825 if (!
MI.isDebugValue()) {
829 if (!
MI.getDebugVariableOp().isMetadata()) {
830 LLVM_DEBUG(
dbgs() <<
"Can't handle DBG_VALUE* with invalid variable: "
834 if (
MI.isNonListDebugValue() &&
835 (
MI.getNumOperands() != 4 ||
836 !(
MI.getDebugOffset().isImm() ||
MI.getDebugOffset().isReg()))) {
845 bool Discard =
false;
846 for (
const MachineOperand &
Op :
MI.debug_operands()) {
847 if (
Op.isReg() &&
Op.getReg().isVirtual()) {
849 if (!LIS->hasInterval(
Reg)) {
853 LLVM_DEBUG(
dbgs() <<
"Discarding debug info (no LIS interval): " << Idx
859 const LiveInterval &LI = LIS->getInterval(
Reg);
860 LiveQueryResult LRQ = LI.
Query(Idx);
865 LLVM_DEBUG(
dbgs() <<
"Discarding debug info (reg not live): " << Idx
873 bool IsIndirect =
MI.isDebugOffsetImm();
875 assert(
MI.getDebugOffset().getImm() == 0 &&
876 "DBG_VALUE with nonzero offset");
877 bool IsList =
MI.isDebugValueList();
878 const DILocalVariable *Var =
MI.getDebugVariable();
879 const DIExpression *Expr =
MI.getDebugExpression();
884 MI.debug_operands().end()),
885 IsIndirect, IsList, *Expr);
892 SmallVector<MachineOperand, 4> UndefMOs(
MI.getNumDebugOperands(), MO);
893 UV->addDef(Idx, UndefMOs,
false, IsList, *Expr);
899LiveDebugVariables::LDVImpl::handleDebugInstr(MachineInstr &
MI, SlotIndex Idx) {
900 assert(
MI.isDebugValueLike() ||
MI.isDebugPHI());
904 if (
MI.isDebugValueLike())
906 [](
const MachineOperand &MO) {
907 return MO.isReg() && MO.getReg().isVirtual();
909 "MIs should not refer to Virtual Registers in InstrRef mode.");
912 auto NextInst = std::next(
MI.getIterator());
914 MI.removeFromParent();
919bool LiveDebugVariables::LDVImpl::handleDebugLabel(MachineInstr &
MI,
922 if (
MI.getNumOperands() != 1 || !
MI.getOperand(0).isMetadata()) {
928 const DILabel *
Label =
MI.getDebugLabel();
931 for (
auto const &L : userLabels) {
932 if (
L->matches(Label,
DL->getInlinedAt(), Idx)) {
938 userLabels.
push_back(std::make_unique<UserLabel>(Label,
DL, Idx));
943bool LiveDebugVariables::LDVImpl::collectDebugValues(
MachineFunction &mf,
946 for (MachineBasicBlock &
MBB : mf) {
951 if (!
MBBI->isDebugOrPseudoInstr()) {
959 ? LIS->getMBBStartIdx(&
MBB)
960 : LIS->getInstructionIndex(*std::prev(
MBBI)).getRegSlot();
966 if (InstrRef && (
MBBI->isNonListDebugValue() ||
MBBI->isDebugPHI() ||
967 MBBI->isDebugRef())) {
968 MBBI = handleDebugInstr(*
MBBI, Idx);
972 }
else if ((
MBBI->isDebugValue() && handleDebugValue(*
MBBI, Idx)) ||
973 (
MBBI->isDebugLabel() && handleDebugLabel(*
MBBI, Idx))) {
978 }
while (
MBBI != MBBE &&
MBBI->isDebugOrPseudoInstr());
984void UserValue::extendDef(
985 SlotIndex Idx, DbgVariableValue DbgValue,
986 SmallDenseMap<
unsigned, std::pair<LiveRange *, const VNInfo *>>
988 std::optional<std::pair<SlotIndex, SmallVector<unsigned>>> &Kills,
989 LiveIntervals &LIS) {
993 LocMap::iterator
I = locInts.find(Start);
996 for (
auto &LII : LiveIntervalInfo) {
998 assert(LR && LII.second.second &&
"Missing range info for Idx.");
1000 assert(Segment && Segment->
valno == LII.second.second &&
1001 "Invalid VNInfo for Idx given?");
1002 if (Segment->
end < Stop) {
1003 Stop = Segment->
end;
1004 Kills = {Stop, {LII.first}};
1005 }
else if (Segment->
end == Stop && Kills) {
1008 Kills->second.push_back(LII.first);
1013 if (
I.valid() &&
I.start() <= Start) {
1016 if (
I.value() != DbgValue ||
I.stop() != Start) {
1018 Kills = std::nullopt;
1026 if (
I.valid() &&
I.start() < Stop) {
1029 Kills = std::nullopt;
1033 DbgVariableValue ExtDbgValue(DbgValue);
1034 I.insert(Start, Stop, std::move(ExtDbgValue));
1038void UserValue::addDefsFromCopies(
1039 DbgVariableValue DbgValue,
1040 SmallVectorImpl<std::pair<unsigned, LiveInterval *>> &LocIntervals,
1042 SmallVectorImpl<std::pair<SlotIndex, DbgVariableValue>> &NewDefs,
1043 MachineRegisterInfo &MRI, LiveIntervals &LIS) {
1046 [](
auto LocI) {
return !LocI.second->reg().isVirtual(); }))
1050 SmallDenseMap<unsigned,
1053 for (
auto &LocInterval : LocIntervals) {
1054 unsigned LocNo = LocInterval.first;
1055 LiveInterval *LI = LocInterval.second;
1061 Register DstReg =
MI->getOperand(0).getReg();
1073 LocMap::iterator
I = locInts.find(
Idx.getRegSlot(
true));
1074 if (!
I.valid() ||
I.value() != DbgValue)
1081 assert(DstVNI && DstVNI->
def ==
Idx.getRegSlot() &&
"Bad copy value");
1082 CopyValues[LocNo].push_back(std::make_pair(DstLI, DstVNI));
1086 if (CopyValues.
empty())
1090 for (
auto &LocInterval : LocIntervals)
1091 LLVM_DEBUG(
dbgs() <<
"Got " << CopyValues[LocInterval.first].size()
1092 <<
" copies of " << *LocInterval.second <<
'\n');
1097 LocMap::iterator
I = locInts.find(KilledAt);
1098 if (
I.valid() &&
I.start() <= KilledAt)
1100 DbgVariableValue NewValue(DbgValue);
1101 for (
auto &LocInterval : LocIntervals) {
1102 unsigned LocNo = LocInterval.first;
1103 bool FoundCopy =
false;
1104 for (
auto &LIAndVNI : CopyValues[LocNo]) {
1105 LiveInterval *DstLI = LIAndVNI.first;
1106 const VNInfo *DstVNI = LIAndVNI.second;
1109 LLVM_DEBUG(
dbgs() <<
"Kill at " << KilledAt <<
" covered by valno #"
1110 << DstVNI->
id <<
" in " << *DstLI <<
'\n');
1112 assert(CopyMI && CopyMI->
isCopy() &&
"Bad copy value");
1113 unsigned NewLocNo = getLocationNo(CopyMI->
getOperand(0));
1114 NewValue = NewValue.changeLocNo(LocNo, NewLocNo);
1124 NewDefs.push_back(std::make_pair(KilledAt, NewValue));
1127void UserValue::computeIntervals(MachineRegisterInfo &MRI,
1128 const TargetRegisterInfo &
TRI,
1129 LiveIntervals &LIS, LexicalScopes &LS) {
1133 for (LocMap::const_iterator
I = locInts.begin();
I.valid(); ++
I)
1134 if (!
I.value().isUndef())
1135 Defs.
push_back(std::make_pair(
I.start(),
I.value()));
1138 for (
unsigned i = 0; i != Defs.
size(); ++i) {
1139 SlotIndex
Idx = Defs[i].first;
1140 DbgVariableValue DbgValue = Defs[i].second;
1141 SmallDenseMap<unsigned, std::pair<LiveRange *, const VNInfo *>> LIs;
1142 bool ShouldExtendDef =
false;
1143 for (
unsigned LocNo : DbgValue.loc_nos()) {
1144 const MachineOperand &LocMO = locations[LocNo];
1146 ShouldExtendDef |= !LocMO.
isReg();
1149 ShouldExtendDef =
true;
1150 LiveInterval *LI =
nullptr;
1151 const VNInfo *VNI =
nullptr;
1157 LIs[LocNo] = {LI, VNI};
1159 if (ShouldExtendDef) {
1160 std::optional<std::pair<SlotIndex, SmallVector<unsigned>>> Kills;
1161 extendDef(Idx, DbgValue, LIs, Kills, LIS);
1165 bool AnySubreg =
false;
1166 for (
unsigned LocNo : Kills->second) {
1167 const MachineOperand &LocMO = this->locations[LocNo];
1173 KilledLocIntervals.
push_back({LocNo, LI});
1185 addDefsFromCopies(DbgValue, KilledLocIntervals, Kills->first, Defs,
1205 if (!dl.getInlinedAt())
1208 LexicalScope *
Scope =
LS.findLexicalScope(dl);
1213 LocMap::iterator
I = locInts.begin();
1225 if (
Range.first ==
Range.first->getParent()->begin())
1230 if (PrevEnd &&
I.start() < PrevEnd) {
1231 SlotIndex IStop =
I.stop();
1232 DbgVariableValue DbgValue =
I.value();
1236 I.setStopUnchecked(PrevEnd);
1243 I.insert(RStart, IStop, DbgValue);
1247 I.advanceTo(RStart);
1251 if (
I.start() < RStart) {
1253 I.setStartUnchecked(RStart);
1255 trimmedDefs.insert(RStart);
1272 if (PrevEnd &&
I.start() < PrevEnd)
1273 I.setStopUnchecked(PrevEnd);
1276void LiveDebugVariables::LDVImpl::computeIntervals() {
1278 LS.scanFunction(*MF);
1280 for (
const auto &UV : userValues) {
1281 UV->computeIntervals(MF->getRegInfo(), *
TRI, *LIS, LS);
1282 UV->mapVirtRegs(
this);
1291 LLVM_DEBUG(
dbgs() <<
"********** COMPUTING LIVE DEBUG VARIABLES: "
1292 << mf.
getName() <<
" **********\n");
1294 bool Changed = collectDebugValues(mf, InstrRef);
1301 for (
const auto &PHIIt : MF->DebugPHIPositions) {
1305 unsigned SubReg = Position.SubReg;
1307 PHIValPos VP = {
SI, Reg, SubReg};
1308 PHIValToPos.insert(std::make_pair(PHIIt.first, VP));
1309 RegToPHIIdx[Reg].push_back(PHIIt.first);
1319 if (
MI.isDebugInstr())
1328 Impl = std::make_unique<LiveDebugVariables>();
1329 Impl->analyze(mf, LIS);
1342 LDV.analyze(MF, LIS);
1361 MachineFunctionAnalysisManager::Invalidator &) {
1366 return !PAC.preservedWhenStateless();
1377 PImpl.reset(
new LDVImpl(LIS));
1382 PImpl->runOnMachineFunction(MF, InstrRef);
1393 dbgs() <<
"Splitting Loc" << OldLocNo <<
'\t';
1396 bool DidChange =
false;
1397 LocMap::iterator LocMapI;
1398 LocMapI.setMap(locInts);
1409 if (!LocMapI.valid())
1413 while (LocMapI.valid() && LII != LIE) {
1415 LII = LI->
advanceTo(LII, LocMapI.start());
1420 if (LocMapI.value().containsLocNo(OldLocNo) &&
1421 LII->start < LocMapI.stop()) {
1425 MO.
setSubReg(locations[OldLocNo].getSubReg());
1426 NewLocNo = getLocationNo(MO);
1430 SlotIndex LStart = LocMapI.start();
1431 SlotIndex LStop = LocMapI.stop();
1432 DbgVariableValue OldDbgValue = LocMapI.value();
1435 if (LStart < LII->start)
1436 LocMapI.setStartUnchecked(LII->start);
1437 if (LStop > LII->end)
1438 LocMapI.setStopUnchecked(LII->end);
1441 LocMapI.setValue(OldDbgValue.changeLocNo(OldLocNo, NewLocNo));
1444 if (LStart < LocMapI.start()) {
1445 LocMapI.insert(LStart, LocMapI.start(), OldDbgValue);
1447 assert(LocMapI.valid() &&
"Unexpected coalescing");
1449 if (LStop > LocMapI.stop()) {
1451 LocMapI.insert(LII->end, LStop, OldDbgValue);
1457 if (LII->end < LocMapI.stop()) {
1460 LocMapI.advanceTo(LII->start);
1463 if (!LocMapI.valid())
1465 LII = LI->
advanceTo(LII, LocMapI.start());
1480 removeLocationIfUnused(OldLocNo);
1483 dbgs() <<
"Split result: \t";
1491 LiveIntervals &LIS) {
1492 bool DidChange =
false;
1495 for (
unsigned i = locations.size(); i ; --i) {
1496 unsigned LocNo = i-1;
1497 const MachineOperand *Loc = &locations[LocNo];
1500 DidChange |= splitLocation(LocNo, NewRegs, LIS);
1507 auto RegIt = RegToPHIIdx.find(OldReg);
1508 if (RegIt == RegToPHIIdx.end())
1511 std::vector<std::pair<Register, unsigned>> NewRegIdxes;
1513 for (
unsigned InstrID : RegIt->second) {
1514 auto PHIIt = PHIValToPos.find(InstrID);
1515 assert(PHIIt != PHIValToPos.end());
1516 const SlotIndex &Slot = PHIIt->second.SI;
1517 assert(OldReg == PHIIt->second.Reg);
1520 for (
auto NewReg : NewRegs) {
1522 auto LII = LI.
find(Slot);
1523 if (LII != LI.
end() && LII->start <= Slot) {
1525 NewRegIdxes.push_back(std::make_pair(NewReg, InstrID));
1527 PHIIt->second.Reg = NewReg;
1539 RegToPHIIdx.erase(RegIt);
1540 for (
auto &RegAndInstr : NewRegIdxes)
1541 RegToPHIIdx[RegAndInstr.first].push_back(RegAndInstr.second);
1551 bool DidChange =
false;
1552 for (UserValue *UV = lookupVirtReg(OldReg); UV; UV = UV->getNext())
1553 DidChange |= UV->splitRegister(OldReg, NewRegs, *LIS);
1559 UserValue *UV = lookupVirtReg(OldReg);
1567 PImpl->splitRegister(OldReg, NewRegs);
1575 unsigned NumStale = 0;
1576 for (LocMap::const_iterator
I = locInts.begin();
I.valid(); ++
I)
1577 NumStale +=
SI.isStaleIndex(
I.start()) +
SI.isStaleIndex(
I.stop());
1579 NumStale +=
SI.isStaleIndex(Idx);
1580 NumStaleIndexes += NumStale;
1586 if (!trimmedDefs.empty()) {
1588 trimmedDefs.clear();
1591 if (!
SI.isBlockBoundaryIndex(Canon))
1592 trimmedDefs.insert(Canon);
1599 struct CanonicalInterval {
1602 DbgVariableValue
Value;
1606 for (LocMap::const_iterator
I = locInts.begin();
I.valid(); ++
I) {
1607 SlotIndex
Start =
SI.canonicalizeIndex(
I.start());
1608 SlotIndex Stop =
SI.canonicalizeIndex(
I.stop());
1615 if (!Intervals.
empty()) {
1616 CanonicalInterval &Prev = Intervals.
back();
1617 if (Start <= Prev.Start) {
1620 Prev.Stop = std::max(Prev.Stop, Stop);
1621 Prev.Value =
I.value();
1622 ++NumMergedIntervals;
1625 Prev.Stop = std::min(Prev.Stop, Start);
1633 for (CanonicalInterval &
Interval : Intervals) {
1638 "No room left for a canonicalized interval");
1642 for (
const CanonicalInterval &
Interval : Intervals)
1647 for (LocMap::const_iterator
I = locInts.begin();
I.valid(); ++
I)
1648 assert(!
SI.isStaleIndex(
I.start()) && !
SI.isStaleIndex(
I.stop()) &&
1649 "Canonicalized interval still refers to an erased instruction");
1650 for (SlotIndex Idx : trimmedDefs)
1652 "Canonicalized trimmed def still refers to an erased instruction");
1657 for (
auto &userValue : userValues)
1658 userValue->canonicalizeIndexes(
SI);
1659 for (
auto &userLabel : userLabels)
1660 NumStaleIndexes += userLabel->canonicalizeIndex(
SI);
1666 for (InstrPos &Stashed : StashedDebugInstrs) {
1667 if (!
SI.isStaleIndex(Stashed.Idx))
1670 Stashed.Idx =
SI.canonicalizeIndex(Stashed.Idx);
1671 assert(!
SI.isStaleIndex(Stashed.Idx) &&
1672 "Canonicalized debug instr still refers to an erased instruction");
1678 for (
const auto &
P : PHIValToPos)
1680 "PHI position refers to an erased instruction");
1686 PImpl->canonicalizeIndexes(
SI);
1703 for (
unsigned I = 0, E = locations.size();
I != E; ++
I) {
1704 bool Spilled =
false;
1705 unsigned SpillOffset = 0;
1708 if (
Loc.isReg() &&
Loc.getReg() &&
Loc.getReg().isVirtual()) {
1720 bool Success =
TII.getStackSlotRange(TRC,
Loc.getSubReg(), SpillSize,
1736 auto InsertResult = NewLocations.
insert({Loc, {Spilled, SpillOffset}});
1737 unsigned NewLocNo = std::distance(NewLocations.
begin(), InsertResult.first);
1738 LocNoMap[
I] = NewLocNo;
1743 SpillOffsets.
clear();
1744 for (
auto &Pair : NewLocations) {
1746 unsigned SpillOffset;
1747 std::tie(Spilled, SpillOffset) = Pair.second;
1748 locations.push_back(Pair.first);
1750 unsigned NewLocNo = std::distance(&*NewLocations.begin(), &Pair);
1751 SpillOffsets[NewLocNo] = SpillOffset;
1759 for (LocMap::iterator
I = locInts.begin();
I.valid(); ++
I) {
1760 I.setValueUnchecked(
I.value().remapLocNos(LocNoMap));
1761 I.setStart(
I.start());
1770 Idx = Idx.getBaseIndex();
1792 auto MapIt = BBSkipInstsMap.
find(
MBB);
1793 if (MapIt == BBSkipInstsMap.
end())
1794 BeginIt =
MBB->begin();
1796 BeginIt = std::next(MapIt->second);
1797 auto I =
MBB->SkipPHIsLabelsAndDebug(BeginIt);
1799 BBSkipInstsMap[
MBB] = std::prev(
I);
1802 Idx = Idx.getPrevIndex();
1806 auto It =
MI->isTerminator() ?
MBB->getFirstTerminator()
1822 return MBB->instr_end();
1825 while (
I !=
MBB->end() && !
I->isTerminator()) {
1830 return I->definesRegister(
Reg, &
TRI);
1833 return std::next(
I);
1839void UserValue::insertDebugValue(MachineBasicBlock *
MBB, SlotIndex StartIdx,
1840 SlotIndex StopIdx, DbgVariableValue DbgValue,
1842 ArrayRef<unsigned> SpillOffsets,
1843 LiveIntervals &LIS,
const TargetInstrInfo &
TII,
1844 const TargetRegisterInfo &
TRI,
1848 StopIdx = (MBBEndIdx < StopIdx) ? MBBEndIdx : StopIdx;
1854 if (DbgValue.isUndef()) {
1855 MOs.
assign(DbgValue.loc_nos().size(),
1862 for (
unsigned LocNo : DbgValue.loc_nos())
1866 ++NumInsertedDebugValues;
1870 "Expected inlined-at fields to agree");
1876 const DIExpression *Expr = DbgValue.getExpression();
1877 bool IsIndirect = DbgValue.getWasIndirect();
1878 bool IsList = DbgValue.getWasList();
1879 for (
unsigned I = 0,
E = LocSpills.
size();
I !=
E; ++
I) {
1888 SmallVector<uint64_t, 4>
Ops;
1890 Ops.push_back(dwarf::DW_OP_deref);
1895 assert((!LocSpills[
I] || MOs[
I].isFI()) &&
1896 "a spilled location must be a frame index");
1899 unsigned DbgValueOpcode =
1900 IsList ? TargetOpcode::DBG_VALUE_LIST : TargetOpcode::DBG_VALUE;
1911void UserLabel::insertDebugLabel(MachineBasicBlock *
MBB, SlotIndex Idx,
1912 LiveIntervals &LIS,
const TargetInstrInfo &
TII,
1916 ++NumInsertedDebugLabels;
1921void UserValue::emitDebugValues(VirtRegMap *VRM, LiveIntervals &LIS,
1922 const TargetInstrInfo &
TII,
1923 const TargetRegisterInfo &
TRI,
1928 for (LocMap::const_iterator
I = locInts.begin();
I.valid();) {
1929 SlotIndex
Start =
I.start();
1930 SlotIndex Stop =
I.stop();
1931 DbgVariableValue DbgValue =
I.value();
1933 SmallVector<bool> SpilledLocs;
1934 SmallVector<unsigned> LocSpillOffsets;
1935 for (
unsigned LocNo : DbgValue.loc_nos()) {
1937 !DbgValue.isUndef() ? SpillOffsets.
find(LocNo) : SpillOffsets.
end();
1938 bool Spilled = SpillIt != SpillOffsets.
end();
1940 LocSpillOffsets.
push_back(Spilled ? SpillIt->second : 0);
1946 if (trimmedDefs.count(Start))
1950 DbgValue.printLocNos(dbg));
1955 insertDebugValue(&*
MBB, Start, Stop, DbgValue, SpilledLocs, LocSpillOffsets,
1956 LIS,
TII,
TRI, BBSkipInstsMap);
1959 while (Stop > MBBEnd) {
1966 insertDebugValue(&*
MBB, Start, Stop, DbgValue, SpilledLocs,
1967 LocSpillOffsets, LIS,
TII,
TRI, BBSkipInstsMap);
1977void UserLabel::emitDebugLabel(LiveIntervals &LIS,
const TargetInstrInfo &
TII,
1983 insertDebugLabel(&*
MBB, loc, LIS,
TII, BBSkipInstsMap);
1989 LLVM_DEBUG(
dbgs() <<
"********** EMITTING LIVE DEBUG VARIABLES **********\n");
1999 for (
auto &userValue : userValues) {
2001 userValue->rewriteLocations(*VRM, *MF, *
TII, *TRI, SpillOffsets);
2002 userValue->emitDebugValues(VRM, *LIS, *
TII, *TRI, SpillOffsets,
2005 LLVM_DEBUG(
dbgs() <<
"********** EMITTING LIVE DEBUG LABELS **********\n");
2006 for (
auto &userLabel : userLabels) {
2008 userLabel->emitDebugLabel(*LIS, *
TII, BBSkipInstsMap);
2011 LLVM_DEBUG(
dbgs() <<
"********** EMITTING DEBUG PHIS **********\n");
2013 auto Slots = LIS->getSlotIndexes();
2014 for (
auto &It : PHIValToPos) {
2017 unsigned InstNum = It.first;
2018 auto Slot = It.second.SI;
2020 unsigned SubReg = It.second.SubReg;
2024 unsigned PhysReg = VRM->
getPhys(Reg);
2026 PhysReg = TRI->getSubReg(PhysReg, SubReg);
2029 TII->get(TargetOpcode::DBG_PHI));
2030 Builder.addReg(PhysReg);
2031 Builder.addImm(InstNum);
2035 unsigned SpillSize, SpillOffset;
2037 unsigned regSizeInBits = TRI->getRegSizeInBits(*TRC);
2039 regSizeInBits = TRI->getSubRegIdxSize(SubReg);
2045 TII->getStackSlotRange(TRC, SubReg, SpillSize, SpillOffset, *MF);
2047 if (
Success && SpillOffset == 0) {
2049 TII->get(TargetOpcode::DBG_PHI));
2051 Builder.addImm(InstNum);
2055 Builder.addImm(regSizeInBits);
2060 <<
" has nonzero offset\n";
2066 MF->DebugPHIPositions.clear();
2068 LLVM_DEBUG(
dbgs() <<
"********** EMITTING INSTR REFERENCES **********\n");
2076 for (
auto *StashIt = StashedDebugInstrs.begin();
2077 StashIt != StashedDebugInstrs.end(); ++StashIt) {
2082 auto EmitInstsHere = [
this, &StashIt,
MBB, Idx,
2085 MBB->insert(InsertPos,
MI);
2089 auto NextItem = std::next(StashIt);
2090 while (NextItem != StashedDebugInstrs.end() && NextItem->Idx == Idx) {
2091 assert(NextItem->MBB ==
MBB &&
"Instrs with same slot index should be"
2092 "in the same block");
2093 MBB->insert(InsertPos, NextItem->MI);
2095 NextItem = std::next(StashIt);
2101 if (Idx == Slots->getMBBStartIdx(
MBB)) {
2104 EmitInstsHere(InsertPos);
2108 if (
MachineInstr *Pos = Slots->getInstructionFromIndex(Idx)) {
2112 EmitInstsHere(PostDebug);
2117 for (; Idx < End; Idx = Slots->getNextNonNullIndex(Idx)) {
2118 Pos = Slots->getInstructionFromIndex(Idx);
2120 EmitInstsHere(Pos->getIterator());
2129 auto TermIt =
MBB->getFirstTerminator();
2130 EmitInstsHere(TermIt);
2136 BBSkipInstsMap.
clear();
2141 PImpl->emitDebugValues(VRM);
2144#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
MachineBasicBlock MachineBasicBlock::iterator MBBI
Function Alias Analysis false
static void print(raw_ostream &Out, object::Archive::Kind Kind, T Val)
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
#define LLVM_DUMP_METHOD
Mark debug helper function definitions like dump() that should not be stripped from debug builds.
This file defines the DenseMap class.
This file contains constants used for implementing Dwarf debug support.
const HexagonInstrInfo * TII
This file implements a coalescing interval map for small objects.
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
static void printExtendedName(raw_ostream &OS, const DINode *Node, const DILocation *DL)
static MachineBasicBlock::iterator findInsertLocation(MachineBasicBlock *MBB, SlotIndex Idx, LiveIntervals &LIS, BlockSkipInstsMap &BBSkipInstsMap)
Find an iterator for inserting a DBG_VALUE instruction.
static MachineBasicBlock::iterator findNextInsertLocation(MachineBasicBlock *MBB, MachineBasicBlock::iterator I, SlotIndex StopIdx, ArrayRef< MachineOperand > LocMOs, LiveIntervals &LIS, const TargetRegisterInfo &TRI)
Find an iterator for inserting the next DBG_VALUE instruction (or end if no more insert locations fou...
DenseMap< MachineBasicBlock *, MachineBasicBlock::iterator > BlockSkipInstsMap
Cache to save the location where it can be used as the starting position as input for calling Machine...
IntervalMap< SlotIndex, DbgVariableValue, 4 > LocMap
Map of where a user value is live to that value.
static cl::opt< bool > EnableLDV("live-debug-variables", cl::init(true), cl::desc("Enable the live debug variables pass"), cl::Hidden)
static void printDebugLoc(const DebugLoc &DL, raw_ostream &CommentOS, const LLVMContext &Ctx)
DenseMap< unsigned, unsigned > SpillOffsetMap
Map of stack slot offsets for spilled locations.
static void removeDebugInstrs(MachineFunction &mf)
static LoopDeletionResult merge(LoopDeletionResult A, LoopDeletionResult B)
static bool isUndef(const MachineInstr &MI)
Register const TargetRegisterInfo * TRI
This file implements a map that provides insertion order iteration.
std::pair< uint64_t, uint64_t > Interval
Promote Memory to Register
static MCRegister getReg(const MCDisassembler *D, unsigned RC, unsigned RegNo)
static bool isReg(const MCInst &MI, unsigned OpNo)
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
#define INITIALIZE_PASS_DEPENDENCY(depName)
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
SI Optimize VGPR LiveRange
This file defines the SmallSet class.
This file defines the SmallVector class.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
Class recording the (high level) value of a variable.
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
Represent the analysis usage information of a pass.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
Get the array size.
static LLVM_ABI void appendOffset(SmallVectorImpl< uint64_t > &Ops, int64_t Offset)
Append Ops with operations to apply the Offset.
static LLVM_ABI DIExpression * appendOpsToArg(const DIExpression *Expr, ArrayRef< uint64_t > Ops, unsigned ArgNo, bool StackValue=false)
Create a copy of Expr by appending the given list of Ops to each instance of the operand DW_OP_LLVM_a...
static LLVM_ABI std::optional< FragmentInfo > getFragmentInfo(expr_op_iterator Start, expr_op_iterator End)
Retrieve the details of this fragment expression.
static LLVM_ABI DIExpression * replaceArg(const DIExpression *Expr, uint64_t OldArg, uint64_t NewArg)
Create a copy of Expr with each instance of DW_OP_LLVM_arg, \p OldArg replaced with DW_OP_LLVM_arg,...
static LLVM_ABI std::optional< DIExpression * > createFragmentExpression(const DIExpression *Expr, unsigned OffsetInBits, unsigned SizeInBits)
Create a DIExpression to describe one part of an aggregate variable that is fragmented across multipl...
static LLVM_ABI DIExpression * prepend(const DIExpression *Expr, uint8_t Flags, int64_t Offset=0)
Prepend DIExpr with a deref and offset operation and optionally turn it into a stack value or/and an ...
Tagged DWARF-like metadata node.
Identifies a unique instance of a variable.
iterator find(const_arg_type_t< KeyT > Val)
DISubprogram * getSubprogram() const
Get the attached subprogram.
const_iterator begin() const
typename Sizer::Allocator Allocator
const_iterator find(KeyT x) const
find - Return an iterator pointing to the first interval ending at or after x, or end().
This is an important class for using LLVM in a threaded context.
This class provides interface to collect and use lexical scoping information from machine instruction...
LLVM_ABI Result run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM)
LLVM_ABI PreservedAnalyses run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM)
LiveDebugVariablesWrapperLegacy()
bool runOnMachineFunction(MachineFunction &) override
runOnMachineFunction - This method must be overloaded to perform the desired machine code transformat...
void getAnalysisUsage(AnalysisUsage &) const override
getAnalysisUsage - This function should be overriden by passes that need analysis information to do t...
LDVImpl(LiveIntervals *LIS)
void print(raw_ostream &)
void splitRegister(Register OldReg, ArrayRef< Register > NewRegs)
Replace all references to OldReg with NewRegs.
bool runOnMachineFunction(MachineFunction &mf, bool InstrRef)
void mapVirtReg(Register VirtReg, UserValue *EC)
Map virtual register to an equivalence class.
void clear()
Release all memory.
void canonicalizeIndexes(const SlotIndexes &SI)
Replace every stale index held by this analysis.
void emitDebugValues(VirtRegMap *VRM)
Recreate DBG_VALUE instruction from data structures.
void splitPHIRegister(Register OldReg, ArrayRef< Register > NewRegs)
Replace any PHI referring to OldReg with its corresponding NewReg, if present.
LLVM_ABI void canonicalizeIndexes(const SlotIndexes &SI)
canonicalizeIndexes - Replace every SlotIndex held by this analysis that refers to an erased instruct...
LLVM_ABI ~LiveDebugVariables()
void dump() const
dump - Print data structures to dbgs().
LLVM_ABI void splitRegister(Register OldReg, ArrayRef< Register > NewRegs, LiveIntervals &LIS)
splitRegister - Move any user variables in OldReg to the live ranges in NewRegs where they are live.
LLVM_ABI LiveDebugVariables()
Implementation of the LiveDebugVariables pass.
LLVM_ABI void print(raw_ostream &OS) const
LLVM_ABI void analyze(MachineFunction &MF, LiveIntervals *LIS)
LLVM_ABI void releaseMemory()
LLVM_ABI void emitDebugValues(VirtRegMap *VRM)
emitDebugValues - Emit new DBG_VALUE instructions reflecting the changes that happened during registe...
LLVM_ABI bool invalidate(MachineFunction &MF, const PreservedAnalyses &PA, MachineFunctionAnalysisManager::Invalidator &Inv)
LiveInterval - This class represents the liveness of a register, or stack slot.
bool hasInterval(Register Reg) const
SlotIndex getMBBStartIdx(const MachineBasicBlock *mbb) const
Return the first index in the given basic block.
MachineInstr * getInstructionFromIndex(SlotIndex index) const
Returns the instruction associated with the given index.
SlotIndexes * getSlotIndexes() const
SlotIndex getInstructionIndex(const MachineInstr &Instr) const
Returns the base index of the given instruction.
SlotIndex getMBBEndIdx(const MachineBasicBlock *mbb) const
Return the last index in the given basic block.
LiveInterval & getInterval(Register Reg)
bool isNotInMIMap(const MachineInstr &Instr) const
Returns true if the specified machine instr has been removed or was never entered in the map.
MachineBasicBlock * getMBBFromIndex(SlotIndex index) const
VNInfo * valueOutOrDead() const
Returns the value alive at the end of the instruction, if any.
Segments::iterator iterator
const Segment * getSegmentContaining(SlotIndex Idx) const
Return the segment that contains the specified index, or null if there is none.
iterator advanceTo(iterator I, SlotIndex Pos)
advanceTo - Advance the specified iterator to point to the Segment containing the specified position,...
LiveQueryResult Query(SlotIndex Idx) const
Query Liveness at Idx.
SlotIndex beginIndex() const
beginIndex - Return the lowest numbered slot covered.
VNInfo * getVNInfoAt(SlotIndex Idx) const
getVNInfoAt - Return the VNInfo that is live at Idx, or NULL.
LLVM_ABI iterator find(SlotIndex Pos)
find - Return an iterator pointing to the first segment that ends after Pos, or end().
LLVMContext & getContext() const
An RAII based helper class to modify MachineFunctionProperties when running pass.
void push_back(MachineInstr *MI)
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
LLVM_ABI instr_iterator erase(instr_iterator I)
Remove an instruction from the instruction list and delete it.
MachineInstrBundleIterator< MachineInstr > iterator
MachineFunctionPass(char &ID)
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
Location of a PHI instruction that is also a debug-info variable value, for the duration of register ...
bool useDebugInstrRef() const
Returns true if the function's variable locations are tracked with instruction referencing.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
StringRef getName() const
getName - Return the name of the corresponding LLVM function.
void push_back(MachineBasicBlock *MBB)
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
Function & getFunction()
Return the LLVM function that this machine code represents.
BasicBlockListType::iterator iterator
const MachineInstrBuilder & addMetadata(const MDNode *MD) const
Representation of each machine instruction.
const MachineOperand & getOperand(unsigned i) const
MachineOperand class - Representation of each machine instruction operand.
void setSubReg(unsigned subReg)
unsigned getSubReg() const
bool isReg() const
isReg - Tests if this is a MO_Register operand.
LLVM_ABI void setReg(Register Reg)
Change the register this operand corresponds to.
MachineInstr * getParent()
getParent - Return the instruction that this operand belongs to.
void setIsDebug(bool Val=true)
Register getReg() const
getReg - Returns the register number.
LLVM_ABI bool isIdenticalTo(const MachineOperand &Other) const
Returns true if this operand is identical to the specified operand except for liveness related flags ...
static MachineOperand CreateReg(Register Reg, bool isDef, bool isImp=false, bool isKill=false, bool isDead=false, bool isUndef=false, bool isEarlyClobber=false, unsigned SubReg=0, bool isDebug=false, bool isInternalRead=false, bool isRenamable=false)
static MachineOperand CreateFI(int Idx)
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
const TargetRegisterClass * getRegClass(Register Reg) const
Return the register class of the specified virtual register.
iterator_range< use_nodbg_iterator > use_nodbg_operands(Register Reg) const
This class implements a map that also provides access to all stored values in a deterministic order.
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
AnalysisType & getAnalysis() const
getAnalysis<AnalysisType>() - This function is used by subclasses to get to the analysis information ...
A set of analyses that are preserved following a run of a transformation pass.
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
PreservedAnalysisChecker getChecker() const
Build a checker for this PreservedAnalyses and the specified analysis type.
Wrapper class representing virtual and physical registers.
constexpr bool isVirtual() const
Return true if the specified register number is in the virtual register namespace.
SlotIndex - An opaque wrapper around machine indexes.
SlotIndex getNextIndex() const
Returns the next index.
static bool isEarlierEqualInstr(SlotIndex A, SlotIndex B)
Return true if A refers to the same instruction as B or an earlier one.
SlotIndex getNextSlot() const
Returns the next slot in the index list.
SlotIndex getIndexBefore(const MachineInstr &MI) const
getIndexBefore - Returns the index of the last indexed instruction before MI, or the start index of i...
SlotIndex getMBBStartIdx(const MachineBasicBlock *mbb) const
Returns the first index in the given basic block.
SmallSet - This maintains a set of unique values, optimizing for the case when the set is small (less...
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void assign(size_type NumElts, ValueParamT Elt)
iterator erase(const_iterator CI)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Represent a constant reference to a string, i.e.
constexpr bool empty() const
Check if the string is empty.
TargetInstrInfo - Interface to description of machine instruction set.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
virtual const TargetRegisterInfo * getRegisterInfo() const =0
Return the target's register information.
unsigned id
The ID number of this value.
SlotIndex def
The index of the defining instruction.
int getStackSlot(Register virtReg) const
returns the stack slot mapped to the specified virtual register
MachineFunction & getMachineFunction() const
MCRegister getPhys(Register virtReg) const
returns the physical register mapped to the specified virtual register
bool hasPhys(Register virtReg) const
returns true if the specified virtual register is mapped to a physical register
bool isAssignedReg(Register virtReg) const
returns true if the specified virtual register is not mapped to a stack slot or rematerialized.
static constexpr int NO_STACK_SLOT
self_iterator getIterator()
This class implements an extremely fast bulk output stream that can only output to a stream.
initializer< Ty > init(const Ty &Val)
Scope
Defines the scope in which this symbol should be visible: Default – Visible in the public interface o...
This is an optimization pass for GlobalISel generic memory operations.
auto find(R &&Range, const T &Val)
Provide wrappers to std::find which take ranges instead of having to pass begin/end explicitly.
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
bool operator!=(uint64_t V1, const APInt &V2)
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
AnalysisManager< MachineFunction > MachineFunctionAnalysisManager
bool operator==(const AddressRangeValuePair &LHS, const AddressRangeValuePair &RHS)
std::pair< const MachineInstr *, const MachineInstr * > InsnRange
This is used to track range of instructions with identical lexical scope.
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
IterT skipDebugInstructionsForward(IterT It, IterT End, bool SkipPseudoOp=true)
Increment It until it points to a non-debug instruction or to End and return the resulting iterator.
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
bool none_of(R &&Range, UnaryPredicate P)
Provide wrappers to std::none_of which take ranges instead of having to pass begin/end explicitly.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
@ Success
The lock was released successfully.
DWARFExpression::Operation Op
ArrayRef(const T &OneElt) -> ArrayRef< T >
OutputIt copy(R &&Range, OutputIt Out)
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
LLVM_ABI Printable printReg(Register Reg, const TargetRegisterInfo *TRI=nullptr, unsigned SubIdx=0, const MachineRegisterInfo *MRI=nullptr)
Prints virtual and physical registers with or without a TRI instance.
LLVM_ABI Printable printMBBReference(const MachineBasicBlock &MBB)
Prints a machine basic block reference.
MCRegisterClass TargetRegisterClass
A special type used by analysis passes to provide an address that identifies that particular analysis...