40#include "llvm/Config/llvm-config.h"
61#define DEBUG_TYPE "regalloc"
64 "Number of intervals removed for unreferenced virtual registers");
80 OS <<
"Live intervals for machine function: " << MF.
getName() <<
":\n";
88 "Live Interval Analysis",
false,
false)
105 cl::desc(
"Eagerly compute live intervals for all physreg units."));
113 "Use segment set for the computation of the live ranges of physregs."));
132 MachineFunctionAnalysisManager::Invalidator &Inv) {
144void LiveIntervals::clear() {
146 for (
unsigned i = 0, e = VirtRegIntervals.size(); i != e; ++i)
148 VirtRegIntervals.clear();
149 RegMaskSlots.clear();
151 RegMaskBlocks.
clear();
155 RegUnitRanges.clear();
158 VNInfoAllocator.Reset();
168 LICalc = std::make_unique<LiveIntervalCalc>();
171 VirtRegIntervals.resize(
MRI->getNumVirtRegs());
175 computeLiveInRegUnits();
180 for (MCRegUnit Unit :
TRI->regunits())
186 unsigned Removed = 0;
187 for (
unsigned I = 0, E = MRI->getNumVirtRegs();
I != E; ++
I) {
194 NumUnreferencedIntervals += Removed;
199 OS <<
"********** INTERVALS **********\n";
202 for (
unsigned Unit = 0, UnitE = RegUnitRanges.size(); Unit != UnitE; ++Unit)
204 OS << printRegUnit(static_cast<MCRegUnit>(Unit), TRI) <<
' ' << *LR
208 for (
unsigned i = 0, e = MRI->getNumVirtRegs(); i != e; ++i) {
222void LiveIntervals::printInstrs(
raw_ostream &OS)
const {
223 OS <<
"********** MACHINEINSTRS **********\n";
224 MF->
print(OS, Indexes);
227#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
233#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
242LiveRange *LiveIntervals::createRegUnitRange() {
248bool LiveIntervals::computeVirtRegInterval(
LiveInterval &LI) {
249 assert(LICalc &&
"LICalc not initialized.");
250 assert(LI.
empty() &&
"Should only compute empty intervals.");
252 LICalc->calculate(LI, MRI->shouldTrackSubRegLiveness(LI.
reg()));
253 return computeDeadValues(LI,
nullptr);
256void LiveIntervals::computeVirtRegs() {
257 for (
unsigned i = 0, e = MRI->getNumVirtRegs(); i != e; ++i) {
259 if (MRI->reg_nodbg_empty(
Reg))
262 bool NeedSplit = computeVirtRegInterval(LI);
270void LiveIntervals::computeRegMasks() {
271 RegMaskBlocks.resize(MF->getNumBlockIDs());
274 for (
const MachineBasicBlock &
MBB : *MF) {
275 std::pair<unsigned, unsigned> &RMB = RegMaskBlocks[
MBB.
getNumber()];
276 RMB.first = RegMaskSlots.size();
280 RegMaskSlots.push_back(Indexes->getMBBStartIdx(&
MBB));
281 RegMaskBits.push_back(Mask);
288 if (
auto *Mask = TRI->getCustomEHPadPreservedMask(*
MBB.
getParent())) {
289 RegMaskSlots.push_back(Indexes->getMBBStartIdx(&
MBB));
290 RegMaskBits.push_back(Mask);
293 for (
const MachineInstr &
MI :
MBB) {
294 for (
const MachineOperand &MO :
MI.operands()) {
297 RegMaskSlots.push_back(Indexes->getInstructionIndex(
MI).getRegSlot());
298 RegMaskBits.push_back(MO.getRegMask());
307 RegMaskSlots.push_back(
308 Indexes->getInstructionIndex(
MBB.
back()).getRegSlot());
309 RegMaskBits.push_back(Mask);
313 RMB.second = RegMaskSlots.size() - RMB.first;
319 assert(&Orig != &SplitBB &&
"expected distinct blocks");
320 std::pair<unsigned, unsigned> &OrigRMB = RegMaskBlocks[Orig.
getNumber()];
321 std::pair<unsigned, unsigned> &SplitRMB = RegMaskBlocks[SplitBB.
getNumber()];
329 if (KeptCount == OrigRMB.second)
332 SplitRMB.first = OrigRMB.first + KeptCount;
333 SplitRMB.second = OrigRMB.second - KeptCount;
334 OrigRMB.second = KeptCount;
337void LiveIntervals::insertMBBInMapsImpl(
339#ifdef EXPENSIVE_CHECKS
340 assert((!AssumeRegMaskEmpty ||
342 [](
const MachineInstr &
MI) {
343 return any_of(
MI.operands(), [](
const MachineOperand &MO) {
344 return MO.isRegMask();
347 "insertMBBInMaps expects a block with no regmask operands; use "
348 "LiveIntervals::splitAt() to split a block containing calls");
350 Indexes->insertMBBInMaps(
MBB);
352 "Blocks must be added in order.");
353 RegMaskBlocks.push_back(std::make_pair(RegMaskSlots.size(), 0));
370void LiveIntervals::computeRegUnitRange(
LiveRange &LR, MCRegUnit Unit) {
371 assert(LICalc &&
"LICalc not initialized.");
379 bool IsReserved =
false;
380 for (MCRegUnitRootIterator Root(Unit, TRI); Root.isValid(); ++Root) {
381 bool IsRootReserved =
true;
383 if (!MRI->reg_empty(
Reg))
384 LICalc->createDeadDefs(LR,
Reg);
387 if (!MRI->isReserved(
Reg))
388 IsRootReserved =
false;
390 IsReserved |= IsRootReserved;
392 assert(IsReserved == MRI->isReservedRegUnit(Unit) &&
393 "reserved computation mismatch");
398 for (MCRegUnitRootIterator Root(Unit, TRI); Root.isValid(); ++Root) {
400 if (!MRI->reg_empty(
Reg))
401 LICalc->extendToUses(LR,
Reg);
414void LiveIntervals::computeLiveInRegUnits() {
415 RegUnitRanges.resize(TRI->getNumRegUnits());
416 LLVM_DEBUG(
dbgs() <<
"Computing live-in reg-units in ABI blocks.\n");
422 for (
const MachineBasicBlock &
MBB : *MF) {
428 SlotIndex Begin = Indexes->getMBBStartIdx(&
MBB);
431 for (MCRegUnit Unit : TRI->regunits(LI.PhysReg)) {
434 LR = RegUnitRanges[
static_cast<unsigned>(
Unit)] =
435 createRegUnitRange();
448 for (MCRegUnit Unit : NewRanges)
449 computeRegUnitRange(*RegUnitRanges[
static_cast<unsigned>(Unit)], Unit);
454 for (
VNInfo *VNI : VNIs) {
462void LiveIntervals::extendSegmentsToUses(
LiveRange &Segments,
463 ShrinkToUsesWorkList &WorkList,
466 SmallPtrSet<VNInfo*, 8> UsedPHIs;
468 SmallPtrSet<const MachineBasicBlock*, 16> LiveOut;
470 auto getSubRange = [](
const LiveInterval &
I, LaneBitmask
M)
474 for (
const LiveInterval::SubRange &SR :
I.subranges()) {
475 if ((SR.LaneMask & M).any()) {
476 assert(SR.LaneMask == M &&
"Expecting lane masks to match exactly");
484 const LiveRange &OldRange = getSubRange(LI, LaneMask);
487 while (!WorkList.empty()) {
488 SlotIndex
Idx = WorkList.back().first;
489 VNInfo *VNI = WorkList.back().second;
491 const MachineBasicBlock *
MBB = Indexes->getMBBFromIndex(
Idx.getPrevSlot());
492 SlotIndex BlockStart = Indexes->getMBBStartIdx(
MBB);
495 if (VNInfo *ExtVNI =
Segments.extendInBlock(BlockStart, Idx)) {
496 assert(ExtVNI == VNI &&
"Unexpected existing value number");
500 !UsedPHIs.
insert(VNI).second)
504 if (!LiveOut.
insert(Pred).second)
506 SlotIndex Stop = Indexes->getMBBEndIdx(Pred);
509 WorkList.push_back(std::make_pair(Stop, PVNI));
516 Segments.addSegment(LiveRange::Segment(BlockStart, Idx, VNI));
520 if (!LiveOut.
insert(Pred).second)
522 SlotIndex Stop = Indexes->getMBBEndIdx(Pred);
524 assert(OldVNI == VNI &&
"Wrong value out of predecessor");
526 WorkList.push_back(std::make_pair(Stop, VNI));
532 "Missing value out of predecessor for main range");
536 "Missing value out of predecessor for subrange");
549 bool NeedsCleanup =
false;
559 ShrinkToUsesWorkList WorkList;
564 if (
UseMI.isDebugInstr() || !
UseMI.readsVirtualRegister(Reg))
575 <<
"Warning: Instr claims to read non-existent value in "
584 WorkList.
push_back(std::make_pair(Idx, VNI));
596 bool CanSeparate = computeDeadValues(*li, dead);
603 bool MayHaveSplitComponents =
false;
610 assert(
I != LI.
end() &&
"Missing segment for VNI");
615 if (
MRI->shouldTrackSubRegLiveness(VReg)) {
616 if ((
I == LI.
begin() || std::prev(
I)->end < Def) && !VNI->
isPHIDef()) {
618 MI->setRegisterDefReadUndef(VReg);
622 if (
I->end !=
Def.getDeadSlot())
628 LLVM_DEBUG(
dbgs() <<
"Dead PHI at " << Def <<
" may separate interval\n");
632 assert(
MI &&
"No instruction defining live value");
633 MI->addRegisterDead(LI.
reg(), TRI);
635 if (dead &&
MI->allDefsAreDead()) {
640 MayHaveSplitComponents =
true;
642 return MayHaveSplitComponents;
647 assert(Reg.isVirtual() &&
"Can only shrink virtual registers");
649 ShrinkToUsesWorkList WorkList;
658 unsigned SubReg = MO.getSubReg();
660 LaneBitmask LaneMask = TRI->getSubRegIndexLaneMask(SubReg);
661 if ((LaneMask & SR.
LaneMask).none())
683 WorkList.
push_back(std::make_pair(Idx, VNI));
689 extendSegmentsToUses(NewLR, WorkList, Reg, SR.
LaneMask);
699 assert(Segment !=
nullptr &&
"Missing segment for VNI");
705 <<
" may separate interval\n");
717 assert(LICalc &&
"LICalc not initialized.");
720 LICalc->extend(LR, Idx, 0, Undefs);
734 SlotIndex MBBEnd = Indexes->getMBBEndIdx(KillMBB);
745 if (EndPoints) EndPoints->
push_back(MBBEnd);
760 std::tie(MBBStart, MBBEnd) = Indexes->getMBBRange(
MBB);
778 if (EndPoints) EndPoints->
push_back(MBBEnd);
792 for (
unsigned i = 0, e = MRI->getNumVirtRegs(); i != e; ++i) {
794 if (MRI->reg_nodbg_empty(Reg))
810 auto [Unit, Bitmask] = *UI;
812 if (TRI->isArtificialRegUnit(Unit))
813 ArtificialLanes |= Bitmask;
824 if (RI->end.isBlock())
838 for (
auto &RUP : RU) {
841 if (
I == RURange.
end())
844 if (
I == RURange.
end() ||
I->start >= RI->end)
850 if (MRI->subRegLivenessEnabled()) {
869 DefinedLanesMask = ArtificialLanes;
872 if (Segment.
start >= RI->end)
874 if (Segment.
end == RI->end) {
875 DefinedLanesMask |= SR.LaneMask;
882 bool IsFullWrite =
false;
884 if (!MO.isReg() || MO.getReg() != Reg)
888 unsigned SubReg = MO.getSubReg();
889 LaneBitmask UseMask = SubReg ? TRI->getSubRegIndexLaneMask(SubReg)
890 : MRI->getMaxLaneMaskForVReg(Reg);
891 if ((UseMask & ~DefinedLanesMask).any())
893 }
else if (MO.getSubReg() == 0) {
907 if (
N != LI.
end() &&
N->start == RI->end)
912 MI->addRegisterKilled(Reg,
nullptr);
915 MI->clearRegisterKills(Reg,
nullptr);
943 return MBB1 == MBB2 ? MBB1 :
nullptr;
949 if (
PHI->isUnused() || !
PHI->isPHIDef())
973 const auto *MF =
MBB->getParent();
988 float Weight = isDef + isUse;
1016 if (
MI->getOpcode() != TargetOpcode::STATEPOINT)
1058 auto unionBitMask = [&](
unsigned Idx) {
1062 UsableRegs.
resize(TRI->getNumRegs(),
true);
1069 assert(*SlotI >= LiveI->start);
1071 while (*SlotI < LiveI->end) {
1073 unionBitMask(SlotI - Slots.
begin());
1074 if (++SlotI == SlotE)
1078 if (*SlotI == LiveI->end)
1081 unionBitMask(SlotI++ - Slots.
begin());
1084 if (++LiveI == LiveE || SlotI == SlotE || *SlotI > LI.
endIndex())
1086 while (LiveI->end < *SlotI)
1089 while (*SlotI < LiveI->start)
1090 if (++SlotI == SlotE)
1114 : LIS(LIS), MRI(MRI), TRI(TRI), OldIdx(OldIdx), NewIdx(NewIdx),
1115 UpdateFlags(UpdateFlags) {}
1122 if (UpdateFlags && !MRI.isReservedRegUnit(Unit))
1123 return &LIS.getRegUnit(Unit);
1124 return LIS.getCachedRegUnit(Unit);
1130 LLVM_DEBUG(
dbgs() <<
"handleMove " << OldIdx <<
" -> " << NewIdx <<
": "
1132 bool hasRegMask =
false;
1143 MO.setIsKill(
false);
1149 if (Reg.isVirtual()) {
1152 unsigned SubReg = MO.getSubReg();
1153 LaneBitmask LaneMask = SubReg ? TRI.getSubRegIndexLaneMask(SubReg)
1154 : MRI.getMaxLaneMaskForVReg(Reg);
1156 if ((S.LaneMask & LaneMask).none())
1169 unsigned SubReg = MO.getSubReg();
1170 LaneBitmask LaneMask = SubReg ? TRI.getSubRegIndexLaneMask(SubReg)
1171 : MRI.getMaxLaneMaskForVReg(Reg);
1173 if ((S.LaneMask & LaneMask).none() || LI.
covers(S))
1176 LIS.constructMainRangeFromSubranges(LI);
1186 for (MCRegUnit Unit : TRI.regunits(Reg.asMCReg()))
1191 updateRegMaskSlots();
1199 if (!Updated.
insert(&LR).second)
1210 dbgs() <<
":\t" << LR <<
'\n';
1215 handleMoveUp(LR, VRegOrUnit, LaneMask);
1240 if (MachineInstr *KillMI = LIS.getInstructionFromIndex(OldIdxIn->end))
1242 if (MOP.isReg() && MOP.isUse())
1243 MOP.setIsKill(
false);
1254 if (NewIdxIn ==
E ||
1257 Prev->end = NewIdx.getRegSlot();
1260 OldIdxIn->end =
Next->start;
1267 OldIdxIn->end = NewIdx.getRegSlot(OldIdxIn->end.isEarlyClobber());
1277 OldIdxOut = OldIdxIn;
1284 VNInfo *OldIdxVNI = OldIdxOut->valno;
1285 assert(OldIdxVNI->
def == OldIdxOut->start &&
"Inconsistent def");
1289 SlotIndex NewIdxDef = NewIdx.getRegSlot(OldIdxOut->start.isEarlyClobber());
1291 OldIdxVNI->
def = NewIdxDef;
1292 OldIdxOut->start = OldIdxVNI->
def;
1301 = LR.
advanceTo(OldIdxOut, NewIdx.getRegSlot());
1302 bool OldIdxDefIsDead = OldIdxOut->end.isDead();
1303 if (!OldIdxDefIsDead &&
1307 if (OldIdxOut != LR.
begin() &&
1309 OldIdxOut->start)) {
1314 IPrev->end = OldIdxOut->end;
1318 assert(INext !=
E &&
"Must have following segment");
1324 INext->start = OldIdxOut->end;
1325 INext->valno->def = INext->start;
1328 if (AfterNewIdx ==
E) {
1333 std::copy(std::next(OldIdxOut),
E, OldIdxOut);
1336 *NewSegment = LiveRange::Segment(NewIdxDef, NewIdxDef.
getDeadSlot(),
1338 DefVNI->
def = NewIdxDef;
1341 Prev->end = NewIdxDef;
1347 std::copy(std::next(OldIdxOut), std::next(AfterNewIdx), OldIdxOut);
1354 *NewSegment = LiveRange::Segment(NewIdxDef, Prev->end, Prev->valno);
1355 Prev->valno->def = NewIdxDef;
1357 *Prev = LiveRange::Segment(Prev->start, NewIdxDef, DefVNI);
1358 DefVNI->
def = Prev->start;
1362 *Prev = LiveRange::Segment(NewIdxDef, AfterNewIdx->start, DefVNI);
1363 DefVNI->
def = NewIdxDef;
1364 assert(DefVNI != AfterNewIdx->valno);
1370 if (AfterNewIdx !=
E &&
1374 assert(AfterNewIdx->valno != OldIdxVNI &&
"Multiple defs of value?");
1382 assert(AfterNewIdx != OldIdxOut &&
"Inconsistent iterators");
1383 std::copy(std::next(OldIdxOut), AfterNewIdx, OldIdxOut);
1386 VNInfo *NewSegmentVNI = OldIdxVNI;
1387 NewSegmentVNI->
def = NewIdxDef;
1388 *NewSegment = LiveRange::Segment(NewIdxDef, NewIdxDef.
getDeadSlot(),
1395 void handleMoveUp(
LiveRange &LR, VirtRegOrUnit VRegOrUnit,
1396 LaneBitmask LaneMask) {
1417 SlotIndex DefBeforeOldIdx
1418 = std::max(OldIdxIn->start.getDeadSlot(),
1419 NewIdx.getRegSlot(OldIdxIn->end.isEarlyClobber()));
1420 OldIdxIn->end = findLastUseBefore(DefBeforeOldIdx, VRegOrUnit, LaneMask);
1423 OldIdxOut = std::next(OldIdxIn);
1427 OldIdxOut = OldIdxIn;
1428 OldIdxIn = OldIdxOut != LR.
begin() ? std::prev(OldIdxOut) :
E;
1435 VNInfo *OldIdxVNI = OldIdxOut->valno;
1436 assert(OldIdxVNI->
def == OldIdxOut->start &&
"Inconsistent def");
1437 bool OldIdxDefIsDead = OldIdxOut->end.isDead();
1440 SlotIndex NewIdxDef = NewIdx.
getRegSlot(OldIdxOut->start.isEarlyClobber());
1443 assert(NewIdxOut->valno != OldIdxVNI &&
1444 "Same value defined more than once?");
1446 if (!OldIdxDefIsDead) {
1449 OldIdxVNI->
def = NewIdxDef;
1450 OldIdxOut->start = NewIdxDef;
1459 if (!OldIdxDefIsDead) {
1461 if (OldIdxIn !=
E &&
1465 assert(NewIdxIn == LR.
find(NewIdx.getBaseIndex()));
1466 const SlotIndex SplitPos = NewIdxDef;
1467 OldIdxVNI = OldIdxIn->valno;
1469 SlotIndex NewDefEndPoint = std::next(NewIdxIn)->end;
1471 if (OldIdxIn != LR.
begin() &&
1479 NewDefEndPoint = std::min(OldIdxIn->start,
1480 std::next(NewIdxOut)->start);
1484 OldIdxOut->valno->def = OldIdxIn->start;
1485 *OldIdxOut = LiveRange::Segment(OldIdxIn->start, OldIdxOut->end,
1491 std::copy_backward(NewIdxIn, OldIdxIn, OldIdxOut);
1498 *NewSegment = LiveRange::Segment(
Next->start, SplitPos,
1501 *
Next = LiveRange::Segment(SplitPos, NewDefEndPoint, OldIdxVNI);
1502 Next->valno->def = SplitPos;
1506 *NewSegment = LiveRange::Segment(SplitPos,
Next->start, OldIdxVNI);
1507 NewSegment->valno->def = SplitPos;
1511 OldIdxOut->start = NewIdxDef;
1512 OldIdxVNI->
def = NewIdxDef;
1514 OldIdxIn->end = NewIdxDef;
1516 }
else if (OldIdxIn !=
E
1527 std::copy_backward(NewIdxOut, OldIdxOut, std::next(OldIdxOut));
1531 *NewIdxOut = LiveRange::Segment(
1532 NewIdxOut->start, NewIdxDef.
getRegSlot(), NewIdxOut->valno);
1533 *(NewIdxOut + 1) = LiveRange::Segment(
1534 NewIdxDef.
getRegSlot(), (NewIdxOut + 1)->end, OldIdxVNI);
1535 OldIdxVNI->
def = NewIdxDef;
1541 const SlotIndex RetagEnd = OldIdxOut->end;
1543 Idx != LR.
end() &&
Idx->start < RetagEnd;) {
1544 Idx->valno = OldIdxVNI;
1550 if (MachineInstr *KillMI = LIS.getInstructionFromIndex(NewIdx))
1551 for (MIBundleOperands MO(*KillMI); MO.isValid(); ++MO)
1552 if (MO->isReg() && !MO->isUse())
1553 MO->setIsDead(
false);
1560 std::copy_backward(NewIdxOut, OldIdxOut, std::next(OldIdxOut));
1563 VNInfo *NewSegmentVNI = OldIdxVNI;
1564 *NewSegment = LiveRange::Segment(NewIdxDef, NewIdxDef.
getDeadSlot(),
1566 NewSegmentVNI->
def = NewIdxDef;
1571 void updateRegMaskSlots() {
1574 assert(RI != LIS.RegMaskSlots.end() && *RI == OldIdx.getRegSlot() &&
1575 "No RegMask at OldIdx.");
1576 *RI = NewIdx.getRegSlot();
1577 assert((RI == LIS.RegMaskSlots.begin() ||
1579 "Cannot move regmask instruction above another call");
1580 assert((std::next(RI) == LIS.RegMaskSlots.end() ||
1582 "Cannot move regmask instruction below another call");
1586 SlotIndex findLastUseBefore(SlotIndex Before, VirtRegOrUnit VRegOrUnit,
1587 LaneBitmask LaneMask) {
1589 SlotIndex LastUse = Before;
1590 for (MachineOperand &MO :
1594 unsigned SubReg = MO.getSubReg();
1595 if (SubReg != 0 && LaneMask.
any()
1596 && (TRI.getSubRegIndexLaneMask(SubReg) & LaneMask).none())
1599 const MachineInstr &
MI = *MO.getParent();
1600 SlotIndex InstSlot = LIS.getSlotIndexes()->getInstructionIndex(
MI);
1601 if (InstSlot > LastUse && InstSlot < OldIdx)
1609 assert(Before < OldIdx &&
"Expected upwards move");
1610 SlotIndexes *Indexes = LIS.getSlotIndexes();
1618 if (
MI->getParent() ==
MBB)
1622 while (MII != Begin) {
1623 if ((--MII)->isDebugOrPseudoInstr())
1632 for (MIBundleOperands MO(*MII); MO.isValid(); ++MO)
1633 if (MO->isReg() && !MO->isUndef() && MO->getReg().isPhysical() &&
1634 TRI.hasRegUnit(MO->getReg(), VRegOrUnit.
asMCRegUnit()))
1635 return Idx.getRegSlot();
1645 assert((!
MI.isBundled() ||
MI.getOpcode() == TargetOpcode::BUNDLE) &&
1646 "Cannot move instruction in bundle");
1647 SlotIndex OldIndex = Indexes->getInstructionIndex(
MI);
1648 Indexes->removeMachineInstrFromMaps(
MI);
1649 SlotIndex NewIndex = Indexes->insertMachineInstrInMaps(
MI);
1652 "Cannot handle moves across basic block boundaries.");
1654 HMEditor HME(*
this, *MRI, *TRI, OldIndex, NewIndex, UpdateFlags);
1661 "Bundle start is not a bundle");
1663 const SlotIndex NewIndex = Indexes->insertMachineInstrInMaps(BundleStart);
1668 while (
I != BundleEnd) {
1669 if (!Indexes->hasIndex(*
I))
1671 SlotIndex OldIndex = Indexes->getInstructionIndex(*
I,
true);
1673 Indexes->removeMachineInstrFromMaps(*
I,
true);
1677 HMEditor HME(*
this, *MRI, *TRI, OldIndex, NewIndex, UpdateFlags);
1687 if (Reg.isVirtual() &&
hasInterval(Reg) && !MO.isUndef()) {
1703 if (LII != LR.
end() && LII->start < EndIdx) {
1704 lastUseIdx = LII->end;
1705 }
else if (LII == LR.
begin()) {
1714 MachineInstr &
MI = *
I;
1715 if (
MI.isDebugOrPseudoInstr())
1724 for (
const MachineOperand &MO :
MI.operands()) {
1725 if (!MO.isReg() || MO.getReg() !=
Reg)
1728 unsigned SubReg = MO.getSubReg();
1729 LaneBitmask
Mask = TRI->getSubRegIndexLaneMask(SubReg);
1730 if ((Mask & LaneMask).
none())
1734 if (!isStartValid) {
1735 if (LII->end.isDead()) {
1737 if (LII != LR.
begin())
1742 if (MO.getSubReg() && !MO.isUndef())
1745 lastUseIdx = SlotIndex();
1755 }
else if (LII->start != instrIdx.
getRegSlot()) {
1757 LiveRange::Segment S(instrIdx.
getRegSlot(), lastUseIdx, VNI);
1761 if (MO.getSubReg() && !MO.isUndef())
1764 lastUseIdx = SlotIndex();
1765 }
else if (MO.isUse()) {
1769 if (!isEndValid && !LII->end.isBlock())
1778 if (!isStartValid && LII->end.isDead())
1789 while (Begin !=
MBB->begin() && !Indexes->hasIndex(*std::prev(Begin)))
1791 while (
End !=
MBB->end() && !Indexes->hasIndex(*
End))
1800 Indexes->repairIndexesInRange(
MBB, Begin,
End);
1807 if (
MI.isDebugOrPseudoInstr())
1810 if (MO.isReg() && MO.getReg().isVirtual()) {
1813 MRI->shouldTrackSubRegLiveness(Reg)) {
1820 }
else if (MO.isDef()) {
1823 unsigned SubReg = MO.getSubReg();
1824 LaneBitmask Mask = TRI->getSubRegIndexLaneMask(SubReg);
1827 return SR.LaneMask == Mask;
1842 for (
Register Reg : RegsToRepair) {
1843 if (!Reg.isVirtual())
1852 repairOldRegInRange(Begin,
End, EndIdx, S, Reg, S.LaneMask);
1855 repairOldRegInRange(Begin,
End, EndIdx, LI, Reg);
1860 for (MCRegUnit Unit : TRI->regunits(Reg)) {
1871 if (VNI !=
nullptr) {
1878 if (
VNInfo *SVNI = S.getVNInfoAt(Pos))
1880 S.removeValNo(SVNI);
1888 unsigned NumComp = ConEQ.
Classify(LI);
1891 LLVM_DEBUG(
dbgs() <<
" Split " << NumComp <<
" components: " << LI <<
'\n');
1893 for (
unsigned I = 1;
I < NumComp; ++
I) {
1894 Register NewVReg = MRI->cloneVirtualRegister(Reg);
1902 assert(LICalc &&
"LICalc not initialized.");
1904 LICalc->constructMainRangeFromSubranges(LI);
MachineInstrBuilder & UseMI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
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 builds on the ADT/GraphTraits.h file to build generic depth first graph iterator.
const HexagonInstrInfo * TII
A common definition of LaneBitmask for use in TableGen and CodeGen.
static cl::opt< bool > UseSegmentSetForPhysRegs("use-segment-set-for-physregs", cl::Hidden, cl::init(true), cl::desc("Use segment set for the computation of the live ranges of physregs."))
static cl::opt< bool > EnablePrecomputePhysRegs("precompute-phys-liveness", cl::Hidden, cl::desc("Eagerly compute live intervals for all physreg units."))
static bool hasLiveThroughUse(const MachineInstr *MI, Register Reg)
Check whether use of reg in MI is live-through.
static void createSegmentsForValues(LiveRange &LR, iterator_range< LiveInterval::vni_iterator > VNIs)
Register const TargetRegisterInfo * TRI
std::pair< uint64_t, uint64_t > Interval
Promote Memory to Register
#define INITIALIZE_PASS_DEPENDENCY(depName)
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
MachineRegisterInfo & MRI
SI Optimize VGPR LiveRange
This file defines the SmallPtrSet 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)
Toolkit used by handleMove to trim or extend live intervals.
HMEditor(LiveIntervals &LIS, const MachineRegisterInfo &MRI, const TargetRegisterInfo &TRI, SlotIndex OldIdx, SlotIndex NewIdx, bool UpdateFlags)
LiveRange * getRegUnitLI(MCRegUnit Unit)
void updateAllRanges(MachineInstr *MI)
Update all live ranges touched by MI, assuming a move from OldIdx to NewIdx.
This templated class represents "all analyses that operate over <aparticular IR unit>" (e....
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.
LLVM_ABI AnalysisUsage & addRequiredTransitiveID(char &ID)
AnalysisUsage & addPreservedID(const void *ID)
AnalysisUsage & addPreserved()
Add the specified Pass class to the set of analyses preserved by this pass.
LLVM_ABI void setPreservesCFG()
This function should be called by the pass, iff they do not:
AnalysisUsage & addRequiredTransitive()
Represent a constant reference to an array (0 or more elements consecutively in memory),...
void resize(unsigned N, bool t=false)
Grow or shrink the bitvector.
void clear()
Removes all bits from the bitvector.
void clearBitsNotInMask(const uint32_t *Mask, unsigned MaskWords=~0u)
Clear a bit in this vector for every '0' bit in Mask.
ConnectedVNInfoEqClasses - Helper class that can divide VNInfos in a LiveInterval into equivalence cl...
LLVM_ABI void Distribute(LiveInterval &LI, LiveInterval *LIV[], MachineRegisterInfo &MRI)
Distribute values in LI into a separate LiveIntervals for each connected component.
LLVM_ABI unsigned Classify(const LiveRange &LR)
Classify the values in LR into connected components.
A live range for subregisters.
LiveInterval - This class represents the liveness of a register, or stack slot.
LLVM_ABI void removeEmptySubRanges()
Removes all subranges without any segments (subranges without segments are not considered valid and s...
bool hasSubRanges() const
Returns true if subregister liveness information is available.
iterator_range< subrange_iterator > subranges()
LLVM_ABI void computeSubRangeUndefs(SmallVectorImpl< SlotIndex > &Undefs, LaneBitmask LaneMask, const MachineRegisterInfo &MRI, const SlotIndexes &Indexes) const
For a given lane mask LaneMask, compute indexes at which the lane is marked undefined by subregister ...
LLVM_ABI Result run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM)
LLVM_ABI PreservedAnalyses run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM)
bool runOnMachineFunction(MachineFunction &) override
Pass entry point; Calculates LiveIntervals.
LiveIntervalsWrapperPass()
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - This function should be overriden by passes that need analysis information to do t...
LLVM_ABI ~LiveIntervals()
LLVM_ABI void repairIntervalsInRange(MachineBasicBlock *MBB, MachineBasicBlock::iterator Begin, MachineBasicBlock::iterator End, ArrayRef< Register > OrigRegs)
Update live intervals for instructions in a range of iterators.
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.
LLVM_ABI bool hasPHIKill(const LiveInterval &LI, const VNInfo *VNI) const
Returns true if VNI is killed by any PHI-def values in LI.
LLVM_ABI bool checkRegMaskInterference(const LiveInterval &LI, BitVector &UsableRegs)
Test if LI is live across any register mask instructions, and compute a bit mask of physical register...
LLVM_ABI void handleMove(MachineInstr &MI, bool UpdateFlags=false)
Call this method to notify LiveIntervals that instruction MI has been moved within a basic block.
SlotIndexes * getSlotIndexes() const
LLVM_ABI unsigned removeUnreferencedIntervals()
Remove intervals for virtual registers no instruction refers to any more.
ArrayRef< const uint32_t * > getRegMaskBits() const
Returns an array of register mask pointers corresponding to getRegMaskSlots().
LiveInterval & getOrCreateEmptyInterval(Register Reg)
Return an existing interval for Reg.
LLVM_ABI void addKillFlags(const VirtRegMap *)
Add kill flags to any instruction that kills a virtual register.
SlotIndex getInstructionIndex(const MachineInstr &Instr) const
Returns the base index of the given instruction.
LLVM_ABI bool invalidate(MachineFunction &MF, const PreservedAnalyses &PA, MachineFunctionAnalysisManager::Invalidator &Inv)
VNInfo::Allocator & getVNInfoAllocator()
ArrayRef< const uint32_t * > getRegMaskBitsInBlock(unsigned MBBNum) const
Returns an array of mask pointers corresponding to getRegMaskSlotsInBlock(MBBNum).
SlotIndex getMBBEndIdx(const MachineBasicBlock *mbb) const
Return the last index in the given basic block.
static LLVM_ABI float getSpillWeight(bool isDef, bool isUse, const MachineBlockFrequencyInfo *MBFI, const MachineInstr &MI, ProfileSummaryInfo *PSI=nullptr)
Calculate the spill weight to assign to a single instruction.
ArrayRef< SlotIndex > getRegMaskSlots() const
Returns a sorted array of slot indices of all instructions with register mask operands.
ArrayRef< SlotIndex > getRegMaskSlotsInBlock(unsigned MBBNum) const
Returns a sorted array of slot indices of all instructions with register mask operands in the basic b...
LiveInterval & getInterval(Register Reg)
friend class LiveIntervalsAnalysis
LLVM_ABI void pruneValue(LiveRange &LR, SlotIndex Kill, SmallVectorImpl< SlotIndex > *EndPoints)
If LR has a live value at Kill, prune its live range by removing any liveness reachable from Kill.
void removeInterval(Register Reg)
Interval removal.
LLVM_ABI void handleMoveIntoNewBundle(MachineInstr &BundleStart, bool UpdateFlags=false)
Update intervals of operands of all instructions in the newly created bundle specified by BundleStart...
LiveRange & getRegUnit(MCRegUnit Unit)
Return the live range for register unit Unit.
LLVM_ABI MachineBasicBlock * intervalIsInOneMBB(const LiveInterval &LI) const
If LI is confined to a single basic block, return a pointer to that block.
LiveRange * getCachedRegUnit(MCRegUnit Unit)
Return the live range for register unit Unit if it has already been computed, or nullptr if it hasn't...
LLVM_ABI void removeVRegDefAt(LiveInterval &LI, SlotIndex Pos)
Remove value number and related live segments of LI and its subranges that start at position Pos.
LLVM_ABI LiveInterval::Segment addSegmentToEndOfBlock(Register Reg, MachineInstr &startInst)
Given a register and an instruction, adds a live segment from that instruction to the end of its MBB.
LLVM_ABI bool shrinkToUses(LiveInterval *li, SmallVectorImpl< MachineInstr * > *dead=nullptr)
After removing some uses of a register, shrink its live range to just the remaining uses.
LLVM_ABI void constructMainRangeFromSubranges(LiveInterval &LI)
For live interval LI with correct SubRanges construct matching information for the main live range.
LiveInterval & createEmptyInterval(Register Reg)
Interval creation.
LLVM_ABI void extendToIndices(LiveRange &LR, ArrayRef< SlotIndex > Indices, ArrayRef< SlotIndex > Undefs)
Extend the live range LR to reach all points in Indices.
LLVM_ABI void dump() const
LLVM_ABI void print(raw_ostream &O) const
Implement the dump method.
LLVM_ABI void removePhysRegDefAt(MCRegister Reg, SlotIndex Pos)
Remove value numbers and related live segments starting at position Pos that are part of any liverang...
LLVM_ABI void splitSeparateComponents(LiveInterval &LI, SmallVectorImpl< LiveInterval * > &SplitLIs)
Split separate components in LiveInterval LI into separate intervals.
MachineBasicBlock * getMBBFromIndex(SlotIndex index) const
LiveInterval & createAndComputeVirtRegInterval(Register Reg)
Result of a LiveRange query.
VNInfo * valueOutOrDead() const
Returns the value alive at the end of the instruction, if any.
bool isDeadDef() const
Return true if this instruction has a dead def.
VNInfo * valueIn() const
Return the value that is live-in to the instruction.
VNInfo * valueDefined() const
Return the value defined by this instruction, if any.
SlotIndex endPoint() const
Return the end point of the last live range segment to interact with the instruction,...
static LLVM_ABI bool isJointlyDominated(const MachineBasicBlock *MBB, ArrayRef< SlotIndex > Defs, const SlotIndexes &Indexes)
A diagnostic function to check if the end of the block MBB is jointly dominated by the blocks corresp...
This class represents the liveness of a register, stack slot, etc.
LLVM_ABI iterator addSegment(Segment S)
Add the specified Segment to this range, merging segments as appropriate.
Segments::iterator iterator
const Segment * getSegmentContaining(SlotIndex Idx) const
Return the segment that contains the specified index, or null if there is none.
iterator_range< vni_iterator > vnis()
Segments::const_iterator const_iterator
LLVM_ABI VNInfo * createDeadDef(SlotIndex Def, VNInfo::Allocator &VNIAlloc)
createDeadDef - Make sure the range has a value defined at Def.
LLVM_ABI iterator mergeAdjacentSegments(iterator I)
Merge the segment pointed to by I with its immediate neighbors when they use the same value number an...
LLVM_ABI bool covers(const LiveRange &Other) const
Returns true if all segments of the Other live range are completely covered by this live range.
iterator advanceTo(iterator I, SlotIndex Pos)
advanceTo - Advance the specified iterator to point to the Segment containing the specified position,...
LLVM_ABI void removeValNo(VNInfo *ValNo)
removeValNo - Remove all the segments defined by the specified value#.
LiveQueryResult Query(SlotIndex Idx) const
Query Liveness at Idx.
VNInfo * getVNInfoBefore(SlotIndex Idx) const
getVNInfoBefore - Return the VNInfo that is live up to but not necessarily including Idx,...
bool verify() const
Walk the range and assert if any invariants fail to hold.
SlotIndex beginIndex() const
beginIndex - Return the lowest numbered slot covered.
SlotIndex endIndex() const
endNumber - return the maximum point of the range of the whole, exclusive.
bool hasAtLeastOneValue() const
VNInfo * getNextValue(SlotIndex Def, VNInfo::Allocator &VNInfoAllocator)
getNextValue - Create a new value number and return it.
iterator FindSegmentContaining(SlotIndex Idx)
Return an iterator to the segment that contains the specified index, or end() if there is none.
LLVM_ABI void removeSegment(SlotIndex Start, SlotIndex End, bool RemoveDeadValNo=false)
Remove the specified interval from this live range.
LLVM_ABI void flushSegmentSet()
Flush segment set into the regular segment vector.
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().
MCRegUnitMaskIterator enumerates a list of register units and their associated lane masks for Reg.
bool isValid() const
Returns true if this iterator is not yet at the end.
Wrapper class representing physical registers. Should be passed by value.
unsigned pred_size() const
bool isEHPad() const
Returns true if the block is a landing pad.
iterator_range< livein_iterator > liveins() const
int getNumber() const
MachineBasicBlocks are uniquely numbered at the function level, unless they're not in a MachineFuncti...
bool livein_empty() const
LLVM_ABI const uint32_t * getBeginClobberMask(const TargetRegisterInfo *TRI) const
Get the clobber mask for the start of this basic block.
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
iterator_range< succ_iterator > successors()
iterator_range< pred_iterator > predecessors()
MachineInstrBundleIterator< MachineInstr > iterator
LLVM_ABI const uint32_t * getEndClobberMask(const TargetRegisterInfo *TRI) const
Get the clobber mask for the end of the basic block.
MachineBlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate machine basic b...
double getBlockFreqRelativeToEntryBlock(const MachineBasicBlock *MBB) const
Compute the frequency of the block, relative to the entry block.
Analysis pass which computes a MachineDominatorTree.
Analysis pass which computes a MachineDominatorTree.
MachineFunctionPass(char &ID)
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
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.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
void print(raw_ostream &OS, const SlotIndexes *=nullptr) const
print - Print out the MachineFunction in a format suitable for debugging to the specified stream.
Representation of each machine instruction.
unsigned getOpcode() const
Returns the opcode of this MachineInstr.
const MachineBasicBlock * getParent() const
MachineOperand class - Representation of each machine instruction operand.
bool isReg() const
isReg - Tests if this is a MO_Register operand.
Register getReg() const
getReg - Returns the register number.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
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.
Analysis providing profile information.
Wrapper class representing virtual and physical registers.
static Register index2VirtReg(unsigned Index)
Convert a 0-based index to a virtual register number.
constexpr bool isVirtual() const
Return true if the specified register number is in the virtual register namespace.
constexpr bool isPhysical() const
Return true if the specified register number is in the physical register namespace.
SlotIndex - An opaque wrapper around machine indexes.
static bool isSameInstr(SlotIndex A, SlotIndex B)
isSameInstr - Return true if A and B refer to the same instruction.
bool isBlock() const
isBlock - Returns true if this is a block boundary slot.
SlotIndex getDeadSlot() const
Returns the dead def kill slot for the current instruction.
static bool isEarlierInstr(SlotIndex A, SlotIndex B)
isEarlierInstr - Return true if A refers to an instruction earlier than B.
bool isValid() const
Returns true if this is a valid index.
static bool isEarlierEqualInstr(SlotIndex A, SlotIndex B)
Return true if A refers to the same instruction as B or an earlier one.
SlotIndex getBaseIndex() const
Returns the base index for associated with this index.
SlotIndex getPrevSlot() const
Returns the previous slot in the index list.
SlotIndex getRegSlot(bool EC=false) const
Returns the register use/def slot in the current instruction for a normal or early-clobber def.
MachineBasicBlock * getMBBFromIndex(SlotIndex index) const
Returns the basic block which the given index falls in.
SlotIndex getNextNonNullIndex(SlotIndex Index)
Returns the next non-null index, if one exists.
SlotIndex getInstructionIndex(const MachineInstr &MI, bool IgnoreBundle=false) const
Returns the base index for the given instruction.
MachineInstr * getInstructionFromIndex(SlotIndex index) const
Returns the instruction for the given index, or null if the given index has no instruction associated...
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void swap(SmallVectorImpl &RHS)
typename SuperClass::iterator iterator
void push_back(const T &Elt)
pointer data()
Return a pointer to the vector's buffer, even if empty().
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
MI-level Statepoint operands.
unsigned getNumDeoptArgsIdx() const
Get index of Number Deopt Arguments operand.
uint64_t getFlags() const
Return the statepoint flags.
LLVM_ABI unsigned getNumGCPtrIdx()
Get index of number of GC pointers.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
virtual const TargetInstrInfo * getInstrInfo() const
virtual const TargetRegisterInfo * getRegisterInfo() const =0
Return the target's register information.
VNInfo - Value Number Information.
void markUnused()
Mark this value as unused.
bool isUnused() const
Returns true if this value is unused.
unsigned id
The ID number of this value.
SlotIndex def
The index of the defining instruction.
bool isPHIDef() const
Returns true if this value is defined by a PHI instruction (or was, PHI instructions may have been el...
MCRegister getPhys(Register virtReg) const
returns the physical register mapped to the specified virtual register
Wrapper class representing a virtual register or register unit.
constexpr bool isVirtualReg() const
constexpr MCRegUnit asMCRegUnit() const
constexpr Register asVirtualReg() const
self_iterator getIterator()
A range adaptor for a pair of iterators.
This class implements an extremely fast bulk output stream that can only output to a stream.
This provides a very simple, boring adaptor for a begin and end iterator into a range type.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr std::underlying_type_t< E > Mask()
Get a bitmask with 1s in all places up to the high-order bit of E's largest value.
initializer< Ty > init(const Ty &Val)
NodeAddr< DefNode * > Def
This is an optimization pass for GlobalISel generic memory operations.
void dump(const SparseBitVector< ElementSize > &LHS, raw_ostream &out)
Printable print(const GCNRegPressure &RP, const GCNSubtarget *ST=nullptr, unsigned DynamicVGPRBlockSize=0)
@ Kill
The last use of a register.
LLVM_ABI char & MachineDominatorsID
MachineDominators - This pass is a machine dominators analysis pass.
LLVM_ABI bool shouldOptimizeForSize(const MachineFunction *MF, ProfileSummaryInfo *PSI, const MachineBlockFrequencyInfo *BFI, PGSOQueryType QueryType=PGSOQueryType::Other)
Returns true if machine function MF is suggested to be size-optimized based on the profile.
Printable PrintLaneMask(LaneBitmask LaneMask)
Create Printable object to print LaneBitmasks on a raw_ostream.
LLVM_ABI Printable printRegUnit(MCRegUnit Unit, const TargetRegisterInfo *TRI)
Create Printable object to print register units on a raw_ostream.
AnalysisManager< MachineFunction > MachineFunctionAnalysisManager
void erase(Container &C, ValueType V)
Wrapper function to remove a value from a container:
LLVM_ABI char & MachineLoopInfoID
MachineLoopInfo - This pass is a loop analysis pass.
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.
df_ext_iterator< T, SetTy > df_ext_begin(const T &G, SetTy &S)
bool none_of(R &&Range, UnaryPredicate P)
Provide wrappers to std::none_of which take ranges instead of having to pass begin/end explicitly.
MachineBasicBlock::instr_iterator getBundleEnd(MachineBasicBlock::instr_iterator I)
Returns an iterator pointing beyond the bundle containing I.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
LLVM_ABI const float huge_valf
Use this rather than HUGE_VALF; the latter causes warnings on MSVC.
auto lower_bound(R &&Range, T &&Value)
Provide wrappers to std::lower_bound which take ranges instead of having to pass begin/end explicitly...
uint16_t MCPhysReg
An unsigned integer type large enough to represent all physical registers, but not necessarily virtua...
ArrayRef(const T &OneElt) -> ArrayRef< T >
@ DeoptLiveIn
Mark the deopt arguments associated with the statepoint as only being "live-in".
iterator_range< MIBundleOperands > mi_bundle_ops(MachineInstr &MI)
df_ext_iterator< T, SetTy > df_ext_end(const T &G, SetTy &S)
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Next
@ End
Run the machine verifier once, at the end of the pipeline.
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 char & LiveIntervalsID
LiveIntervals - This analysis keeps track of the live ranges of virtual and physical registers.
LLVM_ABI Printable printMBBReference(const MachineBasicBlock &MBB)
Prints a machine basic block reference.
A special type used by analysis passes to provide an address that identifies that particular analysis...
static constexpr LaneBitmask getAll()
constexpr bool any() const
static constexpr LaneBitmask getNone()
This represents a simple continuous liveness interval for a value.