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();
156 RegUnitRanges.clear();
159 VNInfoAllocator.Reset();
169 LICalc = std::make_unique<LiveIntervalCalc>();
172 VirtRegIntervals.resize(
MRI->getNumVirtRegs());
177 computeLiveInRegUnits();
182 for (MCRegUnit Unit :
TRI->regunits())
188 unsigned Removed = 0;
189 for (
unsigned I = 0, E = MRI->getNumVirtRegs();
I != E; ++
I) {
196 NumUnreferencedIntervals += Removed;
201 OS <<
"********** INTERVALS **********\n";
204 for (
unsigned Unit = 0, UnitE = RegUnitRanges.size(); Unit != UnitE; ++Unit)
206 OS << printRegUnit(static_cast<MCRegUnit>(Unit), TRI) <<
' ' << *LR
210 for (
unsigned i = 0, e = MRI->getNumVirtRegs(); i != e; ++i) {
224void LiveIntervals::printInstrs(
raw_ostream &OS)
const {
225 OS <<
"********** MACHINEINSTRS **********\n";
226 MF->
print(OS, Indexes);
229#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
235#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
244LiveRange *LiveIntervals::createRegUnitRange() {
250bool LiveIntervals::computeVirtRegInterval(
LiveInterval &LI) {
251 assert(LICalc &&
"LICalc not initialized.");
252 assert(LI.
empty() &&
"Should only compute empty intervals.");
254 LICalc->calculate(LI, MRI->shouldTrackSubRegLiveness(LI.
reg()));
255 return computeDeadValues(LI,
nullptr);
258void LiveIntervals::computeVirtRegs() {
259 for (
unsigned i = 0, e = MRI->getNumVirtRegs(); i != e; ++i) {
261 if (MRI->reg_nodbg_empty(
Reg))
264 bool NeedSplit = computeVirtRegInterval(LI);
272void LiveIntervals::computeRegMasks() {
273 RegMaskBlocks.resize(MF->getNumBlockIDs());
276 for (
const MachineBasicBlock &
MBB : *MF) {
277 std::pair<unsigned, unsigned> &RMB = RegMaskBlocks[
MBB.
getNumber()];
278 RMB.first = RegMaskSlots.size();
282 RegMaskSlots.push_back(Indexes->getMBBStartIdx(&
MBB));
283 RegMaskBits.push_back(Mask);
290 if (
auto *Mask = TRI->getCustomEHPadPreservedMask(*
MBB.
getParent())) {
291 RegMaskSlots.push_back(Indexes->getMBBStartIdx(&
MBB));
292 RegMaskBits.push_back(Mask);
295 for (
const MachineInstr &
MI :
MBB) {
296 for (
const MachineOperand &MO :
MI.operands()) {
299 RegMaskSlots.push_back(Indexes->getInstructionIndex(
MI).getRegSlot());
300 RegMaskBits.push_back(MO.getRegMask());
309 RegMaskSlots.push_back(
310 Indexes->getInstructionIndex(
MBB.
back()).getRegSlot());
311 RegMaskBits.push_back(Mask);
315 RMB.second = RegMaskSlots.size() - RMB.first;
321 assert(&Orig != &SplitBB &&
"expected distinct blocks");
322 std::pair<unsigned, unsigned> &OrigRMB = RegMaskBlocks[Orig.
getNumber()];
323 std::pair<unsigned, unsigned> &SplitRMB = RegMaskBlocks[SplitBB.
getNumber()];
331 if (KeptCount == OrigRMB.second)
334 SplitRMB.first = OrigRMB.first + KeptCount;
335 SplitRMB.second = OrigRMB.second - KeptCount;
336 OrigRMB.second = KeptCount;
339void LiveIntervals::insertMBBInMapsImpl(
341#ifdef EXPENSIVE_CHECKS
342 assert((!AssumeRegMaskEmpty ||
344 [](
const MachineInstr &
MI) {
345 return any_of(
MI.operands(), [](
const MachineOperand &MO) {
346 return MO.isRegMask();
349 "insertMBBInMaps expects a block with no regmask operands; use "
350 "LiveIntervals::splitAt() to split a block containing calls");
352 Indexes->insertMBBInMaps(
MBB);
354 "Blocks must be added in order.");
355 RegMaskBlocks.push_back(std::make_pair(RegMaskSlots.size(), 0));
356 LiveOutTags.push_back(0);
373void LiveIntervals::computeRegUnitRange(
LiveRange &LR, MCRegUnit Unit) {
374 assert(LICalc &&
"LICalc not initialized.");
382 bool IsReserved =
false;
383 for (MCRegUnitRootIterator Root(Unit, TRI); Root.isValid(); ++Root) {
384 bool IsRootReserved =
true;
386 if (!MRI->reg_empty(
Reg))
387 LICalc->createDeadDefs(LR,
Reg);
390 if (!MRI->isReserved(
Reg))
391 IsRootReserved =
false;
393 IsReserved |= IsRootReserved;
395 assert(IsReserved == MRI->isReservedRegUnit(Unit) &&
396 "reserved computation mismatch");
401 for (MCRegUnitRootIterator Root(Unit, TRI); Root.isValid(); ++Root) {
403 if (!MRI->reg_empty(
Reg))
404 LICalc->extendToUses(LR,
Reg);
417void LiveIntervals::computeLiveInRegUnits() {
418 RegUnitRanges.resize(TRI->getNumRegUnits());
419 LLVM_DEBUG(
dbgs() <<
"Computing live-in reg-units in ABI blocks.\n");
425 for (
const MachineBasicBlock &
MBB : *MF) {
431 SlotIndex Begin = Indexes->getMBBStartIdx(&
MBB);
434 for (MCRegUnit Unit : TRI->regunits(LI.PhysReg)) {
437 LR = RegUnitRanges[
static_cast<unsigned>(
Unit)] =
438 createRegUnitRange();
451 for (MCRegUnit Unit : NewRanges)
452 computeRegUnitRange(*RegUnitRanges[
static_cast<unsigned>(Unit)], Unit);
457 for (
VNInfo *VNI : VNIs) {
465void LiveIntervals::extendSegmentsToUses(
LiveRange &Segments,
466 ShrinkToUsesWorkList &WorkList,
469 SmallPtrSet<VNInfo*, 8> UsedPHIs;
471 if (++LiveOutTag == 0) {
476 auto getSubRange = [](
const LiveInterval &
I, LaneBitmask
M)
480 for (
const LiveInterval::SubRange &SR :
I.subranges()) {
481 if ((SR.LaneMask & M).any()) {
482 assert(SR.LaneMask == M &&
"Expecting lane masks to match exactly");
490 const LiveRange &OldRange = getSubRange(LI, LaneMask);
493 while (!WorkList.empty()) {
494 SlotIndex
Idx = WorkList.back().first;
495 VNInfo *VNI = WorkList.back().second;
497 const MachineBasicBlock *
MBB = Indexes->getMBBFromIndex(
Idx.getPrevSlot());
498 SlotIndex BlockStart = Indexes->getMBBStartIdx(
MBB);
501 if (VNInfo *ExtVNI =
Segments.extendInBlock(BlockStart, Idx)) {
502 assert(ExtVNI == VNI &&
"Unexpected existing value number");
506 !UsedPHIs.
insert(VNI).second)
510 unsigned &
Tag = LiveOutTags[Pred->getNumber()];
511 if (
Tag == LiveOutTag)
514 SlotIndex Stop = Indexes->getMBBEndIdx(Pred);
517 WorkList.push_back(std::make_pair(Stop, PVNI));
524 Segments.addSegment(LiveRange::Segment(BlockStart, Idx, VNI));
528 unsigned &
Tag = LiveOutTags[Pred->getNumber()];
529 if (
Tag == LiveOutTag)
532 SlotIndex Stop = Indexes->getMBBEndIdx(Pred);
534 assert(OldVNI == VNI &&
"Wrong value out of predecessor");
536 WorkList.push_back(std::make_pair(Stop, VNI));
542 "Missing value out of predecessor for main range");
546 "Missing value out of predecessor for subrange");
559 bool NeedsCleanup =
false;
569 ShrinkToUsesWorkList WorkList;
574 if (
UseMI.isDebugInstr() || !
UseMI.readsVirtualRegister(Reg))
585 <<
"Warning: Instr claims to read non-existent value in "
594 WorkList.
push_back(std::make_pair(Idx, VNI));
606 bool CanSeparate = computeDeadValues(*li, dead);
613 bool MayHaveSplitComponents =
false;
620 assert(
I != LI.
end() &&
"Missing segment for VNI");
625 if (
MRI->shouldTrackSubRegLiveness(VReg)) {
626 if ((
I == LI.
begin() || std::prev(
I)->end < Def) && !VNI->
isPHIDef()) {
628 MI->setRegisterDefReadUndef(VReg);
632 if (
I->end !=
Def.getDeadSlot())
638 LLVM_DEBUG(
dbgs() <<
"Dead PHI at " << Def <<
" may separate interval\n");
642 assert(
MI &&
"No instruction defining live value");
643 MI->addRegisterDead(LI.
reg(), TRI);
645 if (dead &&
MI->allDefsAreDead()) {
650 MayHaveSplitComponents =
true;
652 return MayHaveSplitComponents;
657 assert(Reg.isVirtual() &&
"Can only shrink virtual registers");
659 ShrinkToUsesWorkList WorkList;
668 unsigned SubReg = MO.getSubReg();
670 LaneBitmask LaneMask = TRI->getSubRegIndexLaneMask(SubReg);
671 if ((LaneMask & SR.
LaneMask).none())
693 WorkList.
push_back(std::make_pair(Idx, VNI));
699 extendSegmentsToUses(NewLR, WorkList, Reg, SR.
LaneMask);
709 assert(Segment !=
nullptr &&
"Missing segment for VNI");
715 <<
" may separate interval\n");
727 assert(LICalc &&
"LICalc not initialized.");
730 LICalc->extend(LR, Idx, 0, Undefs);
744 SlotIndex MBBEnd = Indexes->getMBBEndIdx(KillMBB);
755 if (EndPoints) EndPoints->
push_back(MBBEnd);
770 std::tie(MBBStart, MBBEnd) = Indexes->getMBBRange(
MBB);
788 if (EndPoints) EndPoints->
push_back(MBBEnd);
802 for (
unsigned i = 0, e = MRI->getNumVirtRegs(); i != e; ++i) {
804 if (MRI->reg_nodbg_empty(Reg))
820 auto [Unit, Bitmask] = *UI;
822 if (TRI->isArtificialRegUnit(Unit))
823 ArtificialLanes |= Bitmask;
834 if (RI->end.isBlock())
848 for (
auto &RUP : RU) {
851 if (
I == RURange.
end())
854 if (
I == RURange.
end() ||
I->start >= RI->end)
860 if (MRI->subRegLivenessEnabled()) {
879 DefinedLanesMask = ArtificialLanes;
882 if (Segment.
start >= RI->end)
884 if (Segment.
end == RI->end) {
885 DefinedLanesMask |= SR.LaneMask;
892 bool IsFullWrite =
false;
894 if (!MO.isReg() || MO.getReg() != Reg)
898 unsigned SubReg = MO.getSubReg();
899 LaneBitmask UseMask = SubReg ? TRI->getSubRegIndexLaneMask(SubReg)
900 : MRI->getMaxLaneMaskForVReg(Reg);
901 if ((UseMask & ~DefinedLanesMask).any())
903 }
else if (MO.getSubReg() == 0) {
917 if (
N != LI.
end() &&
N->start == RI->end)
922 MI->addRegisterKilled(Reg,
nullptr);
925 MI->clearRegisterKills(Reg,
nullptr);
953 return MBB1 == MBB2 ? MBB1 :
nullptr;
959 if (
PHI->isUnused() || !
PHI->isPHIDef())
983 const auto *MF =
MBB->getParent();
998 float Weight = isDef + isUse;
1026 if (
MI->getOpcode() != TargetOpcode::STATEPOINT)
1068 auto unionBitMask = [&](
unsigned Idx) {
1072 UsableRegs.
resize(TRI->getNumRegs(),
true);
1079 assert(*SlotI >= LiveI->start);
1081 while (*SlotI < LiveI->end) {
1083 unionBitMask(SlotI - Slots.
begin());
1084 if (++SlotI == SlotE)
1088 if (*SlotI == LiveI->end)
1091 unionBitMask(SlotI++ - Slots.
begin());
1094 if (++LiveI == LiveE || SlotI == SlotE || *SlotI > LI.
endIndex())
1096 while (LiveI->end < *SlotI)
1099 while (*SlotI < LiveI->start)
1100 if (++SlotI == SlotE)
1124 : LIS(LIS), MRI(MRI), TRI(TRI), OldIdx(OldIdx), NewIdx(NewIdx),
1125 UpdateFlags(UpdateFlags) {}
1132 if (UpdateFlags && !MRI.isReservedRegUnit(Unit))
1133 return &LIS.getRegUnit(Unit);
1134 return LIS.getCachedRegUnit(Unit);
1140 LLVM_DEBUG(
dbgs() <<
"handleMove " << OldIdx <<
" -> " << NewIdx <<
": "
1142 bool hasRegMask =
false;
1153 MO.setIsKill(
false);
1159 if (Reg.isVirtual()) {
1162 unsigned SubReg = MO.getSubReg();
1163 LaneBitmask LaneMask = SubReg ? TRI.getSubRegIndexLaneMask(SubReg)
1164 : MRI.getMaxLaneMaskForVReg(Reg);
1166 if ((S.LaneMask & LaneMask).none())
1179 unsigned SubReg = MO.getSubReg();
1180 LaneBitmask LaneMask = SubReg ? TRI.getSubRegIndexLaneMask(SubReg)
1181 : MRI.getMaxLaneMaskForVReg(Reg);
1183 if ((S.LaneMask & LaneMask).none() || LI.
covers(S))
1186 LIS.constructMainRangeFromSubranges(LI);
1196 for (MCRegUnit Unit : TRI.regunits(Reg.asMCReg()))
1201 updateRegMaskSlots();
1209 if (!Updated.
insert(&LR).second)
1220 dbgs() <<
":\t" << LR <<
'\n';
1225 handleMoveUp(LR, VRegOrUnit, LaneMask);
1250 if (MachineInstr *KillMI = LIS.getInstructionFromIndex(OldIdxIn->end))
1252 if (MOP.isReg() && MOP.isUse())
1253 MOP.setIsKill(
false);
1264 if (NewIdxIn ==
E ||
1267 Prev->end = NewIdx.getRegSlot();
1270 OldIdxIn->end =
Next->start;
1277 OldIdxIn->end = NewIdx.getRegSlot(OldIdxIn->end.isEarlyClobber());
1287 OldIdxOut = OldIdxIn;
1294 VNInfo *OldIdxVNI = OldIdxOut->valno;
1295 assert(OldIdxVNI->
def == OldIdxOut->start &&
"Inconsistent def");
1299 SlotIndex NewIdxDef = NewIdx.getRegSlot(OldIdxOut->start.isEarlyClobber());
1301 OldIdxVNI->
def = NewIdxDef;
1302 OldIdxOut->start = OldIdxVNI->
def;
1311 = LR.
advanceTo(OldIdxOut, NewIdx.getRegSlot());
1312 bool OldIdxDefIsDead = OldIdxOut->end.isDead();
1313 if (!OldIdxDefIsDead &&
1317 if (OldIdxOut != LR.
begin() &&
1319 OldIdxOut->start)) {
1324 IPrev->end = OldIdxOut->end;
1328 assert(INext !=
E &&
"Must have following segment");
1334 INext->start = OldIdxOut->end;
1335 INext->valno->def = INext->start;
1338 if (AfterNewIdx ==
E) {
1343 std::copy(std::next(OldIdxOut),
E, OldIdxOut);
1346 *NewSegment = LiveRange::Segment(NewIdxDef, NewIdxDef.
getDeadSlot(),
1348 DefVNI->
def = NewIdxDef;
1351 Prev->end = NewIdxDef;
1357 std::copy(std::next(OldIdxOut), std::next(AfterNewIdx), OldIdxOut);
1364 *NewSegment = LiveRange::Segment(NewIdxDef, Prev->end, Prev->valno);
1365 Prev->valno->def = NewIdxDef;
1367 *Prev = LiveRange::Segment(Prev->start, NewIdxDef, DefVNI);
1368 DefVNI->
def = Prev->start;
1372 *Prev = LiveRange::Segment(NewIdxDef, AfterNewIdx->start, DefVNI);
1373 DefVNI->
def = NewIdxDef;
1374 assert(DefVNI != AfterNewIdx->valno);
1380 if (AfterNewIdx !=
E &&
1384 assert(AfterNewIdx->valno != OldIdxVNI &&
"Multiple defs of value?");
1392 assert(AfterNewIdx != OldIdxOut &&
"Inconsistent iterators");
1393 std::copy(std::next(OldIdxOut), AfterNewIdx, OldIdxOut);
1396 VNInfo *NewSegmentVNI = OldIdxVNI;
1397 NewSegmentVNI->
def = NewIdxDef;
1398 *NewSegment = LiveRange::Segment(NewIdxDef, NewIdxDef.
getDeadSlot(),
1405 void handleMoveUp(
LiveRange &LR, VirtRegOrUnit VRegOrUnit,
1406 LaneBitmask LaneMask) {
1427 SlotIndex DefBeforeOldIdx
1428 = std::max(OldIdxIn->start.getDeadSlot(),
1429 NewIdx.getRegSlot(OldIdxIn->end.isEarlyClobber()));
1430 OldIdxIn->end = findLastUseBefore(DefBeforeOldIdx, VRegOrUnit, LaneMask);
1433 OldIdxOut = std::next(OldIdxIn);
1437 OldIdxOut = OldIdxIn;
1438 OldIdxIn = OldIdxOut != LR.
begin() ? std::prev(OldIdxOut) :
E;
1445 VNInfo *OldIdxVNI = OldIdxOut->valno;
1446 assert(OldIdxVNI->
def == OldIdxOut->start &&
"Inconsistent def");
1447 bool OldIdxDefIsDead = OldIdxOut->end.isDead();
1450 SlotIndex NewIdxDef = NewIdx.
getRegSlot(OldIdxOut->start.isEarlyClobber());
1453 assert(NewIdxOut->valno != OldIdxVNI &&
1454 "Same value defined more than once?");
1456 if (!OldIdxDefIsDead) {
1459 OldIdxVNI->
def = NewIdxDef;
1460 OldIdxOut->start = NewIdxDef;
1469 if (!OldIdxDefIsDead) {
1471 if (OldIdxIn !=
E &&
1475 assert(NewIdxIn == LR.
find(NewIdx.getBaseIndex()));
1476 const SlotIndex SplitPos = NewIdxDef;
1477 OldIdxVNI = OldIdxIn->valno;
1479 SlotIndex NewDefEndPoint = std::next(NewIdxIn)->end;
1481 if (OldIdxIn != LR.
begin() &&
1489 NewDefEndPoint = std::min(OldIdxIn->start,
1490 std::next(NewIdxOut)->start);
1494 OldIdxOut->valno->def = OldIdxIn->start;
1495 *OldIdxOut = LiveRange::Segment(OldIdxIn->start, OldIdxOut->end,
1501 std::copy_backward(NewIdxIn, OldIdxIn, OldIdxOut);
1508 *NewSegment = LiveRange::Segment(
Next->start, SplitPos,
1511 *
Next = LiveRange::Segment(SplitPos, NewDefEndPoint, OldIdxVNI);
1512 Next->valno->def = SplitPos;
1516 *NewSegment = LiveRange::Segment(SplitPos,
Next->start, OldIdxVNI);
1517 NewSegment->valno->def = SplitPos;
1521 OldIdxOut->start = NewIdxDef;
1522 OldIdxVNI->
def = NewIdxDef;
1524 OldIdxIn->end = NewIdxDef;
1526 }
else if (OldIdxIn !=
E
1537 std::copy_backward(NewIdxOut, OldIdxOut, std::next(OldIdxOut));
1541 *NewIdxOut = LiveRange::Segment(
1542 NewIdxOut->start, NewIdxDef.
getRegSlot(), NewIdxOut->valno);
1543 *(NewIdxOut + 1) = LiveRange::Segment(
1544 NewIdxDef.
getRegSlot(), (NewIdxOut + 1)->end, OldIdxVNI);
1545 OldIdxVNI->
def = NewIdxDef;
1551 const SlotIndex RetagEnd = OldIdxOut->end;
1553 Idx != LR.
end() &&
Idx->start < RetagEnd;) {
1554 Idx->valno = OldIdxVNI;
1560 if (MachineInstr *KillMI = LIS.getInstructionFromIndex(NewIdx))
1561 for (MIBundleOperands MO(*KillMI); MO.isValid(); ++MO)
1562 if (MO->isReg() && !MO->isUse())
1563 MO->setIsDead(
false);
1570 std::copy_backward(NewIdxOut, OldIdxOut, std::next(OldIdxOut));
1573 VNInfo *NewSegmentVNI = OldIdxVNI;
1574 *NewSegment = LiveRange::Segment(NewIdxDef, NewIdxDef.
getDeadSlot(),
1576 NewSegmentVNI->
def = NewIdxDef;
1581 void updateRegMaskSlots() {
1584 assert(RI != LIS.RegMaskSlots.end() && *RI == OldIdx.getRegSlot() &&
1585 "No RegMask at OldIdx.");
1586 *RI = NewIdx.getRegSlot();
1587 assert((RI == LIS.RegMaskSlots.begin() ||
1589 "Cannot move regmask instruction above another call");
1590 assert((std::next(RI) == LIS.RegMaskSlots.end() ||
1592 "Cannot move regmask instruction below another call");
1596 SlotIndex findLastUseBefore(SlotIndex Before, VirtRegOrUnit VRegOrUnit,
1597 LaneBitmask LaneMask) {
1599 SlotIndex LastUse = Before;
1600 for (MachineOperand &MO :
1604 unsigned SubReg = MO.getSubReg();
1605 if (SubReg != 0 && LaneMask.
any()
1606 && (TRI.getSubRegIndexLaneMask(SubReg) & LaneMask).none())
1609 const MachineInstr &
MI = *MO.getParent();
1610 SlotIndex InstSlot = LIS.getSlotIndexes()->getInstructionIndex(
MI);
1611 if (InstSlot > LastUse && InstSlot < OldIdx)
1619 assert(Before < OldIdx &&
"Expected upwards move");
1620 SlotIndexes *Indexes = LIS.getSlotIndexes();
1628 if (
MI->getParent() ==
MBB)
1632 while (MII != Begin) {
1633 if ((--MII)->isDebugOrPseudoInstr())
1642 for (MIBundleOperands MO(*MII); MO.isValid(); ++MO)
1643 if (MO->isReg() && !MO->isUndef() && MO->getReg().isPhysical() &&
1644 TRI.hasRegUnit(MO->getReg(), VRegOrUnit.
asMCRegUnit()))
1645 return Idx.getRegSlot();
1655 assert((!
MI.isBundled() ||
MI.getOpcode() == TargetOpcode::BUNDLE) &&
1656 "Cannot move instruction in bundle");
1657 SlotIndex OldIndex = Indexes->getInstructionIndex(
MI);
1658 Indexes->removeMachineInstrFromMaps(
MI);
1659 SlotIndex NewIndex = Indexes->insertMachineInstrInMaps(
MI);
1662 "Cannot handle moves across basic block boundaries.");
1664 HMEditor HME(*
this, *MRI, *TRI, OldIndex, NewIndex, UpdateFlags);
1671 "Bundle start is not a bundle");
1673 const SlotIndex NewIndex = Indexes->insertMachineInstrInMaps(BundleStart);
1678 while (
I != BundleEnd) {
1679 if (!Indexes->hasIndex(*
I))
1681 SlotIndex OldIndex = Indexes->getInstructionIndex(*
I,
true);
1683 Indexes->removeMachineInstrFromMaps(*
I,
true);
1687 HMEditor HME(*
this, *MRI, *TRI, OldIndex, NewIndex, UpdateFlags);
1697 if (Reg.isVirtual() &&
hasInterval(Reg) && !MO.isUndef()) {
1713 if (LII != LR.
end() && LII->start < EndIdx) {
1714 lastUseIdx = LII->end;
1715 }
else if (LII == LR.
begin()) {
1724 MachineInstr &
MI = *
I;
1725 if (
MI.isDebugOrPseudoInstr())
1734 for (
const MachineOperand &MO :
MI.operands()) {
1735 if (!MO.isReg() || MO.getReg() !=
Reg)
1738 unsigned SubReg = MO.getSubReg();
1739 LaneBitmask
Mask = TRI->getSubRegIndexLaneMask(SubReg);
1740 if ((Mask & LaneMask).
none())
1744 if (!isStartValid) {
1745 if (LII->end.isDead()) {
1747 if (LII != LR.
begin())
1752 if (MO.getSubReg() && !MO.isUndef())
1755 lastUseIdx = SlotIndex();
1765 }
else if (LII->start != instrIdx.
getRegSlot()) {
1767 LiveRange::Segment S(instrIdx.
getRegSlot(), lastUseIdx, VNI);
1771 if (MO.getSubReg() && !MO.isUndef())
1774 lastUseIdx = SlotIndex();
1775 }
else if (MO.isUse()) {
1779 if (!isEndValid && !LII->end.isBlock())
1788 if (!isStartValid && LII->end.isDead())
1799 while (Begin !=
MBB->begin() && !Indexes->hasIndex(*std::prev(Begin)))
1801 while (
End !=
MBB->end() && !Indexes->hasIndex(*
End))
1810 Indexes->repairIndexesInRange(
MBB, Begin,
End);
1817 if (
MI.isDebugOrPseudoInstr())
1820 if (MO.isReg() && MO.getReg().isVirtual()) {
1823 MRI->shouldTrackSubRegLiveness(Reg)) {
1830 }
else if (MO.isDef()) {
1833 unsigned SubReg = MO.getSubReg();
1834 LaneBitmask Mask = TRI->getSubRegIndexLaneMask(SubReg);
1837 return SR.LaneMask == Mask;
1852 for (
Register Reg : RegsToRepair) {
1853 if (!Reg.isVirtual())
1862 repairOldRegInRange(Begin,
End, EndIdx, S, Reg, S.LaneMask);
1865 repairOldRegInRange(Begin,
End, EndIdx, LI, Reg);
1870 for (MCRegUnit Unit : TRI->regunits(Reg)) {
1881 if (VNI !=
nullptr) {
1888 if (
VNInfo *SVNI = S.getVNInfoAt(Pos))
1890 S.removeValNo(SVNI);
1898 unsigned NumComp = ConEQ.
Classify(LI);
1901 LLVM_DEBUG(
dbgs() <<
" Split " << NumComp <<
" components: " << LI <<
'\n');
1903 for (
unsigned I = 1;
I < NumComp; ++
I) {
1904 Register NewVReg = MRI->cloneVirtualRegister(Reg);
1912 assert(LICalc &&
"LICalc not initialized.");
1914 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.
unsigned getNumBlockIDs() const
getNumBlockIDs - Return the number of MBB ID's allocated.
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 assign(size_type NumElts, ValueParamT Elt)
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)
void fill(R &&Range, T &&Value)
Provide wrappers to std::fill which take ranges instead of having to pass begin/end explicitly.
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.