51#define DEBUG_TYPE "regalloc"
55STATISTIC(NumCoalesced,
"Number of copies coalesced");
68class InstrPosIndexes {
70 void unsetInitialized() { IsInitialized =
false; }
72 void init(
const MachineBasicBlock &
MBB) {
74 Instr2PosIndex.
clear();
75 uint64_t LastIndex = 0;
76 for (
const MachineInstr &
MI :
MBB) {
77 LastIndex += InstrDist;
78 Instr2PosIndex[&
MI] = LastIndex;
85 bool getIndex(
const MachineInstr &
MI, uint64_t &Index) {
93 assert(
MI.getParent() == CurMBB &&
"MI is not in CurMBB");
94 auto It = Instr2PosIndex.find(&
MI);
95 if (It != Instr2PosIndex.end()) {
109 unsigned Distance = 1;
111 End = std::next(Start);
112 while (Start != CurMBB->begin() &&
113 !Instr2PosIndex.count(&*std::prev(Start))) {
117 while (End != CurMBB->end() && !Instr2PosIndex.count(&*(End))) {
125 Start == CurMBB->begin() ? 0 : Instr2PosIndex.at(&*std::prev(Start));
127 if (End == CurMBB->end())
128 Step =
static_cast<uint64_t
>(InstrDist);
131 uint64_t EndIndex = Instr2PosIndex.at(&*End);
132 assert(EndIndex > LastIndex &&
"Index must be ascending order");
133 unsigned NumAvailableIndexes = EndIndex - LastIndex - 1;
152 Step = (NumAvailableIndexes + 1) / (Distance + 1);
157 if (
LLVM_UNLIKELY(!Step || (!LastIndex && Step == InstrDist))) {
159 Index = Instr2PosIndex.at(&
MI);
163 for (
auto I = Start;
I != End; ++
I) {
165 Instr2PosIndex[&*
I] = LastIndex;
167 Index = Instr2PosIndex.at(&
MI);
172 bool IsInitialized =
false;
173 enum { InstrDist = 1024 };
174 const MachineBasicBlock *CurMBB =
nullptr;
175 DenseMap<const MachineInstr *, uint64_t> Instr2PosIndex;
178class RegAllocFastImpl {
181 bool ClearVirtRegs_ =
true)
182 : ShouldAllocateRegisterImpl(
F), StackSlotForVirtReg(-1),
183 ClearVirtRegs(ClearVirtRegs_) {}
186 MachineFrameInfo *MFI =
nullptr;
187 MachineRegisterInfo *MRI =
nullptr;
188 const TargetRegisterInfo *TRI =
nullptr;
189 const TargetInstrInfo *TII =
nullptr;
190 RegisterClassInfo RegClassInfo;
194 MachineBasicBlock *MBB =
nullptr;
197 IndexedMap<int, VirtReg2IndexFunctor> StackSlotForVirtReg;
201 MachineInstr *LastUse =
nullptr;
204 bool LiveOut =
false;
205 bool Reloaded =
false;
208 explicit LiveReg(
Register VirtReg) : VirtReg(VirtReg) {}
209 explicit LiveReg() =
default;
211 unsigned getSparseSetIndex()
const {
return VirtReg.virtRegIndex(); }
214 using LiveRegMap = SparseSet<LiveReg, unsigned, identity, uint16_t>;
217 LiveRegMap LiveVirtRegs;
220 DenseMap<Register, LiveReg> BundleVirtRegsMap;
222 DenseMap<Register, SmallVector<MachineOperand *, 2>> LiveDbgValueMap;
225 DenseMap<Register, SmallVector<MachineInstr *, 1>> DanglingDbgValues;
229 BitVector MayLiveAcrossBlocks;
251 std::vector<unsigned> RegUnitStates;
269 SmallVector<unsigned, 0> UsedInInstr;
271 SmallVector<unsigned, 8> DefOperandIndexes;
276 InstrPosIndexes PosIndexes;
278 void setRegUnitState(MCRegUnit Unit,
unsigned NewState);
279 unsigned getRegUnitState(MCRegUnit Unit)
const;
281 void setPhysRegState(MCRegister PhysReg,
unsigned NewState);
282 bool isPhysRegFree(MCRegister PhysReg)
const;
285 void markRegUsedInInstr(
MCPhysReg PhysReg) {
286 for (MCRegUnit Unit : TRI->regunits(PhysReg))
287 UsedInInstr[
static_cast<unsigned>(
Unit)] = InstrGen | 1;
291 bool isClobberedByRegMasks(MCRegister PhysReg)
const {
292 return llvm::any_of(RegMasks, [PhysReg](
const uint32_t *Mask) {
298 bool isRegUsedInInstr(MCRegister PhysReg,
bool LookAtPhysRegUses)
const {
299 if (LookAtPhysRegUses && isClobberedByRegMasks(PhysReg))
301 for (MCRegUnit Unit : TRI->regunits(PhysReg))
302 if (UsedInInstr[
static_cast<unsigned>(Unit)] >=
303 (InstrGen | !LookAtPhysRegUses))
310 void markPhysRegUsedInInstr(MCRegister PhysReg) {
311 for (MCRegUnit Unit : TRI->regunits(PhysReg)) {
312 assert(UsedInInstr[
static_cast<unsigned>(Unit)] <= InstrGen &&
313 "non-phys use before phys use?");
314 UsedInInstr[
static_cast<unsigned>(
Unit)] = InstrGen;
319 void unmarkRegUsedInInstr(MCRegister PhysReg) {
320 for (MCRegUnit Unit : TRI->regunits(PhysReg))
321 UsedInInstr[
static_cast<unsigned>(
Unit)] = 0;
328 spillImpossible = ~0
u
334 bool runOnMachineFunction(MachineFunction &MF);
337 void allocateBasicBlock(MachineBasicBlock &MBB);
342 void findAndSortDefOperandIndexes(
const MachineInstr &
MI);
344 void allocateInstruction(MachineInstr &
MI);
345 void handleDebugValue(MachineInstr &
MI);
346 void handleBundle(MachineInstr &
MI);
348 bool usePhysReg(MachineInstr &
MI, MCRegister PhysReg);
349 bool definePhysReg(MachineInstr &
MI, MCRegister PhysReg);
350 bool displacePhysReg(MachineInstr &
MI, MCRegister PhysReg);
351 void freePhysReg(MCRegister PhysReg);
353 unsigned calcSpillCost(
MCPhysReg PhysReg)
const;
363 void assignVirtToPhysReg(MachineInstr &
MI, LiveReg &, MCRegister PhysReg);
364 void allocVirtReg(MachineInstr &
MI, LiveReg &LR,
Register Hint,
365 bool LookAtPhysRegUses =
false);
366 void allocVirtRegUndef(MachineOperand &MO);
367 void assignDanglingDebugValues(MachineInstr &Def,
Register VirtReg,
369 bool defineLiveThroughVirtReg(MachineInstr &
MI,
unsigned OpNum,
371 bool defineVirtReg(MachineInstr &
MI,
unsigned OpNum,
Register VirtReg,
372 bool LookAtPhysRegUses =
false);
373 bool useVirtReg(MachineInstr &
MI, MachineOperand &MO,
Register VirtReg);
375 MCPhysReg getErrorAssignment(
const LiveReg &LR, MachineInstr &
MI,
376 const TargetRegisterClass &RC);
379 getMBBBeginInsertionPoint(MachineBasicBlock &MBB,
380 SmallSet<Register, 2> &PrologLiveIns)
const;
382 void reloadAtBegin(MachineBasicBlock &MBB);
383 bool setPhysReg(MachineInstr &
MI, MachineOperand &MO,
384 const LiveReg &Assignment);
389 bool shouldAllocateRegister(
const Register Reg)
const;
390 int getStackSpaceFor(
Register VirtReg);
399 bool mayBeSpillFromInlineAsmBr(
const MachineInstr &
MI)
const;
401 void dumpState()
const;
405 RegAllocFastImpl Impl;
411 : MachineFunctionPass(ID), Impl(
F, ClearVirtRegs_) {}
413 bool runOnMachineFunction(MachineFunction &MF)
override {
414 return Impl.runOnMachineFunction(MF);
417 StringRef getPassName()
const override {
return "Fast Register Allocator"; }
419 void getAnalysisUsage(AnalysisUsage &AU)
const override {
424 MachineFunctionProperties getRequiredProperties()
const override {
425 return MachineFunctionProperties().setNoPHIs();
428 MachineFunctionProperties getSetProperties()
const override {
429 if (Impl.ClearVirtRegs) {
430 return MachineFunctionProperties().setNoVRegs();
433 return MachineFunctionProperties();
436 MachineFunctionProperties getClearedProperties()
const override {
437 return MachineFunctionProperties().setIsSSA();
443char RegAllocFast::ID = 0;
450 if (!ShouldAllocateRegisterImpl)
453 return ShouldAllocateRegisterImpl(*
TRI, *MRI,
Reg);
456void RegAllocFastImpl::setRegUnitState(MCRegUnit Unit,
unsigned NewState) {
457 RegUnitStates[
static_cast<unsigned>(
Unit)] = NewState;
460unsigned RegAllocFastImpl::getRegUnitState(MCRegUnit Unit)
const {
461 return RegUnitStates[
static_cast<unsigned>(
Unit)];
464void RegAllocFastImpl::setPhysRegState(MCRegister PhysReg,
unsigned NewState) {
465 for (MCRegUnit Unit :
TRI->regunits(PhysReg))
466 setRegUnitState(Unit, NewState);
469bool RegAllocFastImpl::isPhysRegFree(MCRegister PhysReg)
const {
470 for (MCRegUnit Unit :
TRI->regunits(PhysReg)) {
471 if (getRegUnitState(Unit) != regFree)
479int RegAllocFastImpl::getStackSpaceFor(
Register VirtReg) {
481 int SS = StackSlotForVirtReg[VirtReg];
487 const TargetRegisterClass &RC = *MRI->
getRegClass(VirtReg);
488 unsigned Size =
TRI->getSpillSize(RC);
489 Align Alignment =
TRI->getSpillAlign(RC);
491 const MachineFunction &MF = MRI->
getMF();
493 Align CurrentAlign =
ST.getFrameLowering()->getStackAlign();
494 if (Alignment > CurrentAlign && !
TRI->canRealignStack(MF))
495 Alignment = CurrentAlign;
501 StackSlotForVirtReg[VirtReg] = FrameIdx;
508 PosIndexes.getIndex(
A, IndexA);
510 PosIndexes.getIndex(
A, IndexA);
511 return IndexA < IndexB;
518bool RegAllocFastImpl::mayBeSpillFromInlineAsmBr(
const MachineInstr &
MI)
const {
520 auto *
MBB =
MI.getParent();
523 for (
const auto &
Op :
MI.operands())
530bool RegAllocFastImpl::mayLiveOut(
Register VirtReg) {
536 const MachineInstr *SelfLoopDef =
nullptr;
543 if (DefInst.getParent() !=
MBB) {
547 if (!SelfLoopDef ||
dominates(PosIndexes, DefInst, *SelfLoopDef))
548 SelfLoopDef = &DefInst;
559 static const unsigned Limit = 8;
562 if (UseInst.getParent() !=
MBB || ++
C >= Limit) {
571 if (SelfLoopDef == &UseInst ||
572 !
dominates(PosIndexes, *SelfLoopDef, UseInst)) {
583bool RegAllocFastImpl::mayLiveIn(
Register VirtReg) {
588 static const unsigned Limit = 8;
591 if (DefInst.getParent() !=
MBB || ++
C >= Limit) {
607 int FI = getStackSpaceFor(VirtReg);
610 const TargetRegisterClass &RC = *MRI->
getRegClass(VirtReg);
619 SmallVectorImpl<MachineOperand *> &LRIDbgOperands = LiveDbgValueMap[VirtReg];
620 SmallMapVector<MachineInstr *, SmallVector<const MachineOperand *>, 2>
622 for (MachineOperand *MO : LRIDbgOperands)
623 SpilledOperandsMap[MO->getParent()].push_back(MO);
624 for (
const auto &MISpilledOperands : SpilledOperandsMap) {
625 MachineInstr &
DBG = *MISpilledOperands.first;
627 if (
DBG.isDebugValueList())
630 *
MBB, Before, *MISpilledOperands.first, FI, MISpilledOperands.second);
633 LLVM_DEBUG(
dbgs() <<
"Inserting debug info due to spill:\n" << *NewDV);
640 MachineInstr *ClonedDV =
MBB->
getParent()->CloneMachineInstr(NewDV);
642 LLVM_DEBUG(
dbgs() <<
"Cloning debug info due to live out spill\n");
648 if (
DBG.isNonListDebugValue()) {
649 MachineOperand &MO =
DBG.getDebugOperand(0);
658 LRIDbgOperands.
clear();
666 int FI = getStackSpaceFor(VirtReg);
667 const TargetRegisterClass &RC = *MRI->
getRegClass(VirtReg);
677 MachineBasicBlock &
MBB, SmallSet<Register, 2> &PrologLiveIns)
const {
686 if (!
TII->isBasicBlockPrologue(*
I) && !mayBeSpillFromInlineAsmBr(*
I))
691 for (MachineOperand &MO :
I->operands()) {
703void RegAllocFastImpl::reloadAtBegin(MachineBasicBlock &
MBB) {
704 if (LiveVirtRegs.empty())
707 for (MachineBasicBlock::RegisterMaskPair
P :
MBB.
liveins()) {
708 MCRegister
Reg =
P.PhysReg;
711 setPhysRegState(
Reg, regLiveIn);
714 SmallSet<Register, 2> PrologLiveIns;
719 getMBBBeginInsertionPoint(
MBB, PrologLiveIns);
720 for (
const LiveReg &LR : LiveVirtRegs) {
722 if (PhysReg == 0 || LR.Error)
725 MCRegUnit FirstUnit = *
TRI->regunits(PhysReg).begin();
726 if (getRegUnitState(FirstUnit) == regLiveIn)
730 "no reload in start block. Missing vreg def?");
732 if (PrologLiveIns.
count(PhysReg)) {
736 reload(
MBB.
begin(), LR.VirtReg, PhysReg);
738 reload(InsertBefore, LR.VirtReg, PhysReg);
740 LiveVirtRegs.clear();
746bool RegAllocFastImpl::usePhysReg(MachineInstr &
MI, MCRegister
Reg) {
747 assert(Register::isPhysicalRegister(
Reg) &&
"expected physreg");
748 bool displacedAny = displacePhysReg(
MI,
Reg);
749 setPhysRegState(
Reg, regPreAssigned);
750 markRegUsedInInstr(
Reg);
754bool RegAllocFastImpl::definePhysReg(MachineInstr &
MI, MCRegister
Reg) {
755 bool displacedAny = displacePhysReg(
MI,
Reg);
756 setPhysRegState(
Reg, regPreAssigned);
763bool RegAllocFastImpl::displacePhysReg(MachineInstr &
MI, MCRegister PhysReg) {
764 bool displacedAny =
false;
766 for (MCRegUnit Unit :
TRI->regunits(PhysReg)) {
767 switch (
unsigned VirtReg = getRegUnitState(Unit)) {
769 LiveRegMap::iterator LRI = findLiveVirtReg(VirtReg);
770 assert(LRI != LiveVirtRegs.end() &&
"datastructures in sync");
773 while (mayBeSpillFromInlineAsmBr(*ReloadBefore))
775 reload(ReloadBefore, VirtReg, LRI->PhysReg);
777 setPhysRegState(LRI->PhysReg, regFree);
779 LRI->Reloaded =
true;
784 setRegUnitState(Unit, regFree);
794void RegAllocFastImpl::freePhysReg(MCRegister PhysReg) {
797 MCRegUnit FirstUnit = *
TRI->regunits(PhysReg).begin();
798 switch (
unsigned VirtReg = getRegUnitState(FirstUnit)) {
804 setPhysRegState(PhysReg, regFree);
807 LiveRegMap::iterator LRI = findLiveVirtReg(VirtReg);
808 assert(LRI != LiveVirtRegs.end());
810 setPhysRegState(LRI->PhysReg, regFree);
821unsigned RegAllocFastImpl::calcSpillCost(
MCPhysReg PhysReg)
const {
822 for (MCRegUnit Unit :
TRI->regunits(PhysReg)) {
823 switch (
unsigned VirtReg = getRegUnitState(Unit)) {
829 return spillImpossible;
831 bool SureSpill = StackSlotForVirtReg[VirtReg] != -1 ||
832 findLiveVirtReg(VirtReg)->LiveOut;
833 return SureSpill ? spillClean : spillDirty;
840void RegAllocFastImpl::assignDanglingDebugValues(MachineInstr &Definition,
843 auto UDBGValIter = DanglingDbgValues.
find(VirtReg);
844 if (UDBGValIter == DanglingDbgValues.
end())
847 SmallVectorImpl<MachineInstr *> &Dangling = UDBGValIter->second;
848 for (MachineInstr *DbgValue : Dangling) {
849 assert(DbgValue->isDebugValue());
850 if (!DbgValue->hasDebugOperandForReg(VirtReg))
857 E = DbgValue->getIterator();
859 if (
I->modifiesRegister(
Reg,
TRI) || --Limit == 0) {
866 for (MachineOperand &MO : DbgValue->getDebugOperandsForReg(VirtReg)) {
878void RegAllocFastImpl::assignVirtToPhysReg(MachineInstr &AtMI, LiveReg &LR,
879 MCRegister PhysReg) {
883 assert(LR.PhysReg == 0 &&
"Already assigned a physreg");
884 assert(PhysReg != 0 &&
"Trying to assign no register");
885 LR.PhysReg = PhysReg;
886 setPhysRegState(PhysReg, VirtReg.
id());
888 assignDanglingDebugValues(AtMI, VirtReg, PhysReg);
894 static const unsigned ChainLengthLimit = 3;
905 }
while (++
C <= ChainLengthLimit);
913 static const unsigned DefLimit = 3;
918 Reg = traceCopyChain(
Reg);
930void RegAllocFastImpl::allocVirtReg(MachineInstr &
MI, LiveReg &LR,
931 Register Hint0,
bool LookAtPhysRegUses) {
932 const Register VirtReg = LR.VirtReg;
935 const TargetRegisterClass &RC = *MRI->
getRegClass(VirtReg);
937 <<
" in class " <<
TRI->getRegClassName(&RC)
942 !isRegUsedInInstr(Hint0, LookAtPhysRegUses)) {
944 if (isPhysRegFree(Hint0)) {
947 assignVirtToPhysReg(
MI, LR, Hint0);
958 Register Hint1 = traceCopies(VirtReg);
960 !isRegUsedInInstr(Hint1, LookAtPhysRegUses)) {
962 if (isPhysRegFree(Hint1)) {
965 assignVirtToPhysReg(
MI, LR, Hint1);
976 unsigned BestCost = spillImpossible;
978 for (
MCPhysReg PhysReg : AllocationOrder) {
980 if (isRegUsedInInstr(PhysReg, LookAtPhysRegUses)) {
985 unsigned Cost = calcSpillCost(PhysReg);
989 assignVirtToPhysReg(
MI, LR, PhysReg);
993 if (PhysReg == Hint0 || PhysReg == Hint1)
994 Cost -= spillPrefBonus;
996 if (
Cost < BestCost) {
1005 LR.PhysReg = getErrorAssignment(LR,
MI, RC);
1010 displacePhysReg(
MI, BestReg);
1011 assignVirtToPhysReg(
MI, LR, BestReg);
1014void RegAllocFastImpl::allocVirtRegUndef(MachineOperand &MO) {
1018 if (!shouldAllocateRegister(VirtReg))
1021 LiveRegMap::iterator LRI = findLiveVirtReg(VirtReg);
1023 bool IsRenamable =
true;
1024 if (LRI != LiveVirtRegs.end() && LRI->PhysReg) {
1025 PhysReg = LRI->PhysReg;
1027 const TargetRegisterClass &RC = *MRI->
getRegClass(VirtReg);
1029 if (AllocationOrder.
empty()) {
1035 PhysReg = getErrorAssignment(*LRI, *MO.
getParent(), RC);
1037 IsRenamable =
false;
1039 PhysReg = AllocationOrder.
front();
1043 if (SubRegIdx != 0) {
1044 PhysReg =
TRI->getSubReg(PhysReg, SubRegIdx);
1054bool RegAllocFastImpl::defineLiveThroughVirtReg(MachineInstr &
MI,
1057 if (!shouldAllocateRegister(VirtReg))
1059 LiveRegMap::iterator LRI = findLiveVirtReg(VirtReg);
1060 if (LRI != LiveVirtRegs.end()) {
1062 if (PrevReg != 0 && isRegUsedInInstr(PrevReg,
true)) {
1064 <<
" (tied/earlyclobber resolution)\n");
1065 freePhysReg(PrevReg);
1067 allocVirtReg(
MI, *LRI, 0,
true);
1073 TII->get(TargetOpcode::COPY), PrevReg)
1076 MachineOperand &MO =
MI.getOperand(OpNum);
1081 return defineVirtReg(
MI, OpNum, VirtReg,
true);
1091bool RegAllocFastImpl::defineVirtReg(MachineInstr &
MI,
unsigned OpNum,
1092 Register VirtReg,
bool LookAtPhysRegUses) {
1094 if (!shouldAllocateRegister(VirtReg))
1096 MachineOperand &MO =
MI.getOperand(OpNum);
1097 LiveRegMap::iterator LRI;
1099 std::tie(LRI, New) = LiveVirtRegs.insert(LiveReg(VirtReg));
1102 if (mayLiveOut(VirtReg)) {
1103 LRI->LiveOut =
true;
1110 if (LRI->PhysReg == 0) {
1111 allocVirtReg(
MI, *LRI, 0, LookAtPhysRegUses);
1113 assert((!isRegUsedInInstr(LRI->PhysReg, LookAtPhysRegUses) || LRI->Error) &&
1114 "TODO: preassign mismatch");
1116 <<
" use existing assignment to "
1121 if (LRI->Reloaded || LRI->LiveOut) {
1122 if (!
MI.isImplicitDef()) {
1126 <<
" RL: " << LRI->Reloaded <<
'\n');
1127 bool Kill = LRI->LastUse ==
nullptr;
1128 spill(SpillBefore, VirtReg, PhysReg,
Kill, LRI->LiveOut);
1132 if (
MI.getOpcode() == TargetOpcode::INLINEASM_BR) {
1133 int FI = StackSlotForVirtReg[VirtReg];
1134 const TargetRegisterClass &RC = *MRI->
getRegClass(VirtReg);
1135 for (MachineOperand &MO :
MI.operands()) {
1137 MachineBasicBlock *Succ = MO.
getMBB();
1146 LRI->LastUse =
nullptr;
1148 LRI->LiveOut =
false;
1149 LRI->Reloaded =
false;
1151 if (
MI.getOpcode() == TargetOpcode::BUNDLE) {
1152 BundleVirtRegsMap[VirtReg] = *LRI;
1154 markRegUsedInInstr(PhysReg);
1155 return setPhysReg(
MI, MO, *LRI);
1160bool RegAllocFastImpl::useVirtReg(MachineInstr &
MI, MachineOperand &MO,
1163 if (!shouldAllocateRegister(VirtReg))
1165 LiveRegMap::iterator LRI;
1167 std::tie(LRI, New) = LiveVirtRegs.insert(LiveReg(VirtReg));
1170 if (mayLiveOut(VirtReg)) {
1171 LRI->LiveOut =
true;
1178 assert((!MO.
isKill() || LRI->LastUse == &
MI) &&
"Invalid kill flag");
1182 if (LRI->PhysReg == 0) {
1185 if (
MI.isCopy() &&
MI.getOperand(1).getSubReg() == 0) {
1186 Hint =
MI.getOperand(0).getReg();
1187 if (
Hint.isVirtual()) {
1188 assert(!shouldAllocateRegister(Hint));
1192 "Copy destination should already be assigned");
1195 allocVirtReg(
MI, *LRI, Hint,
false);
1200 if (
MI.getOpcode() == TargetOpcode::BUNDLE) {
1201 BundleVirtRegsMap[VirtReg] = *LRI;
1203 markRegUsedInInstr(LRI->PhysReg);
1204 return setPhysReg(
MI, MO, *LRI);
1210MCPhysReg RegAllocFastImpl::getErrorAssignment(
const LiveReg &LR,
1212 const TargetRegisterClass &RC) {
1213 MachineFunction &MF = *
MI.getMF();
1224 if (AllocationOrder.
empty()) {
1228 "no registers from class available to allocate", Fn,
1233 assert(!RawRegs.
empty() &&
"register classes cannot have no registers");
1234 return RawRegs.
front();
1237 if (!LR.Error && EmitError) {
1240 if (
MI.isInlineAsm()) {
1241 MI.emitInlineAsmError(
1242 "inline assembly requires more registers than available");
1246 "ran out of registers during register allocation", Fn,
1251 return AllocationOrder.
front();
1256bool RegAllocFastImpl::setPhysReg(MachineInstr &
MI, MachineOperand &MO,
1257 const LiveReg &Assignment) {
1259 assert(PhysReg &&
"assignments should always be to a valid physreg");
1287 MI.addRegisterKilled(PhysReg,
TRI,
true);
1296 MI.addRegisterDead(PhysReg,
TRI,
true);
1298 MI.addRegisterDefined(PhysReg,
TRI);
1307void RegAllocFastImpl::dumpState()
const {
1308 for (MCRegUnit Unit :
TRI->regunits()) {
1309 switch (
unsigned VirtReg = getRegUnitState(Unit)) {
1312 case regPreAssigned:
1319 LiveRegMap::const_iterator
I = findLiveVirtReg(VirtReg);
1320 assert(
I != LiveVirtRegs.end() &&
"have LiveVirtRegs entry");
1321 if (
I->LiveOut ||
I->Reloaded) {
1329 assert(
TRI->hasRegUnit(
I->PhysReg, Unit) &&
"inverse mapping present");
1336 for (
const LiveReg &LR : LiveVirtRegs) {
1341 assert(Register::isPhysicalRegister(PhysReg) &&
"mapped to physreg");
1342 for (MCRegUnit Unit :
TRI->regunits(PhysReg)) {
1343 assert(getRegUnitState(Unit) == VirtReg &&
"inverse map valid");
1351void RegAllocFastImpl::addRegClassDefCounts(
1353 assert(RegClassDefCounts.
size() ==
TRI->getNumRegClasses());
1356 if (!shouldAllocateRegister(
Reg))
1359 for (
unsigned RCIdx = 0, RCIdxEnd =
TRI->getNumRegClasses();
1360 RCIdx != RCIdxEnd; ++RCIdx) {
1361 const TargetRegisterClass *IdxRC =
TRI->getRegClass(RCIdx);
1364 ++RegClassDefCounts[RCIdx];
1370 for (
unsigned RCIdx = 0, RCIdxEnd =
TRI->getNumRegClasses();
1371 RCIdx != RCIdxEnd; ++RCIdx) {
1372 const TargetRegisterClass *IdxRC =
TRI->getRegClass(RCIdx);
1373 for (MCRegAliasIterator Alias(
Reg,
TRI,
true); Alias.isValid(); ++Alias) {
1375 ++RegClassDefCounts[RCIdx];
1385void RegAllocFastImpl::findAndSortDefOperandIndexes(
const MachineInstr &
MI) {
1386 DefOperandIndexes.
clear();
1389 for (
unsigned I = 0,
E =
MI.getNumOperands();
I <
E; ++
I) {
1390 const MachineOperand &MO =
MI.getOperand(
I);
1397 markPhysRegUsedInInstr(
Reg);
1407 if (DefOperandIndexes.
size() <= 1)
1415 SmallVector<unsigned> RegClassDefCounts(
TRI->getNumRegClasses(), 0);
1417 for (
const MachineOperand &MO :
MI.all_defs())
1418 addRegClassDefCounts(RegClassDefCounts, MO.
getReg());
1420 llvm::sort(DefOperandIndexes, [&](
unsigned I0,
unsigned I1) {
1421 const MachineOperand &MO0 =
MI.getOperand(I0);
1422 const MachineOperand &MO1 =
MI.getOperand(I1);
1425 const TargetRegisterClass &RC0 = *MRI->
getRegClass(Reg0);
1426 const TargetRegisterClass &RC1 = *MRI->
getRegClass(Reg1);
1430 unsigned ClassSize0 = RegClassInfo.
getOrder(&RC0).size();
1431 unsigned ClassSize1 = RegClassInfo.
getOrder(&RC1).size();
1433 bool SmallClass0 = ClassSize0 < RegClassDefCounts[RC0.
getID()];
1434 bool SmallClass1 = ClassSize1 < RegClassDefCounts[RC1.
getID()];
1435 if (SmallClass0 > SmallClass1)
1437 if (SmallClass0 < SmallClass1)
1445 if (Livethrough0 > Livethrough1)
1447 if (Livethrough0 < Livethrough1)
1461 unsigned TiedIdx =
MI.findTiedOperandIdx(
MI.getOperandNo(&MO));
1466void RegAllocFastImpl::allocateInstruction(MachineInstr &
MI) {
1486 BundleVirtRegsMap.
clear();
1489 bool HasPhysRegUse =
false;
1490 bool HasRegMask =
false;
1491 bool HasVRegDef =
false;
1492 bool HasDef =
false;
1493 bool HasEarlyClobber =
false;
1494 bool NeedToAssignLiveThroughs =
false;
1495 for (MachineOperand &MO :
MI.operands()) {
1499 if (!shouldAllocateRegister(
Reg))
1505 HasEarlyClobber =
true;
1506 NeedToAssignLiveThroughs =
true;
1509 NeedToAssignLiveThroughs =
true;
1515 bool displacedAny = definePhysReg(
MI,
Reg);
1517 HasEarlyClobber =
true;
1522 HasPhysRegUse =
true;
1536 bool ReArrangedImplicitOps =
true;
1544 if (NeedToAssignLiveThroughs) {
1545 while (ReArrangedImplicitOps) {
1546 ReArrangedImplicitOps =
false;
1547 findAndSortDefOperandIndexes(
MI);
1548 for (
unsigned OpIdx : DefOperandIndexes) {
1549 MachineOperand &MO =
MI.getOperand(
OpIdx);
1554 ReArrangedImplicitOps = defineLiveThroughVirtReg(
MI,
OpIdx,
Reg);
1556 ReArrangedImplicitOps = defineVirtReg(
MI,
OpIdx,
Reg);
1560 if (ReArrangedImplicitOps)
1566 while (ReArrangedImplicitOps) {
1567 ReArrangedImplicitOps =
false;
1568 for (MachineOperand &MO :
MI.all_defs()) {
1571 ReArrangedImplicitOps =
1572 defineVirtReg(
MI,
MI.getOperandNo(&MO),
Reg);
1573 if (ReArrangedImplicitOps)
1584 for (MachineOperand &MO :
reverse(
MI.all_defs())) {
1595 "tied def assigned to clobbered register");
1610 unmarkRegUsedInInstr(
Reg);
1618 for (
const auto *RM : RegMasks)
1622 for (
const LiveReg &LR : LiveVirtRegs) {
1624 if (PhysReg != 0 && isClobberedByRegMasks(PhysReg))
1625 displacePhysReg(
MI, PhysReg);
1630 if (HasPhysRegUse) {
1631 for (MachineOperand &MO :
MI.operands()) {
1639 if (!usePhysReg(
MI,
Reg))
1647 bool HasUndefUse =
false;
1648 bool ReArrangedImplicitMOs =
true;
1649 while (ReArrangedImplicitMOs) {
1650 ReArrangedImplicitMOs =
false;
1651 for (MachineOperand &MO :
MI.operands()) {
1669 ReArrangedImplicitMOs = useVirtReg(
MI, MO,
Reg);
1670 if (ReArrangedImplicitMOs)
1679 for (MachineOperand &MO :
MI.all_uses()) {
1684 assert(MO.
isUndef() &&
"Should only have undef virtreg uses left");
1685 allocVirtRegUndef(MO);
1690 if (HasEarlyClobber) {
1691 for (MachineOperand &MO :
reverse(
MI.all_defs())) {
1694 assert(!MO.
getSubReg() &&
"should be already handled in def processing");
1720 (
MI.getOperand(0).getReg() ==
MI.getOperand(1).getReg() ||
1721 MI.getOperand(0).isDead()) &&
1722 MI.getNumOperands() == 2) {
1728void RegAllocFastImpl::handleDebugValue(MachineInstr &
MI) {
1731 assert(
MI.isDebugValue() &&
"not a DBG_VALUE*");
1732 for (
const auto &MO :
MI.debug_operands()) {
1738 if (!shouldAllocateRegister(
Reg))
1742 int SS = StackSlotForVirtReg[
Reg];
1752 LiveRegMap::iterator LRI = findLiveVirtReg(
Reg);
1756 if (LRI != LiveVirtRegs.end() && LRI->PhysReg) {
1758 for (
auto &RegMO : DbgOps)
1759 setPhysReg(
MI, *RegMO, *LRI);
1761 DanglingDbgValues[
Reg].push_back(&
MI);
1766 LiveDbgValueMap[
Reg].append(DbgOps.begin(), DbgOps.end());
1770void RegAllocFastImpl::handleBundle(MachineInstr &
MI) {
1773 while (BundledMI->isBundledWithPred()) {
1774 for (MachineOperand &MO : BundledMI->operands()) {
1782 auto DI = BundleVirtRegsMap.
find(
Reg);
1783 assert(DI != BundleVirtRegsMap.
end() &&
"Unassigned virtual register");
1785 setPhysReg(
MI, MO, DI->second);
1792void RegAllocFastImpl::allocateBasicBlock(MachineBasicBlock &
MBB) {
1796 PosIndexes.unsetInitialized();
1797 RegUnitStates.assign(
TRI->getNumRegUnits(), regFree);
1798 assert(LiveVirtRegs.empty() &&
"Mapping not cleared from last block?");
1801 setPhysRegState(LiveReg.PhysReg, regPreAssigned);
1811 if (
MI.isDebugValue()) {
1812 handleDebugValue(
MI);
1816 allocateInstruction(
MI);
1820 if (
MI.getOpcode() == TargetOpcode::BUNDLE) {
1828 LLVM_DEBUG(
dbgs() <<
"Loading live registers at begin of block.\n");
1833 for (MachineInstr *
MI : Coalesced)
1835 NumCoalesced += Coalesced.size();
1837 for (
auto &UDBGPair : DanglingDbgValues) {
1838 for (MachineInstr *DbgValue : UDBGPair.second) {
1843 LLVM_DEBUG(
dbgs() <<
"Register did not survive for " << *DbgValue
1848 DanglingDbgValues.clear();
1853bool RegAllocFastImpl::runOnMachineFunction(MachineFunction &MF) {
1854 LLVM_DEBUG(
dbgs() <<
"********** FAST REGISTER ALLOCATION **********\n"
1855 <<
"********** Function: " << MF.
getName() <<
'\n');
1863 unsigned NumRegUnits =
TRI->getNumRegUnits();
1865 UsedInInstr.
assign(NumRegUnits, 0);
1870 StackSlotForVirtReg.
resize(NumVirtRegs);
1871 LiveVirtRegs.setUniverse(NumVirtRegs);
1872 MayLiveAcrossBlocks.
clear();
1873 MayLiveAcrossBlocks.
resize(NumVirtRegs);
1876 for (MachineBasicBlock &
MBB : MF)
1877 allocateBasicBlock(
MBB);
1879 if (ClearVirtRegs) {
1885 StackSlotForVirtReg.
clear();
1886 LiveDbgValueMap.
clear();
1893 RegAllocFastImpl Impl(Opts.Filter, Opts.ClearVRegs);
1894 bool Changed = Impl.runOnMachineFunction(MF);
1904 bool PrintFilterName = Opts.FilterName !=
"all";
1905 bool PrintNoClearVRegs = !Opts.ClearVRegs;
1906 bool PrintSemicolon = PrintFilterName && PrintNoClearVRegs;
1908 OS <<
"regallocfast";
1909 if (PrintFilterName || PrintNoClearVRegs) {
1911 if (PrintFilterName)
1912 OS <<
"filter=" << Opts.FilterName;
1915 if (PrintNoClearVRegs)
1916 OS <<
"no-clear-vregs";
1924 bool ClearVirtRegs) {
1925 return new RegAllocFast(Ftor, ClearVirtRegs);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
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
MachineInstr unsigned OpIdx
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
static bool isCoalescable(const MachineInstr &MI)
static cl::opt< bool > IgnoreMissingDefs("rafast-ignore-missing-defs", cl::Hidden)
static bool dominates(InstrPosIndexes &PosIndexes, const MachineInstr &A, const MachineInstr &B)
static bool isTiedToNotUndef(const MachineOperand &MO)
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.
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
const MachineOperand & getOperand(unsigned i) 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
bool isReserved(MCRegister PhysReg) const
isReserved - Returns true when PhysReg is a reserved 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
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.
LLVM_ABI MachineInstr * getUniqueVRegDef(Register Reg) const
getUniqueVRegDef - Return the unique machine instr that defines the specified virtual register or nul...
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.
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.
ArrayRef< MCPhysReg > getRegisters() const
unsigned getID() const
Return the register class ID number.
bool contains(Register Reg) const
Return true if the specified register is included in this register class.
bool hasSubClassEq(const TargetRegisterClass *RC) const
Returns true if RC is a sub-class of or equal to this class.
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.
self_iterator getIterator()
This class implements an extremely fast bulk output stream that can only output to a stream.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
@ C
The default llvm calling convention, compatible with C.
initializer< Ty > init(const Ty &Val)
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.
LLVM_ABI void updateDbgValueForSpill(MachineInstr &Orig, int FrameIndex, Register Reg)
Update a DBG_VALUE whose value has been spilled to FrameIndex.
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)
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.