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());
381#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
383 if (RegAssign.empty()) {
384 dbgs() <<
" empty\n";
388 for (RegAssignMap::const_iterator
I = RegAssign.begin();
I.valid(); ++
I)
389 dbgs() <<
" [" <<
I.start() <<
';' <<
I.stop() <<
"):" <<
I.value();
399 for (
auto &S : LI.subranges())
400 if (S.LaneMask == LM)
422 if ((S.LaneMask & LM) == LM)
438 for (LiveInterval::SubRange &S : LI.
subranges()) {
440 VNInfo *PV = PS.getVNInfoAt(Def);
441 if (PV !=
nullptr && PV->
def == Def)
442 S.createDeadDef(Def, LIS.getVNInfoAllocator());
448 const MachineInstr *
DefMI = LIS.getInstructionFromIndex(Def);
451 for (
const MachineOperand &DefOp :
DefMI->
defs()) {
455 if (
unsigned SR = DefOp.getSubReg())
456 LM |= TRI.getSubRegIndexLaneMask(SR);
458 LM = MRI.getMaxLaneMaskForVReg(R);
462 for (LiveInterval::SubRange &S : LI.
subranges())
463 if ((S.LaneMask & LM).any())
464 S.createDeadDef(Def, LIS.getVNInfoAllocator());
468VNInfo *SplitEditor::defValue(
unsigned RegIdx,
472 assert(ParentVNI &&
"Mapping NULL value");
474 assert(Edit->getParent().getVNInfoAt(Idx) == ParentVNI &&
"Bad Parent VNI");
475 LiveInterval *LI = &LIS.getInterval(Edit->get(RegIdx));
478 VNInfo *VNI = LI->
getNextValue(Idx, LIS.getVNInfoAllocator());
481 ValueForcePair
FP(Force ?
nullptr : VNI, Force);
483 std::pair<ValueMap::iterator, bool> InsP =
484 Values.insert(std::make_pair(std::make_pair(RegIdx, ParentVNI->
id),
FP));
488 if (!Force && InsP.second)
492 if (VNInfo *OldVNI = InsP.first->second.getPointer()) {
493 addDeadDef(*LI, OldVNI, Original);
497 InsP.first->second = ValueForcePair(
nullptr, Force);
501 addDeadDef(*LI, VNI, Original);
505void SplitEditor::forceRecompute(
unsigned RegIdx,
const VNInfo &ParentVNI) {
506 ValueForcePair &VFP = Values[std::make_pair(RegIdx, ParentVNI.
id)];
507 VNInfo *VNI = VFP.getPointer();
518 addDeadDef(LIS.getInterval(Edit->get(RegIdx)), VNI,
false);
521 VFP = ValueForcePair(
nullptr,
true);
524SlotIndex SplitEditor::buildSingleSubRegCopy(
528 bool FirstCopy = !
Def.isValid();
532 .
addReg(FromReg, 0, SubIdx);
534 SlotIndexes &Indexes = *LIS.getSlotIndexes();
546 const MCInstrDesc &
Desc =
547 TII.get(TII.getLiveRangeSplitOpcode(FromReg, *
MBB.
getParent()));
548 SlotIndexes &Indexes = *LIS.getSlotIndexes();
549 if (LaneMask.
all() || LaneMask == MRI.getMaxLaneMaskForVReg(FromReg)) {
551 MachineInstr *CopyMI =
559 LiveInterval &DestLI = LIS.getInterval(Edit->get(RegIdx));
563 const TargetRegisterClass *RC = MRI.getRegClass(FromReg);
564 assert(RC == MRI.getRegClass(ToReg) &&
"Should have same reg class");
566 SmallVector<unsigned, 8> SubIndexes;
569 if (!TRI.getCoveringSubRegIndexes(RC, LaneMask, SubIndexes))
573 for (
unsigned BestIdx : SubIndexes) {
574 Def = buildSingleSubRegCopy(FromReg, ToReg,
MBB, InsertBefore, BestIdx,
575 DestLI, Late, Def,
Desc);
581 [Def, &Allocator](LiveInterval::SubRange &SR) {
592 const MachineInstr *
UseMI = LIS.getInstructionFromIndex(UseIdx);
597 const unsigned DefOperandIdx = 0;
601 const TargetRegisterClass *DefConstrainRC =
606 const TargetRegisterClass *RC = MRI.getRegClass(Edit->getReg());
610 const TargetRegisterClass *SuperRC =
614 const TargetRegisterClass *UseConstrainRC =
617 return UseConstrainRC->
hasSubClass(DefConstrainRC);
620VNInfo *SplitEditor::defFromParent(
unsigned RegIdx,
const VNInfo *ParentVNI,
623 LiveInterval *LI = &LIS.getInterval(Edit->get(RegIdx));
627 bool Late = RegIdx != 0;
630 Register Original = VRM.getOriginal(Edit->get(RegIdx));
631 LiveInterval &OrigLI = LIS.getInterval(Original);
636 LiveRangeEdit::Remat
RM(ParentVNI);
637 RM.OrigMI = LIS.getInstructionFromIndex(OrigVNI->
def);
638 if (
RM.OrigMI && TII.isAsCheapAsAMove(*
RM.OrigMI) &&
639 Edit->canRematerializeAt(RM, UseIdx)) {
640 if (!rematWillIncreaseRestriction(
RM.OrigMI,
MBB, UseIdx)) {
641 SlotIndex
Def = Edit->rematerializeAt(
MBB,
I,
Reg, RM, TRI, Late);
644 return defValue(RegIdx, ParentVNI, Def,
false);
649 <<
" since it will increase register class restrictions\n");
653 LaneBitmask LaneMask;
656 for (LiveInterval::SubRange &S : OrigLI.
subranges()) {
657 if (S.liveAt(UseIdx))
658 LaneMask |= S.LaneMask;
665 if (LaneMask.
none()) {
666 const MCInstrDesc &
Desc = TII.get(TargetOpcode::IMPLICIT_DEF);
668 SlotIndexes &Indexes = *LIS.getSlotIndexes();
672 Def = buildCopy(Edit->getReg(),
Reg, LaneMask,
MBB,
I, Late, RegIdx);
676 return defValue(RegIdx, ParentVNI, Def,
false);
683 Edit->createEmptyInterval();
686 OpenIdx = Edit->size();
687 Edit->createEmptyInterval();
692 assert(Idx != 0 &&
"Cannot select the complement interval");
693 assert(Idx < Edit->
size() &&
"Can only select previously opened interval");
694 LLVM_DEBUG(
dbgs() <<
" selectIntv " << OpenIdx <<
" -> " << Idx <<
'\n');
699 assert(OpenIdx &&
"openIntv not called before enterIntvBefore");
702 VNInfo *ParentVNI = Edit->getParent().getVNInfoAt(Idx);
709 assert(
MI &&
"enterIntvBefore called with invalid index");
711 VNInfo *VNI = defFromParent(OpenIdx, ParentVNI, Idx, *
MI->getParent(),
MI);
716 assert(OpenIdx &&
"openIntv not called before enterIntvAfter");
719 VNInfo *ParentVNI = Edit->getParent().getVNInfoAt(Idx);
726 assert(
MI &&
"enterIntvAfter called with invalid index");
728 VNInfo *VNI = defFromParent(OpenIdx, ParentVNI, Idx, *
MI->getParent(),
734 assert(OpenIdx &&
"openIntv not called before enterIntvAtEnd");
739 VNInfo *ParentVNI = Edit->getParent().getVNInfoAt(
Last);
753 ParentVNI = Edit->getParent().getVNInfoAt(
Last);
763 SA.getLastSplitPointIter(&
MBB));
764 RegAssign.insert(VNI->
def, End, OpenIdx);
775 assert(OpenIdx &&
"openIntv not called before useIntv");
776 LLVM_DEBUG(
dbgs() <<
" useIntv [" << Start <<
';' << End <<
"):");
777 RegAssign.insert(Start, End, OpenIdx);
782 assert(OpenIdx &&
"openIntv not called before leaveIntvAfter");
787 VNInfo *ParentVNI = Edit->getParent().getVNInfoAt(Boundary);
794 assert(
MI &&
"No instruction at index");
801 MI->readsVirtualRegister(Edit->getReg())) {
802 forceRecompute(0, *ParentVNI);
803 defFromParent(0, ParentVNI, Idx, *
MI->getParent(),
MI);
807 VNInfo *VNI = defFromParent(0, ParentVNI, Boundary, *
MI->getParent(),
813 assert(OpenIdx &&
"openIntv not called before leaveIntvBefore");
818 VNInfo *ParentVNI = Edit->getParent().getVNInfoAt(Idx);
826 assert(
MI &&
"No instruction at index");
827 VNInfo *VNI = defFromParent(0, ParentVNI, Idx, *
MI->getParent(),
MI);
832 assert(OpenIdx &&
"openIntv not called before leaveIntvAtTop");
837 VNInfo *ParentVNI = Edit->getParent().getVNInfoAt(Start);
844 Register Reg = LIS.getInterval(Edit->get(RegIdx)).reg();
845 VNInfo *VNI = defFromParent(RegIdx, ParentVNI, Start,
MBB,
846 MBB.SkipPHIsLabelsAndDebug(
MBB.begin(), Reg));
847 RegAssign.insert(Start, VNI->
def, OpenIdx);
854 return MO.isReg() && MO.isTied() && MO.getReg() == Reg;
859 assert(OpenIdx &&
"openIntv not called before overlapIntv");
860 const VNInfo *ParentVNI = Edit->getParent().getVNInfoAt(Start);
861 assert(ParentVNI == Edit->getParent().getVNInfoBefore(End) &&
862 "Parent changes value in extended range");
863 assert(LIS.getMBBFromIndex(Start) == LIS.getMBBFromIndex(End) &&
864 "Range cannot span basic blocks");
868 forceRecompute(0, *ParentVNI);
873 if (
auto *
MI = LIS.getInstructionFromIndex(End))
879 LLVM_DEBUG(
dbgs() <<
" overlapIntv [" << Start <<
';' << End <<
"):");
880 RegAssign.insert(Start, End, OpenIdx);
892 AssignI.setMap(RegAssign);
897 assert(
MI &&
"No instruction for back-copy");
902 do AtBegin =
MBBI ==
MBB->begin();
903 while (!AtBegin && (--
MBBI)->isDebugOrPseudoInstr());
908 MI->eraseFromParent();
912 AssignI.find(Def.getPrevSlot());
913 if (!AssignI.valid() || AssignI.start() >= Def)
916 if (AssignI.stop() != Def)
918 unsigned RegIdx = AssignI.value();
924 AtBegin ?
SlotIndex() : LIS.getInstructionIndex(*
MBBI).getRegSlot();
925 if (AtBegin || !
MBBI->readsVirtualRegister(Edit->
getReg()) ||
926 Kill <= AssignI.start()) {
927 LLVM_DEBUG(dbgs() <<
" cannot find simple kill of RegIdx " << RegIdx
929 forceRecompute(RegIdx, *Edit->getParent().getVNInfoAt(Def));
931 LLVM_DEBUG(dbgs() <<
" move kill to " << Kill <<
'\t' << *MBBI);
932 AssignI.setStop(Kill);
942 assert(MDT.dominates(DefMBB,
MBB) &&
"MBB must be dominated by the def.");
944 const MachineLoopInfo &
Loops = SA.Loops;
945 const MachineLoop *DefLoop =
Loops.getLoopFor(DefMBB);
949 MachineBasicBlock *BestMBB =
MBB;
950 unsigned BestDepth = std::numeric_limits<unsigned>::max();
953 const MachineLoop *Loop =
Loops.getLoopFor(
MBB);
965 if (Loop == DefLoop) {
968 <<
" in the same loop\n");
974 if (
Depth < BestDepth) {
979 <<
" at depth " <<
Depth <<
'\n');
987 if (!IDom || !MDT.dominates(DefDomNode, IDom))
994void SplitEditor::computeRedundantBackCopies(
996 LiveInterval *LI = &LIS.getInterval(Edit->get(0));
997 const LiveInterval *Parent = &Edit->getParent();
999 SmallPtrSet<VNInfo *, 8> DominatedVNIs;
1002 for (VNInfo *VNI : LI->
valnos) {
1005 VNInfo *ParentVNI = Edit->getParent().getVNInfoAt(VNI->
def);
1006 EqualVNs[ParentVNI->
id].insert(VNI);
1011 for (
unsigned i = 0, e = Parent->
getNumValNums(); i != e; ++i) {
1013 if (!NotToHoistSet.
count(ParentVNI->
id))
1015 SmallPtrSetIterator<VNInfo *> It1 = EqualVNs[ParentVNI->
id].begin();
1016 SmallPtrSetIterator<VNInfo *> It2 = It1;
1017 for (; It1 != EqualVNs[ParentVNI->
id].end(); ++It1) {
1019 for (++It2; It2 != EqualVNs[ParentVNI->
id].end(); ++It2) {
1020 if (DominatedVNIs.
count(*It1) || DominatedVNIs.
count(*It2))
1023 MachineBasicBlock *MBB1 = LIS.getMBBFromIndex((*It1)->def);
1024 MachineBasicBlock *MBB2 = LIS.getMBBFromIndex((*It2)->def);
1026 DominatedVNIs.
insert((*It1)->def < (*It2)->def ? (*It2) : (*It1));
1027 }
else if (MDT.dominates(MBB1, MBB2)) {
1028 DominatedVNIs.
insert(*It2);
1029 }
else if (MDT.dominates(MBB2, MBB1)) {
1030 DominatedVNIs.
insert(*It1);
1034 if (!DominatedVNIs.
empty()) {
1035 forceRecompute(0, *ParentVNI);
1037 DominatedVNIs.
clear();
1047void SplitEditor::hoistCopies() {
1049 LiveInterval *LI = &LIS.getInterval(Edit->get(0));
1050 const LiveInterval *Parent = &Edit->getParent();
1054 using DomPair = std::pair<MachineBasicBlock *, SlotIndex>;
1060 DenseSet<unsigned> NotToHoistSet;
1064 for (VNInfo *VNI : LI->
valnos) {
1067 VNInfo *ParentVNI = Edit->getParent().getVNInfoAt(VNI->
def);
1068 assert(ParentVNI &&
"Parent not live at complement def");
1072 if (Edit->didRematerialize(ParentVNI))
1075 MachineBasicBlock *ValMBB = LIS.getMBBFromIndex(VNI->
def);
1077 DomPair &Dom = NearestDom[ParentVNI->
id];
1082 if (VNI->
def == ParentVNI->
def) {
1084 Dom = DomPair(ValMBB, VNI->
def);
1089 if (Values.lookup(std::make_pair(0, ParentVNI->
id)).getPointer()) {
1096 Dom = DomPair(ValMBB, VNI->
def);
1097 }
else if (Dom.first == ValMBB) {
1099 if (!Dom.second.isValid() || VNI->
def < Dom.second)
1100 Dom.second = VNI->
def;
1103 MachineBasicBlock *
Near =
1104 MDT.findNearestCommonDominator(Dom.first, ValMBB);
1107 Dom = DomPair(ValMBB, VNI->
def);
1108 else if (Near != Dom.first)
1110 Dom = DomPair(Near, SlotIndex());
1111 Costs[ParentVNI->
id] += MBFI.getBlockFreq(ValMBB);
1115 << VNI->
def <<
" for parent " << ParentVNI->
id <<
'@'
1116 << ParentVNI->
def <<
" hoist to "
1122 for (
unsigned i = 0, e = Parent->
getNumValNums(); i != e; ++i) {
1123 DomPair &Dom = NearestDom[i];
1124 if (!Dom.first || Dom.second.isValid())
1128 MachineBasicBlock *DefMBB = LIS.getMBBFromIndex(ParentVNI->
def);
1130 Dom.first = findShallowDominator(Dom.first, DefMBB);
1132 MBFI.getBlockFreq(Dom.first) > Costs[ParentVNI->
id]) {
1133 NotToHoistSet.
insert(ParentVNI->
id);
1136 SlotIndex LSP = SA.getLastSplitPoint(Dom.first);
1137 if (LSP <= ParentVNI->def) {
1138 NotToHoistSet.
insert(ParentVNI->
id);
1141 Dom.second = defFromParent(0, ParentVNI, LSP, *Dom.first,
1142 SA.getLastSplitPointIter(Dom.first))->def;
1148 for (VNInfo *VNI : LI->
valnos) {
1151 VNInfo *ParentVNI = Edit->getParent().getVNInfoAt(VNI->
def);
1152 const DomPair &Dom = NearestDom[ParentVNI->
id];
1153 if (!Dom.first || Dom.second == VNI->
def ||
1154 NotToHoistSet.
count(ParentVNI->
id))
1157 forceRecompute(0, *ParentVNI);
1163 computeRedundantBackCopies(NotToHoistSet, BackCopies);
1165 removeBackCopies(BackCopies);
1170bool SplitEditor::transferValues() {
1171 bool Skipped =
false;
1172 RegAssignMap::const_iterator AssignI = RegAssign.begin();
1173 for (
const LiveRange::Segment &S : Edit->getParent()) {
1175 VNInfo *ParentVNI = S.valno;
1177 SlotIndex
Start = S.start;
1178 AssignI.advanceTo(Start);
1181 SlotIndex End = S.end;
1182 if (!AssignI.valid()) {
1184 }
else if (AssignI.start() <= Start) {
1185 RegIdx = AssignI.value();
1186 if (AssignI.stop() < End) {
1187 End = AssignI.stop();
1192 End = std::min(End, AssignI.start());
1196 LLVM_DEBUG(
dbgs() <<
" [" << Start <<
';' << End <<
")=" << RegIdx <<
'('
1197 <<
printReg(Edit->get(RegIdx)) <<
')');
1198 LiveInterval &LI = LIS.getInterval(Edit->get(RegIdx));
1201 ValueForcePair VFP = Values.lookup(std::make_pair(RegIdx, ParentVNI->
id));
1202 if (VNInfo *VNI = VFP.getPointer()) {
1204 LI.
addSegment(LiveInterval::Segment(Start, End, VNI));
1217 LiveIntervalCalc &LIC = getLICalc(RegIdx);
1223 SlotIndex BlockStart, BlockEnd;
1224 std::tie(BlockStart, BlockEnd) = LIS.getSlotIndexes()->getMBBRange(&*
MBB);
1227 if (Start != BlockStart) {
1228 VNInfo *VNI = LI.
extendInBlock(BlockStart, std::min(BlockEnd, End));
1229 assert(VNI &&
"Missing def for complex mapped value");
1232 if (BlockEnd <= End)
1237 BlockStart = BlockEnd;
1241 assert(Start <= BlockStart &&
"Expected live-in block");
1242 while (BlockStart < End) {
1244 BlockEnd = LIS.getMBBEndIdx(&*
MBB);
1245 if (BlockStart == ParentVNI->
def) {
1247 assert(ParentVNI->
isPHIDef() &&
"Non-phi defined at block start?");
1248 VNInfo *VNI = LI.
extendInBlock(BlockStart, std::min(BlockEnd, End));
1249 assert(VNI &&
"Missing def for complex mapped parent PHI");
1250 if (End >= BlockEnd)
1263 BlockStart = BlockEnd;
1267 }
while (Start != S.end);
1271 LICalc[0].calculateValues();
1273 LICalc[1].calculateValues();
1282 if (Seg->
end != Def.getDeadSlot())
1292 for (MachineBasicBlock *
P :
B.predecessors()) {
1293 SlotIndex End = LIS.getMBBEndIdx(
P);
1297 const LiveInterval &PLI = Edit->getParent();
1303 LIC.
extend(LR, End, 0, Undefs);
1307void SplitEditor::extendPHIKillRanges() {
1314 const LiveInterval &ParentLI = Edit->getParent();
1315 for (
const VNInfo *V : ParentLI.
valnos) {
1316 if (
V->isUnused() || !
V->isPHIDef())
1319 unsigned RegIdx = RegAssign.lookup(
V->def);
1320 LiveInterval &LI = LIS.getInterval(Edit->get(RegIdx));
1321 LiveIntervalCalc &LIC = getLICalc(RegIdx);
1322 MachineBasicBlock &
B = *LIS.getMBBFromIndex(
V->def);
1328 LiveIntervalCalc SubLIC;
1330 for (
const LiveInterval::SubRange &PS : ParentLI.
subranges()) {
1331 for (
const VNInfo *V : PS.valnos) {
1332 if (
V->isUnused() || !
V->isPHIDef())
1334 unsigned RegIdx = RegAssign.lookup(
V->def);
1335 LiveInterval &LI = LIS.getInterval(Edit->get(RegIdx));
1340 MachineBasicBlock &
B = *LIS.getMBBFromIndex(
V->def);
1341 SubLIC.
reset(&VRM.getMachineFunction(), LIS.getSlotIndexes(), &MDT,
1342 &LIS.getVNInfoAllocator());
1345 extendPHIRange(
B, SubLIC, S, PS.LaneMask, Undefs);
1351void SplitEditor::rewriteAssigned(
bool ExtendRanges) {
1353 ExtPoint(
const MachineOperand &O,
unsigned R, SlotIndex
N)
1354 : MO(
O), RegIdx(
R),
Next(
N) {}
1363 for (MachineOperand &MO :
1365 MachineInstr *MI = MO.getParent();
1367 if (MI->isDebugValue()) {
1368 LLVM_DEBUG(dbgs() <<
"Zapping " << *MI);
1376 SlotIndex Idx = LIS.getInstructionIndex(*
MI);
1377 if (MO.isDef() || MO.isUndef())
1381 unsigned RegIdx = RegAssign.lookup(Idx);
1382 LiveInterval &LI = LIS.getInterval(Edit->get(RegIdx));
1383 MO.setReg(LI.
reg());
1385 <<
'\t' << Idx <<
':' << RegIdx <<
'\t' << *
MI);
1388 if (!ExtendRanges || MO.isUndef())
1393 if (!MO.getSubReg() && !MO.isEarlyClobber())
1397 if (!Edit->getParent().liveAt(Idx.getPrevSlot()))
1401 bool IsEarlyClobber = false;
1415 unsigned OpIdx = MO.getOperandNo();
1416 unsigned DefOpIdx = MI->findTiedOperandIdx(OpIdx);
1417 const MachineOperand &DefOp = MI->getOperand(DefOpIdx);
1418 IsEarlyClobber = DefOp.isEarlyClobber();
1431 ExtPoints.push_back(ExtPoint(MO, RegIdx, Next));
1433 LiveIntervalCalc &LIC = getLICalc(RegIdx);
1434 LIC.extend(LI, Next, 0, ArrayRef<SlotIndex>());
1438 for (ExtPoint &EP : ExtPoints) {
1439 LiveInterval &LI = LIS.getInterval(Edit->get(EP.RegIdx));
1444 unsigned Sub = EP.MO.getSubReg();
1446 :
MRI.getMaxLaneMaskForVReg(
Reg);
1457 SubLIC.
reset(&VRM.getMachineFunction(), LIS.getSlotIndexes(), &MDT,
1458 &LIS.getVNInfoAllocator());
1461 SubLIC.
extend(S, EP.Next, 0, Undefs);
1471 LIS.constructMainRangeFromSubranges(LI);
1475void SplitEditor::deleteRematVictims() {
1476 SmallVector<MachineInstr*, 8>
Dead;
1478 LiveInterval *LI = &LIS.getInterval(R);
1479 for (
const LiveRange::Segment &S : LI->
segments) {
1485 MachineInstr *
MI = LIS.getInstructionFromIndex(S.
valno->
def);
1486 assert(
MI &&
"Missing instruction for dead def");
1487 MI->addRegisterDead(LI->
reg(), &TRI);
1489 if (!
MI->allDefsAreDead())
1500 Edit->eliminateDeadDefs(Dead, {});
1503void SplitEditor::forceRecomputeVNI(
const VNInfo &ParentVNI) {
1506 for (
unsigned I = 0,
E = Edit->size();
I !=
E; ++
I)
1507 forceRecompute(
I, ParentVNI);
1512 SmallPtrSet<const VNInfo *, 8> Visited;
1514 Visited.
insert(&ParentVNI);
1517 const LiveInterval &ParentLI = Edit->getParent();
1518 const SlotIndexes &Indexes = *LIS.getSlotIndexes();
1521 for (
unsigned I = 0,
E = Edit->size();
I !=
E; ++
I)
1522 forceRecompute(
I, VNI);
1530 assert(PredVNI &&
"Value available in PhiVNI predecessor");
1531 if (Visited.
insert(PredVNI).second)
1534 }
while(!WorkList.
empty());
1544 for (
const VNInfo *ParentVNI : Edit->getParent().valnos) {
1547 unsigned RegIdx = RegAssign.lookup(ParentVNI->
def);
1548 defValue(RegIdx, ParentVNI, ParentVNI->
def,
true);
1552 if (Edit->didRematerialize(ParentVNI))
1553 forceRecomputeVNI(*ParentVNI);
1557 switch (SpillMode) {
1568 bool Skipped = transferValues();
1571 rewriteAssigned(Skipped);
1574 extendPHIKillRanges();
1580 deleteRematVictims();
1592 LRMap->
assign(Seq.begin(), Seq.end());
1597 for (
unsigned i = 0, e = Edit->size(); i != e; ++i) {
1602 LIS.splitSeparateComponents(LI, SplitLIs);
1603 Register Original = VRM.getOriginal(VReg);
1605 VRM.setIsSplitFromReg(SplitLI->reg(), Original);
1609 LRMap->
resize(Edit->size(), i);
1613 Edit->calculateRegClassAndHint(VRM.getMachineFunction(), VRAI);
1615 assert(!LRMap || LRMap->
size() == Edit->size());
1623 bool SingleInstrs)
const {
1635 bool copyLike =
TII.isCopyInstr(*
MI) ||
MI->isSubregToReg();
1644 SlotIndex LastSplitPoint = SA.getLastSplitPoint(BI.
MBB);
1670 unsigned IntvOut,
SlotIndex EnterAfter){
1672 std::tie(Start, Stop) = LIS.getSlotIndexes()->getMBBRange(MBBNum);
1674 LLVM_DEBUG(
dbgs() <<
"%bb." << MBBNum <<
" [" << Start <<
';' << Stop
1675 <<
") intf " << LeaveBefore <<
'-' << EnterAfter
1676 <<
", live-through " << IntvIn <<
" -> " << IntvOut);
1678 assert((IntvIn || IntvOut) &&
"Use splitSingleBlock for isolated blocks");
1680 assert((!LeaveBefore || LeaveBefore < Stop) &&
"Interference after block");
1681 assert((!IntvIn || !LeaveBefore || LeaveBefore > Start) &&
"Impossible intf");
1682 assert((!EnterAfter || EnterAfter >= Start) &&
"Interference before block");
1695 assert((!LeaveBefore || Idx <= LeaveBefore) &&
"Interference");
1709 assert((!EnterAfter || Idx >= EnterAfter) &&
"Interference");
1714 if (IntvIn == IntvOut && !LeaveBefore && !EnterAfter) {
1726 SlotIndex LSP = SA.getLastSplitPoint(MBBNum);
1727 assert((!IntvOut || !EnterAfter || EnterAfter < LSP) &&
"Impossible intf");
1729 if (IntvIn != IntvOut && (!LeaveBefore || !EnterAfter ||
1739 if (LeaveBefore && LeaveBefore < LSP) {
1747 assert((!LeaveBefore || Idx <= LeaveBefore) &&
"Interference");
1748 assert((!EnterAfter || Idx >= EnterAfter) &&
"Interference");
1758 assert(LeaveBefore <= EnterAfter &&
"Missed case");
1763 assert((!EnterAfter || Idx >= EnterAfter) &&
"Interference");
1768 assert((!LeaveBefore || Idx <= LeaveBefore) &&
"Interference");
1772 unsigned IntvIn,
SlotIndex LeaveBefore) {
1774 std::tie(Start, Stop) = LIS.getSlotIndexes()->getMBBRange(BI.
MBB);
1777 << Stop <<
"), uses " << BI.
FirstInstr <<
'-'
1778 << BI.
LastInstr <<
", reg-in " << IntvIn
1779 <<
", leave before " << LeaveBefore
1780 << (BI.
LiveOut ?
", stack-out" :
", killed in block"));
1782 assert(IntvIn &&
"Must have register in");
1784 assert((!LeaveBefore || LeaveBefore > Start) &&
"Bad interference");
1812 LLVM_DEBUG(
dbgs() <<
", spill after last use before interference.\n");
1816 assert((!LeaveBefore || Idx <= LeaveBefore) &&
"Interference");
1823 assert((!LeaveBefore || Idx <= LeaveBefore) &&
"Interference");
1833 LLVM_DEBUG(
dbgs() <<
", creating local interval " << LocalIntv <<
".\n");
1846 assert((!LeaveBefore || From <= LeaveBefore) &&
"Interference");
1861 assert((!LeaveBefore || From <= LeaveBefore) &&
"Interference");
1865 unsigned IntvOut,
SlotIndex EnterAfter) {
1867 std::tie(Start, Stop) = LIS.getSlotIndexes()->getMBBRange(BI.
MBB);
1870 << Stop <<
"), uses " << BI.
FirstInstr <<
'-'
1871 << BI.
LastInstr <<
", reg-out " << IntvOut
1872 <<
", enter after " << EnterAfter
1873 << (BI.
LiveIn ?
", stack-in" :
", defined in block"));
1877 assert(IntvOut &&
"Must have register out");
1879 assert((!EnterAfter || EnterAfter < LSP) &&
"Bad interference");
1903 assert((!EnterAfter || Idx >= EnterAfter) &&
"Interference");
1919 assert((!EnterAfter || Idx >= EnterAfter) &&
"Interference");
1930 << (
LiveIn ?
"live in" :
"dead in") <<
", "
1931 << (
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 index past the last valid index in the given basic block.
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.