62#define DEBUG_TYPE "regalloc"
66STATISTIC(NumCoalesced,
"Number of copies coalesced");
75class InstrPosIndexes {
77 void unsetInitialized() { IsInitialized =
false; }
79 void init(
const MachineBasicBlock &
MBB) {
81 Instr2PosIndex.
clear();
83 for (
const MachineInstr &
MI :
MBB) {
84 LastIndex += InstrDist;
85 Instr2PosIndex[&
MI] = LastIndex;
92 bool getIndex(
const MachineInstr &
MI,
uint64_t &Index) {
100 assert(
MI.getParent() == CurMBB &&
"MI is not in CurMBB");
101 auto It = Instr2PosIndex.find(&
MI);
102 if (It != Instr2PosIndex.end()) {
116 unsigned Distance = 1;
118 End = std::next(Start);
119 while (Start != CurMBB->begin() &&
120 !Instr2PosIndex.count(&*std::prev(Start))) {
124 while (
End != CurMBB->end() && !Instr2PosIndex.count(&*(
End))) {
132 Start == CurMBB->begin() ? 0 : Instr2PosIndex.at(&*std::prev(Start));
134 if (
End == CurMBB->end())
135 Step =
static_cast<uint64_t>(InstrDist);
139 assert(EndIndex > LastIndex &&
"Index must be ascending order");
140 unsigned NumAvailableIndexes = EndIndex - LastIndex - 1;
159 Step = (NumAvailableIndexes + 1) / (Distance + 1);
164 if (
LLVM_UNLIKELY(!Step || (!LastIndex && Step == InstrDist))) {
166 Index = Instr2PosIndex.at(&
MI);
170 for (
auto I = Start;
I !=
End; ++
I) {
172 Instr2PosIndex[&*
I] = LastIndex;
174 Index = Instr2PosIndex.at(&
MI);
179 bool IsInitialized =
false;
180 enum { InstrDist = 1024 };
181 const MachineBasicBlock *CurMBB =
nullptr;
182 DenseMap<const MachineInstr *, uint64_t> Instr2PosIndex;
185class RegAllocFastImpl {
188 bool ClearVirtRegs_ =
true)
189 : ShouldAllocateRegisterImpl(
F), StackSlotForVirtReg(-1),
190 ClearVirtRegs(ClearVirtRegs_) {}
193 MachineFrameInfo *MFI =
nullptr;
194 MachineRegisterInfo *MRI =
nullptr;
195 const TargetRegisterInfo *TRI =
nullptr;
196 const TargetInstrInfo *TII =
nullptr;
197 RegisterClassInfo *RegClassInfo =
nullptr;
202 bool LowerTiedOps =
false;
205 MachineBasicBlock *MBB =
nullptr;
208 IndexedMap<int, VirtReg2IndexFunctor> StackSlotForVirtReg;
213 MachineInstr *LastUse =
nullptr;
216 bool LiveOut =
false;
217 bool Reloaded =
false;
220 explicit LiveReg(
Register VirtReg) : VirtReg(VirtReg) {}
221 explicit LiveReg() =
default;
223 unsigned getSparseSetIndex()
const {
return VirtReg.virtRegIndex(); }
226 using LiveRegMap = SparseSet<LiveReg, unsigned, identity, uint16_t>;
229 LiveRegMap LiveVirtRegs;
232 DenseMap<Register, LiveReg> BundleVirtRegsMap;
234 DenseMap<Register, SmallVector<MachineOperand *, 2>> LiveDbgValueMap;
237 DenseMap<Register, SmallVector<MachineInstr *, 1>> DanglingDbgValues;
241 BitVector MayLiveAcrossBlocks;
262 std::vector<unsigned> RegUnitStates;
280 SmallVector<unsigned, 0> UsedInInstr;
285 SmallVector<unsigned, 8> DefOperandIndexes;
288 bool HasErrorDef =
false;
294 InstrPosIndexes PosIndexes;
296 void setRegUnitState(MCRegUnit Unit,
unsigned NewState);
297 unsigned getRegUnitState(MCRegUnit Unit)
const;
299 void setPhysRegState(MCRegister PhysReg,
unsigned NewState);
300 bool isPhysRegFree(MCRegister PhysReg)
const;
303 void markRegUsedInInstr(MCRegister PhysReg) {
304 for (MCRegUnit Unit : TRI->regunits(PhysReg))
305 UsedInInstr[
static_cast<unsigned>(
Unit)] = InstrGen | 1;
309 bool isClobberedByRegMasks(MCRegister PhysReg)
const {
310 return llvm::any_of(RegMasks, [PhysReg](
const uint32_t *Mask) {
316 bool isRegUsedInInstr(MCRegister PhysReg,
bool LookAtPhysRegUses)
const {
317 if (LookAtPhysRegUses && isClobberedByRegMasks(PhysReg))
319 for (MCRegUnit Unit : TRI->regunits(PhysReg))
320 if (UsedInInstr[
static_cast<unsigned>(Unit)] >=
321 (InstrGen | !LookAtPhysRegUses))
328 void markPhysRegUsedInInstr(MCRegister PhysReg) {
329 for (MCRegUnit Unit : TRI->regunits(PhysReg)) {
330 assert(UsedInInstr[
static_cast<unsigned>(Unit)] <= InstrGen &&
331 "non-phys use before phys use?");
332 UsedInInstr[
static_cast<unsigned>(
Unit)] = InstrGen;
337 void unmarkRegUsedInInstr(MCRegister PhysReg) {
338 for (MCRegUnit Unit : TRI->regunits(PhysReg))
339 UsedInInstr[
static_cast<unsigned>(
Unit)] = 0;
344 bool hasLiveDefOfSuperReg(MCRegister PhysReg)
const {
345 return any_of(LiveDefRegs, [&](MCRegister LiveReg) {
346 return TRI->isSuperRegisterEq(PhysReg, LiveReg);
354 spillImpossible = ~0
u
360 bool runOnMachineFunction(
MachineFunction &MF, RegisterClassInfo &RCI);
363 void allocateBasicBlock(MachineBasicBlock &MBB);
364 void expandSubregPseudo(MachineInstr &
MI);
369 void findAndSortDefOperandIndexes(
const MachineInstr &
MI);
371 void allocateInstruction(MachineInstr &
MI);
372 void handleDebugValue(MachineInstr &
MI);
373 void handleBundle(MachineInstr &
MI);
375 bool usePhysReg(MachineInstr &
MI, MCRegister PhysReg);
376 bool definePhysReg(MachineInstr &
MI, MCRegister PhysReg);
377 bool displacePhysReg(MachineInstr &
MI, MCRegister PhysReg);
378 void freePhysReg(MCRegister PhysReg);
380 unsigned calcSpillCost(
MCPhysReg PhysReg)
const;
390 void assignVirtToPhysReg(MachineInstr &
MI, LiveReg &, MCRegister PhysReg);
391 void allocVirtReg(MachineInstr &
MI, LiveReg &LR,
Register Hint,
392 bool LookAtPhysRegUses =
false);
393 void allocVirtRegUndef(MachineOperand &MO);
394 void assignDanglingDebugValues(MachineInstr &Def,
Register VirtReg,
396 void defineLiveThroughVirtReg(MachineInstr &
MI, MachineOperand &MO,
398 void defineVirtReg(MachineInstr &
MI, MachineOperand &MO,
Register VirtReg,
399 bool LookAtPhysRegUses =
false);
400 void useVirtReg(MachineInstr &
MI, MachineOperand &MO,
Register VirtReg);
401 bool lowerTiedUse(MachineInstr &
MI, MachineOperand &MO, LiveReg &LR);
403 MCPhysReg getErrorAssignment(
const LiveReg &LR, MachineInstr &
MI,
407 getMBBBeginInsertionPoint(MachineBasicBlock &MBB,
408 SmallSet<Register, 2> &PrologLiveIns)
const;
410 void reloadAtBegin(MachineBasicBlock &MBB);
411 void setPhysReg(MachineOperand &MO,
const LiveReg &Assignment);
412 void addImplicitOps(MachineInstr &
MI);
416 enum ImplicitOpKind { ImplicitKill, ImplicitDead, ImplicitDef };
422 bool shouldAllocateRegister(
const Register Reg)
const;
423 int getStackSpaceFor(
Register VirtReg);
425 MCRegister AssignedReg,
bool Kill,
bool LiveOut);
432 bool mayBeSpillFromInlineAsmBr(
const MachineInstr &
MI)
const;
434 void dumpState()
const;
438 RegAllocFastImpl Impl;
444 : MachineFunctionPass(ID), Impl(
F, ClearVirtRegs_) {}
447 return Impl.runOnMachineFunction(
448 MF, getAnalysis<MachineRegisterClassInfoWrapperPass>().getRCI());
451 StringRef getPassName()
const override {
return "Fast Register Allocator"; }
453 void getAnalysisUsage(AnalysisUsage &AU)
const override {
454 AU.
addRequired<MachineRegisterClassInfoWrapperPass>();
459 MachineFunctionProperties getRequiredProperties()
const override {
460 return MachineFunctionProperties().setNoPHIs();
463 MachineFunctionProperties getSetProperties()
const override {
464 MachineFunctionProperties
P;
465 if (Impl.ClearVirtRegs)
466 P.setNoVRegs().setTiedOpsRewritten();
470 MachineFunctionProperties getClearedProperties()
const override {
471 return MachineFunctionProperties().setIsSSA();
477char RegAllocFast::ID = 0;
487 if (!ShouldAllocateRegisterImpl)
490 return ShouldAllocateRegisterImpl(*
TRI, *
MRI,
Reg);
493void RegAllocFastImpl::setRegUnitState(MCRegUnit Unit,
unsigned NewState) {
494 RegUnitStates[
static_cast<unsigned>(
Unit)] = NewState;
497unsigned RegAllocFastImpl::getRegUnitState(MCRegUnit Unit)
const {
498 return RegUnitStates[
static_cast<unsigned>(
Unit)];
501void RegAllocFastImpl::setPhysRegState(MCRegister PhysReg,
unsigned NewState) {
502 for (MCRegUnit Unit :
TRI->regunits(PhysReg))
503 setRegUnitState(Unit, NewState);
506bool RegAllocFastImpl::isPhysRegFree(MCRegister PhysReg)
const {
507 for (MCRegUnit Unit :
TRI->regunits(PhysReg)) {
508 if (getRegUnitState(Unit) != regFree)
516int RegAllocFastImpl::getStackSpaceFor(
Register VirtReg) {
518 int SS = StackSlotForVirtReg[VirtReg];
525 unsigned Size =
TRI->getSpillSize(RC);
530 Align CurrentAlign =
ST.getFrameLowering()->getStackAlign();
531 if (Alignment > CurrentAlign && !
TRI->canRealignStack(MF))
538 StackSlotForVirtReg[VirtReg] = FrameIdx;
545 PosIndexes.getIndex(
A, IndexA);
548 PosIndexes.getIndex(
A, IndexA);
549 return IndexA < IndexB;
556bool RegAllocFastImpl::mayBeSpillFromInlineAsmBr(
const MachineInstr &
MI)
const {
561 for (
const auto &
Op :
MI.operands())
568bool RegAllocFastImpl::mayLiveOut(
Register VirtReg) {
574 const MachineInstr *SelfLoopDef =
nullptr;
581 if (DefInst.getParent() !=
MBB) {
585 if (!SelfLoopDef ||
dominates(PosIndexes, DefInst, *SelfLoopDef))
586 SelfLoopDef = &DefInst;
597 static const unsigned Limit = 8;
600 if (UseInst.getParent() !=
MBB || ++
C >= Limit) {
609 if (SelfLoopDef == &UseInst ||
610 !
dominates(PosIndexes, *SelfLoopDef, UseInst)) {
621bool RegAllocFastImpl::mayLiveIn(
Register VirtReg) {
626 static const unsigned Limit = 8;
629 if (DefInst.getParent() !=
MBB || ++
C >= Limit) {
641 Register VirtReg, MCRegister AssignedReg,
642 bool Kill,
bool LiveOut) {
645 int FI = getStackSpaceFor(VirtReg);
657 SmallVectorImpl<MachineOperand *> &LRIDbgOperands = LiveDbgValueMap[VirtReg];
658 SmallMapVector<MachineInstr *, SmallVector<const MachineOperand *>, 2>
660 for (MachineOperand *MO : LRIDbgOperands)
661 SpilledOperandsMap[MO->getParent()].push_back(MO);
662 for (
const auto &MISpilledOperands : SpilledOperandsMap) {
663 MachineInstr &
DBG = *MISpilledOperands.first;
665 if (
DBG.isDebugValueList())
668 *
MBB, Before, *MISpilledOperands.first, FI, MISpilledOperands.second);
671 LLVM_DEBUG(
dbgs() <<
"Inserting debug info due to spill:\n" << *NewDV);
678 MachineInstr *ClonedDV =
MBB->
getParent()->CloneMachineInstr(NewDV);
680 LLVM_DEBUG(
dbgs() <<
"Cloning debug info due to live out spill\n");
686 if (
DBG.isNonListDebugValue()) {
687 MachineOperand &MO =
DBG.getDebugOperand(0);
696 LRIDbgOperands.
clear();
701 Register VirtReg, MCRegister PhysReg) {
704 int FI = getStackSpaceFor(VirtReg);
715 MachineBasicBlock &
MBB, SmallSet<Register, 2> &PrologLiveIns)
const {
724 if (!
TII->isBasicBlockPrologue(*
I) && !mayBeSpillFromInlineAsmBr(*
I))
729 for (MachineOperand &MO :
I->operands()) {
741void RegAllocFastImpl::reloadAtBegin(MachineBasicBlock &
MBB) {
742 if (LiveVirtRegs.empty())
747 for (MachineBasicBlock::RegisterMaskPair
P :
MBB.
liveins())
748 setPhysRegState(
P.PhysReg, regLiveIn);
750 SmallSet<Register, 2> PrologLiveIns;
755 getMBBBeginInsertionPoint(
MBB, PrologLiveIns);
756 for (
const LiveReg &LR : LiveVirtRegs) {
757 MCRegister PhysReg = LR.PhysReg;
758 if (!PhysReg || LR.Error)
761 MCRegUnit FirstUnit = *
TRI->regunits(PhysReg).begin();
762 if (getRegUnitState(FirstUnit) == regLiveIn)
766 "no reload in start block. Missing vreg def?");
768 if (PrologLiveIns.
count(PhysReg)) {
772 reload(
MBB.
begin(), LR.VirtReg, PhysReg);
774 reload(InsertBefore, LR.VirtReg, PhysReg);
776 LiveVirtRegs.clear();
783bool RegAllocFastImpl::usePhysReg(MachineInstr &
MI, MCRegister
Reg) {
785 bool displacedAny = displacePhysReg(
MI,
Reg);
786 setPhysRegState(
Reg, regPreAssigned);
787 markRegUsedInInstr(
Reg);
796bool RegAllocFastImpl::definePhysReg(MachineInstr &
MI, MCRegister
Reg) {
797 bool displacedAny = displacePhysReg(
MI,
Reg);
798 setPhysRegState(
Reg, regPreAssigned);
805bool RegAllocFastImpl::displacePhysReg(MachineInstr &
MI, MCRegister PhysReg) {
806 bool displacedAny =
false;
808 for (MCRegUnit Unit :
TRI->regunits(PhysReg)) {
809 switch (
unsigned VirtReg = getRegUnitState(Unit)) {
811 LiveRegMap::iterator LRI = findLiveVirtReg(VirtReg);
812 assert(LRI != LiveVirtRegs.end() &&
"datastructures in sync");
815 while (mayBeSpillFromInlineAsmBr(*ReloadBefore))
817 reload(ReloadBefore, VirtReg, LRI->PhysReg);
819 setPhysRegState(LRI->PhysReg, regFree);
820 LRI->PhysReg = MCRegister();
821 LRI->Reloaded =
true;
826 setRegUnitState(Unit, regFree);
836void RegAllocFastImpl::freePhysReg(MCRegister PhysReg) {
839 MCRegUnit FirstUnit = *
TRI->regunits(PhysReg).begin();
840 switch (
unsigned VirtReg = getRegUnitState(FirstUnit)) {
846 setPhysRegState(PhysReg, regFree);
849 LiveRegMap::iterator LRI = findLiveVirtReg(VirtReg);
850 assert(LRI != LiveVirtRegs.end());
852 setPhysRegState(LRI->PhysReg, regFree);
853 LRI->PhysReg = MCRegister();
863unsigned RegAllocFastImpl::calcSpillCost(
MCPhysReg PhysReg)
const {
864 for (MCRegUnit Unit :
TRI->regunits(PhysReg)) {
865 switch (
unsigned VirtReg = getRegUnitState(Unit)) {
871 return spillImpossible;
873 bool SureSpill = StackSlotForVirtReg[VirtReg] != -1 ||
874 findLiveVirtReg(VirtReg)->LiveOut;
875 return SureSpill ? spillClean : spillDirty;
882void RegAllocFastImpl::assignDanglingDebugValues(MachineInstr &Definition,
885 auto UDBGValIter = DanglingDbgValues.
find(VirtReg);
886 if (UDBGValIter == DanglingDbgValues.
end())
889 SmallVectorImpl<MachineInstr *> &Dangling = UDBGValIter->second;
890 for (MachineInstr *DbgValue : Dangling) {
891 assert(DbgValue->isDebugValue());
892 if (!DbgValue->hasDebugOperandForReg(VirtReg))
898 MCRegister SetToReg =
Reg;
901 if (!Definition.definesRegister(
Reg,
TRI))
904 if (
I->modifiesRegister(
Reg,
TRI) || --Limit == 0) {
907 SetToReg = MCRegister();
911 for (MachineOperand &MO : DbgValue->getDebugOperandsForReg(VirtReg)) {
923void RegAllocFastImpl::assignVirtToPhysReg(MachineInstr &AtMI, LiveReg &LR,
924 MCRegister PhysReg) {
928 assert(!LR.PhysReg &&
"Already assigned a physreg");
929 assert(PhysReg &&
"Trying to assign no register");
930 LR.PhysReg = PhysReg;
931 setPhysRegState(PhysReg, VirtReg.
id());
933 assignDanglingDebugValues(AtMI, VirtReg, PhysReg);
941 return MI.getOperand(
MI.findTiedOperandIdx(
MI.getOperandNo(&MO)));
955 static const unsigned ChainLengthLimit = 3;
956 for (
unsigned C = 0;
C <= ChainLengthLimit; ++
C) {
966 Reg =
Def->getOperand(1).getReg();
982 static const unsigned DefLimit = 3;
988 Reg =
MI.getOperand(1).getReg();
989 else if (LowerTiedOps)
992 Reg = traceCopyChain(
Reg);
1004void RegAllocFastImpl::allocVirtReg(MachineInstr &
MI, LiveReg &LR,
1005 Register Hint0,
bool LookAtPhysRegUses) {
1006 const Register VirtReg = LR.VirtReg;
1011 <<
" in class " <<
TRI->getRegClassName(&RC)
1012 <<
" with hint " <<
printReg(Hint0,
TRI) <<
'\n');
1016 !isRegUsedInInstr(Hint0, LookAtPhysRegUses)) {
1018 if (isPhysRegFree(Hint0)) {
1021 assignVirtToPhysReg(
MI, LR, Hint0);
1032 Register Hint1 = traceCopies(VirtReg);
1034 !isRegUsedInInstr(Hint1, LookAtPhysRegUses)) {
1036 if (isPhysRegFree(Hint1)) {
1039 assignVirtToPhysReg(
MI, LR, Hint1);
1050 unsigned BestCost = spillImpossible;
1052 for (
MCPhysReg PhysReg : AllocationOrder) {
1054 if (isRegUsedInInstr(PhysReg, LookAtPhysRegUses)) {
1059 unsigned Cost = calcSpillCost(PhysReg);
1063 assignVirtToPhysReg(
MI, LR, PhysReg);
1067 if (PhysReg == Hint0 || PhysReg == Hint1)
1068 Cost -= spillPrefBonus;
1070 if (
Cost < BestCost) {
1079 LR.PhysReg = getErrorAssignment(LR,
MI, RC);
1084 displacePhysReg(
MI, BestReg);
1085 assignVirtToPhysReg(
MI, LR, BestReg);
1088void RegAllocFastImpl::allocVirtRegUndef(MachineOperand &MO) {
1092 if (!shouldAllocateRegister(VirtReg))
1098 for (
const MachineOperand &Tied :
MI.all_uses()) {
1099 if (!Tied.isTied() || Tied.getReg() != VirtReg)
1102 for (MachineOperand &O :
MI.all_uses()) {
1103 if (
O.getReg() != VirtReg)
1106 unsigned SubIdx =
O.isTied() ? 0 :
O.getSubReg();
1107 O.setReg(SubIdx ?
TRI->getSubReg(DefReg, SubIdx) : DefReg);
1114 LiveRegMap::iterator LRI = findLiveVirtReg(VirtReg);
1116 bool IsRenamable =
true;
1117 if (LRI != LiveVirtRegs.end() && LRI->PhysReg) {
1118 PhysReg = LRI->PhysReg;
1122 if (AllocationOrder.
empty()) {
1128 PhysReg = getErrorAssignment(*LRI, *MO.
getParent(), RC);
1130 IsRenamable =
false;
1132 PhysReg = AllocationOrder.
front();
1136 if (SubRegIdx != 0) {
1137 PhysReg =
TRI->getSubReg(PhysReg, SubRegIdx);
1146void RegAllocFastImpl::defineLiveThroughVirtReg(MachineInstr &
MI,
1149 if (!shouldAllocateRegister(VirtReg))
1151 LiveRegMap::iterator LRI = findLiveVirtReg(VirtReg);
1152 if (LRI != LiveVirtRegs.end()) {
1153 MCRegister PrevReg = LRI->PhysReg;
1154 if (PrevReg && isRegUsedInInstr(PrevReg,
true)) {
1156 <<
" (tied/earlyclobber resolution)\n");
1157 freePhysReg(PrevReg);
1158 LRI->PhysReg = MCRegister();
1165 TII->get(TargetOpcode::COPY), PrevReg)
1172 defineVirtReg(
MI, MO, VirtReg,
true);
1180void RegAllocFastImpl::defineVirtReg(MachineInstr &
MI, MachineOperand &MO,
1181 Register VirtReg,
bool LookAtPhysRegUses) {
1183 if (!shouldAllocateRegister(VirtReg))
1185 LiveRegMap::iterator LRI;
1187 std::tie(LRI, New) = LiveVirtRegs.insert(LiveReg(VirtReg));
1190 if (mayLiveOut(VirtReg)) {
1191 LRI->LiveOut =
true;
1198 if (!LRI->PhysReg) {
1199 allocVirtReg(
MI, *LRI,
Register(), LookAtPhysRegUses);
1201 assert((!isRegUsedInInstr(LRI->PhysReg, LookAtPhysRegUses) || LRI->Error) &&
1202 "TODO: preassign mismatch");
1204 <<
" use existing assignment to "
1208 MCRegister PhysReg = LRI->PhysReg;
1210 if (LRI->Reloaded || LRI->LiveOut) {
1211 if (!
MI.isImplicitDef()) {
1215 <<
" RL: " << LRI->Reloaded <<
'\n');
1216 bool Kill = LRI->LastUse ==
nullptr;
1217 spill(SpillBefore, VirtReg, PhysReg,
Kill, LRI->LiveOut);
1221 if (
MI.getOpcode() == TargetOpcode::INLINEASM_BR) {
1222 int FI = StackSlotForVirtReg[VirtReg];
1224 for (MachineOperand &MO :
MI.operands()) {
1226 MachineBasicBlock *Succ = MO.
getMBB();
1235 LRI->LastUse =
nullptr;
1236 }
else if (!LRI->LastUse) {
1241 LRI->LiveOut =
false;
1242 LRI->Reloaded =
false;
1244 if (
MI.getOpcode() == TargetOpcode::BUNDLE) {
1245 BundleVirtRegsMap[VirtReg] = *LRI;
1247 markRegUsedInInstr(PhysReg);
1248 setPhysReg(MO, *LRI);
1253bool RegAllocFastImpl::lowerTiedUse(MachineInstr &
MI, MachineOperand &MO,
1266 any_of(
MI.all_uses(), [&](
const MachineOperand &O) {
1267 return &O != &MO && O.getReg() == LR.VirtReg;
1271 freePhysReg(DefReg);
1272 assignVirtToPhysReg(
MI, LR, DefReg);
1277 assert((LR.Error || !
TRI->regsOverlap(LR.PhysReg, DefReg)) &&
1278 "copy source overlaps the tied def");
1281 MCRegister SrcReg = SubReg ?
TRI->getSubReg(LR.PhysReg, SubReg) : LR.PhysReg;
1283 if (SrcReg == DefReg)
1290 markRegUsedInInstr(LR.PhysReg);
1293 auto ReadDefReg = [&](MachineOperand &
O) {
1303 for (MachineOperand &O :
MI.all_uses()) {
1304 if (
O.isTied() ||
O.getReg() != LR.VirtReg ||
O.getSubReg() != SubReg)
1312 freePhysReg(DefReg);
1317void RegAllocFastImpl::useVirtReg(MachineInstr &
MI, MachineOperand &MO,
1320 if (!shouldAllocateRegister(VirtReg))
1322 LiveRegMap::iterator LRI;
1324 std::tie(LRI, New) = LiveVirtRegs.insert(LiveReg(VirtReg));
1327 if (mayLiveOut(VirtReg)) {
1328 LRI->LiveOut =
true;
1335 assert((!MO.
isKill() || LRI->LastUse == &
MI) &&
"Invalid kill flag");
1338 if (LowerTiedOps && MO.
isTied() && lowerTiedUse(
MI, MO, *LRI))
1342 if (!LRI->PhysReg) {
1345 if (
MI.isCopy() &&
MI.getOperand(1).getSubReg() == 0) {
1346 Hint =
MI.getOperand(0).getReg();
1347 if (
Hint.isVirtual()) {
1348 assert(!shouldAllocateRegister(Hint));
1352 "Copy destination should already be assigned");
1355 allocVirtReg(
MI, *LRI, Hint,
false);
1360 if (
MI.getOpcode() == TargetOpcode::BUNDLE) {
1361 BundleVirtRegsMap[VirtReg] = *LRI;
1363 markRegUsedInInstr(LRI->PhysReg);
1364 setPhysReg(MO, *LRI);
1371 MI.clearRegisterDeads(MO.
getReg());
1378MCPhysReg RegAllocFastImpl::getErrorAssignment(
const LiveReg &LR,
1392 if (AllocationOrder.
empty()) {
1396 "no registers from class available to allocate", Fn,
1401 assert(!RawRegs.
empty() &&
"register classes cannot have no registers");
1402 return RawRegs.
front();
1405 if (!LR.Error && EmitError) {
1408 if (
MI.isInlineAsm()) {
1409 MI.emitInlineAsmError(
1410 "inline assembly requires more registers than available");
1414 "ran out of registers during register allocation", Fn,
1419 return AllocationOrder.
front();
1423void RegAllocFastImpl::setPhysReg(MachineOperand &MO,
1424 const LiveReg &Assignment) {
1425 MCRegister PhysReg = Assignment.PhysReg;
1426 assert(PhysReg &&
"assignments should always be to a valid physreg");
1456 PendingImplicitOps.emplace_back(PhysReg,
ImplicitKill);
1458 PendingImplicitOps.emplace_back(PhysReg,
1459 MO.
isDead() ? ImplicitDead : ImplicitDef);
1462void RegAllocFastImpl::addImplicitOps(MachineInstr &
MI) {
1463 for (
auto [PhysReg, Kind] : PendingImplicitOps) {
1465 MI.addRegisterKilled(PhysReg,
TRI,
true);
1466 else if (Kind == ImplicitDead)
1467 MI.addRegisterDead(PhysReg,
TRI,
true);
1469 MI.addRegisterDefined(PhysReg,
TRI);
1471 PendingImplicitOps.clear();
1476void RegAllocFastImpl::dumpState()
const {
1477 for (MCRegUnit Unit :
TRI->regunits()) {
1478 switch (
unsigned VirtReg = getRegUnitState(Unit)) {
1481 case regPreAssigned:
1488 LiveRegMap::const_iterator
I = findLiveVirtReg(VirtReg);
1489 assert(
I != LiveVirtRegs.end() &&
"have LiveVirtRegs entry");
1490 if (
I->LiveOut ||
I->Reloaded) {
1498 assert(
TRI->hasRegUnit(
I->PhysReg, Unit) &&
"inverse mapping present");
1505 for (
const LiveReg &LR : LiveVirtRegs) {
1508 MCRegister PhysReg = LR.PhysReg;
1511 for (MCRegUnit Unit :
TRI->regunits(PhysReg)) {
1512 assert(getRegUnitState(Unit) == VirtReg &&
"inverse map valid");
1520void RegAllocFastImpl::addRegClassDefCounts(
1522 assert(RegClassDefCounts.
size() ==
TRI->getNumRegClasses());
1525 if (!shouldAllocateRegister(
Reg))
1528 for (
unsigned RCIdx = 0, RCIdxEnd =
TRI->getNumRegClasses();
1529 RCIdx != RCIdxEnd; ++RCIdx) {
1533 ++RegClassDefCounts[RCIdx];
1539 for (
unsigned RCIdx = 0, RCIdxEnd =
TRI->getNumRegClasses();
1540 RCIdx != RCIdxEnd; ++RCIdx) {
1542 for (MCRegAliasIterator Alias(
Reg,
TRI,
true); Alias.isValid(); ++Alias) {
1544 ++RegClassDefCounts[RCIdx];
1558 !
MI.getOperand(
MI.findTiedOperandIdx(
MI.getOperandNo(&MO))).isUndef();
1564void RegAllocFastImpl::findAndSortDefOperandIndexes(
const MachineInstr &
MI) {
1565 DefOperandIndexes.
clear();
1568 for (
unsigned I = 0,
E =
MI.getNumOperands();
I <
E; ++
I) {
1569 const MachineOperand &MO =
MI.getOperand(
I);
1576 markPhysRegUsedInInstr(
Reg);
1586 if (DefOperandIndexes.
size() <= 1)
1594 SmallVector<unsigned> RegClassDefCounts(
TRI->getNumRegClasses(), 0);
1596 for (
const MachineOperand &MO :
MI.all_defs())
1597 addRegClassDefCounts(RegClassDefCounts, MO.
getReg());
1599 llvm::sort(DefOperandIndexes, [&](
unsigned I0,
unsigned I1) {
1600 const MachineOperand &MO0 =
MI.getOperand(I0);
1601 const MachineOperand &MO1 =
MI.getOperand(I1);
1609 unsigned ClassSize0 = RegClassInfo->
getOrder(&RC0).size();
1610 unsigned ClassSize1 = RegClassInfo->
getOrder(&RC1).size();
1612 bool SmallClass0 = ClassSize0 < RegClassDefCounts[RC0.
getID()];
1613 bool SmallClass1 = ClassSize1 < RegClassDefCounts[RC1.
getID()];
1614 if (SmallClass0 > SmallClass1)
1616 if (SmallClass0 < SmallClass1)
1622 if (Livethrough0 > Livethrough1)
1624 if (Livethrough0 < Livethrough1)
1632void RegAllocFastImpl::allocateInstruction(MachineInstr &
MI) {
1655 LiveDefRegs.
clear();
1656 BundleVirtRegsMap.
clear();
1657 assert(PendingImplicitOps.empty() &&
"implicit operands not added");
1660 bool HasPhysRegUse =
false;
1661 bool HasRegMask =
false;
1662 bool HasVRegDef =
false;
1663 bool HasDef =
false;
1664 bool HasEarlyClobber =
false;
1665 bool HasTiedDef =
false;
1666 bool NeedToAssignLiveThroughs =
false;
1667 for (MachineOperand &MO :
MI.operands()) {
1671 if (!shouldAllocateRegister(
Reg))
1677 HasEarlyClobber =
true;
1678 if (LowerTiedOps && MO.
isTied())
1681 NeedToAssignLiveThroughs =
true;
1687 bool displacedAny = definePhysReg(
MI,
Reg);
1689 HasEarlyClobber =
true;
1696 HasPhysRegUse =
true;
1714 if (NeedToAssignLiveThroughs) {
1715 findAndSortDefOperandIndexes(
MI);
1716 for (
unsigned OpIdx : DefOperandIndexes) {
1717 MachineOperand &MO =
MI.getOperand(OpIdx);
1721 defineLiveThroughVirtReg(
MI, MO,
Reg);
1723 defineVirtReg(
MI, MO,
Reg);
1726 for (MachineOperand &MO :
MI.all_defs())
1728 defineVirtReg(
MI, MO, MO.
getReg());
1736 for (MachineOperand &MO :
reverse(
MI.all_defs())) {
1753 "tied def assigned to clobbered register");
1768 unmarkRegUsedInInstr(
Reg);
1777 for (
const auto *RM : RegMasks)
1780 for (
const LiveReg &LR : LiveVirtRegs) {
1781 MCRegister PhysReg = LR.PhysReg;
1782 if (PhysReg && isClobberedByRegMasks(PhysReg))
1783 displacePhysReg(
MI, PhysReg);
1788 if (HasPhysRegUse) {
1789 for (MachineOperand &MO :
MI.operands()) {
1797 if (!usePhysReg(
MI,
Reg))
1806 bool HasUndefUse =
false;
1807 bool TiedOnly = HasTiedDef;
1809 for (MachineOperand &MO :
MI.all_uses()) {
1812 (TiedOnly && !MO.
isTied()))
1826 useVirtReg(
MI, MO,
Reg);
1828 }
while (std::exchange(TiedOnly,
false));
1835 for (MachineOperand &MO :
MI.all_uses()) {
1840 assert(MO.
isUndef() &&
"Should only have undef virtreg uses left");
1841 allocVirtRegUndef(MO);
1847 if (HasEarlyClobber) {
1848 for (MachineOperand &MO :
reverse(
MI.all_defs())) {
1851 assert(!MO.
getSubReg() &&
"should be already handled in def processing");
1877 (
MI.getOperand(0).getReg() ==
MI.getOperand(1).getReg() ||
1878 MI.getOperand(0).isDead()) &&
1879 MI.getNumOperands() == 2) {
1885void RegAllocFastImpl::handleDebugValue(MachineInstr &
MI) {
1888 assert(
MI.isDebugValue() &&
"not a DBG_VALUE*");
1889 for (
const auto &MO :
MI.debug_operands()) {
1895 if (!shouldAllocateRegister(
Reg))
1899 int SS = StackSlotForVirtReg[
Reg];
1909 LiveRegMap::iterator LRI = findLiveVirtReg(
Reg);
1913 if (LRI != LiveVirtRegs.end() && LRI->PhysReg) {
1915 for (
auto &RegMO : DbgOps)
1916 setPhysReg(*RegMO, *LRI);
1918 DanglingDbgValues[
Reg].push_back(&
MI);
1923 LiveDbgValueMap[
Reg].append(DbgOps.begin(), DbgOps.end());
1927void RegAllocFastImpl::handleBundle(MachineInstr &
MI) {
1930 while (BundledMI->isBundledWithPred()) {
1931 for (MachineOperand &MO : BundledMI->operands()) {
1939 auto DI = BundleVirtRegsMap.
find(
Reg);
1940 assert(DI != BundleVirtRegsMap.
end() &&
"Unassigned virtual register");
1942 setPhysReg(MO, DI->second);
1950void RegAllocFastImpl::allocateBasicBlock(MachineBasicBlock &
MBB) {
1954 PosIndexes.unsetInitialized();
1955 RegUnitStates.assign(
TRI->getNumRegUnits(), regFree);
1956 assert(LiveVirtRegs.empty() &&
"Mapping not cleared from last block?");
1959 setPhysRegState(LiveReg.PhysReg, regPreAssigned);
1971 if (
MI.isDebugValue()) {
1972 handleDebugValue(
MI);
1976 allocateInstruction(
MI);
1981 HasErrorDef =
false;
1986 if (
MI.getOpcode() == TargetOpcode::BUNDLE) {
1994 LLVM_DEBUG(
dbgs() <<
"Loading live registers at begin of block.\n");
1999 for (MachineInstr *
MI : Coalesced)
2001 NumCoalesced += Coalesced.size();
2003 for (
auto &UDBGPair : DanglingDbgValues) {
2004 for (MachineInstr *DbgValue : UDBGPair.second) {
2009 LLVM_DEBUG(
dbgs() <<
"Register did not survive for " << *DbgValue
2014 DanglingDbgValues.clear();
2022void RegAllocFastImpl::expandSubregPseudo(MachineInstr &
MI) {
2025 if (
MI.isInsertSubreg()) {
2028 const MachineOperand &BaseMO =
MI.getOperand(1);
2031 MI.getOperand(0).getReg())
2033 unsigned SubIdx =
MI.getOperand(3).getImm();
2034 MI.removeOperand(3);
2035 assert(
MI.getOperand(0).getSubReg() == 0 &&
"Unexpected subreg idx");
2036 MI.getOperand(0).setSubReg(SubIdx);
2037 MI.getOperand(0).setIsUndef(
MI.getOperand(1).isUndef());
2038 MI.removeOperand(1);
2039 MI.setDesc(
TII->get(TargetOpcode::COPY));
2052 if (
unsigned UseSubIdx =
Use.getSubReg())
2053 ReadLanes |=
TRI->getSubRegIndexLaneMask(UseSubIdx);
2055 bool DefEmitted =
false;
2056 for (
unsigned I = 1,
E =
MI.getNumOperands();
I + 1 <
E;
I += 2) {
2057 const MachineOperand &SrcMO =
MI.getOperand(
I);
2058 unsigned SubIdx =
MI.getOperand(
I + 1).getImm();
2060 (ReadLanes &
TRI->getSubRegIndexLaneMask(SubIdx)).none())
2070 MI.setDesc(
TII->get(TargetOpcode::IMPLICIT_DEF));
2071 while (
MI.getNumOperands() > 1)
2072 MI.removeOperand(
MI.getNumOperands() - 1);
2075 MI.eraseFromParent();
2079 RegisterClassInfo &RCI) {
2080 LLVM_DEBUG(
dbgs() <<
"********** FAST REGISTER ALLOCATION **********\n"
2081 <<
"********** Function: " << MF.
getName() <<
'\n');
2087 RegClassInfo = &RCI;
2091 unsigned NumRegUnits =
TRI->getNumRegUnits();
2093 UsedInInstr.
assign(NumRegUnits, 0);
2100 for (MachineBasicBlock &
MBB : MF)
2102 if (
MI.isRegSequence() ||
MI.isInsertSubreg())
2103 expandSubregPseudo(
MI);
2109 StackSlotForVirtReg.
resize(NumVirtRegs);
2110 LiveVirtRegs.setUniverse(NumVirtRegs);
2111 MayLiveAcrossBlocks.
clear();
2112 MayLiveAcrossBlocks.
resize(NumVirtRegs);
2115 for (MachineBasicBlock &
MBB : MF)
2116 allocateBasicBlock(
MBB);
2118 if (ClearVirtRegs) {
2124 StackSlotForVirtReg.
clear();
2125 LiveDbgValueMap.
clear();
2132 RegAllocFastImpl Impl(Opts.Filter, Opts.ClearVRegs);
2133 bool Changed = Impl.runOnMachineFunction(
2144 bool PrintFilterName = Opts.FilterName !=
"all";
2145 bool PrintNoClearVRegs = !Opts.ClearVRegs;
2146 bool PrintSemicolon = PrintFilterName && PrintNoClearVRegs;
2148 OS <<
"regallocfast";
2149 if (PrintFilterName || PrintNoClearVRegs) {
2151 if (PrintFilterName)
2152 OS <<
"filter=" << Opts.FilterName;
2155 if (PrintNoClearVRegs)
2156 OS <<
"no-clear-vregs";
2164 bool ClearVirtRegs) {
2165 return new RegAllocFast(Ftor, ClearVirtRegs);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
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 LLVM_UNLIKELY(EXPR)
This file defines the DenseMap class.
const HexagonInstrInfo * TII
This file implements an indexed map.
Register const TargetRegisterInfo * TRI
This file implements a map that provides insertion order iteration.
Promote Memory to Register
#define INITIALIZE_PASS_DEPENDENCY(depName)
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
MachineRegisterInfo & MRI
static Register getTiedUseReg(const MachineInstr &MI, const MachineOperand &DefMO)
The register DefMO's tied use reads, when the two end up in the same register: a subregister index on...
static bool isCoalescable(const MachineInstr &MI)
static const MachineOperand & getTiedOperand(const MachineInstr &MI, const MachineOperand &MO)
The operand MO is tied to.
static bool isLiveThroughDef(const MachineInstr &MI, const MachineOperand &MO)
Early clobber, partial def, or tied to a use that carries a value: the register is occupied while the...
static bool dominates(InstrPosIndexes &PosIndexes, const MachineInstr &A, const MachineInstr &B)
static RegisterRegAlloc fastRegAlloc("fast", "fast register allocator", createFastRegisterAllocator)
static void clearDeadsOfLiveDefs(MachineInstr &MI)
Clear dead flags on defs of any register which also has a live def on MI.
This file defines the SmallSet class.
This file defines the SmallVector class.
This file defines the SparseSet class derived from the version described in Briggs,...
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
AnalysisUsage & addRequired()
LLVM_ABI void setPreservesCFG()
This function should be called by the pass, iff they do not:
const T & front() const
Get the first element.
size_t size() const
Get the array size.
bool empty() const
Check if the array is empty.
bool test(unsigned Idx) const
Returns true if bit Idx is set.
void resize(unsigned N, bool t=false)
Grow or shrink the bitvector.
void clear()
Removes all bits from the bitvector.
BitVector & set()
Set all bits in the bitvector.
Represents analyses that only rely on functions' control flow.
iterator find(const_arg_type_t< KeyT > Val)
FunctionPass class - This class is used to implement most global optimizations.
LLVMContext & getContext() const
getContext - Return a reference to the LLVMContext associated with this function.
void storeRegToStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, Register SrcReg, bool isKill, int FrameIndex, const TargetRegisterClass *RC, Register VReg, MachineInstr::MIFlag Flags=MachineInstr::NoFlags) const override
Store the specified register of the given register class to the specified stack frame index.
void loadRegFromStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, Register DestReg, int FrameIndex, const TargetRegisterClass *RC, Register VReg, unsigned SubReg=0, MachineInstr::MIFlag Flags=MachineInstr::NoFlags) const override
Load the specified register of the given register class from the specified stack frame index.
Register isStoreToStackSlot(const MachineInstr &MI, int &FrameIndex) const override
If the specified machine instruction is a direct store to a stack slot, return the virtual or physica...
void resize(typename StorageT::size_type S)
LLVM_ABI void diagnose(const DiagnosticInfo &DI)
Report a message to the currently installed diagnostic handler.
unsigned getID() const
getID() - Return the register class ID number.
ArrayRef< MCPhysReg > getRegisters() const
bool contains(MCRegister Reg) const
contains - Return true if the specified register is included in this register class.
bool hasSubClassEq(const MCRegisterClass *RC) const
Returns true if RC is a sub-class of or equal to this class.
constexpr bool isPhysical() const
Return true if the specified register number is in the physical register namespace.
An RAII based helper class to modify MachineFunctionProperties when running pass.
bool isInlineAsmBrIndirectTarget() const
Returns true if this is the indirect dest of an INLINEASM_BR.
iterator_range< liveout_iterator > liveouts() const
MachineInstrBundleIterator< const MachineInstr > const_iterator
LLVM_ABI instr_iterator insert(instr_iterator I, MachineInstr *M)
Insert MI into the instruction list before I, possibly inside a bundle.
iterator_range< livein_iterator > liveins() const
LLVM_ABI iterator getFirstTerminator()
Returns an iterator to the first terminator instruction of this basic block.
LLVM_ABI void dump() const
Instructions::iterator instr_iterator
void addLiveIn(MCRegister PhysReg, LaneBitmask LaneMask=LaneBitmask::getAll())
Adds the specified register as a live in.
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
LLVM_ABI instr_iterator erase(instr_iterator I)
Remove an instruction from the instruction list and delete it.
LLVM_ABI bool isSuccessor(const MachineBasicBlock *MBB) const
Return true if the specified MBB is a successor of this block.
MachineInstrBundleIterator< MachineInstr > iterator
LLVM_ABI bool isLiveIn(MCRegister Reg, LaneBitmask LaneMask=LaneBitmask::getAll()) const
Return true if the specified register is in the live in set.
bool isSpillSlotObjectIndex(int ObjectIdx) const
Returns true if the specified index corresponds to a spill slot.
LLVM_ABI int CreateSpillStackObject(uint64_t Size, Align Alignment, TargetStackID::Value StackID=TargetStackID::Default)
Create a new statically sized stack object that represents a spill slot, returning a nonnegative iden...
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.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
Function & getFunction()
Return the LLVM function that this machine code represents.
const MachineFunctionProperties & getProperties() const
Get the function properties.
const MachineBasicBlock & front() const
const MachineInstrBuilder & addReg(Register RegNo, RegState Flags={}, unsigned SubReg=0) const
Add a new virtual register operand.
Representation of each machine instruction.
bool hasDebugOperandForReg(Register Reg) const
Returns whether this debug value has at least one debug operand with the register Reg.
void setDebugValueUndef()
Sets all register debug operands in this debug value instruction to be undef.
const MachineBasicBlock * getParent() const
bool isDebugValue() const
MachineOperand class - Representation of each machine instruction operand.
void setSubReg(unsigned subReg)
unsigned getSubReg() const
bool readsReg() const
readsReg - Returns true if this operand reads the previous value of its register.
LLVM_ABI void setIsRenamable(bool Val=true)
bool isReg() const
isReg - Tests if this is a MO_Register operand.
bool isRegMask() const
isRegMask - Tests if this is a MO_RegisterMask operand.
MachineBasicBlock * getMBB() const
void setIsDead(bool Val=true)
LLVM_ABI void setReg(Register Reg)
Change the register this operand corresponds to.
void setIsKill(bool Val=true)
MachineInstr * getParent()
getParent - Return the instruction that this operand belongs to.
void setIsUndef(bool Val=true)
bool isEarlyClobber() const
Register getReg() const
getReg - Returns the register number.
bool isInternalRead() const
static bool clobbersPhysReg(const uint32_t *RegMask, MCRegister PhysReg)
clobbersPhysReg - Returns true if this RegMask clobbers PhysReg.
const uint32_t * getRegMask() const
getRegMask - Returns a bit mask of registers preserved by this RegMask operand.
bool isMBB() const
isMBB - Tests if this is a MO_MachineBasicBlock operand.
LLVM_ABI void freezeReservedRegs()
freezeReservedRegs - Called by the register allocator to freeze the set of reserved registers before ...
const TargetRegisterClass * getRegClass(Register Reg) const
Return the register class of the specified virtual register.
iterator_range< def_instr_iterator > def_instructions(Register Reg) const
iterator_range< use_nodbg_iterator > use_nodbg_operands(Register Reg) const
bool isReserved(MCRegister PhysReg) const
isReserved - Returns true when PhysReg is a reserved register.
MachineOperand * getOneDef(Register Reg) const
Returns the defining operand if there is exactly one operand defining the specified register,...
const BitVector & getReservedRegs() const
getReservedRegs - Returns a reference to the frozen set of reserved registers.
LLVM_ABI void clearVirtRegs()
clearVirtRegs - Remove all virtual registers (after physreg assignment).
bool isAllocatable(MCRegister PhysReg) const
isAllocatable - Returns true when PhysReg belongs to an allocatable register class and it hasn't been...
iterator_range< use_instr_nodbg_iterator > use_nodbg_instructions(Register Reg) const
iterator_range< def_iterator > def_operands(Register Reg) const
const MachineFunction & getMF() const
void addPhysRegsUsedFromRegMask(const uint32_t *RegMask)
addPhysRegsUsedFromRegMask - Mark any registers not in RegMask as used.
unsigned getNumVirtRegs() const
getNumVirtRegs - Return the number of virtual registers created.
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.
LLVM_ABI PreservedAnalyses run(MachineFunction &MF, MachineFunctionAnalysisManager &)
LLVM_ABI void printPipeline(raw_ostream &OS, function_ref< StringRef(StringRef)> MapClassName2PassName)
LLVM_ABI void updateReservedRegs(const BitVector &ReservedInput)
Update cached register class information using ReservedInput, MRI's current reserved-register set.
ArrayRef< MCPhysReg > getOrder(const TargetRegisterClass *RC) const
getOrder - Returns the preferred allocation order for RC.
Wrapper class representing virtual and physical registers.
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 isValid() const
constexpr bool isVirtual() const
Return true if the specified register number is in the virtual register namespace.
constexpr unsigned id() const
constexpr bool isPhysical() const
Return true if the specified register number is in the physical register namespace.
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.
void assign(size_type NumElts, ValueParamT Elt)
void push_back(const T &Elt)
typename DenseT::const_iterator const_iterator
typename DenseT::iterator iterator
Represent a constant reference to a string, i.e.
virtual const TargetInstrInfo * getInstrInfo() const
virtual const TargetRegisterInfo * getRegisterInfo() const =0
Return the target's register information.
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.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
initializer< Ty > init(const Ty &Val)
NodeAddr< DefNode * > Def
NodeAddr< UseNode * > Use
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI FunctionPass * createFastRegisterAllocator()
FastRegisterAllocation Pass - This pass register allocates as fast as possible.
std::function< bool(const TargetRegisterInfo &TRI, const MachineRegisterInfo &MRI, const Register Reg)> RegAllocFilterFunc
Filter function for register classes during regalloc.
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
@ Kill
The last use of a register.
@ Renamable
Register that may be renamed.
LLVM_ABI void updateDbgValueForSpill(MachineInstr &Orig, int FrameIndex, Register Reg)
Update a DBG_VALUE whose value has been spilled to FrameIndex.
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
LLVM_ABI Printable printRegUnit(MCRegUnit Unit, const TargetRegisterInfo *TRI)
Create Printable object to print register units on a raw_ostream.
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)
void sort(IteratorTy Start, IteratorTy End)
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
MutableArrayRef(T &OneElt) -> MutableArrayRef< T >
uint16_t MCPhysReg
An unsigned integer type large enough to represent all physical registers, but not necessarily virtua...
DWARFExpression::Operation Op
ArrayRef(const T &OneElt) -> ArrayRef< T >
LLVM_ABI MachineInstr * buildDbgValueForSpill(MachineBasicBlock &BB, MachineBasicBlock::iterator I, const MachineInstr &Orig, int FrameIndex, Register SpillReg)
Clone a DBG_VALUE whose value has been spilled to FrameIndex.
iterator_range< pointer_iterator< WrappedIteratorT > > make_pointer_range(RangeT &&Range)
@ End
Run the machine verifier once, at the end of the pipeline.
constexpr RegState getUndefRegState(bool B)
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.
MCRegisterClass TargetRegisterClass
static constexpr LaneBitmask getNone()