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;
165 bool runOnMachineFunction(MachineFunction &mf)
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");
697 if (
RegCosts[PhysReg.
id()] >= CostPerUseLimit)
723 MCRegister BestPhys = EvictAdvisor->tryFindEvictionCandidate(
724 VirtReg, Order, CostPerUseLimit, FixedRegisters);
726 evictInterference(VirtReg, BestPhys, NewVRegs);
744 SplitConstraints.resize(UseBlocks.
size());
746 for (
unsigned I = 0;
I != UseBlocks.
size(); ++
I) {
767 if (Intf.
first() <= Indexes->getMBBStartIdx(BC.
Number)) {
781 SA->getFirstSplitPoint(BC.
Number)))
787 if (Intf.
last() >= SA->getLastSplitPoint(BC.
Number)) {
800 StaticCost += SpillPlacer->getBlockFrequency(BC.
Number);
806 SpillPlacer->addConstraints(SplitConstraints);
807 return SpillPlacer->scanActiveBundles();
812bool RAGreedy::addThroughConstraints(InterferenceCache::Cursor Intf,
813 ArrayRef<unsigned> Blocks) {
814 const unsigned GroupSize = 8;
815 SpillPlacement::BlockConstraint BCS[GroupSize];
816 unsigned TBS[GroupSize];
817 unsigned B = 0,
T = 0;
819 for (
unsigned Number : Blocks) {
823 assert(
T < GroupSize &&
"Array overflow");
825 if (++
T == GroupSize) {
832 assert(
B < GroupSize &&
"Array overflow");
836 MachineBasicBlock *
MBB = MF->getBlockNumbered(
Number);
838 if (FirstNonDebugInstr !=
MBB->
end() &&
840 SA->getFirstSplitPoint(
Number)))
846 SlotIndex InsertIdx = InsertPt ==
MBB->
end()
847 ? Indexes->getMBBEndIdx(
Number)
848 :
LIS->getInstructionIndex(*InsertPt);
849 if (Intf.
first() <= Indexes->getMBBStartIdx(
Number) ||
856 if (Intf.
last() >= SA->getLastSplitPoint(
Number))
861 if (++
B == GroupSize) {
862 SpillPlacer->addConstraints(
ArrayRef(BCS,
B));
867 SpillPlacer->addConstraints(
ArrayRef(BCS,
B));
872bool RAGreedy::growRegion(GlobalSplitCandidate &Cand) {
874 BitVector Todo = SA->getThroughBlocks();
875 SmallVectorImpl<unsigned> &ActiveBlocks = Cand.ActiveBlocks;
876 unsigned AddedTo = 0;
878 unsigned Visited = 0;
883 ArrayRef<unsigned> NewBundles = SpillPlacer->getRecentPositive();
885 for (
unsigned Bundle : NewBundles) {
887 ArrayRef<unsigned> Blocks = Bundles->getBlocks(Bundle);
889 if (Blocks.
size() >= Budget)
891 Budget -= Blocks.
size();
892 for (
unsigned Block : Blocks) {
904 if (ActiveBlocks.
size() == AddedTo)
909 auto NewBlocks =
ArrayRef(ActiveBlocks).slice(AddedTo);
911 if (!addThroughConstraints(Cand.Intf, NewBlocks))
919 bool PrefSpill =
true;
920 if (SA->looksLikeLoopIV() && NewBlocks.size() >= 2) {
925 MachineLoop *
L = Loops->getLoopFor(MF->getBlockNumbered(NewBlocks[0]));
926 if (L &&
L->getHeader()->getNumber() == (
int)NewBlocks[0] &&
927 all_of(NewBlocks.drop_front(), [&](
unsigned Block) {
928 return L == Loops->getLoopFor(MF->getBlockNumbered(Block));
933 SpillPlacer->addPrefSpill(NewBlocks,
true);
935 AddedTo = ActiveBlocks.
size();
938 SpillPlacer->iterate();
951bool RAGreedy::calcCompactRegion(GlobalSplitCandidate &Cand) {
953 if (!SA->getNumThroughBlocks())
963 SpillPlacer->prepare(Cand.LiveBundles);
967 if (!addSplitConstraints(Cand.Intf,
Cost)) {
972 if (!growRegion(Cand)) {
977 SpillPlacer->finish();
979 if (!Cand.LiveBundles.any()) {
985 for (
int I : Cand.LiveBundles.set_bits())
986 dbgs() <<
" EB#" <<
I;
994BlockFrequency RAGreedy::calcBlockSplitCost() {
995 BlockFrequency
Cost = BlockFrequency(0);
997 for (
const SplitAnalysis::BlockInfo &BI : UseBlocks) {
1000 Cost += SpillPlacer->getBlockFrequency(
Number);
1004 Cost += SpillPlacer->getBlockFrequency(
Number);
1013BlockFrequency RAGreedy::calcGlobalSplitCost(GlobalSplitCandidate &Cand,
1014 const AllocationOrder &Order) {
1015 BlockFrequency GlobalCost = BlockFrequency(0);
1016 const BitVector &LiveBundles = Cand.LiveBundles;
1018 for (
unsigned I = 0;
I != UseBlocks.
size(); ++
I) {
1019 const SplitAnalysis::BlockInfo &BI = UseBlocks[
I];
1020 SpillPlacement::BlockConstraint &BC = SplitConstraints[
I];
1021 bool RegIn = LiveBundles[Bundles->getBundle(BC.
Number,
false)];
1022 bool RegOut = LiveBundles[Bundles->getBundle(BC.
Number,
true)];
1025 Cand.Intf.moveToBlock(BC.
Number);
1032 GlobalCost += SpillPlacer->getBlockFrequency(BC.
Number);
1035 for (
unsigned Number : Cand.ActiveBlocks) {
1036 bool RegIn = LiveBundles[Bundles->getBundle(
Number,
false)];
1037 bool RegOut = LiveBundles[Bundles->getBundle(
Number,
true)];
1038 if (!RegIn && !RegOut)
1040 if (RegIn && RegOut) {
1042 Cand.Intf.moveToBlock(
Number);
1043 if (Cand.Intf.hasInterference()) {
1044 GlobalCost += SpillPlacer->getBlockFrequency(
Number);
1045 GlobalCost += SpillPlacer->getBlockFrequency(
Number);
1050 GlobalCost += SpillPlacer->getBlockFrequency(
Number);
1067void RAGreedy::splitAroundRegion(LiveRangeEdit &LREdit,
1068 ArrayRef<unsigned> UsedCands) {
1071 const unsigned NumGlobalIntvs = LREdit.
size();
1074 assert(NumGlobalIntvs &&
"No global intervals configured");
1084 for (
const SplitAnalysis::BlockInfo &BI : UseBlocks) {
1086 unsigned IntvIn = 0, IntvOut = 0;
1087 SlotIndex IntfIn, IntfOut;
1089 unsigned CandIn = BundleCand[Bundles->getBundle(
Number,
false)];
1090 if (CandIn != NoCand) {
1091 GlobalSplitCandidate &Cand = GlobalCand[CandIn];
1092 IntvIn = Cand.IntvIdx;
1093 Cand.Intf.moveToBlock(
Number);
1094 IntfIn = Cand.Intf.first();
1098 unsigned CandOut = BundleCand[Bundles->getBundle(
Number,
true)];
1099 if (CandOut != NoCand) {
1100 GlobalSplitCandidate &Cand = GlobalCand[CandOut];
1101 IntvOut = Cand.IntvIdx;
1102 Cand.Intf.moveToBlock(
Number);
1103 IntfOut = Cand.Intf.last();
1108 if (!IntvIn && !IntvOut) {
1110 if (SA->shouldSplitSingleBlock(BI, SingleInstrs))
1111 SE->splitSingleBlock(BI);
1115 if (IntvIn && IntvOut)
1116 SE->splitLiveThroughBlock(
Number, IntvIn, IntfIn, IntvOut, IntfOut);
1118 SE->splitRegInBlock(BI, IntvIn, IntfIn);
1120 SE->splitRegOutBlock(BI, IntvOut, IntfOut);
1126 BitVector Todo = SA->getThroughBlocks();
1127 for (
unsigned UsedCand : UsedCands) {
1128 ArrayRef<unsigned> Blocks = GlobalCand[UsedCand].ActiveBlocks;
1129 for (
unsigned Number : Blocks) {
1134 unsigned IntvIn = 0, IntvOut = 0;
1135 SlotIndex IntfIn, IntfOut;
1137 unsigned CandIn = BundleCand[Bundles->getBundle(
Number,
false)];
1138 if (CandIn != NoCand) {
1139 GlobalSplitCandidate &Cand = GlobalCand[CandIn];
1140 IntvIn = Cand.IntvIdx;
1141 Cand.Intf.moveToBlock(
Number);
1142 IntfIn = Cand.Intf.first();
1145 unsigned CandOut = BundleCand[Bundles->getBundle(
Number,
true)];
1146 if (CandOut != NoCand) {
1147 GlobalSplitCandidate &Cand = GlobalCand[CandOut];
1148 IntvOut = Cand.IntvIdx;
1149 Cand.Intf.moveToBlock(
Number);
1150 IntfOut = Cand.Intf.last();
1152 if (!IntvIn && !IntvOut)
1154 SE->splitLiveThroughBlock(
Number, IntvIn, IntfIn, IntvOut, IntfOut);
1160 SmallVector<unsigned, 8> IntvMap;
1161 SE->finish(&IntvMap);
1162 DebugVars->splitRegister(
Reg, LREdit.
regs(), *
LIS);
1164 unsigned OrigBlocks = SA->getNumLiveBlocks();
1171 for (
unsigned I = 0,
E = LREdit.
size();
I !=
E; ++
I) {
1172 const LiveInterval &
Reg =
LIS->getInterval(LREdit.
get(
I));
1175 if (ExtraInfo->getOrInitStage(
Reg.reg()) !=
RS_New)
1180 if (IntvMap[
I] == 0) {
1187 if (IntvMap[
I] < NumGlobalIntvs) {
1188 if (SA->countLiveBlocks(&
Reg) >= OrigBlocks) {
1189 LLVM_DEBUG(
dbgs() <<
"Main interval covers the same " << OrigBlocks
1190 <<
" blocks as original.\n");
1202 MF->verify(
LIS, Indexes,
"After splitting live range around region",
1206MCRegister RAGreedy::tryRegionSplit(
const LiveInterval &VirtReg,
1207 AllocationOrder &Order,
1208 SmallVectorImpl<Register> &NewVRegs) {
1209 if (!
TRI->shouldRegionSplitForVirtReg(*MF, VirtReg))
1211 unsigned NumCands = 0;
1212 BlockFrequency SpillCost = calcBlockSplitCost();
1213 BlockFrequency BestCost;
1216 bool HasCompact = calcCompactRegion(GlobalCand.front());
1224 BestCost = SpillCost;
1229 unsigned BestCand = calculateRegionSplitCost(VirtReg, Order, BestCost,
1233 if (!HasCompact && BestCand == NoCand)
1236 return doRegionSplit(VirtReg, BestCand, HasCompact, NewVRegs);
1239unsigned RAGreedy::calculateRegionSplitCostAroundReg(MCRegister PhysReg,
1240 AllocationOrder &Order,
1241 BlockFrequency &BestCost,
1243 unsigned &BestCand) {
1246 if (NumCands == IntfCache.getMaxCursors()) {
1247 unsigned WorstCount = ~0
u;
1249 for (
unsigned CandIndex = 0; CandIndex != NumCands; ++CandIndex) {
1250 if (CandIndex == BestCand || !GlobalCand[CandIndex].PhysReg)
1252 unsigned Count = GlobalCand[CandIndex].LiveBundles.count();
1253 if (
Count < WorstCount) {
1259 GlobalCand[Worst] = GlobalCand[NumCands];
1260 if (BestCand == NumCands)
1264 if (GlobalCand.size() <= NumCands)
1265 GlobalCand.resize(NumCands+1);
1266 GlobalSplitCandidate &Cand = GlobalCand[NumCands];
1267 Cand.reset(IntfCache, PhysReg);
1269 SpillPlacer->prepare(Cand.LiveBundles);
1270 BlockFrequency
Cost;
1271 if (!addSplitConstraints(Cand.Intf,
Cost)) {
1277 if (
Cost >= BestCost) {
1279 if (BestCand == NoCand)
1280 dbgs() <<
" worse than no bundles\n";
1282 dbgs() <<
" worse than "
1283 <<
printReg(GlobalCand[BestCand].PhysReg,
TRI) <<
'\n';
1287 if (!growRegion(Cand)) {
1292 SpillPlacer->finish();
1295 if (!Cand.LiveBundles.any()) {
1300 Cost += calcGlobalSplitCost(Cand, Order);
1303 for (
int I : Cand.LiveBundles.set_bits())
1304 dbgs() <<
" EB#" <<
I;
1307 if (
Cost < BestCost) {
1308 BestCand = NumCands;
1316unsigned RAGreedy::calculateRegionSplitCost(
const LiveInterval &VirtReg,
1317 AllocationOrder &Order,
1318 BlockFrequency &BestCost,
1321 unsigned BestCand = NoCand;
1322 for (MCRegister PhysReg : Order) {
1324 if (IgnoreCSR && EvictAdvisor->isUnusedCalleeSavedReg(PhysReg))
1327 calculateRegionSplitCostAroundReg(PhysReg, Order, BestCost, NumCands,
1334MCRegister RAGreedy::doRegionSplit(
const LiveInterval &VirtReg,
1335 unsigned BestCand,
bool HasCompact,
1336 SmallVectorImpl<Register> &NewVRegs) {
1337 SmallVector<unsigned, 8> UsedCands;
1339 LiveRangeEdit LREdit(&VirtReg, NewVRegs, *MF, *
LIS,
VRM,
this, &
DeadRemats);
1343 BundleCand.assign(Bundles->getNumBundles(), NoCand);
1346 if (BestCand != NoCand) {
1347 GlobalSplitCandidate &Cand = GlobalCand[BestCand];
1348 if (
unsigned B = Cand.getBundles(BundleCand, BestCand)) {
1350 Cand.IntvIdx = SE->openIntv();
1352 <<
B <<
" bundles, intv " << Cand.IntvIdx <<
".\n");
1359 GlobalSplitCandidate &Cand = GlobalCand.front();
1360 assert(!Cand.PhysReg &&
"Compact region has no physreg");
1361 if (
unsigned B = Cand.getBundles(BundleCand, 0)) {
1363 Cand.IntvIdx = SE->openIntv();
1365 <<
" bundles, intv " << Cand.IntvIdx <<
".\n");
1370 splitAroundRegion(LREdit, UsedCands);
1371 return MCRegister();
1376bool RAGreedy::trySplitAroundHintReg(MCRegister Hint,
1377 const LiveInterval &VirtReg,
1378 SmallVectorImpl<Register> &NewVRegs,
1379 AllocationOrder &Order) {
1383 if (MF->getFunction().hasOptSize())
1387 if (ExtraInfo->getStage(VirtReg) >=
RS_Split2)
1390 BlockFrequency
Cost = BlockFrequency(0);
1400 for (
const MachineOperand &Opnd :
MRI->reg_nodbg_operands(
Reg)) {
1401 const MachineInstr &
Instr = *Opnd.getParent();
1402 if (!
Instr.isCopy() || Opnd.isImplicit())
1406 const bool IsDef = Opnd.isDef();
1407 const MachineOperand &OtherOpnd =
Instr.getOperand(IsDef);
1410 if (OtherReg ==
Reg)
1413 unsigned SubReg = Opnd.getSubReg();
1414 unsigned OtherSubReg = OtherOpnd.
getSubReg();
1415 if (SubReg && OtherSubReg && SubReg != OtherSubReg)
1419 if (Opnd.readsReg()) {
1420 SlotIndex
Index =
LIS->getInstructionIndex(Instr).getRegSlot();
1423 LaneBitmask
Mask =
TRI->getSubRegIndexLaneMask(SubReg);
1427 if (
any_of(VirtReg.
subranges(), [=](
const LiveInterval::SubRange &S) {
1428 return (S.LaneMask & Mask).any() && S.liveAt(Index);
1433 if (VirtReg.
liveAt(Index))
1438 MCRegister OtherPhysReg =
1440 MCRegister ThisHint = SubReg ?
TRI->getSubReg(Hint, SubReg) :
Hint;
1441 if (OtherPhysReg == ThisHint)
1442 Cost += MBFI->getBlockFreq(
Instr.getParent());
1448 if (
Cost == BlockFrequency(0))
1451 unsigned NumCands = 0;
1452 unsigned BestCand = NoCand;
1453 SA->analyze(&VirtReg);
1454 calculateRegionSplitCostAroundReg(Hint, Order,
Cost, NumCands, BestCand);
1455 if (BestCand == NoCand)
1458 doRegionSplit(VirtReg, BestCand,
false, NewVRegs);
1469MCRegister RAGreedy::tryBlockSplit(
const LiveInterval &VirtReg,
1470 AllocationOrder &Order,
1471 SmallVectorImpl<Register> &NewVRegs) {
1472 assert(&SA->getParent() == &VirtReg &&
"Live range wasn't analyzed");
1475 LiveRangeEdit LREdit(&VirtReg, NewVRegs, *MF, *
LIS,
VRM,
this, &
DeadRemats);
1478 for (
const SplitAnalysis::BlockInfo &BI : UseBlocks) {
1479 if (SA->shouldSplitSingleBlock(BI, SingleInstrs))
1480 SE->splitSingleBlock(BI);
1484 return MCRegister();
1487 SmallVector<unsigned, 8> IntvMap;
1488 SE->finish(&IntvMap);
1491 DebugVars->splitRegister(
Reg, LREdit.
regs(), *
LIS);
1495 for (
unsigned I = 0,
E = LREdit.
size();
I !=
E; ++
I) {
1496 const LiveInterval &LI =
LIS->getInterval(LREdit.
get(
I));
1497 if (ExtraInfo->getOrInitStage(LI.
reg()) ==
RS_New && IntvMap[
I] == 0)
1502 MF->verify(
LIS, Indexes,
"After splitting live range around basic blocks",
1504 return MCRegister();
1517 assert(SuperRC &&
"Invalid register class");
1520 MI->getRegClassConstraintEffectForVReg(
Reg, SuperRC,
TII,
TRI,
1539 if (SubReg == 0 && MO.
isUse()) {
1548 Mask |= ~SubRegMask;
1565 auto DestSrc =
TII->isCopyInstr(*
MI);
1566 if (DestSrc && !
MI->isBundled() &&
1567 DestSrc->Destination->getSubReg() == DestSrc->Source->getSubReg())
1576 LiveAtMask |= S.LaneMask;
1581 return (ReadMask & ~(LiveAtMask &
TRI->getCoveringLanes())).
any();
1591MCRegister RAGreedy::tryInstructionSplit(
const LiveInterval &VirtReg,
1592 AllocationOrder &Order,
1593 SmallVectorImpl<Register> &NewVRegs) {
1597 bool SplitSubClass =
true;
1600 return MCRegister();
1601 SplitSubClass =
false;
1606 LiveRangeEdit LREdit(&VirtReg, NewVRegs, *MF, *
LIS,
VRM,
this, &
DeadRemats);
1610 if (
Uses.size() <= 1)
1611 return MCRegister();
1614 <<
" individual instrs.\n");
1617 TRI->getLargestLegalSuperClass(CurRC, *MF);
1618 unsigned SuperRCNumAllocatableRegs =
1624 for (
const SlotIndex Use :
Uses) {
1625 if (
const MachineInstr *
MI = Indexes->getInstructionFromIndex(Use)) {
1626 if (TII->isFullCopyInstr(*
MI) ||
1628 SuperRCNumAllocatableRegs ==
1639 SlotIndex SegStart = SE->enterIntvBefore(Use);
1640 SlotIndex SegStop = SE->leaveIntvAfter(Use);
1641 SE->useIntv(SegStart, SegStop);
1644 if (LREdit.
empty()) {
1646 return MCRegister();
1649 SmallVector<unsigned, 8> IntvMap;
1650 SE->finish(&IntvMap);
1651 DebugVars->splitRegister(VirtReg.
reg(), LREdit.
regs(), *
LIS);
1654 return MCRegister();
1666void RAGreedy::calcGapWeights(MCRegister PhysReg,
1667 SmallVectorImpl<float> &GapWeight) {
1668 assert(SA->getUseBlocks().size() == 1 &&
"Not a local interval");
1669 const SplitAnalysis::BlockInfo &BI = SA->getUseBlocks().front();
1671 const unsigned NumGaps =
Uses.size()-1;
1674 SlotIndex StartIdx =
1679 GapWeight.
assign(NumGaps, 0.0f);
1682 for (MCRegUnit Unit :
TRI->regunits(PhysReg)) {
1683 if (!
Matrix->query(
const_cast<LiveInterval &
>(SA->getParent()), Unit)
1684 .checkInterference())
1695 Matrix->getLiveUnions()[
static_cast<unsigned>(
Unit)].
find(StartIdx);
1696 for (
unsigned Gap = 0; IntI.valid() && IntI.start() < StopIdx; ++IntI) {
1698 while (
Uses[Gap+1].getBoundaryIndex() < IntI.start())
1699 if (++Gap == NumGaps)
1705 const float weight = IntI.value()->weight();
1706 for (; Gap != NumGaps; ++Gap) {
1707 GapWeight[Gap] = std::max(GapWeight[Gap], weight);
1708 if (
Uses[Gap+1].getBaseIndex() >= IntI.stop())
1717 for (MCRegUnit Unit :
TRI->regunits(PhysReg)) {
1723 for (
unsigned Gap = 0;
I !=
E &&
I->start < StopIdx; ++
I) {
1724 while (
Uses[Gap+1].getBoundaryIndex() <
I->start)
1725 if (++Gap == NumGaps)
1730 for (; Gap != NumGaps; ++Gap) {
1732 if (
Uses[Gap+1].getBaseIndex() >=
I->end)
1744MCRegister RAGreedy::tryLocalSplit(
const LiveInterval &VirtReg,
1745 AllocationOrder &Order,
1746 SmallVectorImpl<Register> &NewVRegs) {
1749 if (SA->getUseBlocks().size() != 1)
1750 return MCRegister();
1752 const SplitAnalysis::BlockInfo &BI = SA->getUseBlocks().front();
1762 if (
Uses.size() <= 2)
1763 return MCRegister();
1764 const unsigned NumGaps =
Uses.size()-1;
1767 dbgs() <<
"tryLocalSplit: ";
1768 for (
const auto &Use :
Uses)
1775 SmallVector<unsigned, 8> RegMaskGaps;
1776 if (
Matrix->checkRegMaskInterference(VirtReg)) {
1783 unsigned RE = RMS.
size();
1784 for (
unsigned I = 0;
I != NumGaps && RI != RE; ++
I) {
1795 RegMaskGaps.push_back(
I);
1822 bool ProgressRequired = ExtraInfo->getStage(VirtReg) >=
RS_Split2;
1825 unsigned BestBefore = NumGaps;
1826 unsigned BestAfter = 0;
1829 const float blockFreq =
1830 SpillPlacer->getBlockFrequency(BI.
MBB->
getNumber()).getFrequency() *
1831 (1.0f / MBFI->getEntryFreq().getFrequency());
1834 for (MCRegister PhysReg : Order) {
1838 calcGapWeights(PhysReg, GapWeight);
1841 if (
Matrix->checkRegMaskInterference(VirtReg, PhysReg))
1842 for (
unsigned Gap : RegMaskGaps)
1849 unsigned SplitBefore = 0, SplitAfter = 1;
1853 float MaxGap = GapWeight[0];
1857 const bool LiveBefore = SplitBefore != 0 || BI.
LiveIn;
1858 const bool LiveAfter = SplitAfter != NumGaps || BI.
LiveOut;
1861 <<
'-' <<
Uses[SplitAfter] <<
" I=" << MaxGap);
1864 if (!LiveBefore && !LiveAfter) {
1872 unsigned NewGaps = LiveBefore + SplitAfter - SplitBefore + LiveAfter;
1875 bool Legal = !ProgressRequired || NewGaps < NumGaps;
1884 blockFreq * (NewGaps + 1),
1885 Uses[SplitBefore].distance(
Uses[SplitAfter]) +
1893 float Diff = EstWeight - MaxGap;
1894 if (Diff > BestDiff) {
1897 BestBefore = SplitBefore;
1898 BestAfter = SplitAfter;
1905 if (++SplitBefore < SplitAfter) {
1908 if (GapWeight[SplitBefore - 1] >= MaxGap) {
1909 MaxGap = GapWeight[SplitBefore];
1910 for (
unsigned I = SplitBefore + 1;
I != SplitAfter; ++
I)
1911 MaxGap = std::max(MaxGap, GapWeight[
I]);
1919 if (SplitAfter >= NumGaps) {
1925 MaxGap = std::max(MaxGap, GapWeight[SplitAfter++]);
1930 if (BestBefore == NumGaps)
1931 return MCRegister();
1934 <<
Uses[BestAfter] <<
", " << BestDiff <<
", "
1935 << (BestAfter - BestBefore + 1) <<
" instrs\n");
1937 LiveRangeEdit LREdit(&VirtReg, NewVRegs, *MF, *
LIS,
VRM,
this, &
DeadRemats);
1941 SlotIndex SegStart = SE->enterIntvBefore(
Uses[BestBefore]);
1942 SlotIndex SegStop = SE->leaveIntvAfter(
Uses[BestAfter]);
1943 SE->useIntv(SegStart, SegStop);
1944 SmallVector<unsigned, 8> IntvMap;
1945 SE->finish(&IntvMap);
1946 DebugVars->splitRegister(VirtReg.
reg(), LREdit.
regs(), *
LIS);
1950 bool LiveBefore = BestBefore != 0 || BI.
LiveIn;
1951 bool LiveAfter = BestAfter != NumGaps || BI.
LiveOut;
1952 unsigned NewGaps = LiveBefore + BestAfter - BestBefore + LiveAfter;
1953 if (NewGaps >= NumGaps) {
1955 assert(!ProgressRequired &&
"Didn't make progress when it was required.");
1956 for (
unsigned I = 0,
E = IntvMap.
size();
I !=
E; ++
I)
1957 if (IntvMap[
I] == 1) {
1965 return MCRegister();
1975MCRegister RAGreedy::trySplit(
const LiveInterval &VirtReg,
1976 AllocationOrder &Order,
1977 SmallVectorImpl<Register> &NewVRegs,
1980 if (ExtraInfo->getStage(VirtReg) >=
RS_Spill)
1981 return MCRegister();
1984 if (
LIS->intervalIsInOneMBB(VirtReg)) {
1987 SA->analyze(&VirtReg);
1988 MCRegister PhysReg = tryLocalSplit(VirtReg, Order, NewVRegs);
1989 if (PhysReg || !NewVRegs.
empty())
1991 return tryInstructionSplit(VirtReg, Order, NewVRegs);
1994 NamedRegionTimer
T(
"global_split",
"Global Splitting",
TimerGroupName,
1997 SA->analyze(&VirtReg);
2002 if (ExtraInfo->getStage(VirtReg) <
RS_Split2) {
2003 MCRegister PhysReg = tryRegionSplit(VirtReg, Order, NewVRegs);
2004 if (PhysReg || !NewVRegs.
empty())
2009 return tryBlockSplit(VirtReg, Order, NewVRegs);
2032 if (PhysReg == AssignedReg)
2034 return TRI.regsOverlap(PhysReg, AssignedReg);
2045bool RAGreedy::mayRecolorAllInterferences(
2046 MCRegister PhysReg,
const LiveInterval &VirtReg,
2047 SmallLISet &RecoloringCandidates,
const SmallVirtRegSet &FixedRegisters) {
2050 for (MCRegUnit Unit :
TRI->regunits(PhysReg)) {
2051 LiveIntervalUnion::Query &Q =
Matrix->query(VirtReg, Unit);
2058 CutOffInfo |= CO_Interf;
2073 if (((ExtraInfo->getStage(*Intf) ==
RS_Done &&
2074 MRI->getRegClass(Intf->reg()) == CurRC &&
2078 FixedRegisters.
count(Intf->reg())) {
2080 dbgs() <<
"Early abort: the interference is not recolorable.\n");
2083 RecoloringCandidates.insert(Intf);
2132MCRegister RAGreedy::tryLastChanceRecoloring(
2133 const LiveInterval &VirtReg, AllocationOrder &Order,
2135 RecoloringStack &RecolorStack,
unsigned Depth) {
2136 if (!
TRI->shouldUseLastChanceRecoloringForVirtReg(*MF, VirtReg))
2139 LLVM_DEBUG(
dbgs() <<
"Try last chance recoloring for " << VirtReg <<
'\n');
2141 const ssize_t EntryStackSize = RecolorStack.size();
2145 "Last chance recoloring should really be last chance");
2151 LLVM_DEBUG(
dbgs() <<
"Abort because max depth has been reached.\n");
2152 CutOffInfo |= CO_Depth;
2157 SmallLISet RecoloringCandidates;
2165 for (MCRegister PhysReg : Order) {
2169 RecoloringCandidates.clear();
2170 CurrentNewVRegs.
clear();
2173 if (
Matrix->checkInterference(VirtReg, PhysReg) >
2176 dbgs() <<
"Some interferences are not with virtual registers.\n");
2183 if (!mayRecolorAllInterferences(PhysReg, VirtReg, RecoloringCandidates,
2185 LLVM_DEBUG(
dbgs() <<
"Some interferences cannot be recolored.\n");
2192 PQueue RecoloringQueue;
2193 for (
const LiveInterval *RC : RecoloringCandidates) {
2195 enqueue(RecoloringQueue, RC);
2197 "Interferences are supposed to be with allocated variables");
2200 RecolorStack.push_back(std::make_pair(RC,
VRM->getPhys(ItVirtReg)));
2209 Matrix->assign(VirtReg, PhysReg);
2218 if (tryRecoloringCandidates(RecoloringQueue, CurrentNewVRegs,
2219 FixedRegisters, RecolorStack,
Depth)) {
2224 if (
VRM->hasPhys(ThisVirtReg)) {
2225 Matrix->unassign(VirtReg);
2230 LLVM_DEBUG(
dbgs() <<
"tryRecoloringCandidates deleted a fixed register "
2232 FixedRegisters.
erase(ThisVirtReg);
2233 return MCRegister();
2240 FixedRegisters = SaveFixedRegisters;
2241 Matrix->unassign(VirtReg);
2247 for (
Register R : CurrentNewVRegs) {
2248 if (RecoloringCandidates.count(&
LIS->getInterval(R)))
2259 for (ssize_t
I = RecolorStack.size() - 1;
I >= EntryStackSize; --
I) {
2260 const LiveInterval *LI;
2262 std::tie(LI, PhysReg) = RecolorStack[
I];
2264 if (
VRM->hasPhys(LI->
reg()))
2268 for (
size_t I = EntryStackSize;
I != RecolorStack.size(); ++
I) {
2269 const LiveInterval *LI;
2271 std::tie(LI, PhysReg) = RecolorStack[
I];
2272 if (!LI->
empty() && !
MRI->reg_nodbg_empty(LI->
reg()))
2273 Matrix->assign(*LI, PhysReg);
2277 RecolorStack.resize(EntryStackSize);
2292bool RAGreedy::tryRecoloringCandidates(PQueue &RecoloringQueue,
2293 SmallVectorImpl<Register> &NewVRegs,
2295 RecoloringStack &RecolorStack,
2297 while (!RecoloringQueue.empty()) {
2298 const LiveInterval *LI =
dequeue(RecoloringQueue);
2300 MCRegister PhysReg = selectOrSplitImpl(*LI, NewVRegs, FixedRegisters,
2301 RecolorStack,
Depth + 1);
2306 if (PhysReg == ~0u || (!PhysReg && !LI->
empty()))
2310 assert(LI->
empty() &&
"Only empty live-range do not require a register");
2312 <<
" succeeded. Empty LI.\n");
2316 <<
" succeeded with: " <<
printReg(PhysReg,
TRI) <<
'\n');
2318 Matrix->assign(*LI, PhysReg);
2330 CutOffInfo = CO_None;
2331 LLVMContext &Ctx = MF->getFunction().getContext();
2333 RecoloringStack RecolorStack;
2335 selectOrSplitImpl(VirtReg, NewVRegs, FixedRegisters, RecolorStack);
2336 if (Reg == ~0U && (CutOffInfo != CO_None)) {
2337 uint8_t CutOffEncountered = CutOffInfo & (CO_Depth | CO_Interf);
2338 if (CutOffEncountered == CO_Depth)
2339 Ctx.emitError(
"register allocation failed: maximum depth for recoloring "
2340 "reached. Use -fexhaustive-register-search to skip "
2342 else if (CutOffEncountered == CO_Interf)
2343 Ctx.emitError(
"register allocation failed: maximum interference for "
2344 "recoloring reached. Use -fexhaustive-register-search "
2346 else if (CutOffEncountered == (CO_Depth | CO_Interf))
2347 Ctx.emitError(
"register allocation failed: maximum interference and "
2348 "depth for recoloring reached. Use "
2349 "-fexhaustive-register-search to skip cutoffs");
2365 if (
MI->isMetaInstruction())
2370 auto [Reads, Writes] =
MI->readsWritesVirtualRegister(LI.
reg());
2371 auto MBBFreq = SpillPlacer->getBlockFrequency(
MI->getParent()->getNumber());
2372 SpillCost += (Reads + Writes) * MBBFreq.getFrequency();
2384MCRegister RAGreedy::tryAssignCSRFirstTime(
2385 const LiveInterval &VirtReg, AllocationOrder &Order, MCRegister PhysReg,
2386 uint8_t &CostPerUseLimit, SmallVectorImpl<Register> &NewVRegs) {
2390 SA->analyze(&VirtReg);
2391 if (calcSpillCost(VirtReg) >= CSRCost)
2396 CostPerUseLimit = 1;
2397 return MCRegister();
2399 if (ExtraInfo->getStage(VirtReg) <
RS_Split) {
2402 SA->analyze(&VirtReg);
2403 unsigned NumCands = 0;
2404 BlockFrequency BestCost = CSRCost;
2405 unsigned BestCand = calculateRegionSplitCost(VirtReg, Order, BestCost,
2407 if (BestCand == NoCand)
2412 doRegionSplit(VirtReg, BestCand,
false, NewVRegs);
2413 return MCRegister();
2420 SetOfBrokenHints.remove(&LI);
2423void RAGreedy::initializeCSRCost() {
2433 if (!CSRCost.getFrequency())
2437 uint64_t ActualEntry = MBFI->getEntryFreq().getFrequency();
2443 if (ActualEntry < FixedEntry) {
2445 }
else if (ActualEntry <= UINT32_MAX) {
2447 CSRCost /= BranchProbability(FixedEntry, ActualEntry);
2451 BlockFrequency(CSRCost.getFrequency() * (ActualEntry / FixedEntry));
2454 uint64_t EntryFreq = MBFI->getEntryFreq().getFrequency();
2455 CSRCost = BlockFrequency(
TRI->getCSRFirstUseCost() * EntryFreq);
2466void RAGreedy::collectHintInfo(
Register Reg, HintsInfo &Out) {
2469 for (
const MachineOperand &Opnd :
MRI->reg_nodbg_operands(
Reg)) {
2470 const MachineInstr &
Instr = *Opnd.getParent();
2471 if (!
Instr.isCopy() || Opnd.isImplicit())
2475 const MachineOperand &OtherOpnd =
Instr.getOperand(Opnd.isDef());
2477 if (OtherReg ==
Reg)
2479 unsigned OtherSubReg = OtherOpnd.
getSubReg();
2480 unsigned SubReg = Opnd.getSubReg();
2483 MCRegister OtherPhysReg;
2486 OtherPhysReg =
TRI->getMatchingSuperReg(OtherReg, OtherSubReg, RC);
2488 OtherPhysReg =
TRI->getMatchingSuperReg(OtherReg, SubReg, RC);
2490 OtherPhysReg = OtherReg;
2492 OtherPhysReg =
VRM->getPhys(OtherReg);
2496 if (SubReg && OtherSubReg && SubReg != OtherSubReg)
2502 Out.push_back(HintInfo(MBFI->getBlockFreq(
Instr.getParent()), OtherReg,
2511BlockFrequency RAGreedy::getBrokenHintFreq(
const HintsInfo &
List,
2512 MCRegister PhysReg) {
2513 BlockFrequency
Cost = BlockFrequency(0);
2514 for (
const HintInfo &Info :
List) {
2515 if (
Info.PhysReg != PhysReg)
2529void RAGreedy::tryHintRecoloring(
const LiveInterval &VirtReg) {
2535 MCRegister PhysReg =
VRM->getPhys(
Reg);
2538 SmallSet<Register, 4> Visited = {
Reg};
2547 MCRegister CurrPhys =
VRM->getPhys(
Reg);
2552 "We have an unallocated variable which should have been handled");
2558 LiveInterval &LI =
LIS->getInterval(
Reg);
2561 if (CurrPhys != PhysReg && (!
MRI->getRegClass(
Reg)->contains(PhysReg) ||
2562 Matrix->checkInterference(LI, PhysReg)))
2566 <<
") is recolorable.\n");
2570 collectHintInfo(
Reg, Info);
2573 if (CurrPhys != PhysReg) {
2575 BlockFrequency OldCopiesCost = getBrokenHintFreq(Info, CurrPhys);
2576 BlockFrequency NewCopiesCost = getBrokenHintFreq(Info, PhysReg);
2580 if (OldCopiesCost < NewCopiesCost) {
2590 Matrix->assign(LI, PhysReg);
2594 for (
const HintInfo &HI : Info) {
2596 if (
HI.Reg.isVirtual() && Visited.
insert(
HI.Reg).second)
2599 }
while (!RecoloringCandidates.
empty());
2638void RAGreedy::tryHintsRecoloring() {
2639 for (
const LiveInterval *LI : SetOfBrokenHints) {
2641 "Recoloring is possible only for virtual registers");
2644 if (!
VRM->hasPhys(LI->
reg()))
2646 tryHintRecoloring(*LI);
2650MCRegister RAGreedy::selectOrSplitImpl(
const LiveInterval &VirtReg,
2651 SmallVectorImpl<Register> &NewVRegs,
2653 RecoloringStack &RecolorStack,
2655 uint8_t CostPerUseLimit = uint8_t(~0u);
2659 if (MCRegister PhysReg =
2660 tryAssign(VirtReg, Order, NewVRegs, FixedRegisters)) {
2664 if (CSRCost.getFrequency() &&
2665 EvictAdvisor->isUnusedCalleeSavedReg(PhysReg) && NewVRegs.
empty()) {
2666 MCRegister CSRReg = tryAssignCSRFirstTime(VirtReg, Order, PhysReg,
2667 CostPerUseLimit, NewVRegs);
2668 if (CSRReg || !NewVRegs.
empty())
2676 if (!NewVRegs.
empty())
2677 return MCRegister();
2681 << ExtraInfo->getCascade(VirtReg.
reg()) <<
'\n');
2687 if (MCRegister PhysReg =
2688 tryEvict(VirtReg, Order, NewVRegs, CostPerUseLimit,
2696 if (Hint && Hint != PhysReg)
2697 SetOfBrokenHints.insert(&VirtReg);
2702 assert((NewVRegs.
empty() ||
Depth) &&
"Cannot append to existing NewVRegs");
2708 ExtraInfo->setStage(VirtReg,
RS_Split);
2711 return MCRegister();
2716 unsigned NewVRegSizeBefore = NewVRegs.
size();
2717 MCRegister PhysReg = trySplit(VirtReg, Order, NewVRegs, FixedRegisters);
2718 if (PhysReg || (NewVRegs.
size() - NewVRegSizeBefore))
2725 return tryLastChanceRecoloring(VirtReg, Order, NewVRegs, FixedRegisters,
2726 RecolorStack,
Depth);
2740 DebugVars->splitRegister(r, LRE.regs(), *
LIS);
2742 DebugVars->splitRegister(r, LRE.regs(), *
LIS);
2745 MF->verify(
LIS, Indexes,
"After spilling", &
errs());
2749 return MCRegister();
2752void RAGreedy::RAGreedyStats::report(MachineOptimizationRemarkMissed &R) {
2753 using namespace ore;
2755 R <<
NV(
"NumSpills", Spills) <<
" spills ";
2756 R <<
NV(
"TotalSpillsCost", SpillsCost) <<
" total spills cost ";
2759 R <<
NV(
"NumFoldedSpills", FoldedSpills) <<
" folded spills ";
2760 R <<
NV(
"TotalFoldedSpillsCost", FoldedSpillsCost)
2761 <<
" total folded spills cost ";
2764 R <<
NV(
"NumReloads", Reloads) <<
" reloads ";
2765 R <<
NV(
"TotalReloadsCost", ReloadsCost) <<
" total reloads cost ";
2767 if (FoldedReloads) {
2768 R <<
NV(
"NumFoldedReloads", FoldedReloads) <<
" folded reloads ";
2769 R <<
NV(
"TotalFoldedReloadsCost", FoldedReloadsCost)
2770 <<
" total folded reloads cost ";
2772 if (ZeroCostFoldedReloads)
2773 R <<
NV(
"NumZeroCostFoldedReloads", ZeroCostFoldedReloads)
2774 <<
" zero cost folded reloads ";
2776 R <<
NV(
"NumVRCopies",
Copies) <<
" virtual registers copies ";
2777 R <<
NV(
"TotalCopiesCost", CopiesCost) <<
" total copies cost ";
2781RAGreedy::RAGreedyStats RAGreedy::computeStats(MachineBasicBlock &
MBB) {
2782 RAGreedyStats
Stats;
2783 const MachineFrameInfo &MFI = MF->getFrameInfo();
2786 auto isSpillSlotAccess = [&MFI](
const MachineMemOperand *
A) {
2788 A->getPseudoValue())->getFrameIndex());
2790 auto isPatchpointInstr = [](
const MachineInstr &
MI) {
2791 return MI.getOpcode() == TargetOpcode::PATCHPOINT ||
2792 MI.getOpcode() == TargetOpcode::STACKMAP ||
2793 MI.getOpcode() == TargetOpcode::STATEPOINT;
2795 for (MachineInstr &
MI :
MBB) {
2796 auto DestSrc = TII->isCopyInstr(
MI);
2798 const MachineOperand &Dest = *DestSrc->Destination;
2799 const MachineOperand &Src = *DestSrc->Source;
2805 SrcReg =
VRM->getPhys(SrcReg);
2806 if (SrcReg && Src.getSubReg())
2807 SrcReg =
TRI->getSubReg(SrcReg, Src.getSubReg());
2810 DestReg =
VRM->getPhys(DestReg);
2814 if (SrcReg != DestReg)
2820 SmallVector<const MachineMemOperand *, 2>
Accesses;
2829 if (TII->hasLoadFromStackSlot(
MI,
Accesses) &&
2831 if (!isPatchpointInstr(
MI)) {
2836 std::pair<unsigned, unsigned> NonZeroCostRange =
2837 TII->getPatchpointUnfoldableRange(
MI);
2838 SmallSet<unsigned, 16> FoldedReloads;
2839 SmallSet<unsigned, 16> ZeroCostFoldedReloads;
2840 for (
unsigned Idx = 0,
E =
MI.getNumOperands(); Idx <
E; ++Idx) {
2841 MachineOperand &MO =
MI.getOperand(Idx);
2844 if (Idx >= NonZeroCostRange.first && Idx < NonZeroCostRange.second)
2850 for (
unsigned Slot : FoldedReloads)
2851 ZeroCostFoldedReloads.
erase(Slot);
2852 Stats.FoldedReloads += FoldedReloads.size();
2853 Stats.ZeroCostFoldedReloads += ZeroCostFoldedReloads.
size();
2857 if (TII->hasStoreToStackSlot(
MI,
Accesses) &&
2864 float RelFreq = MBFI->getBlockFreqRelativeToEntryBlock(&
MBB);
2866 Stats.FoldedReloadsCost = RelFreq *
Stats.FoldedReloads;
2868 Stats.FoldedSpillsCost = RelFreq *
Stats.FoldedSpills;
2873RAGreedy::RAGreedyStats RAGreedy::reportStats(MachineLoop *L) {
2874 RAGreedyStats
Stats;
2877 for (MachineLoop *SubLoop : *L)
2878 Stats.add(reportStats(SubLoop));
2880 for (MachineBasicBlock *
MBB :
L->getBlocks())
2882 if (Loops->getLoopFor(
MBB) == L)
2885 if (!
Stats.isEmpty()) {
2886 using namespace ore;
2889 MachineOptimizationRemarkMissed
R(
DEBUG_TYPE,
"LoopSpillReloadCopies",
2890 L->getStartLoc(),
L->getHeader());
2892 R <<
"generated in loop";
2899void RAGreedy::reportStats() {
2902 RAGreedyStats
Stats;
2903 for (MachineLoop *L : *Loops)
2904 Stats.add(reportStats(L));
2906 for (MachineBasicBlock &
MBB : *MF)
2907 if (!Loops->getLoopFor(&
MBB))
2909 if (!
Stats.isEmpty()) {
2910 using namespace ore;
2914 if (
auto *SP = MF->getFunction().getSubprogram())
2916 MachineOptimizationRemarkMissed
R(
DEBUG_TYPE,
"SpillReloadCopies", Loc,
2919 R <<
"generated in function";
2925bool RAGreedy::hasVirtRegAlloc() {
2926 for (
unsigned I = 0,
E =
MRI->getNumVirtRegs();
I !=
E; ++
I) {
2928 if (
MRI->reg_nodbg_empty(
Reg))
2938 LLVM_DEBUG(
dbgs() <<
"********** GREEDY REGISTER ALLOCATION **********\n"
2939 <<
"********** Function: " << mf.
getName() <<
'\n');
2945 MF->verify(
LIS, Indexes,
"Before greedy register allocator", &
errs());
2951 if (!hasVirtRegAlloc())
2956 Indexes->packIndexes();
2958 initializeCSRCost();
2960 RegCosts =
TRI->getRegisterCosts(*MF);
2961 RegClassPriorityTrumpsGlobalness =
2964 :
TRI->regClassPriorityTrumpsGlobalness(*MF);
2968 :
TRI->reverseLocalAssignment();
2970 ExtraInfo.emplace();
2972 EvictAdvisor = EvictProvider->getAdvisor(*MF, *
this, MBFI, Loops);
2973 PriorityAdvisor = PriorityProvider->getAdvisor(*MF, *
this, *Indexes);
2975 VRAI = std::make_unique<VirtRegAuxInfo>(*MF, *
LIS, *
VRM, *Loops, *MBFI);
2979 VRAI->calculateSpillWeightsAndHints();
2986 IntfCache.init(MF,
Matrix->getLiveUnions(), Indexes,
LIS,
TRI);
2987 GlobalCand.resize(32);
2988 SetOfBrokenHints.clear();
2991 tryHintsRecoloring();
2994 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
MachineInstr unsigned OpIdx
#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.
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.