30#include "llvm/Config/llvm-config.h"
45#define DEBUG_TYPE "regalloc"
49 cl::desc(
"Enable loop iv regalloc heuristic"),
53STATISTIC(NumSimple,
"Number of splits that were simple");
54STATISTIC(NumCopies,
"Number of copies inserted for splitting");
55STATISTIC(NumRemats,
"Number of rematerialized defs for splitting");
63 : LIS(lis), LastInsertPoint(BBNum) {}
66InsertPointAnalysis::computeLastInsertPoint(
const LiveInterval &CurLI,
68 unsigned Num =
MBB.getNumber();
69 std::pair<SlotIndex, SlotIndex> &LIP = LastInsertPoint[Num];
73 bool EHPadSuccessor =
false;
75 if (SMBB->isEHPad()) {
77 EHPadSuccessor =
true;
78 }
else if (SMBB->isInlineAsmBrIndirectTarget())
84 if (!LIP.first.isValid()) {
86 if (FirstTerm ==
MBB.
end())
89 LIP.first = LIS.getInstructionIndex(*FirstTerm);
97 if (ExceptionalSuccessors.
empty())
100 if ((EHPadSuccessor &&
MI.isCall()) ||
101 MI.getOpcode() == TargetOpcode::INLINEASM_BR) {
102 LIP.second = LIS.getInstructionIndex(
MI);
113 if (
none_of(ExceptionalSuccessors, [&](
const MachineBasicBlock *EHPad) {
114 return LIS.isLiveInToMBB(CurLI, EHPad);
126 if (
auto *
I = LIS.getInstructionFromIndex(LIP.second))
127 if (
I->getOpcode() == TargetOpcode::STATEPOINT)
145 if (LIP == LIS.getMBBEndIdx(&
MBB))
147 return LIS.getInstructionFromIndex(LIP);
156 :
MF(vrm.getMachineFunction()),
VRM(vrm),
LIS(lis),
Loops(mli),
157 TII(*
MF.getSubtarget().getInstrInfo()), IPA(lis,
MF.getNumBlockIDs()) {}
162 ThroughBlocks.clear();
167void SplitAnalysis::analyzeUses() {
168 assert(UseSlots.empty() &&
"Call clear first");
174 UseSlots.push_back(VNI->
def);
192 LLVM_DEBUG(
dbgs() <<
"Analyze counted " << UseSlots.size() <<
" instrs in "
193 << UseBlocks.
size() <<
" blocks, through "
194 << NumThroughBlocks <<
" blocks.\n");
199void SplitAnalysis::calcLiveBlockInfo() {
201 NumThroughBlocks = NumGapBlocks = 0;
209 UseI = UseSlots.begin();
210 UseE = UseSlots.end();
224 if (UseI == UseE || *UseI >= Stop) {
226 ThroughBlocks.
set(BI.MBB->getNumber());
229 assert(LVI->end >= Stop &&
"range ends mid block with no uses");
232 BI.FirstInstr = *UseI;
233 assert(BI.FirstInstr >= Start);
235 while (UseI != UseE && *UseI < Stop);
236 BI.LastInstr = UseI[-1];
237 assert(BI.LastInstr < Stop);
240 BI.LiveIn = LVI->start <=
Start;
244 assert(LVI->start == LVI->valno->def &&
"Dangling Segment start");
245 assert(LVI->start == BI.FirstInstr &&
"First instr should be a def");
246 BI.FirstDef = BI.FirstInstr;
251 while (LVI->end < Stop) {
252 SlotIndex LastStop = LVI->end;
253 if (++LVI == LVE || LVI->start >= Stop) {
255 BI.LastInstr = LastStop;
259 if (LastStop < LVI->start) {
266 UseBlocks.push_back(BI);
267 UseBlocks.back().LastInstr = LastStop;
272 BI.FirstInstr = BI.FirstDef = LVI->start;
276 assert(LVI->start == LVI->valno->def &&
"Dangling Segment start");
278 BI.FirstDef = LVI->start;
281 UseBlocks.push_back(BI);
289 if (LVI->end == Stop && ++LVI == LVE)
293 if (LVI->start < Stop)
296 MFI =
LIS.getMBBFromIndex(LVI->start)->getIterator();
301 MachineLoop *
L =
Loops.getLoopFor(BI.MBB);
302 return BI.LiveIn && BI.LiveOut && BI.FirstDef &&
L &&
303 L->isLoopLatch(BI.MBB);
319 LIS.getMBBFromIndex(LVI->start)->getIterator();
328 Stop =
LIS.getMBBEndIdx(&*MFI);
329 }
while (Stop <= LVI->start);
336 assert(!Orig.
empty() &&
"Splitting empty interval?");
340 if (
I != Orig.
end() &&
I->start <= Idx)
341 return I->start == Idx;
344 return I != Orig.
begin() && (--
I)->end == Idx;
361 : SA(SA), LIS(LIS), VRM(VRM), MRI(VRM.getMachineFunction().getRegInfo()),
362 MDT(MDT), TII(*VRM.getMachineFunction().getSubtarget().getInstrInfo()),
363 TRI(*VRM.getMachineFunction().getSubtarget().getRegisterInfo()),
364 MBFI(MBFI), VRAI(VRAI), RegAssign(Allocator) {}
374 LICalc[0].reset(&VRM.getMachineFunction(), LIS.getSlotIndexes(), &MDT,
375 &LIS.getVNInfoAllocator());
377 LICalc[1].reset(&VRM.getMachineFunction(), LIS.getSlotIndexes(), &MDT,
378 &LIS.getVNInfoAllocator());
380 Edit->anyRematerializable();
383#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
385 if (RegAssign.empty()) {
386 dbgs() <<
" empty\n";
390 for (RegAssignMap::const_iterator
I = RegAssign.begin();
I.valid(); ++
I)
391 dbgs() <<
" [" <<
I.start() <<
';' <<
I.stop() <<
"):" <<
I.value();
401 for (
auto &S : LI.subranges())
402 if (S.LaneMask == LM)
424 if ((S.LaneMask & LM) == LM)
440 for (LiveInterval::SubRange &S : LI.
subranges()) {
442 VNInfo *PV = PS.getVNInfoAt(Def);
443 if (PV !=
nullptr && PV->
def == Def)
444 S.createDeadDef(Def, LIS.getVNInfoAllocator());
450 const MachineInstr *
DefMI = LIS.getInstructionFromIndex(Def);
453 for (
const MachineOperand &DefOp :
DefMI->
defs()) {
457 if (
unsigned SR = DefOp.getSubReg())
458 LM |= TRI.getSubRegIndexLaneMask(SR);
460 LM = MRI.getMaxLaneMaskForVReg(R);
464 for (LiveInterval::SubRange &S : LI.
subranges())
465 if ((S.LaneMask & LM).any())
466 S.createDeadDef(Def, LIS.getVNInfoAllocator());
470VNInfo *SplitEditor::defValue(
unsigned RegIdx,
474 assert(ParentVNI &&
"Mapping NULL value");
476 assert(Edit->getParent().getVNInfoAt(Idx) == ParentVNI &&
"Bad Parent VNI");
477 LiveInterval *LI = &LIS.getInterval(Edit->get(RegIdx));
480 VNInfo *VNI = LI->
getNextValue(Idx, LIS.getVNInfoAllocator());
483 ValueForcePair
FP(Force ?
nullptr : VNI, Force);
485 std::pair<ValueMap::iterator, bool> InsP =
486 Values.insert(std::make_pair(std::make_pair(RegIdx, ParentVNI->
id),
FP));
490 if (!Force && InsP.second)
494 if (VNInfo *OldVNI = InsP.first->second.getPointer()) {
495 addDeadDef(*LI, OldVNI, Original);
499 InsP.first->second = ValueForcePair(
nullptr, Force);
503 addDeadDef(*LI, VNI, Original);
507void SplitEditor::forceRecompute(
unsigned RegIdx,
const VNInfo &ParentVNI) {
508 ValueForcePair &VFP = Values[std::make_pair(RegIdx, ParentVNI.
id)];
509 VNInfo *VNI = VFP.getPointer();
520 addDeadDef(LIS.getInterval(Edit->get(RegIdx)), VNI,
false);
523 VFP = ValueForcePair(
nullptr,
true);
526SlotIndex SplitEditor::buildSingleSubRegCopy(
530 bool FirstCopy = !
Def.isValid();
534 .
addReg(FromReg, 0, SubIdx);
536 SlotIndexes &Indexes = *LIS.getSlotIndexes();
548 const MCInstrDesc &
Desc =
549 TII.get(TII.getLiveRangeSplitOpcode(FromReg, *
MBB.
getParent()));
550 SlotIndexes &Indexes = *LIS.getSlotIndexes();
551 if (LaneMask.
all() || LaneMask == MRI.getMaxLaneMaskForVReg(FromReg)) {
553 MachineInstr *CopyMI =
561 LiveInterval &DestLI = LIS.getInterval(Edit->get(RegIdx));
565 const TargetRegisterClass *RC = MRI.getRegClass(FromReg);
566 assert(RC == MRI.getRegClass(ToReg) &&
"Should have same reg class");
568 SmallVector<unsigned, 8> SubIndexes;
571 if (!TRI.getCoveringSubRegIndexes(RC, LaneMask, SubIndexes))
575 for (
unsigned BestIdx : SubIndexes) {
576 Def = buildSingleSubRegCopy(FromReg, ToReg,
MBB, InsertBefore, BestIdx,
577 DestLI, Late, Def,
Desc);
583 [Def, &Allocator](LiveInterval::SubRange &SR) {
594 const MachineInstr *
UseMI = LIS.getInstructionFromIndex(UseIdx);
599 const unsigned DefOperandIdx = 0;
603 const TargetRegisterClass *DefConstrainRC =
608 const TargetRegisterClass *RC = MRI.getRegClass(Edit->getReg());
612 const TargetRegisterClass *SuperRC =
616 const TargetRegisterClass *UseConstrainRC =
619 return UseConstrainRC->
hasSubClass(DefConstrainRC);
622VNInfo *SplitEditor::defFromParent(
unsigned RegIdx,
const VNInfo *ParentVNI,
625 LiveInterval *LI = &LIS.getInterval(Edit->get(RegIdx));
629 bool Late = RegIdx != 0;
632 Register Original = VRM.getOriginal(Edit->get(RegIdx));
633 LiveInterval &OrigLI = LIS.getInterval(Original);
638 LiveRangeEdit::Remat
RM(ParentVNI);
639 RM.OrigMI = LIS.getInstructionFromIndex(OrigVNI->
def);
640 if (
RM.OrigMI && TII.isAsCheapAsAMove(*
RM.OrigMI) &&
641 Edit->canRematerializeAt(RM, OrigVNI, UseIdx)) {
642 if (!rematWillIncreaseRestriction(
RM.OrigMI,
MBB, UseIdx)) {
643 SlotIndex
Def = Edit->rematerializeAt(
MBB,
I,
Reg, RM, TRI, Late);
646 return defValue(RegIdx, ParentVNI, Def,
false);
651 <<
" since it will increase register class restrictions\n");
655 LaneBitmask LaneMask;
658 for (LiveInterval::SubRange &S : OrigLI.
subranges()) {
659 if (S.liveAt(UseIdx))
660 LaneMask |= S.LaneMask;
667 if (LaneMask.
none()) {
668 const MCInstrDesc &
Desc = TII.get(TargetOpcode::IMPLICIT_DEF);
670 SlotIndexes &Indexes = *LIS.getSlotIndexes();
674 Def = buildCopy(Edit->getReg(),
Reg, LaneMask,
MBB,
I, Late, RegIdx);
678 return defValue(RegIdx, ParentVNI, Def,
false);
685 Edit->createEmptyInterval();
688 OpenIdx = Edit->size();
689 Edit->createEmptyInterval();
694 assert(Idx != 0 &&
"Cannot select the complement interval");
695 assert(Idx < Edit->
size() &&
"Can only select previously opened interval");
696 LLVM_DEBUG(
dbgs() <<
" selectIntv " << OpenIdx <<
" -> " << Idx <<
'\n');
701 assert(OpenIdx &&
"openIntv not called before enterIntvBefore");
704 VNInfo *ParentVNI = Edit->getParent().getVNInfoAt(Idx);
711 assert(
MI &&
"enterIntvBefore called with invalid index");
713 VNInfo *VNI = defFromParent(OpenIdx, ParentVNI, Idx, *
MI->getParent(),
MI);
718 assert(OpenIdx &&
"openIntv not called before enterIntvAfter");
721 VNInfo *ParentVNI = Edit->getParent().getVNInfoAt(Idx);
728 assert(
MI &&
"enterIntvAfter called with invalid index");
730 VNInfo *VNI = defFromParent(OpenIdx, ParentVNI, Idx, *
MI->getParent(),
736 assert(OpenIdx &&
"openIntv not called before enterIntvAtEnd");
741 VNInfo *ParentVNI = Edit->getParent().getVNInfoAt(
Last);
755 ParentVNI = Edit->getParent().getVNInfoAt(
Last);
765 SA.getLastSplitPointIter(&
MBB));
766 RegAssign.insert(VNI->
def, End, OpenIdx);
777 assert(OpenIdx &&
"openIntv not called before useIntv");
778 LLVM_DEBUG(
dbgs() <<
" useIntv [" << Start <<
';' << End <<
"):");
779 RegAssign.insert(Start, End, OpenIdx);
784 assert(OpenIdx &&
"openIntv not called before leaveIntvAfter");
789 VNInfo *ParentVNI = Edit->getParent().getVNInfoAt(Boundary);
796 assert(
MI &&
"No instruction at index");
803 MI->readsVirtualRegister(Edit->getReg())) {
804 forceRecompute(0, *ParentVNI);
805 defFromParent(0, ParentVNI, Idx, *
MI->getParent(),
MI);
809 VNInfo *VNI = defFromParent(0, ParentVNI, Boundary, *
MI->getParent(),
815 assert(OpenIdx &&
"openIntv not called before leaveIntvBefore");
820 VNInfo *ParentVNI = Edit->getParent().getVNInfoAt(Idx);
828 assert(
MI &&
"No instruction at index");
829 VNInfo *VNI = defFromParent(0, ParentVNI, Idx, *
MI->getParent(),
MI);
834 assert(OpenIdx &&
"openIntv not called before leaveIntvAtTop");
839 VNInfo *ParentVNI = Edit->getParent().getVNInfoAt(Start);
846 Register Reg = LIS.getInterval(Edit->get(RegIdx)).reg();
847 VNInfo *VNI = defFromParent(RegIdx, ParentVNI, Start,
MBB,
848 MBB.SkipPHIsLabelsAndDebug(
MBB.begin(), Reg));
849 RegAssign.insert(Start, VNI->
def, OpenIdx);
856 return MO.isReg() && MO.isTied() && MO.getReg() == Reg;
861 assert(OpenIdx &&
"openIntv not called before overlapIntv");
862 const VNInfo *ParentVNI = Edit->getParent().getVNInfoAt(Start);
863 assert(ParentVNI == Edit->getParent().getVNInfoBefore(End) &&
864 "Parent changes value in extended range");
865 assert(LIS.getMBBFromIndex(Start) == LIS.getMBBFromIndex(End) &&
866 "Range cannot span basic blocks");
870 forceRecompute(0, *ParentVNI);
875 if (
auto *
MI = LIS.getInstructionFromIndex(End))
881 LLVM_DEBUG(
dbgs() <<
" overlapIntv [" << Start <<
';' << End <<
"):");
882 RegAssign.insert(Start, End, OpenIdx);
894 AssignI.setMap(RegAssign);
899 assert(
MI &&
"No instruction for back-copy");
904 do AtBegin =
MBBI ==
MBB->begin();
905 while (!AtBegin && (--
MBBI)->isDebugOrPseudoInstr());
910 MI->eraseFromParent();
914 AssignI.find(Def.getPrevSlot());
915 if (!AssignI.valid() || AssignI.start() >= Def)
918 if (AssignI.stop() != Def)
920 unsigned RegIdx = AssignI.value();
926 AtBegin ?
SlotIndex() : LIS.getInstructionIndex(*
MBBI).getRegSlot();
927 if (AtBegin || !
MBBI->readsVirtualRegister(Edit->
getReg()) ||
928 Kill <= AssignI.start()) {
929 LLVM_DEBUG(dbgs() <<
" cannot find simple kill of RegIdx " << RegIdx
931 forceRecompute(RegIdx, *Edit->getParent().getVNInfoAt(Def));
933 LLVM_DEBUG(dbgs() <<
" move kill to " << Kill <<
'\t' << *MBBI);
934 AssignI.setStop(Kill);
944 assert(MDT.dominates(DefMBB,
MBB) &&
"MBB must be dominated by the def.");
946 const MachineLoopInfo &
Loops = SA.Loops;
947 const MachineLoop *DefLoop =
Loops.getLoopFor(DefMBB);
951 MachineBasicBlock *BestMBB =
MBB;
952 unsigned BestDepth = std::numeric_limits<unsigned>::max();
955 const MachineLoop *Loop =
Loops.getLoopFor(
MBB);
967 if (Loop == DefLoop) {
970 <<
" in the same loop\n");
976 if (
Depth < BestDepth) {
981 <<
" at depth " <<
Depth <<
'\n');
989 if (!IDom || !MDT.dominates(DefDomNode, IDom))
996void SplitEditor::computeRedundantBackCopies(
998 LiveInterval *LI = &LIS.getInterval(Edit->get(0));
999 const LiveInterval *Parent = &Edit->getParent();
1001 SmallPtrSet<VNInfo *, 8> DominatedVNIs;
1004 for (VNInfo *VNI : LI->
valnos) {
1007 VNInfo *ParentVNI = Edit->getParent().getVNInfoAt(VNI->
def);
1008 EqualVNs[ParentVNI->
id].insert(VNI);
1013 for (
unsigned i = 0, e = Parent->
getNumValNums(); i != e; ++i) {
1015 if (!NotToHoistSet.
count(ParentVNI->
id))
1017 SmallPtrSetIterator<VNInfo *> It1 = EqualVNs[ParentVNI->
id].begin();
1018 SmallPtrSetIterator<VNInfo *> It2 = It1;
1019 for (; It1 != EqualVNs[ParentVNI->
id].end(); ++It1) {
1021 for (++It2; It2 != EqualVNs[ParentVNI->
id].end(); ++It2) {
1022 if (DominatedVNIs.
count(*It1) || DominatedVNIs.
count(*It2))
1025 MachineBasicBlock *MBB1 = LIS.getMBBFromIndex((*It1)->def);
1026 MachineBasicBlock *MBB2 = LIS.getMBBFromIndex((*It2)->def);
1028 DominatedVNIs.
insert((*It1)->def < (*It2)->def ? (*It2) : (*It1));
1029 }
else if (MDT.dominates(MBB1, MBB2)) {
1030 DominatedVNIs.
insert(*It2);
1031 }
else if (MDT.dominates(MBB2, MBB1)) {
1032 DominatedVNIs.
insert(*It1);
1036 if (!DominatedVNIs.
empty()) {
1037 forceRecompute(0, *ParentVNI);
1039 DominatedVNIs.
clear();
1049void SplitEditor::hoistCopies() {
1051 LiveInterval *LI = &LIS.getInterval(Edit->get(0));
1052 const LiveInterval *Parent = &Edit->getParent();
1056 using DomPair = std::pair<MachineBasicBlock *, SlotIndex>;
1062 DenseSet<unsigned> NotToHoistSet;
1066 for (VNInfo *VNI : LI->
valnos) {
1069 VNInfo *ParentVNI = Edit->getParent().getVNInfoAt(VNI->
def);
1070 assert(ParentVNI &&
"Parent not live at complement def");
1074 if (Edit->didRematerialize(ParentVNI))
1077 MachineBasicBlock *ValMBB = LIS.getMBBFromIndex(VNI->
def);
1079 DomPair &Dom = NearestDom[ParentVNI->
id];
1084 if (VNI->
def == ParentVNI->
def) {
1086 Dom = DomPair(ValMBB, VNI->
def);
1091 if (Values.lookup(std::make_pair(0, ParentVNI->
id)).getPointer()) {
1098 Dom = DomPair(ValMBB, VNI->
def);
1099 }
else if (Dom.first == ValMBB) {
1101 if (!Dom.second.isValid() || VNI->
def < Dom.second)
1102 Dom.second = VNI->
def;
1105 MachineBasicBlock *
Near =
1106 MDT.findNearestCommonDominator(Dom.first, ValMBB);
1109 Dom = DomPair(ValMBB, VNI->
def);
1110 else if (Near != Dom.first)
1112 Dom = DomPair(Near, SlotIndex());
1113 Costs[ParentVNI->
id] += MBFI.getBlockFreq(ValMBB);
1117 << VNI->
def <<
" for parent " << ParentVNI->
id <<
'@'
1118 << ParentVNI->
def <<
" hoist to "
1124 for (
unsigned i = 0, e = Parent->
getNumValNums(); i != e; ++i) {
1125 DomPair &Dom = NearestDom[i];
1126 if (!Dom.first || Dom.second.isValid())
1130 MachineBasicBlock *DefMBB = LIS.getMBBFromIndex(ParentVNI->
def);
1132 Dom.first = findShallowDominator(Dom.first, DefMBB);
1134 MBFI.getBlockFreq(Dom.first) > Costs[ParentVNI->
id]) {
1135 NotToHoistSet.
insert(ParentVNI->
id);
1138 SlotIndex LSP = SA.getLastSplitPoint(Dom.first);
1139 if (LSP <= ParentVNI->def) {
1140 NotToHoistSet.
insert(ParentVNI->
id);
1143 Dom.second = defFromParent(0, ParentVNI, LSP, *Dom.first,
1144 SA.getLastSplitPointIter(Dom.first))->def;
1150 for (VNInfo *VNI : LI->
valnos) {
1153 VNInfo *ParentVNI = Edit->getParent().getVNInfoAt(VNI->
def);
1154 const DomPair &Dom = NearestDom[ParentVNI->
id];
1155 if (!Dom.first || Dom.second == VNI->
def ||
1156 NotToHoistSet.
count(ParentVNI->
id))
1159 forceRecompute(0, *ParentVNI);
1165 computeRedundantBackCopies(NotToHoistSet, BackCopies);
1167 removeBackCopies(BackCopies);
1172bool SplitEditor::transferValues() {
1173 bool Skipped =
false;
1174 RegAssignMap::const_iterator AssignI = RegAssign.begin();
1175 for (
const LiveRange::Segment &S : Edit->getParent()) {
1177 VNInfo *ParentVNI = S.valno;
1179 SlotIndex
Start = S.start;
1180 AssignI.advanceTo(Start);
1183 SlotIndex End = S.end;
1184 if (!AssignI.valid()) {
1186 }
else if (AssignI.start() <= Start) {
1187 RegIdx = AssignI.value();
1188 if (AssignI.stop() < End) {
1189 End = AssignI.stop();
1194 End = std::min(End, AssignI.start());
1198 LLVM_DEBUG(
dbgs() <<
" [" << Start <<
';' << End <<
")=" << RegIdx <<
'('
1199 <<
printReg(Edit->get(RegIdx)) <<
')');
1200 LiveInterval &LI = LIS.getInterval(Edit->get(RegIdx));
1203 ValueForcePair VFP = Values.lookup(std::make_pair(RegIdx, ParentVNI->
id));
1204 if (VNInfo *VNI = VFP.getPointer()) {
1206 LI.
addSegment(LiveInterval::Segment(Start, End, VNI));
1219 LiveIntervalCalc &LIC = getLICalc(RegIdx);
1225 SlotIndex BlockStart, BlockEnd;
1226 std::tie(BlockStart, BlockEnd) = LIS.getSlotIndexes()->getMBBRange(&*
MBB);
1229 if (Start != BlockStart) {
1230 VNInfo *VNI = LI.
extendInBlock(BlockStart, std::min(BlockEnd, End));
1231 assert(VNI &&
"Missing def for complex mapped value");
1234 if (BlockEnd <= End)
1239 BlockStart = BlockEnd;
1243 assert(Start <= BlockStart &&
"Expected live-in block");
1244 while (BlockStart < End) {
1246 BlockEnd = LIS.getMBBEndIdx(&*
MBB);
1247 if (BlockStart == ParentVNI->
def) {
1249 assert(ParentVNI->
isPHIDef() &&
"Non-phi defined at block start?");
1250 VNInfo *VNI = LI.
extendInBlock(BlockStart, std::min(BlockEnd, End));
1251 assert(VNI &&
"Missing def for complex mapped parent PHI");
1252 if (End >= BlockEnd)
1265 BlockStart = BlockEnd;
1269 }
while (Start != S.end);
1273 LICalc[0].calculateValues();
1275 LICalc[1].calculateValues();
1284 if (Seg->
end != Def.getDeadSlot())
1294 for (MachineBasicBlock *
P :
B.predecessors()) {
1295 SlotIndex End = LIS.getMBBEndIdx(
P);
1299 const LiveInterval &PLI = Edit->getParent();
1305 LIC.
extend(LR, End, 0, Undefs);
1309void SplitEditor::extendPHIKillRanges() {
1316 const LiveInterval &ParentLI = Edit->getParent();
1317 for (
const VNInfo *V : ParentLI.
valnos) {
1318 if (
V->isUnused() || !
V->isPHIDef())
1321 unsigned RegIdx = RegAssign.lookup(
V->def);
1322 LiveInterval &LI = LIS.getInterval(Edit->get(RegIdx));
1323 LiveIntervalCalc &LIC = getLICalc(RegIdx);
1324 MachineBasicBlock &
B = *LIS.getMBBFromIndex(
V->def);
1330 LiveIntervalCalc SubLIC;
1332 for (
const LiveInterval::SubRange &PS : ParentLI.
subranges()) {
1333 for (
const VNInfo *V : PS.valnos) {
1334 if (
V->isUnused() || !
V->isPHIDef())
1336 unsigned RegIdx = RegAssign.lookup(
V->def);
1337 LiveInterval &LI = LIS.getInterval(Edit->get(RegIdx));
1342 MachineBasicBlock &
B = *LIS.getMBBFromIndex(
V->def);
1343 SubLIC.
reset(&VRM.getMachineFunction(), LIS.getSlotIndexes(), &MDT,
1344 &LIS.getVNInfoAllocator());
1347 extendPHIRange(
B, SubLIC, S, PS.LaneMask, Undefs);
1353void SplitEditor::rewriteAssigned(
bool ExtendRanges) {
1355 ExtPoint(
const MachineOperand &O,
unsigned R, SlotIndex
N)
1356 : MO(
O), RegIdx(
R),
Next(
N) {}
1365 for (MachineOperand &MO :
1367 MachineInstr *MI = MO.getParent();
1369 if (MI->isDebugValue()) {
1370 LLVM_DEBUG(dbgs() <<
"Zapping " << *MI);
1378 SlotIndex Idx = LIS.getInstructionIndex(*
MI);
1379 if (MO.isDef() || MO.isUndef())
1383 unsigned RegIdx = RegAssign.lookup(Idx);
1384 LiveInterval &LI = LIS.getInterval(Edit->get(RegIdx));
1385 MO.setReg(LI.
reg());
1387 <<
'\t' << Idx <<
':' << RegIdx <<
'\t' << *
MI);
1390 if (!ExtendRanges || MO.isUndef())
1395 if (!MO.getSubReg() && !MO.isEarlyClobber())
1399 if (!Edit->getParent().liveAt(Idx.getPrevSlot()))
1403 bool IsEarlyClobber = false;
1417 unsigned OpIdx = MO.getOperandNo();
1418 unsigned DefOpIdx = MI->findTiedOperandIdx(OpIdx);
1419 const MachineOperand &DefOp = MI->getOperand(DefOpIdx);
1420 IsEarlyClobber = DefOp.isEarlyClobber();
1433 ExtPoints.push_back(ExtPoint(MO, RegIdx, Next));
1435 LiveIntervalCalc &LIC = getLICalc(RegIdx);
1436 LIC.extend(LI, Next, 0, ArrayRef<SlotIndex>());
1440 for (ExtPoint &EP : ExtPoints) {
1441 LiveInterval &LI = LIS.getInterval(Edit->get(EP.RegIdx));
1446 unsigned Sub = EP.MO.getSubReg();
1448 :
MRI.getMaxLaneMaskForVReg(
Reg);
1459 SubLIC.
reset(&VRM.getMachineFunction(), LIS.getSlotIndexes(), &MDT,
1460 &LIS.getVNInfoAllocator());
1463 SubLIC.
extend(S, EP.Next, 0, Undefs);
1473 LIS.constructMainRangeFromSubranges(LI);
1477void SplitEditor::deleteRematVictims() {
1478 SmallVector<MachineInstr*, 8>
Dead;
1480 LiveInterval *LI = &LIS.getInterval(R);
1481 for (
const LiveRange::Segment &S : LI->
segments) {
1487 MachineInstr *
MI = LIS.getInstructionFromIndex(S.
valno->
def);
1488 assert(
MI &&
"Missing instruction for dead def");
1489 MI->addRegisterDead(LI->
reg(), &TRI);
1491 if (!
MI->allDefsAreDead())
1502 Edit->eliminateDeadDefs(Dead, {});
1505void SplitEditor::forceRecomputeVNI(
const VNInfo &ParentVNI) {
1508 for (
unsigned I = 0,
E = Edit->size();
I !=
E; ++
I)
1509 forceRecompute(
I, ParentVNI);
1514 SmallPtrSet<const VNInfo *, 8> Visited;
1516 Visited.
insert(&ParentVNI);
1519 const LiveInterval &ParentLI = Edit->getParent();
1520 const SlotIndexes &Indexes = *LIS.getSlotIndexes();
1523 for (
unsigned I = 0,
E = Edit->size();
I !=
E; ++
I)
1524 forceRecompute(
I, VNI);
1532 assert(PredVNI &&
"Value available in PhiVNI predecessor");
1533 if (Visited.
insert(PredVNI).second)
1536 }
while(!WorkList.
empty());
1546 for (
const VNInfo *ParentVNI : Edit->getParent().valnos) {
1549 unsigned RegIdx = RegAssign.lookup(ParentVNI->
def);
1550 defValue(RegIdx, ParentVNI, ParentVNI->
def,
true);
1554 if (Edit->didRematerialize(ParentVNI))
1555 forceRecomputeVNI(*ParentVNI);
1559 switch (SpillMode) {
1570 bool Skipped = transferValues();
1573 rewriteAssigned(Skipped);
1576 extendPHIKillRanges();
1582 deleteRematVictims();
1594 LRMap->
assign(Seq.begin(), Seq.end());
1599 for (
unsigned i = 0, e = Edit->size(); i != e; ++i) {
1604 LIS.splitSeparateComponents(LI, SplitLIs);
1605 Register Original = VRM.getOriginal(VReg);
1607 VRM.setIsSplitFromReg(SplitLI->reg(), Original);
1611 LRMap->
resize(Edit->size(), i);
1615 Edit->calculateRegClassAndHint(VRM.getMachineFunction(), VRAI);
1617 assert(!LRMap || LRMap->
size() == Edit->size());
1625 bool SingleInstrs)
const {
1637 bool copyLike =
TII.isCopyInstr(*
MI) ||
MI->isSubregToReg();
1646 SlotIndex LastSplitPoint = SA.getLastSplitPoint(BI.
MBB);
1672 unsigned IntvOut,
SlotIndex EnterAfter){
1674 std::tie(Start, Stop) = LIS.getSlotIndexes()->getMBBRange(MBBNum);
1676 LLVM_DEBUG(
dbgs() <<
"%bb." << MBBNum <<
" [" << Start <<
';' << Stop
1677 <<
") intf " << LeaveBefore <<
'-' << EnterAfter
1678 <<
", live-through " << IntvIn <<
" -> " << IntvOut);
1680 assert((IntvIn || IntvOut) &&
"Use splitSingleBlock for isolated blocks");
1682 assert((!LeaveBefore || LeaveBefore < Stop) &&
"Interference after block");
1683 assert((!IntvIn || !LeaveBefore || LeaveBefore > Start) &&
"Impossible intf");
1684 assert((!EnterAfter || EnterAfter >= Start) &&
"Interference before block");
1697 assert((!LeaveBefore || Idx <= LeaveBefore) &&
"Interference");
1711 assert((!EnterAfter || Idx >= EnterAfter) &&
"Interference");
1716 if (IntvIn == IntvOut && !LeaveBefore && !EnterAfter) {
1728 SlotIndex LSP = SA.getLastSplitPoint(MBBNum);
1729 assert((!IntvOut || !EnterAfter || EnterAfter < LSP) &&
"Impossible intf");
1731 if (IntvIn != IntvOut && (!LeaveBefore || !EnterAfter ||
1741 if (LeaveBefore && LeaveBefore < LSP) {
1749 assert((!LeaveBefore || Idx <= LeaveBefore) &&
"Interference");
1750 assert((!EnterAfter || Idx >= EnterAfter) &&
"Interference");
1760 assert(LeaveBefore <= EnterAfter &&
"Missed case");
1765 assert((!EnterAfter || Idx >= EnterAfter) &&
"Interference");
1770 assert((!LeaveBefore || Idx <= LeaveBefore) &&
"Interference");
1774 unsigned IntvIn,
SlotIndex LeaveBefore) {
1776 std::tie(Start, Stop) = LIS.getSlotIndexes()->getMBBRange(BI.
MBB);
1779 << Stop <<
"), uses " << BI.
FirstInstr <<
'-'
1780 << BI.
LastInstr <<
", reg-in " << IntvIn
1781 <<
", leave before " << LeaveBefore
1782 << (BI.
LiveOut ?
", stack-out" :
", killed in block"));
1784 assert(IntvIn &&
"Must have register in");
1786 assert((!LeaveBefore || LeaveBefore > Start) &&
"Bad interference");
1814 LLVM_DEBUG(
dbgs() <<
", spill after last use before interference.\n");
1818 assert((!LeaveBefore || Idx <= LeaveBefore) &&
"Interference");
1825 assert((!LeaveBefore || Idx <= LeaveBefore) &&
"Interference");
1835 LLVM_DEBUG(
dbgs() <<
", creating local interval " << LocalIntv <<
".\n");
1848 assert((!LeaveBefore || From <= LeaveBefore) &&
"Interference");
1863 assert((!LeaveBefore || From <= LeaveBefore) &&
"Interference");
1867 unsigned IntvOut,
SlotIndex EnterAfter) {
1869 std::tie(Start, Stop) = LIS.getSlotIndexes()->getMBBRange(BI.
MBB);
1872 << Stop <<
"), uses " << BI.
FirstInstr <<
'-'
1873 << BI.
LastInstr <<
", reg-out " << IntvOut
1874 <<
", enter after " << EnterAfter
1875 << (BI.
LiveIn ?
", stack-in" :
", defined in block"));
1879 assert(IntvOut &&
"Must have register out");
1881 assert((!EnterAfter || EnterAfter < LSP) &&
"Bad interference");
1905 assert((!EnterAfter || Idx >= EnterAfter) &&
"Interference");
1921 assert((!EnterAfter || Idx >= EnterAfter) &&
"Interference");
1932 << (
LiveIn ?
"live in" :
"dead in") <<
", "
1933 << (
LiveOut ?
"live out" :
"dead out") <<
"}";
unsigned const MachineRegisterInfo * MRI
MachineInstrBuilder & UseMI
MachineInstrBuilder MachineInstrBuilder & DefMI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator MBBI
This file defines the BumpPtrAllocator interface.
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
#define LLVM_DUMP_METHOD
Mark debug helper function definitions like dump() that should not be stripped from debug builds.
Register const TargetRegisterInfo * TRI
Promote Memory to Register
SI Optimize VGPR LiveRange
LiveInterval::SubRange & getSubRangeForMaskExact(LaneBitmask LM, LiveInterval &LI)
static bool removeDeadSegment(SlotIndex Def, LiveRange &LR)
auto & getSubrangeImpl(LaneBitmask LM, T &LI)
Find a subrange corresponding to the exact lane mask LM in the live interval LI.
const LiveInterval::SubRange & getSubRangeForMask(LaneBitmask LM, const LiveInterval &LI)
Find a subrange corresponding to the lane mask LM, or a superset of it, in the live interval LI.
static bool hasTiedUseOf(MachineInstr &MI, Register Reg)
static cl::opt< bool > EnableLoopIVHeuristic("enable-split-loopiv-heuristic", cl::desc("Enable loop iv regalloc heuristic"), cl::init(true))
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
void resize(unsigned N, bool t=false)
resize - Grow or shrink the bitvector.
ConnectedVNInfoEqClasses - Helper class that can divide VNInfos in a LiveInterval into equivalence cl...
Implements a dense probed hash-table based set.
DomTreeNodeBase * getIDom() const
MachineBasicBlock::iterator getLastInsertPointIter(const LiveInterval &CurLI, MachineBasicBlock &MBB)
Returns the last insert point as an iterator for \pCurLI in \pMBB.
SlotIndex getLastInsertPoint(const LiveInterval &CurLI, const MachineBasicBlock &MBB)
Return the base index of the last valid insert point for \pCurLI in \pMBB.
InsertPointAnalysis(const LiveIntervals &lis, unsigned BBNum)
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 refineSubRanges(BumpPtrAllocator &Allocator, LaneBitmask LaneMask, std::function< void(LiveInterval::SubRange &)> Apply, const SlotIndexes &Indexes, const TargetRegisterInfo &TRI, unsigned ComposeSubRegIdx=0)
Refines the subranges to support LaneMask.
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 ...
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.
void RemoveMachineInstrFromMaps(MachineInstr &MI)
SlotIndex getMBBEndIdx(const MachineBasicBlock *mbb) const
Return the last index in the given basic block.
LiveInterval & getInterval(Register Reg)
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.
MachineBasicBlock * getMBBFromIndex(SlotIndex index) const
void addLiveInBlock(LiveRange &LR, MachineDomTreeNode *DomNode, SlotIndex Kill=SlotIndex())
addLiveInBlock - Add a block with an unknown live-in value.
LLVM_ABI void reset(const MachineFunction *mf, SlotIndexes *SI, MachineDominatorTree *MDT, VNInfo::Allocator *VNIA)
reset - Prepare caches for a new set of non-overlapping live ranges.
LLVM_ABI void extend(LiveRange &LR, SlotIndex Use, Register PhysReg, ArrayRef< SlotIndex > Undefs)
Extend the live range of LR to reach Use.
void setLiveOutValue(MachineBasicBlock *MBB, VNInfo *VNI)
setLiveOutValue - Indicate that VNI is live out from MBB.
Register get(unsigned idx) const
This class represents the liveness of a register, stack slot, etc.
VNInfo * getValNumInfo(unsigned ValNo)
getValNumInfo - Returns pointer to the specified val#.
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.
Segments::const_iterator const_iterator
bool liveAt(SlotIndex index) const
LLVM_ABI VNInfo * createDeadDef(SlotIndex Def, VNInfo::Allocator &VNIAlloc)
createDeadDef - Make sure the range has a value defined at Def.
iterator advanceTo(iterator I, SlotIndex Pos)
advanceTo - Advance the specified iterator to point to the Segment containing the specified position,...
LLVM_ABI void RenumberValues()
RenumberValues - Renumber all values in order of appearance and remove unused values.
VNInfo * getVNInfoBefore(SlotIndex Idx) const
getVNInfoBefore - Return the VNInfo that is live up to but not necessarily including Idx,...
LLVM_ABI std::pair< VNInfo *, bool > extendInBlock(ArrayRef< SlotIndex > Undefs, SlotIndex StartIdx, SlotIndex Kill)
Attempt to extend a value defined after StartIdx to include Use.
unsigned getNumValNums() const
VNInfo * getNextValue(SlotIndex Def, VNInfo::Allocator &VNInfoAllocator)
getNextValue - Create a new value number and return it.
LLVM_ABI void removeSegment(SlotIndex Start, SlotIndex End, bool RemoveDeadValNo=false)
Remove the specified interval from this live range.
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().
BlockT * getHeader() const
unsigned getLoopDepth() const
Return the nesting level of this loop.
Describe properties that are true of each instruction in the target description file.
MachineInstrBundleIterator< const MachineInstr > const_iterator
LLVM_ABI iterator getFirstTerminator()
Returns an iterator to the first terminator instruction of this basic block.
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
iterator_range< pred_iterator > predecessors()
MachineInstrBundleIterator< MachineInstr > iterator
MachineBlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate machine basic b...
DominatorTree Class - Concrete subclass of DominatorTreeBase that is used to compute a normal dominat...
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
unsigned getNumBlockIDs() const
getNumBlockIDs - Return the number of MBB ID's allocated.
BasicBlockListType::iterator iterator
BasicBlockListType::const_iterator const_iterator
const MachineInstrBuilder & addReg(Register RegNo, unsigned flags=0, unsigned SubReg=0) const
Add a new virtual register operand.
Representation of each machine instruction.
mop_range defs()
Returns all explicit operands that are register definitions.
LLVM_ABI void bundleWithPred()
Bundle this instruction with its predecessor.
LLVM_ABI const TargetRegisterClass * getRegClassConstraintEffectForVReg(Register Reg, const TargetRegisterClass *CurRC, const TargetInstrInfo *TII, const TargetRegisterInfo *TRI, bool ExploreBundle=false) const
Applies the constraints (def/use) implied by this MI on Reg to the given CurRC.
const MachineOperand & getOperand(unsigned i) const
LLVM_ABI const TargetRegisterClass * getRegClassConstraint(unsigned OpIdx, const TargetInstrInfo *TII, const TargetRegisterInfo *TRI) const
Compute the static register class constraint for operand OpIdx.
MachineOperand class - Representation of each machine instruction operand.
Register getReg() const
getReg - Returns the register number.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
Wrapper class representing virtual and physical registers.
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.
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.
SlotIndex getBoundaryIndex() const
Returns the boundary index for associated with this index.
SlotIndex getBaseIndex() const
Returns the base index for associated with this index.
SlotIndex getNextSlot() const
Returns the next slot in the index list.
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.
SlotIndex insertMachineInstrInMaps(MachineInstr &MI, bool Late=false)
Insert the given machine instruction into the mapping.
MachineBasicBlock * getMBBFromIndex(SlotIndex index) const
Returns the basic block which the given index falls in.
const std::pair< SlotIndex, SlotIndex > & getMBBRange(unsigned Num) const
Return the (start,end) range of the given basic block number.
SlotIndex getMBBEndIdx(unsigned Num) const
Returns the last index in the given basic block number.
size_type count(ConstPtrType Ptr) const
count - Return 1 if the specified pointer is in the set, 0 otherwise.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void assign(size_type NumElts, ValueParamT Elt)
typename SuperClass::const_iterator const_iterator
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
SplitAnalysis - Analyze a LiveInterval, looking for live range splitting opportunities.
SplitAnalysis(const VirtRegMap &vrm, const LiveIntervals &lis, const MachineLoopInfo &mli)
const MachineFunction & MF
bool isOriginalEndpoint(SlotIndex Idx) const
isOriginalEndpoint - Return true if the original live range was killed or (re-)defined at Idx.
unsigned countLiveBlocks(const LiveInterval *li) const
countLiveBlocks - Return the number of blocks where li is live.
const LiveIntervals & LIS
void analyze(const LiveInterval *li)
analyze - set CurLI to the specified interval, and analyze how it may be split.
void clear()
clear - clear all data structures so SplitAnalysis is ready to analyze a new interval.
const MachineLoopInfo & Loops
const TargetInstrInfo & TII
unsigned getNumLiveBlocks() const
getNumLiveBlocks - Return the number of blocks where CurLI is live.
bool shouldSplitSingleBlock(const BlockInfo &BI, bool SingleInstrs) const
shouldSplitSingleBlock - Returns true if it would help to create a local live range for the instructi...
void overlapIntv(SlotIndex Start, SlotIndex End)
overlapIntv - Indicate that all instructions in range should use the open interval if End does not ha...
unsigned openIntv()
Create a new virtual register and live interval.
SplitEditor(SplitAnalysis &SA, LiveIntervals &LIS, VirtRegMap &VRM, MachineDominatorTree &MDT, MachineBlockFrequencyInfo &MBFI, VirtRegAuxInfo &VRAI)
Create a new SplitEditor for editing the LiveInterval analyzed by SA.
void splitRegOutBlock(const SplitAnalysis::BlockInfo &BI, unsigned IntvOut, SlotIndex EnterAfter)
splitRegOutBlock - Split CurLI in the given block such that it enters the block on the stack (or isn'...
SlotIndex enterIntvAfter(SlotIndex Idx)
enterIntvAfter - Enter the open interval after the instruction at Idx.
SlotIndex enterIntvBefore(SlotIndex Idx)
enterIntvBefore - Enter the open interval before the instruction at Idx.
void useIntv(const MachineBasicBlock &MBB)
useIntv - indicate that all instructions in MBB should use OpenLI.
SlotIndex leaveIntvAfter(SlotIndex Idx)
leaveIntvAfter - Leave the open interval after the instruction at Idx.
void reset(LiveRangeEdit &, ComplementSpillMode=SM_Partition)
reset - Prepare for a new split.
SlotIndex enterIntvAtEnd(MachineBasicBlock &MBB)
enterIntvAtEnd - Enter the open interval at the end of MBB.
SlotIndex leaveIntvAtTop(MachineBasicBlock &MBB)
leaveIntvAtTop - Leave the interval at the top of MBB.
SlotIndex leaveIntvBefore(SlotIndex Idx)
leaveIntvBefore - Leave the open interval before the instruction at Idx.
void finish(SmallVectorImpl< unsigned > *LRMap=nullptr)
finish - after all the new live ranges have been created, compute the remaining live range,...
void splitRegInBlock(const SplitAnalysis::BlockInfo &BI, unsigned IntvIn, SlotIndex LeaveBefore)
splitRegInBlock - Split CurLI in the given block such that it enters the block in IntvIn and leaves i...
void splitLiveThroughBlock(unsigned MBBNum, unsigned IntvIn, SlotIndex LeaveBefore, unsigned IntvOut, SlotIndex EnterAfter)
splitLiveThroughBlock - Split CurLI in the given block such that it enters the block in IntvIn and le...
ComplementSpillMode
ComplementSpillMode - Select how the complement live range should be created.
@ SM_Partition
SM_Partition(Default) - Try to create the complement interval so it doesn't overlap any other interva...
@ SM_Speed
SM_Speed - Overlap intervals to minimize the expected execution frequency of the inserted copies.
@ SM_Size
SM_Size - Overlap intervals to minimize the number of inserted COPY instructions.
void selectIntv(unsigned Idx)
selectIntv - Select a previously opened interval index.
void splitSingleBlock(const SplitAnalysis::BlockInfo &BI)
splitSingleBlock - Split CurLI into a separate live interval around the uses in a single block.
void dump() const
dump - print the current interval mapping to dbgs().
bool hasSubClass(const TargetRegisterClass *RC) const
Return true if the specified TargetRegisterClass is a proper sub-class of this TargetRegisterClass.
VNInfo - Value Number Information.
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...
Calculate auxiliary information for a virtual register such as its spill weight and allocation hint.
std::pair< iterator, bool > insert(const ValueT &V)
size_type count(const_arg_type_t< ValueT > V) const
Return 1 if the specified key is in the set, 0 otherwise.
self_iterator getIterator()
This class implements an extremely fast bulk output stream that can only output to a stream.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ C
The default llvm calling convention, compatible with C.
@ Define
Register definition.
initializer< Ty > init(const Ty &Val)
NodeAddr< DefNode * > Def
This is an optimization pass for GlobalISel generic memory operations.
Printable print(const GCNRegPressure &RP, const GCNSubtarget *ST=nullptr, unsigned DynamicVGPRBlockSize=0)
auto size(R &&Range, std::enable_if_t< std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits< decltype(Range.begin())>::iterator_category >::value, void > *=nullptr)
Get the size of a range.
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
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...
auto unique(Range &&R, Predicate P)
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
auto reverse(ContainerTy &&C)
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.
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
unsigned getInternalReadRegState(bool B)
FunctionAddr VTableAddr Count
BumpPtrAllocatorImpl BumpPtrAllocator
The standard BumpPtrAllocator which just uses the default template parameters.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
DomTreeNodeBase< MachineBasicBlock > MachineDomTreeNode
unsigned getUndefRegState(bool B)
@ Sub
Subtraction of integers.
FunctionAddr VTableAddr Next
auto seq(T Begin, T End)
Iterate over an integral type from Begin up to - but not including - End.
void array_pod_sort(IteratorTy Start, IteratorTy End)
array_pod_sort - This sorts an array with the specified start and end extent.
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.
static constexpr LaneBitmask getAll()
constexpr bool none() const
constexpr bool all() const
static constexpr LaneBitmask getNone()
This represents a simple continuous liveness interval for a value.
Additional information about basic blocks where the current variable is live.
SlotIndex FirstDef
First non-phi valno->def, or SlotIndex().
bool LiveOut
Current reg is live out.
bool LiveIn
Current reg is live in.
bool isOneInstr() const
isOneInstr - Returns true when this BlockInfo describes a single instruction.
void print(raw_ostream &OS) const
SlotIndex LastInstr
Last instr accessing current reg.
SlotIndex FirstInstr
First instr accessing current reg.