80#define DEBUG_TYPE "regalloc"
82STATISTIC(NumGlobalSplits,
"Number of split global live ranges");
83STATISTIC(NumLocalSplits,
"Number of split local live ranges");
84STATISTIC(NumEvicted,
"Number of interferences evicted");
88 cl::desc(
"Spill mode for splitting live ranges"),
96 cl::desc(
"Last chance recoloring max depth"),
101 cl::desc(
"Last chance recoloring maximum number of considered"
102 " interference at a time"),
107 cl::desc(
"Exhaustive Search for registers bypassing the depth "
108 "and interference cutoffs of last chance recoloring"),
115 cl::desc(
"Cost for first time use of callee-saved register."),
119 "regalloc-csr-cost-scale",
120 cl::desc(
"Scale for the callee-saved register cost, in percentage."),
124 "grow-region-complexity-budget",
125 cl::desc(
"growRegion() does not scale with the number of BB edges, so "
126 "limit its budget and bail out once we reach the limit."),
130 "greedy-regclass-priority-trumps-globalness",
131 cl::desc(
"Change the greedy register allocator's live range priority "
132 "calculation to make the AllocationPriority of the register class "
133 "more important then whether the range is global"),
137 "greedy-reverse-local-assignment",
138 cl::desc(
"Reverse allocation order of local live ranges, such that "
139 "shorter local live ranges will tend to be allocated first"),
143 "split-threshold-for-reg-with-hint",
144 cl::desc(
"The threshold for splitting a virtual register with a hint, in "
160 StringRef getPassName()
const override {
return "Greedy Register Allocator"; }
163 void getAnalysisUsage(AnalysisUsage &AU)
const override;
167 MachineFunctionProperties getRequiredProperties()
const override {
168 return MachineFunctionProperties().setNoPHIs();
171 MachineFunctionProperties getClearedProperties()
const override {
172 return MachineFunctionProperties().setIsSSA();
211 MBFI = Analyses.
MBFI;
213 Loops = Analyses.
Loops;
226 StringRef FilterName = Opts.FilterName.
empty() ?
"all" : Opts.FilterName;
227 OS <<
"greedy<" << FilterName <<
'>';
254 RAGreedy Impl(Analyses, Opts.Filter);
295char RAGreedyLegacy::ID = 0;
319const char *
const RAGreedy::StageName[] = {
334 return new RAGreedyLegacy();
338 return new RAGreedyLegacy(Ftor);
341void RAGreedyLegacy::getAnalysisUsage(
AnalysisUsage &AU)
const {
370bool RAGreedy::LRE_CanEraseVirtReg(
Register VirtReg) {
371 LiveInterval &LI =
LIS->getInterval(VirtReg);
372 if (
VRM->hasPhys(VirtReg)) {
385void RAGreedy::LRE_WillShrinkVirtReg(
Register VirtReg) {
386 if (!
VRM->hasPhys(VirtReg))
390 LiveInterval &LI =
LIS->getInterval(VirtReg);
396 ExtraInfo->LRE_DidCloneVirtReg(New, Old);
401 if (!Info.inBounds(Old))
410 Info[New] = Info[Old];
414 SpillerInstance.reset();
420void RAGreedy::enqueue(PQueue &CurQueue,
const LiveInterval *LI) {
424 assert(Reg.isVirtual() &&
"Can only enqueue virtual registers");
426 auto Stage = ExtraInfo->getOrInitStage(Reg);
429 ExtraInfo->setStage(Reg, Stage);
432 unsigned Ret = PriorityAdvisor->getPriority(*LI);
436 CurQueue.push(std::make_pair(Ret, ~
Reg.id()));
439unsigned DefaultPriorityAdvisor::getPriority(
const LiveInterval &LI)
const {
454 (!ReverseLocalAssignment &&
457 unsigned GlobalBit = 0;
460 LIS->intervalIsInOneMBB(LI)) {
464 if (!ReverseLocalAssignment)
470 Prio = Indexes->getZeroIndex().getApproxInstrDistance(LI.
endIndex());
492 Prio = std::min(Prio, (
unsigned)
maxUIntN(24));
495 if (RegClassPriorityTrumpsGlobalness)
504 if (
VRM->hasKnownPreference(
Reg))
511unsigned DummyPriorityAdvisor::getPriority(
const LiveInterval &LI)
const {
520 if (CurQueue.empty())
537 for (
auto I = Order.
begin(),
E = Order.
end();
I !=
E && !PhysReg; ++
I) {
539 if (!
Matrix->checkInterference(VirtReg, *
I)) {
555 MCRegister PhysHint =
Hint.asMCReg();
558 if (EvictAdvisor->canEvictHintInterference(VirtReg, PhysHint,
560 evictInterference(VirtReg, PhysHint, NewVRegs);
565 if (trySplitAroundHintReg(PhysHint, VirtReg, NewVRegs, Order))
570 SetOfBrokenHints.insert(&VirtReg);
574 uint8_t
Cost = RegCosts[PhysReg.
id()];
581 << (
unsigned)
Cost <<
'\n');
582 MCRegister CheapReg = tryEvict(VirtReg, Order, NewVRegs,
Cost, FixedRegisters);
583 return CheapReg ? CheapReg : PhysReg;
592 auto HasRegUnitInterference = [&](MCRegUnit Unit) {
595 VirtReg,
Matrix->getLiveUnions()[
static_cast<unsigned>(Unit)]);
604 if (
none_of(
TRI->regunits(Reg), HasRegUnitInterference)) {
617void RAGreedy::evictInterference(
const LiveInterval &VirtReg,
623 unsigned Cascade = ExtraInfo->getOrAssignNewCascade(VirtReg.
reg());
626 <<
" interference: Cascade " << Cascade <<
'\n');
630 for (MCRegUnit Unit :
TRI->regunits(PhysReg)) {
647 assert((ExtraInfo->getCascade(Intf->reg()) < Cascade ||
648 (Cascade < ExtraInfo->getCascade(Intf->reg()) &&
649 EvictAdvisor->isUrgentEviction(VirtReg, *Intf)) ||
651 "Cannot decrease cascade number, illegal eviction");
652 ExtraInfo->setCascade(Intf->reg(), Cascade);
665 return !
Matrix->isPhysRegUsed(PhysReg);
668std::optional<unsigned>
671 unsigned CostPerUseLimit)
const {
672 unsigned OrderLimit = Order.
getOrder().size();
674 if (CostPerUseLimit <
uint8_t(~0u)) {
678 if (MinCost >= CostPerUseLimit) {
680 << MinCost <<
", no cheaper registers to be found.\n");
700 if (
RegCosts[PhysReg.
id()] >= CostPerUseLimit)
726 MCRegister BestPhys = EvictAdvisor->tryFindEvictionCandidate(
727 VirtReg, Order, CostPerUseLimit, FixedRegisters);
729 evictInterference(VirtReg, BestPhys, NewVRegs);
747 SplitConstraints.resize(UseBlocks.
size());
749 for (
unsigned I = 0;
I != UseBlocks.
size(); ++
I) {
770 if (Intf.
first() <= Indexes->getMBBStartIdx(BI.
MBB)) {
784 SA->getFirstSplitPoint(BC.
Number)))
790 if (Intf.
last() >= SA->getLastSplitPoint(BC.
Number)) {
803 StaticCost += SpillPlacer->getBlockFrequency(BC.
Number);
809 SpillPlacer->addConstraints(SplitConstraints);
810 return SpillPlacer->scanActiveBundles();
815bool RAGreedy::addThroughConstraints(InterferenceCache::Cursor Intf,
816 ArrayRef<unsigned> Blocks) {
817 const unsigned GroupSize = 8;
818 SpillPlacement::BlockConstraint BCS[GroupSize];
819 unsigned TBS[GroupSize];
820 unsigned B = 0,
T = 0;
822 for (
unsigned Number : Blocks) {
826 assert(
T < GroupSize &&
"Array overflow");
828 if (++
T == GroupSize) {
835 assert(
B < GroupSize &&
"Array overflow");
839 MachineBasicBlock *
MBB = MF->getBlockNumbered(
Number);
841 if (FirstNonDebugInstr !=
MBB->
end() &&
843 SA->getFirstSplitPoint(
Number)))
849 SlotIndex InsertIdx = InsertPt ==
MBB->
end()
850 ? Indexes->getMBBEndIdx(
MBB)
851 :
LIS->getInstructionIndex(*InsertPt);
852 if (Intf.
first() <= Indexes->getMBBStartIdx(
MBB) ||
859 if (Intf.
last() >= SA->getLastSplitPoint(
Number))
864 if (++
B == GroupSize) {
865 SpillPlacer->addConstraints(
ArrayRef(BCS,
B));
870 SpillPlacer->addConstraints(
ArrayRef(BCS,
B));
875bool RAGreedy::growRegion(GlobalSplitCandidate &Cand) {
877 BitVector Todo = SA->getThroughBlocks();
878 SmallVectorImpl<unsigned> &ActiveBlocks = Cand.ActiveBlocks;
879 unsigned AddedTo = 0;
881 unsigned Visited = 0;
886 ArrayRef<unsigned> NewBundles = SpillPlacer->getRecentPositive();
888 for (
unsigned Bundle : NewBundles) {
890 ArrayRef<unsigned> Blocks = Bundles->getBlocks(Bundle);
892 if (Blocks.
size() >= Budget)
894 Budget -= Blocks.
size();
895 for (
unsigned Block : Blocks) {
907 if (ActiveBlocks.
size() == AddedTo)
912 auto NewBlocks =
ArrayRef(ActiveBlocks).slice(AddedTo);
914 if (!addThroughConstraints(Cand.Intf, NewBlocks))
922 bool PrefSpill =
true;
923 if (SA->looksLikeLoopIV() && NewBlocks.size() >= 2) {
928 MachineLoop *
L = Loops->getLoopFor(MF->getBlockNumbered(NewBlocks[0]));
929 if (L &&
L->getHeader()->getNumber() == (
int)NewBlocks[0] &&
930 all_of(NewBlocks.drop_front(), [&](
unsigned Block) {
931 return L == Loops->getLoopFor(MF->getBlockNumbered(Block));
936 SpillPlacer->addPrefSpill(NewBlocks,
true);
938 AddedTo = ActiveBlocks.
size();
941 SpillPlacer->iterate();
954bool RAGreedy::calcCompactRegion(GlobalSplitCandidate &Cand) {
956 if (!SA->getNumThroughBlocks())
966 SpillPlacer->prepare(Cand.LiveBundles);
970 if (!addSplitConstraints(Cand.Intf,
Cost)) {
975 if (!growRegion(Cand)) {
980 SpillPlacer->finish();
982 if (!Cand.LiveBundles.any()) {
988 for (
int I : Cand.LiveBundles.set_bits())
989 dbgs() <<
" EB#" <<
I;
997BlockFrequency RAGreedy::calcBlockSplitCost() {
998 BlockFrequency
Cost = BlockFrequency(0);
1000 for (
const SplitAnalysis::BlockInfo &BI : UseBlocks) {
1003 Cost += SpillPlacer->getBlockFrequency(
Number);
1007 Cost += SpillPlacer->getBlockFrequency(
Number);
1016BlockFrequency RAGreedy::calcGlobalSplitCost(GlobalSplitCandidate &Cand,
1017 const AllocationOrder &Order) {
1018 BlockFrequency GlobalCost = BlockFrequency(0);
1019 const BitVector &LiveBundles = Cand.LiveBundles;
1021 for (
unsigned I = 0;
I != UseBlocks.
size(); ++
I) {
1022 const SplitAnalysis::BlockInfo &BI = UseBlocks[
I];
1023 SpillPlacement::BlockConstraint &BC = SplitConstraints[
I];
1024 bool RegIn = LiveBundles[Bundles->getBundle(BC.
Number,
false)];
1025 bool RegOut = LiveBundles[Bundles->getBundle(BC.
Number,
true)];
1028 Cand.Intf.moveToBlock(BC.
Number);
1035 GlobalCost += SpillPlacer->getBlockFrequency(BC.
Number);
1038 for (
unsigned Number : Cand.ActiveBlocks) {
1039 bool RegIn = LiveBundles[Bundles->getBundle(
Number,
false)];
1040 bool RegOut = LiveBundles[Bundles->getBundle(
Number,
true)];
1041 if (!RegIn && !RegOut)
1043 if (RegIn && RegOut) {
1045 Cand.Intf.moveToBlock(
Number);
1046 if (Cand.Intf.hasInterference()) {
1047 GlobalCost += SpillPlacer->getBlockFrequency(
Number);
1048 GlobalCost += SpillPlacer->getBlockFrequency(
Number);
1053 GlobalCost += SpillPlacer->getBlockFrequency(
Number);
1070void RAGreedy::splitAroundRegion(LiveRangeEdit &LREdit,
1071 ArrayRef<unsigned> UsedCands) {
1074 const unsigned NumGlobalIntvs = LREdit.
size();
1077 assert(NumGlobalIntvs &&
"No global intervals configured");
1087 for (
const SplitAnalysis::BlockInfo &BI : UseBlocks) {
1089 unsigned IntvIn = 0, IntvOut = 0;
1090 SlotIndex IntfIn, IntfOut;
1092 unsigned CandIn = BundleCand[Bundles->getBundle(
Number,
false)];
1093 if (CandIn != NoCand) {
1094 GlobalSplitCandidate &Cand = GlobalCand[CandIn];
1095 IntvIn = Cand.IntvIdx;
1096 Cand.Intf.moveToBlock(
Number);
1097 IntfIn = Cand.Intf.first();
1101 unsigned CandOut = BundleCand[Bundles->getBundle(
Number,
true)];
1102 if (CandOut != NoCand) {
1103 GlobalSplitCandidate &Cand = GlobalCand[CandOut];
1104 IntvOut = Cand.IntvIdx;
1105 Cand.Intf.moveToBlock(
Number);
1106 IntfOut = Cand.Intf.last();
1111 if (!IntvIn && !IntvOut) {
1113 if (SA->shouldSplitSingleBlock(BI, SingleInstrs))
1114 SE->splitSingleBlock(BI);
1118 if (IntvIn && IntvOut)
1119 SE->splitLiveThroughBlock(
Number, IntvIn, IntfIn, IntvOut, IntfOut);
1121 SE->splitRegInBlock(BI, IntvIn, IntfIn);
1123 SE->splitRegOutBlock(BI, IntvOut, IntfOut);
1129 BitVector Todo = SA->getThroughBlocks();
1130 for (
unsigned UsedCand : UsedCands) {
1131 ArrayRef<unsigned> Blocks = GlobalCand[UsedCand].ActiveBlocks;
1132 for (
unsigned Number : Blocks) {
1137 unsigned IntvIn = 0, IntvOut = 0;
1138 SlotIndex IntfIn, IntfOut;
1140 unsigned CandIn = BundleCand[Bundles->getBundle(
Number,
false)];
1141 if (CandIn != NoCand) {
1142 GlobalSplitCandidate &Cand = GlobalCand[CandIn];
1143 IntvIn = Cand.IntvIdx;
1144 Cand.Intf.moveToBlock(
Number);
1145 IntfIn = Cand.Intf.first();
1148 unsigned CandOut = BundleCand[Bundles->getBundle(
Number,
true)];
1149 if (CandOut != NoCand) {
1150 GlobalSplitCandidate &Cand = GlobalCand[CandOut];
1151 IntvOut = Cand.IntvIdx;
1152 Cand.Intf.moveToBlock(
Number);
1153 IntfOut = Cand.Intf.last();
1155 if (!IntvIn && !IntvOut)
1157 SE->splitLiveThroughBlock(
Number, IntvIn, IntfIn, IntvOut, IntfOut);
1163 SmallVector<unsigned, 8> IntvMap;
1164 SE->finish(&IntvMap);
1165 DebugVars->splitRegister(
Reg, LREdit.
regs(), *
LIS);
1167 unsigned OrigBlocks = SA->getNumLiveBlocks();
1174 for (
unsigned I = 0,
E = LREdit.
size();
I !=
E; ++
I) {
1175 const LiveInterval &
Reg =
LIS->getInterval(LREdit.
get(
I));
1178 if (ExtraInfo->getOrInitStage(
Reg.reg()) !=
RS_New)
1183 if (IntvMap[
I] == 0) {
1190 if (IntvMap[
I] < NumGlobalIntvs) {
1191 if (SA->countLiveBlocks(&
Reg) >= OrigBlocks) {
1192 LLVM_DEBUG(
dbgs() <<
"Main interval covers the same " << OrigBlocks
1193 <<
" blocks as original.\n");
1205 MF->verify(
LIS, Indexes,
"After splitting live range around region",
1209MCRegister RAGreedy::tryRegionSplit(
const LiveInterval &VirtReg,
1210 AllocationOrder &Order,
1211 SmallVectorImpl<Register> &NewVRegs) {
1212 if (!
TRI->shouldRegionSplitForVirtReg(*MF, VirtReg))
1214 unsigned NumCands = 0;
1215 BlockFrequency SpillCost = calcBlockSplitCost();
1216 BlockFrequency BestCost;
1219 bool HasCompact = calcCompactRegion(GlobalCand.front());
1227 BestCost = SpillCost;
1232 unsigned BestCand = calculateRegionSplitCost(VirtReg, Order, BestCost,
1236 if (!HasCompact && BestCand == NoCand)
1239 return doRegionSplit(VirtReg, BestCand, HasCompact, NewVRegs);
1242unsigned RAGreedy::calculateRegionSplitCostAroundReg(MCRegister PhysReg,
1243 AllocationOrder &Order,
1244 BlockFrequency &BestCost,
1246 unsigned &BestCand) {
1249 if (NumCands == IntfCache.getMaxCursors()) {
1250 unsigned WorstCount = ~0
u;
1252 for (
unsigned CandIndex = 0; CandIndex != NumCands; ++CandIndex) {
1253 if (CandIndex == BestCand || !GlobalCand[CandIndex].PhysReg)
1255 unsigned Count = GlobalCand[CandIndex].LiveBundles.count();
1256 if (
Count < WorstCount) {
1262 GlobalCand[Worst] = GlobalCand[NumCands];
1263 if (BestCand == NumCands)
1267 if (GlobalCand.size() <= NumCands)
1268 GlobalCand.resize(NumCands+1);
1269 GlobalSplitCandidate &Cand = GlobalCand[NumCands];
1270 Cand.reset(IntfCache, PhysReg);
1272 SpillPlacer->prepare(Cand.LiveBundles);
1273 BlockFrequency
Cost;
1274 if (!addSplitConstraints(Cand.Intf,
Cost)) {
1280 if (
Cost >= BestCost) {
1282 if (BestCand == NoCand)
1283 dbgs() <<
" worse than no bundles\n";
1285 dbgs() <<
" worse than "
1286 <<
printReg(GlobalCand[BestCand].PhysReg,
TRI) <<
'\n';
1290 if (!growRegion(Cand)) {
1295 SpillPlacer->finish();
1298 if (!Cand.LiveBundles.any()) {
1303 Cost += calcGlobalSplitCost(Cand, Order);
1306 for (
int I : Cand.LiveBundles.set_bits())
1307 dbgs() <<
" EB#" <<
I;
1310 if (
Cost < BestCost) {
1311 BestCand = NumCands;
1319unsigned RAGreedy::calculateRegionSplitCost(
const LiveInterval &VirtReg,
1320 AllocationOrder &Order,
1321 BlockFrequency &BestCost,
1324 unsigned BestCand = NoCand;
1325 for (MCRegister PhysReg : Order) {
1327 if (IgnoreCSR && EvictAdvisor->isUnusedCalleeSavedReg(PhysReg))
1330 calculateRegionSplitCostAroundReg(PhysReg, Order, BestCost, NumCands,
1337MCRegister RAGreedy::doRegionSplit(
const LiveInterval &VirtReg,
1338 unsigned BestCand,
bool HasCompact,
1339 SmallVectorImpl<Register> &NewVRegs) {
1340 SmallVector<unsigned, 8> UsedCands;
1342 LiveRangeEdit LREdit(&VirtReg, NewVRegs, *MF, *
LIS,
VRM,
this, &
DeadRemats);
1346 BundleCand.assign(Bundles->getNumBundles(), NoCand);
1349 if (BestCand != NoCand) {
1350 GlobalSplitCandidate &Cand = GlobalCand[BestCand];
1351 if (
unsigned B = Cand.getBundles(BundleCand, BestCand)) {
1353 Cand.IntvIdx = SE->openIntv();
1355 <<
B <<
" bundles, intv " << Cand.IntvIdx <<
".\n");
1362 GlobalSplitCandidate &Cand = GlobalCand.front();
1363 assert(!Cand.PhysReg &&
"Compact region has no physreg");
1364 if (
unsigned B = Cand.getBundles(BundleCand, 0)) {
1366 Cand.IntvIdx = SE->openIntv();
1368 <<
" bundles, intv " << Cand.IntvIdx <<
".\n");
1373 splitAroundRegion(LREdit, UsedCands);
1374 return MCRegister();
1379bool RAGreedy::trySplitAroundHintReg(MCRegister Hint,
1380 const LiveInterval &VirtReg,
1381 SmallVectorImpl<Register> &NewVRegs,
1382 AllocationOrder &Order) {
1386 if (MF->getFunction().hasOptSize())
1390 if (ExtraInfo->getStage(VirtReg) >=
RS_Split2)
1393 BlockFrequency
Cost = BlockFrequency(0);
1403 for (
const MachineOperand &Opnd :
MRI->reg_nodbg_operands(
Reg)) {
1404 const MachineInstr &
Instr = *Opnd.getParent();
1405 if (!
Instr.isCopy() || Opnd.isImplicit())
1409 const bool IsDef = Opnd.isDef();
1410 const MachineOperand &OtherOpnd =
Instr.getOperand(IsDef);
1413 if (OtherReg ==
Reg)
1416 unsigned SubReg = Opnd.getSubReg();
1417 unsigned OtherSubReg = OtherOpnd.
getSubReg();
1418 if (SubReg && OtherSubReg && SubReg != OtherSubReg)
1422 if (Opnd.readsReg()) {
1423 SlotIndex
Index =
LIS->getInstructionIndex(Instr).getRegSlot();
1426 LaneBitmask
Mask =
TRI->getSubRegIndexLaneMask(SubReg);
1430 if (
any_of(VirtReg.
subranges(), [=](
const LiveInterval::SubRange &S) {
1431 return (S.LaneMask & Mask).any() && S.liveAt(Index);
1436 if (VirtReg.
liveAt(Index))
1441 MCRegister OtherPhysReg =
1443 MCRegister ThisHint = SubReg ?
TRI->getSubReg(Hint, SubReg) :
Hint;
1444 if (OtherPhysReg == ThisHint)
1445 Cost += MBFI->getBlockFreq(
Instr.getParent());
1451 if (
Cost == BlockFrequency(0))
1454 unsigned NumCands = 0;
1455 unsigned BestCand = NoCand;
1456 SA->analyze(&VirtReg);
1457 calculateRegionSplitCostAroundReg(Hint, Order,
Cost, NumCands, BestCand);
1458 if (BestCand == NoCand)
1461 doRegionSplit(VirtReg, BestCand,
false, NewVRegs);
1472MCRegister RAGreedy::tryBlockSplit(
const LiveInterval &VirtReg,
1473 AllocationOrder &Order,
1474 SmallVectorImpl<Register> &NewVRegs) {
1475 assert(&SA->getParent() == &VirtReg &&
"Live range wasn't analyzed");
1478 LiveRangeEdit LREdit(&VirtReg, NewVRegs, *MF, *
LIS,
VRM,
this, &
DeadRemats);
1481 for (
const SplitAnalysis::BlockInfo &BI : UseBlocks) {
1482 if (SA->shouldSplitSingleBlock(BI, SingleInstrs))
1483 SE->splitSingleBlock(BI);
1487 return MCRegister();
1490 SmallVector<unsigned, 8> IntvMap;
1491 SE->finish(&IntvMap);
1494 DebugVars->splitRegister(
Reg, LREdit.
regs(), *
LIS);
1498 for (
unsigned I = 0,
E = LREdit.
size();
I !=
E; ++
I) {
1499 const LiveInterval &LI =
LIS->getInterval(LREdit.
get(
I));
1500 if (ExtraInfo->getOrInitStage(LI.
reg()) ==
RS_New && IntvMap[
I] == 0)
1505 MF->verify(
LIS, Indexes,
"After splitting live range around basic blocks",
1507 return MCRegister();
1520 assert(SuperRC &&
"Invalid register class");
1523 MI->getRegClassConstraintEffectForVReg(
Reg, SuperRC,
TII,
TRI,
1538 for (
auto [
MI, OpIdx] :
Ops) {
1542 if (SubReg == 0 && MO.
isUse()) {
1551 Mask |= ~SubRegMask;
1568 auto DestSrc =
TII->isCopyInstr(*
MI);
1569 if (DestSrc && !
MI->isBundled() &&
1570 DestSrc->Destination->getSubReg() == DestSrc->Source->getSubReg())
1579 LiveAtMask |= S.LaneMask;
1584 return (ReadMask & ~(LiveAtMask &
TRI->getCoveringLanes())).
any();
1594MCRegister RAGreedy::tryInstructionSplit(
const LiveInterval &VirtReg,
1595 AllocationOrder &Order,
1596 SmallVectorImpl<Register> &NewVRegs) {
1600 bool SplitSubClass =
true;
1603 return MCRegister();
1604 SplitSubClass =
false;
1609 LiveRangeEdit LREdit(&VirtReg, NewVRegs, *MF, *
LIS,
VRM,
this, &
DeadRemats);
1613 if (
Uses.size() <= 1)
1614 return MCRegister();
1617 <<
" individual instrs.\n");
1620 TRI->getLargestLegalSuperClass(CurRC, *MF);
1621 unsigned SuperRCNumAllocatableRegs =
1627 for (
const SlotIndex Use :
Uses) {
1628 if (
const MachineInstr *
MI = Indexes->getInstructionFromIndex(Use)) {
1629 if (TII->isFullCopyInstr(*
MI) ||
1631 SuperRCNumAllocatableRegs ==
1642 SlotIndex SegStart = SE->enterIntvBefore(Use);
1643 SlotIndex SegStop = SE->leaveIntvAfter(Use);
1644 SE->useIntv(SegStart, SegStop);
1647 if (LREdit.
empty()) {
1649 return MCRegister();
1652 SmallVector<unsigned, 8> IntvMap;
1653 SE->finish(&IntvMap);
1654 DebugVars->splitRegister(VirtReg.
reg(), LREdit.
regs(), *
LIS);
1657 return MCRegister();
1669void RAGreedy::calcGapWeights(MCRegister PhysReg,
1670 SmallVectorImpl<float> &GapWeight) {
1671 assert(SA->getUseBlocks().size() == 1 &&
"Not a local interval");
1672 const SplitAnalysis::BlockInfo &BI = SA->getUseBlocks().front();
1674 const unsigned NumGaps =
Uses.size()-1;
1677 SlotIndex StartIdx =
1682 GapWeight.
assign(NumGaps, 0.0f);
1685 for (MCRegUnit Unit :
TRI->regunits(PhysReg)) {
1686 if (!
Matrix->query(
const_cast<LiveInterval &
>(SA->getParent()), Unit)
1687 .checkInterference())
1698 Matrix->getLiveUnions()[
static_cast<unsigned>(
Unit)].
find(StartIdx);
1699 for (
unsigned Gap = 0; IntI.valid() && IntI.start() < StopIdx; ++IntI) {
1701 while (
Uses[Gap+1].getBoundaryIndex() < IntI.start())
1702 if (++Gap == NumGaps)
1708 const float weight = IntI.value()->weight();
1709 for (; Gap != NumGaps; ++Gap) {
1710 GapWeight[Gap] = std::max(GapWeight[Gap], weight);
1711 if (
Uses[Gap+1].getBaseIndex() >= IntI.stop())
1720 for (MCRegUnit Unit :
TRI->regunits(PhysReg)) {
1726 for (
unsigned Gap = 0;
I !=
E &&
I->start < StopIdx; ++
I) {
1727 while (
Uses[Gap+1].getBoundaryIndex() <
I->start)
1728 if (++Gap == NumGaps)
1733 for (; Gap != NumGaps; ++Gap) {
1735 if (
Uses[Gap+1].getBaseIndex() >=
I->end)
1747MCRegister RAGreedy::tryLocalSplit(
const LiveInterval &VirtReg,
1748 AllocationOrder &Order,
1749 SmallVectorImpl<Register> &NewVRegs) {
1752 if (SA->getUseBlocks().size() != 1)
1753 return MCRegister();
1755 const SplitAnalysis::BlockInfo &BI = SA->getUseBlocks().front();
1765 if (
Uses.size() <= 2)
1766 return MCRegister();
1767 const unsigned NumGaps =
Uses.size()-1;
1770 dbgs() <<
"tryLocalSplit: ";
1771 for (
const auto &Use :
Uses)
1778 SmallVector<unsigned, 8> RegMaskGaps;
1779 if (
Matrix->checkRegMaskInterference(VirtReg)) {
1786 unsigned RE = RMS.
size();
1787 for (
unsigned I = 0;
I != NumGaps && RI != RE; ++
I) {
1798 RegMaskGaps.push_back(
I);
1825 bool ProgressRequired = ExtraInfo->getStage(VirtReg) >=
RS_Split2;
1828 unsigned BestBefore = NumGaps;
1829 unsigned BestAfter = 0;
1832 const float blockFreq =
1833 SpillPlacer->getBlockFrequency(BI.
MBB->
getNumber()).getFrequency() *
1834 (1.0f / MBFI->getEntryFreq().getFrequency());
1837 for (MCRegister PhysReg : Order) {
1841 calcGapWeights(PhysReg, GapWeight);
1844 if (
Matrix->checkRegMaskInterference(VirtReg, PhysReg))
1845 for (
unsigned Gap : RegMaskGaps)
1852 unsigned SplitBefore = 0, SplitAfter = 1;
1856 float MaxGap = GapWeight[0];
1860 const bool LiveBefore = SplitBefore != 0 || BI.
LiveIn;
1861 const bool LiveAfter = SplitAfter != NumGaps || BI.
LiveOut;
1864 <<
'-' <<
Uses[SplitAfter] <<
" I=" << MaxGap);
1867 if (!LiveBefore && !LiveAfter) {
1875 unsigned NewGaps = LiveBefore + SplitAfter - SplitBefore + LiveAfter;
1878 bool Legal = !ProgressRequired || NewGaps < NumGaps;
1887 blockFreq * (NewGaps + 1),
1888 Uses[SplitBefore].distance(
Uses[SplitAfter]) +
1896 float Diff = EstWeight - MaxGap;
1897 if (Diff > BestDiff) {
1900 BestBefore = SplitBefore;
1901 BestAfter = SplitAfter;
1908 if (++SplitBefore < SplitAfter) {
1911 if (GapWeight[SplitBefore - 1] >= MaxGap) {
1912 MaxGap = GapWeight[SplitBefore];
1913 for (
unsigned I = SplitBefore + 1;
I != SplitAfter; ++
I)
1914 MaxGap = std::max(MaxGap, GapWeight[
I]);
1922 if (SplitAfter >= NumGaps) {
1928 MaxGap = std::max(MaxGap, GapWeight[SplitAfter++]);
1933 if (BestBefore == NumGaps)
1934 return MCRegister();
1937 <<
Uses[BestAfter] <<
", " << BestDiff <<
", "
1938 << (BestAfter - BestBefore + 1) <<
" instrs\n");
1940 LiveRangeEdit LREdit(&VirtReg, NewVRegs, *MF, *
LIS,
VRM,
this, &
DeadRemats);
1944 SlotIndex SegStart = SE->enterIntvBefore(
Uses[BestBefore]);
1945 SlotIndex SegStop = SE->leaveIntvAfter(
Uses[BestAfter]);
1946 SE->useIntv(SegStart, SegStop);
1947 SmallVector<unsigned, 8> IntvMap;
1948 SE->finish(&IntvMap);
1949 DebugVars->splitRegister(VirtReg.
reg(), LREdit.
regs(), *
LIS);
1953 bool LiveBefore = BestBefore != 0 || BI.
LiveIn;
1954 bool LiveAfter = BestAfter != NumGaps || BI.
LiveOut;
1955 unsigned NewGaps = LiveBefore + BestAfter - BestBefore + LiveAfter;
1956 if (NewGaps >= NumGaps) {
1958 assert(!ProgressRequired &&
"Didn't make progress when it was required.");
1959 for (
unsigned I = 0,
E = IntvMap.
size();
I !=
E; ++
I)
1960 if (IntvMap[
I] == 1) {
1968 return MCRegister();
1978MCRegister RAGreedy::trySplit(
const LiveInterval &VirtReg,
1979 AllocationOrder &Order,
1980 SmallVectorImpl<Register> &NewVRegs,
1983 if (ExtraInfo->getStage(VirtReg) >=
RS_Spill)
1984 return MCRegister();
1987 if (
LIS->intervalIsInOneMBB(VirtReg)) {
1990 SA->analyze(&VirtReg);
1991 MCRegister PhysReg = tryLocalSplit(VirtReg, Order, NewVRegs);
1992 if (PhysReg || !NewVRegs.
empty())
1994 return tryInstructionSplit(VirtReg, Order, NewVRegs);
1997 NamedRegionTimer
T(
"global_split",
"Global Splitting",
TimerGroupName,
2000 SA->analyze(&VirtReg);
2005 if (ExtraInfo->getStage(VirtReg) <
RS_Split2) {
2006 MCRegister PhysReg = tryRegionSplit(VirtReg, Order, NewVRegs);
2007 if (PhysReg || !NewVRegs.
empty())
2012 return tryBlockSplit(VirtReg, Order, NewVRegs);
2035 if (PhysReg == AssignedReg)
2037 return TRI.regsOverlap(PhysReg, AssignedReg);
2048bool RAGreedy::mayRecolorAllInterferences(
2049 MCRegister PhysReg,
const LiveInterval &VirtReg,
2050 SmallLISet &RecoloringCandidates,
const SmallVirtRegSet &FixedRegisters) {
2053 for (MCRegUnit Unit :
TRI->regunits(PhysReg)) {
2054 LiveIntervalUnion::Query &Q =
Matrix->query(VirtReg, Unit);
2061 CutOffInfo |= CO_Interf;
2076 if (((ExtraInfo->getStage(*Intf) ==
RS_Done &&
2077 MRI->getRegClass(Intf->reg()) == CurRC &&
2081 FixedRegisters.
count(Intf->reg())) {
2083 dbgs() <<
"Early abort: the interference is not recolorable.\n");
2086 RecoloringCandidates.insert(Intf);
2135MCRegister RAGreedy::tryLastChanceRecoloring(
2136 const LiveInterval &VirtReg, AllocationOrder &Order,
2138 RecoloringStack &RecolorStack,
unsigned Depth) {
2139 if (!
TRI->shouldUseLastChanceRecoloringForVirtReg(*MF, VirtReg))
2142 LLVM_DEBUG(
dbgs() <<
"Try last chance recoloring for " << VirtReg <<
'\n');
2144 const ssize_t EntryStackSize = RecolorStack.size();
2148 "Last chance recoloring should really be last chance");
2154 LLVM_DEBUG(
dbgs() <<
"Abort because max depth has been reached.\n");
2155 CutOffInfo |= CO_Depth;
2160 SmallLISet RecoloringCandidates;
2168 for (MCRegister PhysReg : Order) {
2172 RecoloringCandidates.clear();
2173 CurrentNewVRegs.
clear();
2176 if (
Matrix->checkInterference(VirtReg, PhysReg) >
2179 dbgs() <<
"Some interferences are not with virtual registers.\n");
2186 if (!mayRecolorAllInterferences(PhysReg, VirtReg, RecoloringCandidates,
2188 LLVM_DEBUG(
dbgs() <<
"Some interferences cannot be recolored.\n");
2195 PQueue RecoloringQueue;
2196 for (
const LiveInterval *RC : RecoloringCandidates) {
2198 enqueue(RecoloringQueue, RC);
2200 "Interferences are supposed to be with allocated variables");
2203 RecolorStack.push_back(std::make_pair(RC,
VRM->getPhys(ItVirtReg)));
2212 Matrix->assign(VirtReg, PhysReg);
2221 if (tryRecoloringCandidates(RecoloringQueue, CurrentNewVRegs,
2222 FixedRegisters, RecolorStack,
Depth)) {
2227 if (
VRM->hasPhys(ThisVirtReg)) {
2228 Matrix->unassign(VirtReg);
2233 LLVM_DEBUG(
dbgs() <<
"tryRecoloringCandidates deleted a fixed register "
2235 FixedRegisters.
erase(ThisVirtReg);
2236 return MCRegister();
2243 FixedRegisters = SaveFixedRegisters;
2244 Matrix->unassign(VirtReg);
2250 for (
Register R : CurrentNewVRegs) {
2251 if (RecoloringCandidates.count(&
LIS->getInterval(R)))
2262 for (ssize_t
I = RecolorStack.size() - 1;
I >= EntryStackSize; --
I) {
2263 const LiveInterval *LI;
2265 std::tie(LI, PhysReg) = RecolorStack[
I];
2267 if (
VRM->hasPhys(LI->
reg()))
2271 for (
size_t I = EntryStackSize;
I != RecolorStack.size(); ++
I) {
2272 const LiveInterval *LI;
2274 std::tie(LI, PhysReg) = RecolorStack[
I];
2275 if (!LI->
empty() && !
MRI->reg_nodbg_empty(LI->
reg()))
2276 Matrix->assign(*LI, PhysReg);
2280 RecolorStack.resize(EntryStackSize);
2295bool RAGreedy::tryRecoloringCandidates(PQueue &RecoloringQueue,
2296 SmallVectorImpl<Register> &NewVRegs,
2298 RecoloringStack &RecolorStack,
2300 while (!RecoloringQueue.empty()) {
2301 const LiveInterval *LI =
dequeue(RecoloringQueue);
2303 MCRegister PhysReg = selectOrSplitImpl(*LI, NewVRegs, FixedRegisters,
2304 RecolorStack,
Depth + 1);
2309 if (PhysReg == ~0u || (!PhysReg && !LI->
empty()))
2313 assert(LI->
empty() &&
"Only empty live-range do not require a register");
2315 <<
" succeeded. Empty LI.\n");
2319 <<
" succeeded with: " <<
printReg(PhysReg,
TRI) <<
'\n');
2321 Matrix->assign(*LI, PhysReg);
2333 CutOffInfo = CO_None;
2334 LLVMContext &Ctx = MF->getFunction().getContext();
2336 RecoloringStack RecolorStack;
2338 selectOrSplitImpl(VirtReg, NewVRegs, FixedRegisters, RecolorStack);
2339 if (Reg == ~0U && (CutOffInfo != CO_None)) {
2340 uint8_t CutOffEncountered = CutOffInfo & (CO_Depth | CO_Interf);
2341 if (CutOffEncountered == CO_Depth)
2342 Ctx.emitError(
"register allocation failed: maximum depth for recoloring "
2343 "reached. Use -fexhaustive-register-search to skip "
2345 else if (CutOffEncountered == CO_Interf)
2346 Ctx.emitError(
"register allocation failed: maximum interference for "
2347 "recoloring reached. Use -fexhaustive-register-search "
2349 else if (CutOffEncountered == (CO_Depth | CO_Interf))
2350 Ctx.emitError(
"register allocation failed: maximum interference and "
2351 "depth for recoloring reached. Use "
2352 "-fexhaustive-register-search to skip cutoffs");
2360 uint64_t SpillCost = 0;
2368 if (
MI->isMetaInstruction())
2373 auto [Reads, Writes] =
MI->readsWritesVirtualRegister(LI.
reg());
2374 auto MBBFreq = SpillPlacer->getBlockFrequency(
MI->getParent()->getNumber());
2375 SpillCost += (Reads + Writes) * MBBFreq.getFrequency();
2387MCRegister RAGreedy::tryAssignCSRFirstTime(
2388 const LiveInterval &VirtReg, AllocationOrder &Order, MCRegister PhysReg,
2389 uint8_t &CostPerUseLimit, SmallVectorImpl<Register> &NewVRegs) {
2393 SA->analyze(&VirtReg);
2394 if (calcSpillCost(VirtReg) >= CSRCost)
2399 CostPerUseLimit = 1;
2400 return MCRegister();
2402 if (ExtraInfo->getStage(VirtReg) <
RS_Split) {
2405 SA->analyze(&VirtReg);
2406 unsigned NumCands = 0;
2407 BlockFrequency BestCost = CSRCost;
2408 unsigned BestCand = calculateRegionSplitCost(VirtReg, Order, BestCost,
2410 if (BestCand == NoCand)
2415 doRegionSplit(VirtReg, BestCand,
false, NewVRegs);
2416 return MCRegister();
2423 SetOfBrokenHints.remove(&LI);
2426void RAGreedy::initializeCSRCost() {
2436 if (!CSRCost.getFrequency())
2440 uint64_t ActualEntry = MBFI->getEntryFreq().getFrequency();
2446 if (ActualEntry < FixedEntry) {
2448 }
else if (ActualEntry <= UINT32_MAX) {
2450 CSRCost /= BranchProbability(FixedEntry, ActualEntry);
2454 BlockFrequency(CSRCost.getFrequency() * (ActualEntry / FixedEntry));
2457 uint64_t EntryFreq = MBFI->getEntryFreq().getFrequency();
2458 CSRCost = BlockFrequency(
TRI->getCSRFirstUseCost(*MF) * EntryFreq);
2459 unsigned Scale =
TRI->getCSRCostScale(*MF);
2465 CSRCost *= BranchProbability(Scale, 100);
2467 CSRCost /= BranchProbability(100, Scale);
2474void RAGreedy::collectHintInfo(
Register Reg, HintsInfo &Out) {
2477 for (
const MachineOperand &Opnd :
MRI->reg_nodbg_operands(
Reg)) {
2478 const MachineInstr &
Instr = *Opnd.getParent();
2479 if (!
Instr.isCopy() || Opnd.isImplicit())
2483 const MachineOperand &OtherOpnd =
Instr.getOperand(Opnd.isDef());
2485 if (OtherReg ==
Reg)
2487 unsigned OtherSubReg = OtherOpnd.
getSubReg();
2488 unsigned SubReg = Opnd.getSubReg();
2491 MCRegister OtherPhysReg;
2494 OtherPhysReg =
TRI->getMatchingSuperReg(OtherReg, OtherSubReg, RC);
2496 OtherPhysReg =
TRI->getMatchingSuperReg(OtherReg, SubReg, RC);
2498 OtherPhysReg = OtherReg;
2500 OtherPhysReg =
VRM->getPhys(OtherReg);
2504 if (SubReg && OtherSubReg && SubReg != OtherSubReg)
2510 Out.push_back(HintInfo(MBFI->getBlockFreq(
Instr.getParent()), OtherReg,
2519BlockFrequency RAGreedy::getBrokenHintFreq(
const HintsInfo &
List,
2520 MCRegister PhysReg) {
2521 BlockFrequency
Cost = BlockFrequency(0);
2522 for (
const HintInfo &Info :
List) {
2523 if (
Info.PhysReg != PhysReg)
2537void RAGreedy::tryHintRecoloring(
const LiveInterval &VirtReg) {
2543 MCRegister PhysReg =
VRM->getPhys(
Reg);
2546 SmallSet<Register, 4> Visited = {
Reg};
2555 MCRegister CurrPhys =
VRM->getPhys(
Reg);
2560 "We have an unallocated variable which should have been handled");
2566 LiveInterval &LI =
LIS->getInterval(
Reg);
2569 if (CurrPhys != PhysReg && (!
MRI->getRegClass(
Reg)->contains(PhysReg) ||
2570 Matrix->checkInterference(LI, PhysReg)))
2574 <<
") is recolorable.\n");
2578 collectHintInfo(
Reg, Info);
2581 if (CurrPhys != PhysReg) {
2583 BlockFrequency OldCopiesCost = getBrokenHintFreq(Info, CurrPhys);
2584 BlockFrequency NewCopiesCost = getBrokenHintFreq(Info, PhysReg);
2588 if (OldCopiesCost < NewCopiesCost) {
2598 Matrix->assign(LI, PhysReg);
2602 for (
const HintInfo &HI : Info) {
2604 if (
HI.Reg.isVirtual() && Visited.
insert(
HI.Reg).second)
2607 }
while (!RecoloringCandidates.
empty());
2646void RAGreedy::tryHintsRecoloring() {
2647 for (
const LiveInterval *LI : SetOfBrokenHints) {
2649 "Recoloring is possible only for virtual registers");
2652 if (!
VRM->hasPhys(LI->
reg()))
2654 tryHintRecoloring(*LI);
2658MCRegister RAGreedy::selectOrSplitImpl(
const LiveInterval &VirtReg,
2659 SmallVectorImpl<Register> &NewVRegs,
2661 RecoloringStack &RecolorStack,
2663 uint8_t CostPerUseLimit = uint8_t(~0u);
2667 if (MCRegister PhysReg =
2668 tryAssign(VirtReg, Order, NewVRegs, FixedRegisters)) {
2672 if (CSRCost.getFrequency() &&
2673 EvictAdvisor->isUnusedCalleeSavedReg(PhysReg) && NewVRegs.
empty()) {
2674 MCRegister CSRReg = tryAssignCSRFirstTime(VirtReg, Order, PhysReg,
2675 CostPerUseLimit, NewVRegs);
2676 if (CSRReg || !NewVRegs.
empty())
2684 if (!NewVRegs.
empty())
2685 return MCRegister();
2689 << ExtraInfo->getCascade(VirtReg.
reg()) <<
'\n');
2695 if (MCRegister PhysReg =
2696 tryEvict(VirtReg, Order, NewVRegs, CostPerUseLimit,
2704 if (Hint && Hint != PhysReg)
2705 SetOfBrokenHints.insert(&VirtReg);
2710 assert((NewVRegs.
empty() ||
Depth) &&
"Cannot append to existing NewVRegs");
2716 ExtraInfo->setStage(VirtReg,
RS_Split);
2719 return MCRegister();
2724 unsigned NewVRegSizeBefore = NewVRegs.
size();
2725 MCRegister PhysReg = trySplit(VirtReg, Order, NewVRegs, FixedRegisters);
2726 if (PhysReg || (NewVRegs.
size() - NewVRegSizeBefore))
2733 return tryLastChanceRecoloring(VirtReg, Order, NewVRegs, FixedRegisters,
2734 RecolorStack,
Depth);
2748 DebugVars->splitRegister(r, LRE.regs(), *
LIS);
2750 DebugVars->splitRegister(r, LRE.regs(), *
LIS);
2753 MF->verify(
LIS, Indexes,
"After spilling", &
errs());
2757 return MCRegister();
2760void RAGreedy::RAGreedyStats::report(MachineOptimizationRemarkMissed &R) {
2761 using namespace ore;
2763 R <<
NV(
"NumSpills", Spills) <<
" spills ";
2764 R <<
NV(
"TotalSpillsCost", SpillsCost) <<
" total spills cost ";
2767 R <<
NV(
"NumFoldedSpills", FoldedSpills) <<
" folded spills ";
2768 R <<
NV(
"TotalFoldedSpillsCost", FoldedSpillsCost)
2769 <<
" total folded spills cost ";
2772 R <<
NV(
"NumReloads", Reloads) <<
" reloads ";
2773 R <<
NV(
"TotalReloadsCost", ReloadsCost) <<
" total reloads cost ";
2775 if (FoldedReloads) {
2776 R <<
NV(
"NumFoldedReloads", FoldedReloads) <<
" folded reloads ";
2777 R <<
NV(
"TotalFoldedReloadsCost", FoldedReloadsCost)
2778 <<
" total folded reloads cost ";
2780 if (ZeroCostFoldedReloads)
2781 R <<
NV(
"NumZeroCostFoldedReloads", ZeroCostFoldedReloads)
2782 <<
" zero cost folded reloads ";
2784 R <<
NV(
"NumVRCopies",
Copies) <<
" virtual registers copies ";
2785 R <<
NV(
"TotalCopiesCost", CopiesCost) <<
" total copies cost ";
2789RAGreedy::RAGreedyStats RAGreedy::computeStats(MachineBasicBlock &
MBB) {
2790 RAGreedyStats
Stats;
2791 const MachineFrameInfo &MFI = MF->getFrameInfo();
2794 auto isSpillSlotAccess = [&MFI](
const MachineMemOperand *
A) {
2796 A->getPseudoValue())->getFrameIndex());
2798 auto isPatchpointInstr = [](
const MachineInstr &
MI) {
2799 return MI.getOpcode() == TargetOpcode::PATCHPOINT ||
2800 MI.getOpcode() == TargetOpcode::STACKMAP ||
2801 MI.getOpcode() == TargetOpcode::STATEPOINT;
2803 for (MachineInstr &
MI :
MBB) {
2804 auto DestSrc = TII->isCopyInstr(
MI);
2806 const MachineOperand &Dest = *DestSrc->Destination;
2807 const MachineOperand &Src = *DestSrc->Source;
2813 SrcReg =
VRM->getPhys(SrcReg);
2814 if (SrcReg && Src.getSubReg())
2815 SrcReg =
TRI->getSubReg(SrcReg, Src.getSubReg());
2818 DestReg =
VRM->getPhys(DestReg);
2822 if (SrcReg != DestReg)
2828 SmallVector<const MachineMemOperand *, 2>
Accesses;
2837 if (TII->hasLoadFromStackSlot(
MI,
Accesses) &&
2839 if (!isPatchpointInstr(
MI)) {
2844 std::pair<unsigned, unsigned> NonZeroCostRange =
2845 TII->getPatchpointUnfoldableRange(
MI);
2846 SmallSet<unsigned, 16> FoldedReloads;
2847 SmallSet<unsigned, 16> ZeroCostFoldedReloads;
2848 for (
unsigned Idx = 0,
E =
MI.getNumOperands(); Idx <
E; ++Idx) {
2849 MachineOperand &MO =
MI.getOperand(Idx);
2852 if (Idx >= NonZeroCostRange.first && Idx < NonZeroCostRange.second)
2858 for (
unsigned Slot : FoldedReloads)
2859 ZeroCostFoldedReloads.
erase(Slot);
2860 Stats.FoldedReloads += FoldedReloads.size();
2861 Stats.ZeroCostFoldedReloads += ZeroCostFoldedReloads.
size();
2865 if (TII->hasStoreToStackSlot(
MI,
Accesses) &&
2872 float RelFreq = MBFI->getBlockFreqRelativeToEntryBlock(&
MBB);
2874 Stats.FoldedReloadsCost = RelFreq *
Stats.FoldedReloads;
2876 Stats.FoldedSpillsCost = RelFreq *
Stats.FoldedSpills;
2881RAGreedy::RAGreedyStats RAGreedy::reportStats(MachineLoop *L) {
2882 RAGreedyStats
Stats;
2885 for (MachineLoop *SubLoop : *L)
2886 Stats.add(reportStats(SubLoop));
2888 for (MachineBasicBlock *
MBB :
L->getBlocks())
2890 if (Loops->getLoopFor(
MBB) == L)
2893 if (!
Stats.isEmpty()) {
2894 using namespace ore;
2897 MachineOptimizationRemarkMissed
R(
DEBUG_TYPE,
"LoopSpillReloadCopies",
2898 L->getStartLoc(),
L->getHeader());
2900 R <<
"generated in loop";
2907void RAGreedy::reportStats() {
2910 RAGreedyStats
Stats;
2911 for (MachineLoop *L : *Loops)
2912 Stats.add(reportStats(L));
2914 for (MachineBasicBlock &
MBB : *MF)
2915 if (!Loops->getLoopFor(&
MBB))
2917 if (!
Stats.isEmpty()) {
2918 using namespace ore;
2922 if (
auto *SP = MF->getFunction().getSubprogram())
2924 MachineOptimizationRemarkMissed
R(
DEBUG_TYPE,
"SpillReloadCopies", Loc,
2927 R <<
"generated in function";
2933bool RAGreedy::hasVirtRegAlloc() {
2934 for (
unsigned I = 0,
E =
MRI->getNumVirtRegs();
I !=
E; ++
I) {
2936 if (
MRI->reg_nodbg_empty(
Reg))
2946 LLVM_DEBUG(
dbgs() <<
"********** GREEDY REGISTER ALLOCATION **********\n"
2947 <<
"********** Function: " << mf.
getName() <<
'\n');
2953 MF->verify(
LIS, Indexes,
"Before greedy register allocator", &
errs());
2959 if (!hasVirtRegAlloc())
2964 Indexes->packIndexes();
2966 initializeCSRCost();
2968 RegCosts =
TRI->getRegisterCosts(*MF);
2969 RegClassPriorityTrumpsGlobalness =
2972 :
TRI->regClassPriorityTrumpsGlobalness(*MF);
2976 :
TRI->reverseLocalAssignment();
2978 ExtraInfo.emplace();
2980 EvictAdvisor = EvictProvider->getAdvisor(*MF, *
this, MBFI, Loops);
2981 PriorityAdvisor = PriorityProvider->getAdvisor(*MF, *
this, *Indexes);
2983 VRAI = std::make_unique<VirtRegAuxInfo>(*MF, *
LIS, *
VRM, *Loops, *MBFI);
2987 VRAI->calculateSpillWeightsAndHints();
2994 IntfCache.init(MF,
Matrix->getLiveUnions(), Indexes,
LIS,
TRI);
2995 GlobalCand.resize(32);
2996 SetOfBrokenHints.clear();
2999 tryHintsRecoloring();
3002 MF->verify(
LIS, Indexes,
"Before post optimization", &
errs());
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file implements the BitVector class.
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
#define clEnumValN(ENUMVAL, FLAGNAME, DESC)
DXIL Forward Handle Accesses
const HexagonInstrInfo * TII
This file implements an indexed map.
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
block placement Basic Block Placement Stats
Register const TargetRegisterInfo * TRI
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)
This header defines classes/functions to handle pass execution timing information with interfaces for...
static DominatorTree getDomTree(Function &F)
static bool hasTiedDef(MachineRegisterInfo *MRI, Register reg)
Return true if reg has any tied def operand.
static cl::opt< bool > GreedyRegClassPriorityTrumpsGlobalness("greedy-regclass-priority-trumps-globalness", cl::desc("Change the greedy register allocator's live range priority " "calculation to make the AllocationPriority of the register class " "more important then whether the range is global"), cl::Hidden)
static cl::opt< bool > ExhaustiveSearch("exhaustive-register-search", cl::NotHidden, cl::desc("Exhaustive Search for registers bypassing the depth " "and interference cutoffs of last chance recoloring"), cl::Hidden)
static cl::opt< unsigned > CSRCostScale("regalloc-csr-cost-scale", cl::desc("Scale for the callee-saved register cost, in percentage."), cl::init(80), cl::Hidden)
static cl::opt< unsigned > LastChanceRecoloringMaxInterference("lcr-max-interf", cl::Hidden, cl::desc("Last chance recoloring maximum number of considered" " interference at a time"), cl::init(8))
static bool readsLaneSubset(const MachineRegisterInfo &MRI, const MachineInstr *MI, const LiveInterval &VirtReg, const TargetRegisterInfo *TRI, SlotIndex Use, const TargetInstrInfo *TII)
Return true if MI at \P Use reads a subset of the lanes live in VirtReg.
static bool assignedRegPartiallyOverlaps(const TargetRegisterInfo &TRI, const VirtRegMap &VRM, MCRegister PhysReg, const LiveInterval &Intf)
Return true if the existing assignment of Intf overlaps, but is not the same, as PhysReg.
static cl::opt< unsigned > CSRFirstTimeCost("regalloc-csr-first-time-cost", cl::desc("Cost for first time use of callee-saved register."), cl::init(0), cl::Hidden)
static cl::opt< unsigned > LastChanceRecoloringMaxDepth("lcr-max-depth", cl::Hidden, cl::desc("Last chance recoloring max depth"), cl::init(5))
static RegisterRegAlloc greedyRegAlloc("greedy", "greedy register allocator", createGreedyRegisterAllocator)
static cl::opt< unsigned long > GrowRegionComplexityBudget("grow-region-complexity-budget", cl::desc("growRegion() does not scale with the number of BB edges, so " "limit its budget and bail out once we reach the limit."), cl::init(10000), cl::Hidden)
static cl::opt< unsigned > SplitThresholdForRegWithHint("split-threshold-for-reg-with-hint", cl::desc("The threshold for splitting a virtual register with a hint, in " "percentage"), cl::init(75), cl::Hidden)
static cl::opt< SplitEditor::ComplementSpillMode > SplitSpillMode("split-spill-mode", cl::Hidden, cl::desc("Spill mode for splitting live ranges"), cl::values(clEnumValN(SplitEditor::SM_Partition, "default", "Default"), clEnumValN(SplitEditor::SM_Size, "size", "Optimize for size"), clEnumValN(SplitEditor::SM_Speed, "speed", "Optimize for speed")), cl::init(SplitEditor::SM_Speed))
static unsigned getNumAllocatableRegsForConstraints(const MachineInstr *MI, Register Reg, const TargetRegisterClass *SuperRC, const TargetInstrInfo *TII, const TargetRegisterInfo *TRI, const RegisterClassInfo &RCI)
Get the number of allocatable registers that match the constraints of Reg on MI and that are also in ...
static cl::opt< bool > GreedyReverseLocalAssignment("greedy-reverse-local-assignment", cl::desc("Reverse allocation order of local live ranges, such that " "shorter local live ranges will tend to be allocated first"), cl::Hidden)
static LaneBitmask getInstReadLaneMask(const MachineRegisterInfo &MRI, const TargetRegisterInfo &TRI, const MachineInstr &FirstMI, Register Reg)
Remove Loads Into Fake Uses
SI optimize exec mask operations pre RA
SI Optimize VGPR LiveRange
This file defines the SmallSet class.
This file defines the SmallVector class.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
LLVM_ABI void printPipeline(raw_ostream &OS, function_ref< StringRef(StringRef)> MapClassName2PassName) const
LLVM_ABI PreservedAnalyses run(MachineFunction &F, MachineFunctionAnalysisManager &AM)
bool isHint(Register Reg) const
Return true if Reg is a preferred physical register.
ArrayRef< MCPhysReg > getOrder() const
Get the allocation order without reordered hints.
static AllocationOrder create(Register VirtReg, const VirtRegMap &VRM, const RegisterClassInfo &RegClassInfo, const LiveRegMatrix *Matrix)
Create a new AllocationOrder for VirtReg.
bool hasCustomOrder() const
Return true if a custom order replaced the RegisterClassInfo order.
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.
AnalysisUsage & addRequired()
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:
Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
Get the array size.
bool test(unsigned Idx) const
Returns true if bit Idx is set.
BitVector & reset()
Reset all bits in the bitvector.
static BlockFrequency max()
Returns the maximum possible frequency, the saturation value.
Represents analyses that only rely on functions' control flow.
FunctionPass class - This class is used to implement most global optimizations.
Cursor - The primary query interface for the block interference cache.
SlotIndex first()
first - Return the starting index of the first interfering range in the current block.
SlotIndex last()
last - Return the ending index of the last interfering range in the current block.
bool hasInterference()
hasInterference - Return true if the current block has any interference.
void moveToBlock(unsigned MBBNum)
moveTo - Move cursor to basic block MBBNum.
This is an important class for using LLVM in a threaded context.
Query interferences between a single live virtual register and a live interval union.
const SmallVectorImpl< const LiveInterval * > & interferingVRegs(unsigned MaxInterferingRegs=std::numeric_limits< unsigned >::max())
LiveSegments::iterator SegmentIter
A live range for subregisters.
LiveInterval - This class represents the liveness of a register, or stack slot.
bool isSpillable() const
isSpillable - Can this interval be spilled?
bool hasSubRanges() const
Returns true if subregister liveness information is available.
LLVM_ABI unsigned getSize() const
getSize - Returns the sum of sizes of all the LiveRange's.
iterator_range< subrange_iterator > subranges()
MachineInstr * getInstructionFromIndex(SlotIndex index) const
Returns the instruction associated with the given index.
LiveInterval & getInterval(Register Reg)
Register get(unsigned idx) const
ArrayRef< Register > regs() const
Segments::const_iterator const_iterator
bool liveAt(SlotIndex index) const
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.
LLVM_ABI iterator find(SlotIndex Pos)
find - Return an iterator pointing to the first segment that ends after Pos, or end().
@ IK_VirtReg
Virtual register interference.
const uint8_t AllocationPriority
Classes with a higher priority value are assigned first by register allocators using a greedy heurist...
const bool GlobalPriority
Wrapper class representing physical registers. Should be passed by value.
constexpr bool isValid() const
static constexpr unsigned NoRegister
constexpr unsigned id() const
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
An RAII based helper class to modify MachineFunctionProperties when running pass.
int getNumber() const
MachineBasicBlocks are uniquely numbered at the function level, unless they're not in a MachineFuncti...
LLVM_ABI iterator SkipPHIsLabelsAndDebug(iterator I, Register Reg=Register(), bool SkipPseudoOp=true)
Return the first instruction in MBB after I that is not a PHI, label or debug.
LLVM_ABI iterator getFirstNonDebugInstr(bool SkipPseudoOp=true)
Returns an iterator to the first non-debug instruction in the basic block, or end().
MachineBlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate machine basic b...
Analysis pass which computes a MachineDominatorTree.
Analysis pass which computes a MachineDominatorTree.
DominatorTree Class - Concrete subclass of DominatorTreeBase that is used to compute a normal dominat...
bool isSpillSlotObjectIndex(int ObjectIdx) const
Returns true if the specified index corresponds to a spill slot.
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
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.
Representation of each machine instruction.
bool isImplicitDef() const
Analysis pass that exposes the MachineLoopInfo for a machine function.
MachineOperand class - Representation of each machine instruction operand.
unsigned getSubReg() const
bool isReg() const
isReg - Tests if this is a MO_Register operand.
Register getReg() const
getReg - Returns the register number.
bool isFI() const
isFI - Tests if this is a MO_FrameIndex operand.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
static reg_instr_nodbg_iterator reg_instr_nodbg_end()
defusechain_instr_iterator< true, true, true, true > reg_instr_nodbg_iterator
reg_instr_nodbg_iterator/reg_instr_nodbg_begin/reg_instr_nodbg_end - Walk all defs and uses of the sp...
iterator_range< def_iterator > def_operands(Register Reg) const
LLVM_ABI LaneBitmask getMaxLaneMaskForVReg(Register Reg) const
Returns a mask covering all bits that can appear in lane masks of subregisters of the virtual registe...
reg_instr_nodbg_iterator reg_instr_nodbg_begin(Register RegNo) const
Pass interface - Implemented by all 'passes'.
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.
bool run(MachineFunction &mf)
Perform register allocation.
Spiller & spiller() override
MCRegister selectOrSplit(const LiveInterval &, SmallVectorImpl< Register > &) override
RAGreedy(RequiredAnalyses &Analyses, const RegAllocFilterFunc F=nullptr)
const LiveInterval * dequeue() override
dequeue - Return the next unassigned register, or NULL.
void enqueueImpl(const LiveInterval *LI) override
enqueue - Add VirtReg to the priority queue of unassigned registers.
void aboutToRemoveInterval(const LiveInterval &) override
Method called when the allocator is about to remove a LiveInterval.
RegAllocBase(const RegAllocFilterFunc F=nullptr)
void enqueue(const LiveInterval *LI)
enqueue - Add VirtReg to the priority queue of unassigned registers.
void init(VirtRegMap &vrm, LiveIntervals &lis, LiveRegMatrix &mat)
SmallPtrSet< MachineInstr *, 32 > DeadRemats
Inst which is a def of an original reg and whose defs are already all dead after remat is saved in De...
const TargetRegisterInfo * TRI
static const char TimerGroupName[]
static const char TimerGroupDescription[]
virtual void postOptimization()
RegisterClassInfo RegClassInfo
MachineRegisterInfo * MRI
bool shouldAllocateRegister(Register Reg)
Get whether a given register should be allocated.
static bool VerifyEnabled
VerifyEnabled - True when -verify-regalloc is given.
ImmutableAnalysis abstraction for fetching the Eviction Advisor.
A MachineFunction analysis for fetching the Eviction Advisor.
Common provider for legacy and new pass managers.
const TargetRegisterInfo *const TRI
LLVM_ABI std::optional< unsigned > getOrderLimit(const LiveInterval &VirtReg, const AllocationOrder &Order, unsigned CostPerUseLimit) const
const ArrayRef< uint8_t > RegCosts
MachineRegisterInfo *const MRI
const RegisterClassInfo & RegClassInfo
LLVM_ABI bool isUnusedCalleeSavedReg(MCRegister PhysReg) const
Returns true if the given PhysReg is a callee saved register and has not been used for allocation yet...
LLVM_ABI bool canReassign(const LiveInterval &VirtReg, MCRegister FromReg) const
LLVM_ABI bool canAllocatePhysReg(unsigned CostPerUseLimit, MCRegister PhysReg) const
LiveRegMatrix *const Matrix
Common provider for getting the priority advisor and logging rewards.
unsigned getNumAllocatableRegs(const TargetRegisterClass *RC) const
getNumAllocatableRegs - Returns the number of actually allocatable registers in RC in the current fun...
Wrapper class representing virtual and physical registers.
static Register index2VirtReg(unsigned Index)
Convert a 0-based index to a virtual register number.
MCRegister asMCReg() const
Utility to check-convert this value to a MCRegister.
unsigned virtRegIndex() const
Convert a virtual register number to a 0-based index.
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.
static bool isEarlierInstr(SlotIndex A, SlotIndex B)
isEarlierInstr - Return true if A refers to an instruction earlier than B.
@ InstrDist
The default distance between instructions as returned by distance().
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.
int getApproxInstrDistance(SlotIndex other) const
Return the scaled distance from this index to the given one, where all slots on the same instruction ...
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.
size_type count(const T &V) const
count - Return 1 if the element is in the set, 0 otherwise.
std::pair< const_iterator, bool > insert(const T &V)
insert - Insert an element into the set if it isn't already there.
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 append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
@ MustSpill
A register is impossible, variable must be spilled.
@ DontCare
Block doesn't care / variable not live.
@ PrefReg
Block entry/exit prefers a register.
@ PrefSpill
Block entry/exit prefers a stack slot.
virtual void spill(LiveRangeEdit &LRE, AllocationOrder *Order=nullptr)=0
spill - Spill the LRE.getParent() live interval.
SplitAnalysis - Analyze a LiveInterval, looking for live range splitting opportunities.
SplitEditor - Edit machine code and LiveIntervals for live range splitting.
@ 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.
Represent a constant reference to a string, i.e.
constexpr bool empty() const
Check if the string is empty.
TargetInstrInfo - Interface to description of machine instruction set.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
virtual const TargetInstrInfo * getInstrInfo() const
A Use represents the edge between a Value definition and its users.
MCRegister getPhys(Register virtReg) const
returns the physical register mapped to the specified virtual register
bool hasPhys(Register virtReg) const
returns true if the specified virtual register is mapped to a physical register
An efficient, type-erasing, non-owning reference to a callable.
This class implements an extremely fast bulk output stream that can only output to a stream.
Pass manager infrastructure for declaring and invalidating analyses.
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.
@ Legal
The operation is expected to be selectable directly by the target, and no transformation is necessary...
ValuesClass values(OptsTy... Options)
Helper to build a ValuesClass by forwarding a variable number of arguments as an initializer list to ...
initializer< Ty > init(const Ty &Val)
DiagnosticInfoOptimizationBase::Argument NV
NodeAddr< InstrNode * > Instr
NodeAddr< UseNode * > Use
This is an optimization pass for GlobalISel generic memory operations.
auto find(R &&Range, const T &Val)
Provide wrappers to std::find which take ranges instead of having to pass begin/end explicitly.
std::function< bool(const TargetRegisterInfo &TRI, const MachineRegisterInfo &MRI, const Register Reg)> RegAllocFilterFunc
Filter function for register classes during regalloc.
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
constexpr uint64_t maxUIntN(uint64_t N)
Gets the maximum value for a N-bit unsigned integer.
SmallSet< Register, 16 > SmallVirtRegSet
LLVM_ABI FunctionPass * createGreedyRegisterAllocator()
Greedy register allocation pass - This pass implements a global register allocator for optimized buil...
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
LLVM_ABI bool TimePassesIsEnabled
If the user specifies the -time-passes argument on an LLVM tool command line then the value of this b...
AnalysisManager< MachineFunction > MachineFunctionAnalysisManager
LLVM_ABI PreservedAnalyses getMachineFunctionPassPreservedAnalyses()
Returns the minimum set of Analyses that all machine function passes must preserve.
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.
@ RS_Split2
Attempt more aggressive live range splitting that is guaranteed to make progress.
@ RS_Spill
Live range will be spilled. No more splitting will be attempted.
@ RS_Split
Attempt live range splitting if assignment is impossible.
@ RS_New
Newly created live range that has never been queued.
@ RS_Done
There is nothing more we can do to this live range.
@ RS_Assign
Only attempt assignment and eviction. Then requeue as RS_Split.
constexpr bool isUInt(uint64_t x)
Checks if an unsigned integer fits into the given bit width.
LLVM_ABI Spiller * createInlineSpiller(const Spiller::RequiredAnalyses &Analyses, MachineFunction &MF, VirtRegMap &VRM, VirtRegAuxInfo &VRAI, LiveRegMatrix *Matrix=nullptr)
Create and return a spiller that will insert spill code directly instead of deferring though VirtRegM...
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
LLVM_ABI VirtRegInfo AnalyzeVirtRegInBundle(MachineInstr &MI, Register Reg, SmallVectorImpl< std::pair< MachineInstr *, unsigned > > *Ops=nullptr)
AnalyzeVirtRegInBundle - Analyze how the current instruction or bundle uses a virtual register.
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
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...
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Count
ArrayRef(const T &OneElt) -> ArrayRef< T >
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
LLVM_ABI Printable printBlockFreq(const BlockFrequencyInfo &BFI, BlockFrequency Freq)
Print the block frequency Freq relative to the current functions entry frequency.
LLVM_ABI char & RAGreedyLegacyID
Greedy register allocator.
static float normalizeSpillWeight(float UseDefFreq, unsigned Size, unsigned NumInstr)
Normalize the spill weight of a live interval.
LLVM_ABI Printable printReg(Register Reg, const TargetRegisterInfo *TRI=nullptr, unsigned SubIdx=0, const MachineRegisterInfo *MRI=nullptr)
Prints virtual and physical registers with or without a TRI instance.
LLVM_ABI Printable printMBBReference(const MachineBasicBlock &MBB)
Prints a machine basic block reference.
MCRegisterClass TargetRegisterClass
Implement std::hash so that hash_code can be used in STL containers.
MachineBlockFrequencyInfo * MBFI
RegAllocEvictionAdvisorProvider * EvictProvider
MachineOptimizationRemarkEmitter * ORE
LiveDebugVariables * DebugVars
SpillPlacement * SpillPlacer
RegAllocPriorityAdvisorProvider * PriorityProvider
MachineDominatorTree * DomTree
RequiredAnalyses()=delete
constexpr bool any() const
This class is basically a combination of TimeRegion and Timer.
BlockConstraint - Entry and exit constraints for a basic block.
BorderConstraint Exit
Constraint on block exit.
bool ChangesValue
True when this block changes the value of the live range.
BorderConstraint Entry
Constraint on block entry.
unsigned Number
Basic block number (from MBB::getNumber()).
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.
SlotIndex LastInstr
Last instr accessing current reg.
SlotIndex FirstInstr
First instr accessing current reg.