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;
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;
290 InstrPosIndexes PosIndexes;
292 void setRegUnitState(MCRegUnit Unit,
unsigned NewState);
293 unsigned getRegUnitState(MCRegUnit Unit)
const;
295 void setPhysRegState(MCRegister PhysReg,
unsigned NewState);
296 bool isPhysRegFree(MCRegister PhysReg)
const;
299 void markRegUsedInInstr(MCRegister PhysReg) {
300 for (MCRegUnit Unit : TRI->regunits(PhysReg))
301 UsedInInstr[
static_cast<unsigned>(
Unit)] = InstrGen | 1;
305 bool isClobberedByRegMasks(MCRegister PhysReg)
const {
306 return llvm::any_of(RegMasks, [PhysReg](
const uint32_t *Mask) {
312 bool isRegUsedInInstr(MCRegister PhysReg,
bool LookAtPhysRegUses)
const {
313 if (LookAtPhysRegUses && isClobberedByRegMasks(PhysReg))
315 for (MCRegUnit Unit : TRI->regunits(PhysReg))
316 if (UsedInInstr[
static_cast<unsigned>(Unit)] >=
317 (InstrGen | !LookAtPhysRegUses))
324 void markPhysRegUsedInInstr(MCRegister PhysReg) {
325 for (MCRegUnit Unit : TRI->regunits(PhysReg)) {
326 assert(UsedInInstr[
static_cast<unsigned>(Unit)] <= InstrGen &&
327 "non-phys use before phys use?");
328 UsedInInstr[
static_cast<unsigned>(
Unit)] = InstrGen;
333 void unmarkRegUsedInInstr(MCRegister PhysReg) {
334 for (MCRegUnit Unit : TRI->regunits(PhysReg))
335 UsedInInstr[
static_cast<unsigned>(
Unit)] = 0;
340 bool hasLiveDefOfSuperReg(MCRegister PhysReg)
const {
341 return any_of(LiveDefRegs, [&](MCRegister LiveReg) {
342 return TRI->isSuperRegisterEq(PhysReg, LiveReg);
350 spillImpossible = ~0
u
359 void allocateBasicBlock(MachineBasicBlock &MBB);
360 void expandSubregPseudo(MachineInstr &
MI);
365 void findAndSortDefOperandIndexes(
const MachineInstr &
MI);
367 void allocateInstruction(MachineInstr &
MI);
368 void handleDebugValue(MachineInstr &
MI);
369 void handleBundle(MachineInstr &
MI);
371 bool usePhysReg(MachineInstr &
MI, MCRegister PhysReg);
372 bool definePhysReg(MachineInstr &
MI, MCRegister PhysReg);
373 bool displacePhysReg(MachineInstr &
MI, MCRegister PhysReg);
374 void freePhysReg(MCRegister PhysReg);
376 unsigned calcSpillCost(
MCPhysReg PhysReg)
const;
386 void assignVirtToPhysReg(MachineInstr &
MI, LiveReg &, MCRegister PhysReg);
387 void allocVirtReg(MachineInstr &
MI, LiveReg &LR,
Register Hint,
388 bool LookAtPhysRegUses =
false);
389 void allocVirtRegUndef(MachineOperand &MO);
390 void assignDanglingDebugValues(MachineInstr &Def,
Register VirtReg,
392 bool defineLiveThroughVirtReg(MachineInstr &
MI,
unsigned OpNum,
394 bool defineVirtReg(MachineInstr &
MI,
unsigned OpNum,
Register VirtReg,
395 bool LookAtPhysRegUses =
false);
396 bool useVirtReg(MachineInstr &
MI, MachineOperand &MO,
Register VirtReg);
397 bool lowerTiedUse(MachineInstr &
MI, MachineOperand &MO, LiveReg &LR);
399 MCPhysReg getErrorAssignment(
const LiveReg &LR, MachineInstr &
MI,
403 getMBBBeginInsertionPoint(MachineBasicBlock &MBB,
404 SmallSet<Register, 2> &PrologLiveIns)
const;
406 void reloadAtBegin(MachineBasicBlock &MBB);
407 bool setPhysReg(MachineInstr &
MI, MachineOperand &MO,
408 const LiveReg &Assignment);
413 bool shouldAllocateRegister(
const Register Reg)
const;
414 int getStackSpaceFor(
Register VirtReg);
416 MCRegister AssignedReg,
bool Kill,
bool LiveOut);
423 bool mayBeSpillFromInlineAsmBr(
const MachineInstr &
MI)
const;
425 void dumpState()
const;
429 RegAllocFastImpl Impl;
435 : MachineFunctionPass(ID), Impl(
F, ClearVirtRegs_) {}
438 return Impl.runOnMachineFunction(MF);
441 StringRef getPassName()
const override {
return "Fast Register Allocator"; }
443 void getAnalysisUsage(AnalysisUsage &AU)
const override {
448 MachineFunctionProperties getRequiredProperties()
const override {
449 return MachineFunctionProperties().setNoPHIs();
452 MachineFunctionProperties getSetProperties()
const override {
453 MachineFunctionProperties
P;
454 if (Impl.ClearVirtRegs)
455 P.setNoVRegs().setTiedOpsRewritten();
459 MachineFunctionProperties getClearedProperties()
const override {
460 return MachineFunctionProperties().setIsSSA();
466char RegAllocFast::ID = 0;
473 if (!ShouldAllocateRegisterImpl)
476 return ShouldAllocateRegisterImpl(*
TRI, *MRI,
Reg);
479void RegAllocFastImpl::setRegUnitState(MCRegUnit Unit,
unsigned NewState) {
480 RegUnitStates[
static_cast<unsigned>(
Unit)] = NewState;
483unsigned RegAllocFastImpl::getRegUnitState(MCRegUnit Unit)
const {
484 return RegUnitStates[
static_cast<unsigned>(
Unit)];
487void RegAllocFastImpl::setPhysRegState(MCRegister PhysReg,
unsigned NewState) {
488 for (MCRegUnit Unit :
TRI->regunits(PhysReg))
489 setRegUnitState(Unit, NewState);
492bool RegAllocFastImpl::isPhysRegFree(MCRegister PhysReg)
const {
493 for (MCRegUnit Unit :
TRI->regunits(PhysReg)) {
494 if (getRegUnitState(Unit) != regFree)
502int RegAllocFastImpl::getStackSpaceFor(
Register VirtReg) {
504 int SS = StackSlotForVirtReg[VirtReg];
511 unsigned Size =
TRI->getSpillSize(RC);
516 Align CurrentAlign =
ST.getFrameLowering()->getStackAlign();
517 if (Alignment > CurrentAlign && !
TRI->canRealignStack(MF))
524 StackSlotForVirtReg[VirtReg] = FrameIdx;
531 PosIndexes.getIndex(
A, IndexA);
534 PosIndexes.getIndex(
A, IndexA);
535 return IndexA < IndexB;
542bool RegAllocFastImpl::mayBeSpillFromInlineAsmBr(
const MachineInstr &
MI)
const {
547 for (
const auto &
Op :
MI.operands())
554bool RegAllocFastImpl::mayLiveOut(
Register VirtReg) {
560 const MachineInstr *SelfLoopDef =
nullptr;
567 if (DefInst.getParent() !=
MBB) {
571 if (!SelfLoopDef ||
dominates(PosIndexes, DefInst, *SelfLoopDef))
572 SelfLoopDef = &DefInst;
583 static const unsigned Limit = 8;
586 if (UseInst.getParent() !=
MBB || ++
C >= Limit) {
595 if (SelfLoopDef == &UseInst ||
596 !
dominates(PosIndexes, *SelfLoopDef, UseInst)) {
607bool RegAllocFastImpl::mayLiveIn(
Register VirtReg) {
612 static const unsigned Limit = 8;
615 if (DefInst.getParent() !=
MBB || ++
C >= Limit) {
627 Register VirtReg, MCRegister AssignedReg,
628 bool Kill,
bool LiveOut) {
631 int FI = getStackSpaceFor(VirtReg);
643 SmallVectorImpl<MachineOperand *> &LRIDbgOperands = LiveDbgValueMap[VirtReg];
644 SmallMapVector<MachineInstr *, SmallVector<const MachineOperand *>, 2>
646 for (MachineOperand *MO : LRIDbgOperands)
647 SpilledOperandsMap[MO->getParent()].push_back(MO);
648 for (
const auto &MISpilledOperands : SpilledOperandsMap) {
649 MachineInstr &
DBG = *MISpilledOperands.first;
651 if (
DBG.isDebugValueList())
654 *
MBB, Before, *MISpilledOperands.first, FI, MISpilledOperands.second);
657 LLVM_DEBUG(
dbgs() <<
"Inserting debug info due to spill:\n" << *NewDV);
664 MachineInstr *ClonedDV =
MBB->
getParent()->CloneMachineInstr(NewDV);
666 LLVM_DEBUG(
dbgs() <<
"Cloning debug info due to live out spill\n");
672 if (
DBG.isNonListDebugValue()) {
673 MachineOperand &MO =
DBG.getDebugOperand(0);
682 LRIDbgOperands.
clear();
687 Register VirtReg, MCRegister PhysReg) {
690 int FI = getStackSpaceFor(VirtReg);
701 MachineBasicBlock &
MBB, SmallSet<Register, 2> &PrologLiveIns)
const {
710 if (!
TII->isBasicBlockPrologue(*
I) && !mayBeSpillFromInlineAsmBr(*
I))
715 for (MachineOperand &MO :
I->operands()) {
727void RegAllocFastImpl::reloadAtBegin(MachineBasicBlock &
MBB) {
728 if (LiveVirtRegs.empty())
733 for (MachineBasicBlock::RegisterMaskPair
P :
MBB.
liveins())
734 setPhysRegState(
P.PhysReg, regLiveIn);
736 SmallSet<Register, 2> PrologLiveIns;
741 getMBBBeginInsertionPoint(
MBB, PrologLiveIns);
742 for (
const LiveReg &LR : LiveVirtRegs) {
743 MCRegister PhysReg = LR.PhysReg;
744 if (!PhysReg || LR.Error)
747 MCRegUnit FirstUnit = *
TRI->regunits(PhysReg).begin();
748 if (getRegUnitState(FirstUnit) == regLiveIn)
752 "no reload in start block. Missing vreg def?");
754 if (PrologLiveIns.
count(PhysReg)) {
758 reload(
MBB.
begin(), LR.VirtReg, PhysReg);
760 reload(InsertBefore, LR.VirtReg, PhysReg);
762 LiveVirtRegs.clear();
769bool RegAllocFastImpl::usePhysReg(MachineInstr &
MI, MCRegister
Reg) {
771 bool displacedAny = displacePhysReg(
MI,
Reg);
772 setPhysRegState(
Reg, regPreAssigned);
773 markRegUsedInInstr(
Reg);
782bool RegAllocFastImpl::definePhysReg(MachineInstr &
MI, MCRegister
Reg) {
783 bool displacedAny = displacePhysReg(
MI,
Reg);
784 setPhysRegState(
Reg, regPreAssigned);
791bool RegAllocFastImpl::displacePhysReg(MachineInstr &
MI, MCRegister PhysReg) {
792 bool displacedAny =
false;
794 for (MCRegUnit Unit :
TRI->regunits(PhysReg)) {
795 switch (
unsigned VirtReg = getRegUnitState(Unit)) {
797 LiveRegMap::iterator LRI = findLiveVirtReg(VirtReg);
798 assert(LRI != LiveVirtRegs.end() &&
"datastructures in sync");
801 while (mayBeSpillFromInlineAsmBr(*ReloadBefore))
803 reload(ReloadBefore, VirtReg, LRI->PhysReg);
805 setPhysRegState(LRI->PhysReg, regFree);
806 LRI->PhysReg = MCRegister();
807 LRI->Reloaded =
true;
812 setRegUnitState(Unit, regFree);
822void RegAllocFastImpl::freePhysReg(MCRegister PhysReg) {
825 MCRegUnit FirstUnit = *
TRI->regunits(PhysReg).begin();
826 switch (
unsigned VirtReg = getRegUnitState(FirstUnit)) {
832 setPhysRegState(PhysReg, regFree);
835 LiveRegMap::iterator LRI = findLiveVirtReg(VirtReg);
836 assert(LRI != LiveVirtRegs.end());
838 setPhysRegState(LRI->PhysReg, regFree);
839 LRI->PhysReg = MCRegister();
849unsigned RegAllocFastImpl::calcSpillCost(
MCPhysReg PhysReg)
const {
850 for (MCRegUnit Unit :
TRI->regunits(PhysReg)) {
851 switch (
unsigned VirtReg = getRegUnitState(Unit)) {
857 return spillImpossible;
859 bool SureSpill = StackSlotForVirtReg[VirtReg] != -1 ||
860 findLiveVirtReg(VirtReg)->LiveOut;
861 return SureSpill ? spillClean : spillDirty;
868void RegAllocFastImpl::assignDanglingDebugValues(MachineInstr &Definition,
871 auto UDBGValIter = DanglingDbgValues.
find(VirtReg);
872 if (UDBGValIter == DanglingDbgValues.
end())
875 SmallVectorImpl<MachineInstr *> &Dangling = UDBGValIter->second;
876 for (MachineInstr *DbgValue : Dangling) {
877 assert(DbgValue->isDebugValue());
878 if (!DbgValue->hasDebugOperandForReg(VirtReg))
884 MCRegister SetToReg =
Reg;
887 if (!Definition.definesRegister(
Reg,
TRI))
890 if (
I->modifiesRegister(
Reg,
TRI) || --Limit == 0) {
893 SetToReg = MCRegister();
897 for (MachineOperand &MO : DbgValue->getDebugOperandsForReg(VirtReg)) {
909void RegAllocFastImpl::assignVirtToPhysReg(MachineInstr &AtMI, LiveReg &LR,
910 MCRegister PhysReg) {
914 assert(!LR.PhysReg &&
"Already assigned a physreg");
915 assert(PhysReg &&
"Trying to assign no register");
916 LR.PhysReg = PhysReg;
917 setPhysRegState(PhysReg, VirtReg.
id());
919 assignDanglingDebugValues(AtMI, VirtReg, PhysReg);
927 return MI.getOperand(
MI.findTiedOperandIdx(
MI.getOperandNo(&MO)));
941 static const unsigned ChainLengthLimit = 3;
942 for (
unsigned C = 0;
C <= ChainLengthLimit; ++
C) {
952 Reg =
Def->getOperand(1).getReg();
968 static const unsigned DefLimit = 3;
970 for (
const MachineOperand &DefMO : MRI->
def_operands(VirtReg)) {
974 Reg =
MI.getOperand(1).getReg();
975 else if (LowerTiedOps)
978 Reg = traceCopyChain(
Reg);
990void RegAllocFastImpl::allocVirtReg(MachineInstr &
MI, LiveReg &LR,
991 Register Hint0,
bool LookAtPhysRegUses) {
992 const Register VirtReg = LR.VirtReg;
997 <<
" in class " <<
TRI->getRegClassName(&RC)
1002 !isRegUsedInInstr(Hint0, LookAtPhysRegUses)) {
1004 if (isPhysRegFree(Hint0)) {
1007 assignVirtToPhysReg(
MI, LR, Hint0);
1018 Register Hint1 = traceCopies(VirtReg);
1020 !isRegUsedInInstr(Hint1, LookAtPhysRegUses)) {
1022 if (isPhysRegFree(Hint1)) {
1025 assignVirtToPhysReg(
MI, LR, Hint1);
1036 unsigned BestCost = spillImpossible;
1038 for (
MCPhysReg PhysReg : AllocationOrder) {
1040 if (isRegUsedInInstr(PhysReg, LookAtPhysRegUses)) {
1045 unsigned Cost = calcSpillCost(PhysReg);
1049 assignVirtToPhysReg(
MI, LR, PhysReg);
1053 if (PhysReg == Hint0 || PhysReg == Hint1)
1054 Cost -= spillPrefBonus;
1056 if (
Cost < BestCost) {
1065 LR.PhysReg = getErrorAssignment(LR,
MI, RC);
1070 displacePhysReg(
MI, BestReg);
1071 assignVirtToPhysReg(
MI, LR, BestReg);
1074void RegAllocFastImpl::allocVirtRegUndef(MachineOperand &MO) {
1078 if (!shouldAllocateRegister(VirtReg))
1084 for (
const MachineOperand &Tied :
MI.all_uses()) {
1085 if (!Tied.isTied() || Tied.getReg() != VirtReg)
1088 for (MachineOperand &O :
MI.all_uses()) {
1089 if (
O.getReg() != VirtReg)
1092 unsigned SubIdx =
O.isTied() ? 0 :
O.getSubReg();
1093 O.setReg(SubIdx ?
TRI->getSubReg(DefReg, SubIdx) : DefReg);
1100 LiveRegMap::iterator LRI = findLiveVirtReg(VirtReg);
1102 bool IsRenamable =
true;
1103 if (LRI != LiveVirtRegs.end() && LRI->PhysReg) {
1104 PhysReg = LRI->PhysReg;
1108 if (AllocationOrder.
empty()) {
1114 PhysReg = getErrorAssignment(*LRI, *MO.
getParent(), RC);
1116 IsRenamable =
false;
1118 PhysReg = AllocationOrder.
front();
1122 if (SubRegIdx != 0) {
1123 PhysReg =
TRI->getSubReg(PhysReg, SubRegIdx);
1133bool RegAllocFastImpl::defineLiveThroughVirtReg(MachineInstr &
MI,
1136 if (!shouldAllocateRegister(VirtReg))
1138 LiveRegMap::iterator LRI = findLiveVirtReg(VirtReg);
1139 if (LRI != LiveVirtRegs.end()) {
1140 MCRegister PrevReg = LRI->PhysReg;
1141 if (PrevReg && isRegUsedInInstr(PrevReg,
true)) {
1143 <<
" (tied/earlyclobber resolution)\n");
1144 freePhysReg(PrevReg);
1145 LRI->PhysReg = MCRegister();
1152 TII->get(TargetOpcode::COPY), PrevReg)
1155 MachineOperand &MO =
MI.getOperand(OpNum);
1160 return defineVirtReg(
MI, OpNum, VirtReg,
true);
1170bool RegAllocFastImpl::defineVirtReg(MachineInstr &
MI,
unsigned OpNum,
1171 Register VirtReg,
bool LookAtPhysRegUses) {
1173 if (!shouldAllocateRegister(VirtReg))
1175 MachineOperand &MO =
MI.getOperand(OpNum);
1176 LiveRegMap::iterator LRI;
1178 std::tie(LRI, New) = LiveVirtRegs.insert(LiveReg(VirtReg));
1181 if (mayLiveOut(VirtReg)) {
1182 LRI->LiveOut =
true;
1189 if (!LRI->PhysReg) {
1190 allocVirtReg(
MI, *LRI,
Register(), LookAtPhysRegUses);
1192 assert((!isRegUsedInInstr(LRI->PhysReg, LookAtPhysRegUses) || LRI->Error) &&
1193 "TODO: preassign mismatch");
1195 <<
" use existing assignment to "
1199 MCRegister PhysReg = LRI->PhysReg;
1201 if (LRI->Reloaded || LRI->LiveOut) {
1202 if (!
MI.isImplicitDef()) {
1206 <<
" RL: " << LRI->Reloaded <<
'\n');
1207 bool Kill = LRI->LastUse ==
nullptr;
1208 spill(SpillBefore, VirtReg, PhysReg,
Kill, LRI->LiveOut);
1212 if (
MI.getOpcode() == TargetOpcode::INLINEASM_BR) {
1213 int FI = StackSlotForVirtReg[VirtReg];
1215 for (MachineOperand &MO :
MI.operands()) {
1217 MachineBasicBlock *Succ = MO.
getMBB();
1226 LRI->LastUse =
nullptr;
1227 }
else if (!LRI->LastUse) {
1232 LRI->LiveOut =
false;
1233 LRI->Reloaded =
false;
1235 if (
MI.getOpcode() == TargetOpcode::BUNDLE) {
1236 BundleVirtRegsMap[VirtReg] = *LRI;
1238 markRegUsedInInstr(PhysReg);
1239 return setPhysReg(
MI, MO, *LRI);
1244bool RegAllocFastImpl::lowerTiedUse(MachineInstr &
MI, MachineOperand &MO,
1257 any_of(
MI.all_uses(), [&](
const MachineOperand &O) {
1258 return &O != &MO && O.getReg() == LR.VirtReg;
1262 freePhysReg(DefReg);
1263 assignVirtToPhysReg(
MI, LR, DefReg);
1268 assert((LR.Error || !
TRI->regsOverlap(LR.PhysReg, DefReg)) &&
1269 "copy source overlaps the tied def");
1272 MCRegister SrcReg = SubReg ?
TRI->getSubReg(LR.PhysReg, SubReg) : LR.PhysReg;
1274 if (SrcReg == DefReg)
1281 markRegUsedInInstr(LR.PhysReg);
1284 auto ReadDefReg = [&](MachineOperand &
O) {
1294 for (MachineOperand &O :
MI.all_uses()) {
1295 if (
O.isTied() ||
O.getReg() != LR.VirtReg ||
O.getSubReg() != SubReg)
1303 freePhysReg(DefReg);
1309bool RegAllocFastImpl::useVirtReg(MachineInstr &
MI, MachineOperand &MO,
1312 if (!shouldAllocateRegister(VirtReg))
1314 LiveRegMap::iterator LRI;
1316 std::tie(LRI, New) = LiveVirtRegs.insert(LiveReg(VirtReg));
1319 if (mayLiveOut(VirtReg)) {
1320 LRI->LiveOut =
true;
1327 assert((!MO.
isKill() || LRI->LastUse == &
MI) &&
"Invalid kill flag");
1330 if (LowerTiedOps && MO.
isTied() && lowerTiedUse(
MI, MO, *LRI))
1334 if (!LRI->PhysReg) {
1337 if (
MI.isCopy() &&
MI.getOperand(1).getSubReg() == 0) {
1338 Hint =
MI.getOperand(0).getReg();
1339 if (
Hint.isVirtual()) {
1340 assert(!shouldAllocateRegister(Hint));
1344 "Copy destination should already be assigned");
1347 allocVirtReg(
MI, *LRI, Hint,
false);
1352 if (
MI.getOpcode() == TargetOpcode::BUNDLE) {
1353 BundleVirtRegsMap[VirtReg] = *LRI;
1355 markRegUsedInInstr(LRI->PhysReg);
1356 return setPhysReg(
MI, MO, *LRI);
1362MCPhysReg RegAllocFastImpl::getErrorAssignment(
const LiveReg &LR,
1376 if (AllocationOrder.
empty()) {
1380 "no registers from class available to allocate", Fn,
1385 assert(!RawRegs.
empty() &&
"register classes cannot have no registers");
1386 return RawRegs.
front();
1389 if (!LR.Error && EmitError) {
1392 if (
MI.isInlineAsm()) {
1393 MI.emitInlineAsmError(
1394 "inline assembly requires more registers than available");
1398 "ran out of registers during register allocation", Fn,
1403 return AllocationOrder.
front();
1408bool RegAllocFastImpl::setPhysReg(MachineInstr &
MI, MachineOperand &MO,
1409 const LiveReg &Assignment) {
1410 MCRegister PhysReg = Assignment.PhysReg;
1411 assert(PhysReg &&
"assignments should always be to a valid physreg");
1439 MI.addRegisterKilled(PhysReg,
TRI,
true);
1448 MI.addRegisterDead(PhysReg,
TRI,
true);
1450 MI.addRegisterDefined(PhysReg,
TRI);
1459void RegAllocFastImpl::dumpState()
const {
1460 for (MCRegUnit Unit :
TRI->regunits()) {
1461 switch (
unsigned VirtReg = getRegUnitState(Unit)) {
1464 case regPreAssigned:
1471 LiveRegMap::const_iterator
I = findLiveVirtReg(VirtReg);
1472 assert(
I != LiveVirtRegs.end() &&
"have LiveVirtRegs entry");
1473 if (
I->LiveOut ||
I->Reloaded) {
1481 assert(
TRI->hasRegUnit(
I->PhysReg, Unit) &&
"inverse mapping present");
1488 for (
const LiveReg &LR : LiveVirtRegs) {
1491 MCRegister PhysReg = LR.PhysReg;
1494 for (MCRegUnit Unit :
TRI->regunits(PhysReg)) {
1495 assert(getRegUnitState(Unit) == VirtReg &&
"inverse map valid");
1503void RegAllocFastImpl::addRegClassDefCounts(
1505 assert(RegClassDefCounts.
size() ==
TRI->getNumRegClasses());
1508 if (!shouldAllocateRegister(
Reg))
1511 for (
unsigned RCIdx = 0, RCIdxEnd =
TRI->getNumRegClasses();
1512 RCIdx != RCIdxEnd; ++RCIdx) {
1516 ++RegClassDefCounts[RCIdx];
1522 for (
unsigned RCIdx = 0, RCIdxEnd =
TRI->getNumRegClasses();
1523 RCIdx != RCIdxEnd; ++RCIdx) {
1525 for (MCRegAliasIterator Alias(
Reg,
TRI,
true); Alias.isValid(); ++Alias) {
1527 ++RegClassDefCounts[RCIdx];
1541 !
MI.getOperand(
MI.findTiedOperandIdx(
MI.getOperandNo(&MO))).isUndef();
1547void RegAllocFastImpl::findAndSortDefOperandIndexes(
const MachineInstr &
MI) {
1548 DefOperandIndexes.
clear();
1551 for (
unsigned I = 0,
E =
MI.getNumOperands();
I <
E; ++
I) {
1552 const MachineOperand &MO =
MI.getOperand(
I);
1559 markPhysRegUsedInInstr(
Reg);
1569 if (DefOperandIndexes.
size() <= 1)
1577 SmallVector<unsigned> RegClassDefCounts(
TRI->getNumRegClasses(), 0);
1579 for (
const MachineOperand &MO :
MI.all_defs())
1580 addRegClassDefCounts(RegClassDefCounts, MO.
getReg());
1582 llvm::sort(DefOperandIndexes, [&](
unsigned I0,
unsigned I1) {
1583 const MachineOperand &MO0 =
MI.getOperand(I0);
1584 const MachineOperand &MO1 =
MI.getOperand(I1);
1592 unsigned ClassSize0 = RegClassInfo.
getOrder(&RC0).size();
1593 unsigned ClassSize1 = RegClassInfo.
getOrder(&RC1).size();
1595 bool SmallClass0 = ClassSize0 < RegClassDefCounts[RC0.
getID()];
1596 bool SmallClass1 = ClassSize1 < RegClassDefCounts[RC1.
getID()];
1597 if (SmallClass0 > SmallClass1)
1599 if (SmallClass0 < SmallClass1)
1605 if (Livethrough0 > Livethrough1)
1607 if (Livethrough0 < Livethrough1)
1615void RegAllocFastImpl::allocateInstruction(MachineInstr &
MI) {
1638 LiveDefRegs.
clear();
1639 BundleVirtRegsMap.
clear();
1642 bool HasPhysRegUse =
false;
1643 bool HasRegMask =
false;
1644 bool HasVRegDef =
false;
1645 bool HasDef =
false;
1646 bool HasEarlyClobber =
false;
1647 bool HasTiedDef =
false;
1648 bool NeedToAssignLiveThroughs =
false;
1649 for (MachineOperand &MO :
MI.operands()) {
1653 if (!shouldAllocateRegister(
Reg))
1659 HasEarlyClobber =
true;
1660 if (LowerTiedOps && MO.
isTied())
1663 NeedToAssignLiveThroughs =
true;
1669 bool displacedAny = definePhysReg(
MI,
Reg);
1671 HasEarlyClobber =
true;
1678 HasPhysRegUse =
true;
1692 bool ReArrangedImplicitOps =
true;
1700 if (NeedToAssignLiveThroughs) {
1701 while (ReArrangedImplicitOps) {
1702 ReArrangedImplicitOps =
false;
1703 findAndSortDefOperandIndexes(
MI);
1704 for (
unsigned OpIdx : DefOperandIndexes) {
1705 MachineOperand &MO =
MI.getOperand(OpIdx);
1709 ReArrangedImplicitOps = defineLiveThroughVirtReg(
MI, OpIdx,
Reg);
1711 ReArrangedImplicitOps = defineVirtReg(
MI, OpIdx,
Reg);
1715 if (ReArrangedImplicitOps)
1721 while (ReArrangedImplicitOps) {
1722 ReArrangedImplicitOps =
false;
1723 for (MachineOperand &MO :
MI.all_defs()) {
1726 ReArrangedImplicitOps =
1727 defineVirtReg(
MI,
MI.getOperandNo(&MO),
Reg);
1728 if (ReArrangedImplicitOps)
1739 for (MachineOperand &MO :
reverse(
MI.all_defs())) {
1756 "tied def assigned to clobbered register");
1771 unmarkRegUsedInInstr(
Reg);
1780 for (
const auto *RM : RegMasks)
1783 for (
const LiveReg &LR : LiveVirtRegs) {
1784 MCRegister PhysReg = LR.PhysReg;
1785 if (PhysReg && isClobberedByRegMasks(PhysReg))
1786 displacePhysReg(
MI, PhysReg);
1791 if (HasPhysRegUse) {
1792 for (MachineOperand &MO :
MI.operands()) {
1800 if (!usePhysReg(
MI,
Reg))
1808 bool HasUndefUse =
false;
1809 bool TiedOnly = HasTiedDef;
1810 bool ReArrangedImplicitMOs =
true;
1811 while (ReArrangedImplicitMOs) {
1812 ReArrangedImplicitMOs =
false;
1813 for (MachineOperand &MO :
MI.operands()) {
1818 (TiedOnly && !MO.
isTied()))
1832 ReArrangedImplicitMOs = useVirtReg(
MI, MO,
Reg);
1833 if (ReArrangedImplicitMOs)
1839 if (TiedOnly && !ReArrangedImplicitMOs) {
1841 ReArrangedImplicitMOs =
true;
1849 for (MachineOperand &MO :
MI.all_uses()) {
1854 assert(MO.
isUndef() &&
"Should only have undef virtreg uses left");
1855 allocVirtRegUndef(MO);
1861 if (HasEarlyClobber) {
1862 for (MachineOperand &MO :
reverse(
MI.all_defs())) {
1865 assert(!MO.
getSubReg() &&
"should be already handled in def processing");
1891 (
MI.getOperand(0).getReg() ==
MI.getOperand(1).getReg() ||
1892 MI.getOperand(0).isDead()) &&
1893 MI.getNumOperands() == 2) {
1899void RegAllocFastImpl::handleDebugValue(MachineInstr &
MI) {
1902 assert(
MI.isDebugValue() &&
"not a DBG_VALUE*");
1903 for (
const auto &MO :
MI.debug_operands()) {
1909 if (!shouldAllocateRegister(
Reg))
1913 int SS = StackSlotForVirtReg[
Reg];
1923 LiveRegMap::iterator LRI = findLiveVirtReg(
Reg);
1927 if (LRI != LiveVirtRegs.end() && LRI->PhysReg) {
1929 for (
auto &RegMO : DbgOps)
1930 setPhysReg(
MI, *RegMO, *LRI);
1932 DanglingDbgValues[
Reg].push_back(&
MI);
1937 LiveDbgValueMap[
Reg].append(DbgOps.begin(), DbgOps.end());
1941void RegAllocFastImpl::handleBundle(MachineInstr &
MI) {
1944 while (BundledMI->isBundledWithPred()) {
1945 for (MachineOperand &MO : BundledMI->operands()) {
1953 auto DI = BundleVirtRegsMap.
find(
Reg);
1954 assert(DI != BundleVirtRegsMap.
end() &&
"Unassigned virtual register");
1956 setPhysReg(
MI, MO, DI->second);
1963void RegAllocFastImpl::allocateBasicBlock(MachineBasicBlock &
MBB) {
1967 PosIndexes.unsetInitialized();
1968 RegUnitStates.assign(
TRI->getNumRegUnits(), regFree);
1969 assert(LiveVirtRegs.empty() &&
"Mapping not cleared from last block?");
1972 setPhysRegState(LiveReg.PhysReg, regPreAssigned);
1984 if (
MI.isDebugValue()) {
1985 handleDebugValue(
MI);
1989 allocateInstruction(
MI);
1993 if (
MI.getOpcode() == TargetOpcode::BUNDLE) {
2001 LLVM_DEBUG(
dbgs() <<
"Loading live registers at begin of block.\n");
2006 for (MachineInstr *
MI : Coalesced)
2008 NumCoalesced += Coalesced.size();
2010 for (
auto &UDBGPair : DanglingDbgValues) {
2011 for (MachineInstr *DbgValue : UDBGPair.second) {
2016 LLVM_DEBUG(
dbgs() <<
"Register did not survive for " << *DbgValue
2021 DanglingDbgValues.clear();
2029void RegAllocFastImpl::expandSubregPseudo(MachineInstr &
MI) {
2032 if (
MI.isInsertSubreg()) {
2035 const MachineOperand &BaseMO =
MI.getOperand(1);
2038 MI.getOperand(0).getReg())
2040 unsigned SubIdx =
MI.getOperand(3).getImm();
2041 MI.removeOperand(3);
2042 assert(
MI.getOperand(0).getSubReg() == 0 &&
"Unexpected subreg idx");
2043 MI.getOperand(0).setSubReg(SubIdx);
2044 MI.getOperand(0).setIsUndef(
MI.getOperand(1).isUndef());
2045 MI.removeOperand(1);
2046 MI.setDesc(
TII->get(TargetOpcode::COPY));
2059 if (
unsigned UseSubIdx =
Use.getSubReg())
2060 ReadLanes |=
TRI->getSubRegIndexLaneMask(UseSubIdx);
2062 bool DefEmitted =
false;
2063 for (
unsigned I = 1,
E =
MI.getNumOperands();
I + 1 <
E;
I += 2) {
2064 const MachineOperand &SrcMO =
MI.getOperand(
I);
2065 unsigned SubIdx =
MI.getOperand(
I + 1).getImm();
2067 (ReadLanes &
TRI->getSubRegIndexLaneMask(SubIdx)).none())
2077 MI.setDesc(
TII->get(TargetOpcode::IMPLICIT_DEF));
2078 while (
MI.getNumOperands() > 1)
2079 MI.removeOperand(
MI.getNumOperands() - 1);
2082 MI.eraseFromParent();
2086 LLVM_DEBUG(
dbgs() <<
"********** FAST REGISTER ALLOCATION **********\n"
2087 <<
"********** Function: " << MF.
getName() <<
'\n');
2095 unsigned NumRegUnits =
TRI->getNumRegUnits();
2097 UsedInInstr.
assign(NumRegUnits, 0);
2104 for (MachineBasicBlock &
MBB : MF)
2106 if (
MI.isRegSequence() ||
MI.isInsertSubreg())
2107 expandSubregPseudo(
MI);
2113 StackSlotForVirtReg.
resize(NumVirtRegs);
2114 LiveVirtRegs.setUniverse(NumVirtRegs);
2115 MayLiveAcrossBlocks.
clear();
2116 MayLiveAcrossBlocks.
resize(NumVirtRegs);
2119 for (MachineBasicBlock &
MBB : MF)
2120 allocateBasicBlock(
MBB);
2122 if (ClearVirtRegs) {
2128 StackSlotForVirtReg.
clear();
2129 LiveDbgValueMap.
clear();
2136 RegAllocFastImpl Impl(Opts.Filter, Opts.ClearVRegs);
2137 bool Changed = Impl.runOnMachineFunction(MF);
2147 bool PrintFilterName = Opts.FilterName !=
"all";
2148 bool PrintNoClearVRegs = !Opts.ClearVRegs;
2149 bool PrintSemicolon = PrintFilterName && PrintNoClearVRegs;
2151 OS <<
"regallocfast";
2152 if (PrintFilterName || PrintNoClearVRegs) {
2154 if (PrintFilterName)
2155 OS <<
"filter=" << Opts.FilterName;
2158 if (PrintNoClearVRegs)
2159 OS <<
"no-clear-vregs";
2167 bool ClearVirtRegs) {
2168 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(passName, arg, name, cfg, analysis)
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)
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)
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,...
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 runOnMachineFunction(const MachineFunction &MF, bool Rev=false)
runOnFunction - Prepare to answer questions about MF.
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()