15 #define DEBUG_TYPE "regalloc"
41 STATISTIC(NumSpilledRanges,
"Number of spilled live ranges");
42 STATISTIC(NumSnippets,
"Number of spilled snippets");
43 STATISTIC(NumSpills,
"Number of spills inserted");
44 STATISTIC(NumSpillsRemoved,
"Number of spills removed");
45 STATISTIC(NumReloads,
"Number of reloads inserted");
46 STATISTIC(NumReloadsRemoved,
"Number of reloads removed");
47 STATISTIC(NumFolded,
"Number of folded stack accesses");
48 STATISTIC(NumFoldedLoads,
"Number of folded loads");
49 STATISTIC(NumRemats,
"Number of rematerialized defs for spilling");
50 STATISTIC(NumOmitReloadSpill,
"Number of omitted spills of reloads");
51 STATISTIC(NumHoists,
"Number of hoisted spills");
54 cl::desc(
"Disable inline spill hoisting"));
57 class InlineSpiller :
public Spiller {
92 bool AllDefsAreReloads;
122 : AllDefsAreReloads(
true), DefByOrigPHI(
false), KillsSource(
false),
123 SpillReg(Reg), SpillVNI(VNI), SpillMBB(0), DefMI(0) {}
126 bool hasDef()
const {
return DefByOrigPHI || DefMI; }
132 SibValueMap SibValues;
150 MFI(*mf.getFrameInfo()),
151 MRI(mf.getRegInfo()),
152 TII(*mf.getTarget().getInstrInfo()),
153 TRI(*mf.getTarget().getRegisterInfo()),
160 void collectRegsToSpill();
162 bool isRegToSpill(
unsigned Reg) {
163 return std::find(RegsToSpill.begin(),
164 RegsToSpill.end(),
Reg) != RegsToSpill.end();
167 bool isSibling(
unsigned Reg);
169 void propagateSiblingValue(SibValueMap::iterator,
VNInfo *VNI = 0);
170 void analyzeSiblingValues();
177 void reMaterializeAll();
180 bool foldMemoryOperand(
ArrayRef<std::pair<MachineInstr*, unsigned> >,
185 void spillAroundUses(
unsigned Reg);
194 return new InlineSpiller(pass, mf, vrm);
225 bool InlineSpiller::isSnippet(
const LiveInterval &SnipLI) {
226 unsigned Reg = Edit->getReg();
235 if (SnipLI.
getNumValNums() > 2 || !LIS.intervalIsInOneMBB(SnipLI))
242 RI =
MRI.reg_nodbg_begin(SnipLI.
reg);
259 if (UseMI && MI != UseMI)
268 void InlineSpiller::collectRegsToSpill() {
269 unsigned Reg = Edit->getReg();
272 RegsToSpill.assign(1, Reg);
273 SnippetCopies.clear();
283 if (!isSibling(SnipReg))
286 if (!isSnippet(SnipLI))
288 SnippetCopies.insert(MI);
289 if (isRegToSpill(SnipReg))
291 RegsToSpill.push_back(SnipReg);
292 DEBUG(
dbgs() <<
"\talso spill snippet " << SnipLI <<
'\n');
310 bool InlineSpiller::isSibling(
unsigned Reg) {
312 VRM.getOriginal(Reg) == Original;
317 const InlineSpiller::SibValueInfo &SVI) {
318 OS <<
"spill " <<
PrintReg(SVI.SpillReg) <<
':'
319 << SVI.SpillVNI->id <<
'@' << SVI.SpillVNI->def;
321 OS <<
" in BB#" << SVI.SpillMBB->getNumber();
322 if (SVI.AllDefsAreReloads)
323 OS <<
" all-reloads";
324 if (SVI.DefByOrigPHI)
329 for (
unsigned i = 0, e = SVI.Deps.size(); i != e; ++i)
330 OS <<
' ' << SVI.Deps[i]->id <<
'@' << SVI.Deps[i]->def;
333 OS <<
" def: " << *SVI.DefMI;
345 void InlineSpiller::propagateSiblingValue(SibValueMap::iterator SVIIter,
347 SibValueMap::value_type *SVI = &*SVIIter;
353 SVI->second.Deps.push_back(VNI);
357 if (!SVI->second.hasDef())
369 SibValueInfo &SV = SVI->second;
371 SV.SpillMBB = LIS.getMBBFromIndex(SV.SpillVNI->def);
374 << SVI->first->id <<
'@' << SVI->first->def <<
":\t" << SV);
376 assert(SV.hasDef() &&
"Propagating undefined value");
381 unsigned SpillDepth = ~0u;
384 DepE = Deps->
end(); DepI != DepE; ++DepI) {
385 SibValueMap::iterator DepSVI = SibValues.find(*DepI);
386 assert(DepSVI != SibValues.end() &&
"Dependent value not in SibValues");
387 SibValueInfo &DepSV = DepSVI->second;
389 DepSV.SpillMBB = LIS.getMBBFromIndex(DepSV.SpillVNI->def);
391 bool Changed =
false;
394 if (!DepSV.hasDef()) {
396 DepSV.DefMI = SV.DefMI;
397 DepSV.DefByOrigPHI = SV.DefByOrigPHI;
402 if (!SV.AllDefsAreReloads && DepSV.AllDefsAreReloads) {
404 DepSV.AllDefsAreReloads =
false;
408 if (PropSpill && SV.SpillVNI != DepSV.SpillVNI) {
409 if (SV.SpillMBB == DepSV.SpillMBB) {
411 if (DepSV.KillsSource && SV.SpillVNI->def < DepSV.SpillVNI->def) {
429 DepSV.SpillReg = SV.SpillReg;
430 DepSV.SpillVNI = SV.SpillVNI;
431 DepSV.SpillMBB = SV.SpillMBB;
435 if (SpillDepth == ~0u)
436 SpillDepth =
Loops.getLoopDepth(SV.SpillMBB);
441 if ((
Loops.getLoopDepth(DepSV.SpillMBB) > SpillDepth) &&
442 (!DepSVI->first->isPHIDef() ||
443 MDT.dominates(SV.SpillMBB, DepSV.SpillMBB))) {
445 DepSV.SpillReg = SV.SpillReg;
446 DepSV.SpillVNI = SV.SpillVNI;
447 DepSV.SpillMBB = SV.SpillMBB;
456 WorkList.
insert(&*DepSVI);
458 DEBUG(
dbgs() <<
" update " << DepSVI->first->id <<
'@'
459 << DepSVI->first->def <<
" to:\t" << DepSV);
461 }
while (!WorkList.
empty());
477 SibValueMap::iterator SVI;
480 SibValues.insert(std::make_pair(UseVNI, SibValueInfo(UseReg, UseVNI)));
483 << UseVNI->
id <<
'@' << UseVNI->
def <<
' ' << SVI->second);
484 return SVI->second.DefMI;
488 << UseVNI->
id <<
'@' << UseVNI->
def <<
'\n');
493 WorkList.
push_back(std::make_pair(UseReg, UseVNI));
503 SVI = SibValues.find(VNI);
504 assert(SVI != SibValues.end() &&
"Missing SibValues entry");
509 if (VNI->
def == OrigVNI->
def) {
511 SVI->second.DefByOrigPHI =
true;
512 SVI->second.AllDefsAreReloads =
false;
513 propagateSiblingValue(SVI);
545 <<
" phi-defs, and " << NonPHIs.
size()
546 <<
" non-phi/orig defs\n");
550 for (
unsigned i = 0, e = PHIs.
size(); i != e; ++i)
551 SibValues.insert(std::make_pair(PHIs[i], SibValueInfo(Reg, PHIs[i])));
554 for (
unsigned i = 0, e = NonPHIs.
size(); i != e; ++i) {
555 VNInfo *NonPHI = NonPHIs[i];
558 SibValues.insert(std::make_pair(NonPHI, SibValueInfo(Reg, NonPHI)));
560 for (
unsigned pi = 0, pe = PHIs.
size(); pi != pe; ++pi)
561 SVI->second.Deps.push_back(PHIs[pi]);
564 WorkList.
push_back(std::make_pair(Reg, NonPHI));
567 propagateSiblingValue(SVI);
575 assert(MI &&
"Missing def");
579 if (isSibling(SrcReg)) {
582 assert(SrcQ.
valueIn() &&
"Copy from non-existing value");
584 SVI->second.KillsSource = SrcQ.
isKill();
587 << SrcVNI->
id <<
'@' << SrcVNI->
def
588 <<
" kill=" <<
unsigned(SVI->second.KillsSource) <<
'\n');
590 tie(SVI, Inserted) = SibValues.insert(std::make_pair(SrcVNI,
591 SibValueInfo(SrcReg, SrcVNI)));
594 WorkList.
push_back(std::make_pair(SrcReg, SrcVNI));
595 propagateSiblingValue(SVI, VNI);
602 SVI->second.DefMI =
MI;
607 propagateSiblingValue(SVI);
614 SVI->second.AllDefsAreReloads =
false;
615 propagateSiblingValue(SVI);
616 }
while (!WorkList.
empty());
620 SVI = SibValues.find(UseVNI);
621 assert(SVI != SibValues.end() &&
"Didn't compute requested info");
622 DEBUG(
dbgs() <<
" traced to:\t" << SVI->second);
623 return SVI->second.DefMI;
630 void InlineSpiller::analyzeSiblingValues() {
634 if (Edit->getReg() == Original)
638 for (
unsigned i = 0, e = RegsToSpill.size(); i != e; ++i) {
639 unsigned Reg = RegsToSpill[i];
642 VE = LI.
vni_end(); VI != VE; ++VI) {
648 DefMI = LIS.getInstructionFromIndex(VNI->
def);
649 assert(DefMI &&
"No defining instruction");
654 assert(OrigVNI &&
"Def outside original live range");
655 if (OrigVNI->
def != VNI->
def)
656 DefMI = traceSiblingValue(Reg, VNI, OrigVNI);
658 if (DefMI && Edit->checkRematerializable(VNI, DefMI, AA)) {
660 << VNI->
def <<
" may remat from " << *DefMI);
669 SlotIndex Idx = LIS.getInstructionIndex(CopyMI);
671 assert(VNI && VNI->
def == Idx.
getRegSlot() &&
"Not defined by copy");
672 SibValueMap::iterator
I = SibValues.find(VNI);
673 if (I == SibValues.end())
676 const SibValueInfo &SVI = I->second;
679 if (!SVI.AllDefsAreReloads && SVI.SpillVNI == VNI)
683 if (!LIS.hasInterval(SVI.SpillReg)) {
699 assert(StackInt &&
"No stack slot assigned yet.");
702 StackInt->MergeValueInAsValue(OrigLI, OrigVNI, StackInt->getValNumInfo(0));
703 DEBUG(
dbgs() <<
"\tmerged orig valno " << OrigVNI->
id <<
": "
704 << *StackInt <<
'\n');
707 if (SVI.AllDefsAreReloads) {
708 DEBUG(
dbgs() <<
"\tno spill needed: " << SVI);
709 ++NumOmitReloadSpill;
714 eliminateRedundantSpills(SibLI, SVI.SpillVNI);
718 if (SVI.SpillVNI->isPHIDef())
721 MachineInstr *DefMI = LIS.getInstructionFromIndex(SVI.SpillVNI->def);
722 assert(DefMI &&
"Defining instruction disappeared");
730 LIS.InsertMachineInstrInMaps(MII);
731 DEBUG(
dbgs() <<
"\thoisted: " << SVI.SpillVNI->def <<
'\t' << *MII);
741 assert(VNI &&
"Missing value");
743 WorkList.
push_back(std::make_pair(&SLI, VNI));
744 assert(StackInt &&
"No stack slot assigned yet.");
749 unsigned Reg = LI->
reg;
750 DEBUG(
dbgs() <<
"Checking redundant spills for "
751 << VNI->
id <<
'@' << VNI->
def <<
" in " << *LI <<
'\n');
754 if (isRegToSpill(Reg))
758 StackInt->MergeValueInAsValue(*LI, VNI, StackInt->getValNumInfo(0));
759 DEBUG(
dbgs() <<
"Merged to stack int: " << *StackInt <<
'\n');
766 SlotIndex Idx = LIS.getInstructionIndex(MI);
772 if (isSibling(DstReg)) {
775 assert(DstVNI &&
"Missing defined value");
776 assert(DstVNI->
def == Idx.
getRegSlot() &&
"Wrong copy def slot");
777 WorkList.
push_back(std::make_pair(&DstLI, DstVNI));
785 DEBUG(
dbgs() <<
"Redundant spill " << Idx <<
'\t' << *MI);
788 DeadDefs.push_back(MI);
793 }
while (!WorkList.
empty());
805 WorkList.
push_back(std::make_pair(LI, VNI));
808 if (!UsedValues.insert(VNI))
814 PE = MBB->
pred_end(); PI != PE; ++PI) {
817 WorkList.
push_back(std::make_pair(LI, PVNI));
824 if (!SnippetCopies.count(MI))
827 assert(isRegToSpill(SnipLI.
reg) &&
"Unexpected register in copy");
829 assert(SnipVNI &&
"Snippet undefined before copy");
830 WorkList.
push_back(std::make_pair(&SnipLI, SnipVNI));
831 }
while (!WorkList.
empty());
835 bool InlineSpiller::reMaterializeFor(
LiveInterval &VirtReg,
841 DEBUG(
dbgs() <<
"\tadding <undef> flags: ");
842 for (
unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
851 if (SnippetCopies.count(MI))
856 SibValueMap::const_iterator SibI = SibValues.find(ParentVNI);
857 if (SibI != SibValues.end())
858 RM.OrigMI = SibI->second.DefMI;
859 if (!Edit->canRematerializeAt(
RM, UseIdx,
false)) {
860 markValueUsed(&VirtReg, ParentVNI);
861 DEBUG(
dbgs() <<
"\tcannot remat for " << UseIdx <<
'\t' << *MI);
868 MIBundleOperands::VirtRegInfo RI =
871 markValueUsed(&VirtReg, ParentVNI);
872 DEBUG(
dbgs() <<
"\tcannot remat tied reg: " << UseIdx <<
'\t' << *MI);
878 if (
RM.OrigMI->canFoldAsLoad() &&
879 foldMemoryOperand(Ops,
RM.OrigMI)) {
880 Edit->markRematerialized(
RM.ParentVNI);
886 unsigned NewVReg = Edit->createFrom(Original);
889 SlotIndex DefIdx = Edit->rematerializeAt(*MI->getParent(),
MI, NewVReg,
RM,
892 DEBUG(
dbgs() <<
"\tremat: " << DefIdx <<
'\t'
893 << *LIS.getInstructionFromIndex(DefIdx));
896 for (
unsigned i = 0, e = Ops.
size(); i != e; ++i) {
903 DEBUG(
dbgs() <<
"\t " << UseIdx <<
'\t' << *MI <<
'\n');
911 void InlineSpiller::reMaterializeAll() {
913 if (!Edit->anyRematerializable(AA))
919 bool anyRemat =
false;
920 for (
unsigned i = 0, e = RegsToSpill.size(); i != e; ++i) {
921 unsigned Reg = RegsToSpill[i];
924 RI =
MRI.use_nodbg_begin(Reg);
926 anyRemat |= reMaterializeFor(LI, MI);
932 for (
unsigned i = 0, e = RegsToSpill.size(); i != e; ++i) {
933 unsigned Reg = RegsToSpill[i];
944 DEBUG(
dbgs() <<
"All defs dead: " << *MI);
945 DeadDefs.push_back(MI);
951 if (DeadDefs.empty())
953 DEBUG(
dbgs() <<
"Remat created " << DeadDefs.size() <<
" dead defs.\n");
954 Edit->eliminateDeadDefs(DeadDefs, RegsToSpill);
957 unsigned ResultPos = 0;
958 for (
unsigned i = 0, e = RegsToSpill.size(); i != e; ++i) {
959 unsigned Reg = RegsToSpill[i];
960 if (!LIS.hasInterval(Reg))
965 Edit->eraseVirtReg(Reg);
969 RegsToSpill[ResultPos++] =
Reg;
971 RegsToSpill.erase(RegsToSpill.begin() + ResultPos, RegsToSpill.end());
972 DEBUG(
dbgs() << RegsToSpill.size() <<
" registers to spill after remat.\n");
981 bool InlineSpiller::coalesceStackAccess(
MachineInstr *MI,
unsigned Reg) {
984 bool IsLoad = InstrReg;
989 if (InstrReg != Reg || FI != StackSlot)
992 DEBUG(
dbgs() <<
"Coalescing stack access: " << *MI);
993 LIS.RemoveMachineInstrFromMaps(MI);
1007 #if !defined(NDEBUG)
1012 const char *
const header,
1014 char NextLine =
'\n';
1015 char SlotIndent =
'\t';
1022 dbgs() <<
'\t' << header <<
": " << NextLine;
1036 dbgs() << SlotIndent << Idx <<
'\t' << *
I;
1047 bool InlineSpiller::
1048 foldMemoryOperand(
ArrayRef<std::pair<MachineInstr*, unsigned> > Ops,
1057 bool WasCopy = MI->
isCopy();
1058 unsigned ImpReg = 0;
1066 for (
unsigned i = 0, e = Ops.
size(); i != e; ++i) {
1067 unsigned Idx = Ops[i].second;
1077 if (LoadMI && MO.
isDef())
1087 LoadMI ?
TII.foldMemoryOperand(MI, FoldOps, LoadMI)
1088 :
TII.foldMemoryOperand(MI, FoldOps, StackSlot);
1096 unsigned Reg = MO->
getReg();
1098 MRI.isReserved(Reg)) {
1101 MIBundleOperands::PhysRegInfo RI =
1104 assert(RI.Reads &&
"Cannot fold physreg reader");
1110 assert(MO->
isDead() &&
"Cannot fold physreg def");
1112 if (
LiveRange *LR = LIS.getCachedRegUnit(*Units)) {
1113 SlotIndex Idx = LIS.getInstructionIndex(MI).getRegSlot();
1114 if (
VNInfo *VNI = LR->getVNInfoAt(Idx))
1115 LR->removeValNo(VNI);
1120 LIS.ReplaceMachineInstrInMaps(MI, FoldMI);
1124 assert(!MIS.empty() &&
"Unexpected empty span of instructions!");
1127 if (&*MII != FoldMI)
1128 LIS.InsertMachineInstrInMaps(&*MII);
1137 if (MO.
getReg() == ImpReg)
1146 else if (Ops.
front().second == 0)
1153 void InlineSpiller::insertReload(
unsigned NewVReg,
1162 LIS.InsertMachineInstrRangeInMaps(MIS.begin(),
MI);
1170 void InlineSpiller::insertSpill(
unsigned NewVReg,
bool isKill,
1178 LIS.InsertMachineInstrRangeInMaps(
llvm::next(MI), MIS.end());
1186 void InlineSpiller::spillAroundUses(
unsigned Reg) {
1201 DEBUG(
dbgs() <<
"Modifying debug info due to spill:" <<
"\t" << *MI);
1209 if (SnippetCopies.count(MI))
1213 if (coalesceStackAccess(MI, Reg))
1218 MIBundleOperands::VirtRegInfo RI =
1230 if (SibReg && isSibling(SibReg)) {
1232 if (isRegToSpill(SibReg)) {
1233 DEBUG(
dbgs() <<
"Found new snippet copy: " << *MI);
1234 SnippetCopies.insert(MI);
1239 if (hoistSpill(OldLI, MI)) {
1242 DeadDefs.push_back(MI);
1248 eliminateRedundantSpills(SibLI, SibLI.
getVNInfoAt(Idx));
1254 if (foldMemoryOperand(Ops))
1259 unsigned NewVReg = Edit->createFrom(Reg);
1262 insertReload(NewVReg, Idx, MI);
1265 bool hasLiveDef =
false;
1266 for (
unsigned i = 0, e = Ops.
size(); i != e; ++i) {
1270 if (!Ops[i].first->isRegTiedToDefOperand(Ops[i].second))
1277 DEBUG(
dbgs() <<
"\trewrite: " << Idx <<
'\t' << *MI <<
'\n');
1282 insertSpill(NewVReg,
true, MI);
1287 void InlineSpiller::spillAll() {
1290 StackSlot = VRM.assignVirt2StackSlot(Original);
1291 StackInt = &LSS.getOrCreateInterval(StackSlot,
MRI.
getRegClass(Original));
1292 StackInt->getNextValue(
SlotIndex(), LSS.getVNInfoAllocator());
1294 StackInt = &LSS.getInterval(StackSlot);
1296 if (Original != Edit->getReg())
1297 VRM.assignVirt2StackSlot(Edit->getReg(), StackSlot);
1299 assert(StackInt->getNumValNums() == 1 &&
"Bad stack interval values");
1300 for (
unsigned i = 0, e = RegsToSpill.size(); i != e; ++i)
1301 StackInt->MergeSegmentsInAsValue(LIS.getInterval(RegsToSpill[i]),
1302 StackInt->getValNumInfo(0));
1303 DEBUG(
dbgs() <<
"Merged spilled regs: " << *StackInt <<
'\n');
1306 for (
unsigned i = 0, e = RegsToSpill.size(); i != e; ++i)
1307 spillAroundUses(RegsToSpill[i]);
1310 if (!DeadDefs.empty()) {
1311 DEBUG(
dbgs() <<
"Eliminating " << DeadDefs.size() <<
" dead defs\n");
1312 Edit->eliminateDeadDefs(DeadDefs, RegsToSpill);
1316 for (
unsigned i = 0, e = RegsToSpill.size(); i != e; ++i) {
1319 assert(SnippetCopies.count(MI) &&
"Remaining use wasn't a snippet copy");
1321 LIS.RemoveMachineInstrFromMaps(MI);
1327 for (
unsigned i = 0, e = RegsToSpill.size(); i != e; ++i)
1328 Edit->eraseVirtReg(RegsToSpill[i]);
1335 &&
"Trying to spill a stack slot.");
1337 Original = VRM.getOriginal(edit.
getReg());
1338 StackSlot = VRM.getStackSlot(Original);
1344 <<
"\nFrom original " <<
PrintReg(Original) <<
'\n');
1346 "Attempting to spill already spilled value.");
1347 assert(DeadDefs.empty() &&
"Previous spill didn't remove dead defs");
1349 collectRegsToSpill();
1350 analyzeSiblingValues();
1354 if (!RegsToSpill.empty())
1357 Edit->calculateRegClassAndHint(MF,
Loops, MBFI);
const MachineInstrBuilder & addMetadata(const MDNode *MD) const
void push_back(const T &Elt)
const MachineFunction * getParent() const
bool isRegTiedToDefOperand(unsigned UseOpIdx, unsigned *DefOpIdx=0) const
instr_iterator erase(instr_iterator I)
VirtRegInfo analyzeVirtReg(unsigned Reg, SmallVectorImpl< std::pair< MachineInstr *, unsigned > > *Ops=0)
SlotIndex def
The index of the defining instruction.
bool isValid() const
isValid - returns true if this iterator is not yet at the end.
SlotIndex getBaseIndex() const
bool addRegisterDead(unsigned Reg, const TargetRegisterInfo *RegInfo, bool AddIfNotFound=false)
bool mayStore(QueryType Type=AnyInBundle) const
bool isSpillable() const
isSpillable - Can this interval be spilled?
void setIsUndef(bool Val=true)
SlotIndex getInstructionIndex(const MachineInstr *instr) const
Returns the base index of the given instruction.
static bool isVirtualRegister(unsigned Reg)
static unsigned isFullCopyOf(const MachineInstr *MI, unsigned Reg)
MDNode - a tuple of other values.
void setIsDead(bool Val=true)
const MDNode * getMetadata() const
unsigned getNumValNums() const
VNInfo * getVNInfoAt(SlotIndex Idx) const
getVNInfoAt - Return the VNInfo that is live at Idx, or NULL.
LoopInfoBase< BlockT, LoopT > * LI
bool allDefsAreDead() const
STATISTIC(NumSpilledRanges,"Number of spilled live ranges")
static void dumpMachineInstrRangeWithSlotIndex(MachineBasicBlock::iterator B, MachineBasicBlock::iterator E, LiveIntervals const &LIS, const char *const header, unsigned VReg=0)
const HexagonInstrInfo * TII
T LLVM_ATTRIBUTE_UNUSED_RESULT pop_back_val()
bool isReg() const
isReg - Tests if this is a MO_Register operand.
Abstract Stack Frame Information.
PhysRegInfo analyzePhysReg(unsigned Reg, const TargetRegisterInfo *TRI)
const MachineInstrBuilder & addImm(int64_t Val) const
unsigned getNumOperands() const
bool isUnused() const
Returns true if this value is unused.
void RemoveOperand(unsigned i)
bool insert(const value_type &X)
Insert a new element into the SetVector.
bool LLVM_ATTRIBUTE_UNUSED_RESULT empty() const
bool empty() const
Determine if the SetVector is empty or not.
std::vector< MachineBasicBlock * >::iterator pred_iterator
T LLVM_ATTRIBUTE_UNUSED_RESULT pop_back_val()
VNInfoList::const_iterator const_vni_iterator
const MachineBasicBlock * getParent() const
bool isDebugValue() const
bool isEarlyClobber() const
bundle_iterator< MachineInstr, instr_iterator > iterator
iterator SkipPHIsAndLabels(iterator I)
LiveQueryResult Query(SlotIndex Idx) const
* if(!EatIfPresent(lltok::kw_thread_local)) return false
void push_back(EltTy NewVal)
const MCRegisterClass & getRegClass(unsigned i) const
Returns the register class associated with the enumeration value. See class MCOperandInfo.
bool isIndirectDebugValue() const
const MachineOperand & getOperand(unsigned i) const
virtual void storeRegToStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, unsigned SrcReg, bool isKill, int FrameIndex, const TargetRegisterClass *RC, const TargetRegisterInfo *TRI) const
Two Address instruction pass
ItTy next(ItTy it, Dist n)
LiveInterval & getParent() const
MachineInstrBuilder BuildMI(MachineFunction &MF, DebugLoc DL, const MCInstrDesc &MCID)
unsigned getSubReg() const
pred_iterator pred_begin()
VNInfoList::iterator vni_iterator
bool containsValue(const VNInfo *VNI) const
containsValue - Returns true if VNI belongs to this range.
void setIsKill(bool Val=true)
static bool isStackSlot(unsigned Reg)
unsigned id
The ID number of this value.
A SetVector that performs no allocations if smaller than a certain size.
void setDesc(const MCInstrDesc &tid)
static bool isSameInstr(SlotIndex A, SlotIndex B)
isSameInstr - Return true if A and B refer to the same instruction.
static cl::opt< bool > DisableHoisting("disable-spill-hoist", cl::Hidden, cl::desc("Disable inline spill hoisting"))
raw_ostream & dbgs()
dbgs - Return a circular-buffered debug stream.
virtual void loadRegFromStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, unsigned DestReg, int FrameIndex, const TargetRegisterClass *RC, const TargetRegisterInfo *TRI) const
bool containsOneValue() const
Spiller * createInlineSpiller(MachineFunctionPass &pass, MachineFunction &mf, VirtRegMap &vrm)
std::string getName(ID id, ArrayRef< Type * > Tys=None)
void setReg(unsigned Reg)
DBG_VALUE - a mapping of the llvm.dbg.value intrinsic.
virtual unsigned isStoreToStackSlot(const MachineInstr *MI, int &FrameIndex) const
raw_ostream & operator<<(raw_ostream &OS, const APInt &I)
Remat - Information needed to rematerialize at a specific location.
SlotIndex getRegSlot(bool EC=false) const
unsigned getReg() const
getReg - Returns the register number.
virtual unsigned isLoadFromStackSlot(const MachineInstr *MI, int &FrameIndex) const
const MCRegisterInfo & MRI
SlotIndex - An opaque wrapper around machine indexes.
tier< T1, T2 > tie(T1 &f, T2 &s)
DebugLoc getDebugLoc() const
VNInfo * getVNInfoBefore(SlotIndex Idx) const