47#include "llvm/Config/llvm-config.h"
69#define DEBUG_TYPE "branch-folder"
71STATISTIC(NumDeadBlocks,
"Number of dead blocks removed");
72STATISTIC(NumBranchOpts,
"Number of branches optimized");
73STATISTIC(NumTailMerge ,
"Number of block tails merged");
74STATISTIC(NumHoist ,
"Number of times common instructions are hoisted");
75STATISTIC(NumTailCalls,
"Number of tail calls optimized");
86 cl::desc(
"Override common-code hoisting in the BranchFolding pass"));
93 cl::desc(
"Override basic-block reordering in the BranchFolding pass"));
98 cl::desc(
"Max number of predecessors to consider tail merging"),
104 cl::desc(
"Min number of instructions to consider tail merging"),
111 bool EnableCommonHoist;
112 bool EnableBasicBlockReordering;
117 explicit BranchFolderLegacy(
bool EnableCommonHoist =
true,
118 bool EnableBasicBlockReordering =
true)
120 EnableBasicBlockReordering(EnableBasicBlockReordering) {}
124 void getAnalysisUsage(AnalysisUsage &AU)
const override {
125 AU.
addRequired<MachineBlockFrequencyInfoWrapperPass>();
126 AU.
addRequired<MachineBranchProbabilityInfoWrapperPass>();
133 MachineFunctionProperties getRequiredProperties()
const override {
134 return MachineFunctionProperties().setNoPHIs();
140char BranchFolderLegacy::ID = 0;
150 bool EnableTailMerge =
151 !MF.getTarget().requiresStructuredCFG() && this->EnableTailMerge;
155 .getCachedResult<ProfileSummaryAnalysis>(
156 *MF.getFunction().getParent());
159 "ProfileSummaryAnalysis is required for BranchFoldingPass",
false);
163 BranchFolder Folder(EnableTailMerge,
true, MBBFreqInfo, MBPI,
165 Folder.setBasicBlockReordering(
true);
166 if (Folder.OptimizeFunction(MF, MF.getSubtarget().getInstrInfo(),
167 MF.getSubtarget().getRegisterInfo()))
177 TargetPassConfig *PassConfig = &getAnalysis<TargetPassConfig>();
182 MBFIWrapper MBBFreqInfo(
183 getAnalysis<MachineBlockFrequencyInfoWrapperPass>().getMBFI());
185 EnableTailMerge, EnableCommonHoist, MBBFreqInfo,
186 getAnalysis<MachineBranchProbabilityInfoWrapperPass>().getMBPI(),
187 &getAnalysis<ProfileSummaryInfoWrapperPass>().getPSI());
188 Folder.setBasicBlockReordering(EnableBasicBlockReordering);
197 : EnableHoistCommonCode(CommonHoist), EnableBasicBlockReordering(
true),
198 MinCommonTailLength(MinTailLength), MBBFreqInfo(FreqInfo), MBPI(ProbInfo),
202 EnableTailMerge = DefaultEnableTailMerge;
205 EnableTailMerge =
true;
208 EnableTailMerge =
false;
214 assert(
MBB->pred_empty() &&
"MBB must be dead!");
219 while (!
MBB->succ_empty())
220 MBB->removeSuccessor(
MBB->succ_end()-1);
223 TriedMerging.erase(
MBB);
227 if (
MI.shouldUpdateAdditionalCallInfo())
234 EHScopeMembership.erase(
MBB);
241 if (!tii)
return false;
243 TriedMerging.clear();
246 AfterBlockPlacement = AfterPlacement;
252 if (MinCommonTailLength == 0) {
255 : TII->getTailMergeSize(MF);
258 UpdateLiveIns = MRI.
tracksLiveness() && TRI->trackLivenessAfterRegAlloc(MF);
260 MRI.invalidateLiveness();
266 EnableHoistCommonCode =
269 EnableBasicBlockReordering =
272 bool MadeChange =
false;
277 bool MadeChangeThisIteration =
true;
278 while (MadeChangeThisIteration) {
279 MadeChangeThisIteration = TailMergeBlocks(MF);
282 if (!AfterBlockPlacement || MadeChangeThisIteration)
283 MadeChangeThisIteration |= OptimizeBranches(MF);
284 if (EnableHoistCommonCode)
285 MadeChangeThisIteration |= HoistCommonCode(MF);
286 MadeChange |= MadeChangeThisIteration;
300 if (!
Op.isJTI())
continue;
303 JTIsLive.
set(
Op.getIndex());
309 for (
unsigned i = 0, e = JTIsLive.
size(); i != e; ++i)
310 if (!JTIsLive.
test(i)) {
324 unsigned Hash =
MI.getOpcode();
325 for (
unsigned i = 0, e =
MI.getNumOperands(); i != e; ++i) {
331 unsigned OperandHash = 0;
332 switch (
Op.getType()) {
334 OperandHash =
Op.getReg().id();
337 OperandHash =
Op.getImm();
340 OperandHash =
Op.getMBB()->getNumber();
345 OperandHash =
Op.getIndex();
351 OperandHash =
Op.getOffset();
357 Hash += ((OperandHash << 3) |
Op.getType()) << (i & 31);
373 return !(
MI.isDebugInstr() ||
MI.isCFIInstruction());
377 if (
MI.isPseudoProbe())
389 if (!IsSensitive1 && !IsSensitive2)
391 if (IsSensitive1 != IsSensitive2)
403 while (
I !=
MBB->begin()) {
424 unsigned TailLen = 0;
428 if (MBBI1 == MBB1->
end() || MBBI2 == MBB2->
end())
430 if (!MBBI1->isIdenticalTo(*MBBI2) ||
437 MBBI1->isInlineAsm()) {
455 MachineBasicBlock &OldMBB = *OldInst->getParent();
457 LiveRegs.addLiveOuts(OldMBB);
462 LiveRegs.stepBackward(*
I);
463 }
while (
I != OldInst);
468 for (MachineBasicBlock::RegisterMaskPair
P : NewDest.
liveins()) {
472 "Can only handle full register.");
473 MCRegister
Reg =
P.PhysReg;
474 if (!LiveRegs.available(*MRI,
Reg))
477 BuildMI(OldMBB, OldInst,
DL, TII->get(TargetOpcode::IMPLICIT_DEF),
Reg);
481 TII->ReplaceTailWithBranchTo(OldInst, &NewDest);
488 if (!TII->isLegalToSplitMBBAt(CurMBB, BBI1))
505 NewMBB->
splice(NewMBB->
end(), &CurMBB, BBI1, CurMBB.
end());
509 if (MachineLoop *
ML = MLI->getLoopFor(&CurMBB))
510 ML->addBasicBlockToLoop(NewMBB, *MLI);
513 MBBFreqInfo.setBlockFreq(NewMBB, MBBFreqInfo.getBlockFreq(&CurMBB));
519 const auto &EHScopeI = EHScopeMembership.find(&CurMBB);
520 if (EHScopeI != EHScopeMembership.end()) {
521 auto n = EHScopeI->second;
522 EHScopeMembership[NewMBB] = n;
533 for (;
I !=
E; ++
I) {
538 else if (
I->mayLoadOrStore())
559 if (
I != MF->
end() && !
TII->analyzeBranch(*CurMBB,
TBB, FBB,
Cond,
true)) {
561 if (
TBB == NextBB && !
Cond.empty() && !FBB) {
562 if (!
TII->reverseBranchCondition(
Cond)) {
563 TII->removeBranch(*CurMBB);
564 TII->insertBranch(*CurMBB, SuccBB,
nullptr,
Cond, dl);
569 TII->insertBranch(*CurMBB, SuccBB,
nullptr,
574BranchFolder::MergePotentialsElt::operator<(
const MergePotentialsElt &o)
const {
575 if (getHash() <
o.getHash())
577 if (getHash() >
o.getHash())
579 if (getBlock()->getNumber() <
o.getBlock()->getNumber())
581 if (getBlock()->getNumber() >
o.getBlock()->getNumber())
592 unsigned NumTerms = 0;
594 if (
I ==
MBB->begin()) {
599 if (!
I->isTerminator())
break;
609 if (!
MBB->succ_empty())
613 return !(
MBB->back().isReturn() ||
MBB->back().isIndirectBranch());
634 unsigned MinCommonTailLength,
unsigned &CommonTailLen,
643 if (!EHScopeMembership.
empty()) {
644 auto EHScope1 = EHScopeMembership.
find(MBB1);
645 assert(EHScope1 != EHScopeMembership.
end());
646 auto EHScope2 = EHScopeMembership.
find(MBB2);
647 assert(EHScope2 != EHScopeMembership.
end());
648 if (EHScope1->second != EHScope2->second)
653 if (CommonTailLen == 0)
657 << CommonTailLen <<
'\n');
667 bool FullBlockTail1 = I1 == MBB1->
begin();
668 bool FullBlockTail2 = I2 == MBB2->
begin();
675 if ((MBB1 == PredBB || MBB2 == PredBB) &&
676 (!AfterPlacement || MBB1->
succ_size() == 1)) {
679 if (CommonTailLen > NumTerms)
688 if (FullBlockTail1 && FullBlockTail2 &&
705 if (AfterPlacement && FullBlockTail1 && FullBlockTail2) {
707 if (!
MBB->succ_empty() && !
MBB->canFallThrough())
711 return (
MBB != &*MF->
begin()) && std::prev(
I)->canFallThrough();
713 if (!BothFallThrough(MBB1) || !BothFallThrough(MBB2))
722 unsigned EffectiveTailLen = CommonTailLen;
723 if (SuccBB && MBB1 != PredBB && MBB2 != PredBB &&
724 (MBB1->
succ_size() == 1 || !AfterPlacement) &&
730 if (EffectiveTailLen >= MinCommonTailLength)
739 return EffectiveTailLen >= 2 && OptForSize &&
740 (FullBlockTail1 || FullBlockTail2);
743unsigned BranchFolder::ComputeSameTails(
unsigned CurHash,
744 unsigned MinCommonTailLength,
745 MachineBasicBlock *SuccBB,
746 MachineBasicBlock *PredBB) {
747 unsigned maxCommonTailLength = 0
U;
750 MPIterator HighestMPIter = std::prev(MergePotentials.end());
751 for (MPIterator CurMPIter = std::prev(MergePotentials.end()),
752 B = MergePotentials.begin();
753 CurMPIter !=
B && CurMPIter->getHash() == CurHash; --CurMPIter) {
754 for (MPIterator
I = std::prev(CurMPIter);
I->getHash() == CurHash; --
I) {
755 unsigned CommonTailLen;
758 CommonTailLen, TrialBBI1, TrialBBI2,
761 AfterBlockPlacement, MBBFreqInfo, PSI)) {
762 if (CommonTailLen > maxCommonTailLength) {
764 maxCommonTailLength = CommonTailLen;
765 HighestMPIter = CurMPIter;
766 SameTails.push_back(SameTailElt(CurMPIter, TrialBBI1));
768 if (HighestMPIter == CurMPIter &&
769 CommonTailLen == maxCommonTailLength)
770 SameTails.push_back(SameTailElt(
I, TrialBBI2));
776 return maxCommonTailLength;
779void BranchFolder::RemoveBlocksWithHash(
unsigned CurHash,
780 MachineBasicBlock *SuccBB,
781 MachineBasicBlock *PredBB,
783 MPIterator CurMPIter,
B;
784 for (CurMPIter = std::prev(MergePotentials.end()),
785 B = MergePotentials.begin();
786 CurMPIter->getHash() == CurHash; --CurMPIter) {
788 MachineBasicBlock *CurMBB = CurMPIter->getBlock();
789 if (SuccBB && CurMBB != PredBB)
790 FixTail(CurMBB, SuccBB, TII, BranchDL);
794 if (CurMPIter->getHash() != CurHash)
796 MergePotentials.erase(CurMPIter, MergePotentials.end());
799bool BranchFolder::CreateCommonTailOnlyBlock(MachineBasicBlock *&PredBB,
800 MachineBasicBlock *SuccBB,
801 unsigned maxCommonTailLength,
802 unsigned &commonTailIndex) {
804 unsigned TimeEstimate = ~0
U;
805 for (
unsigned i = 0, e = SameTails.size(); i != e; ++i) {
807 if (SameTails[i].getBlock() == PredBB) {
814 SameTails[i].getTailStartPos());
815 if (t <= TimeEstimate) {
822 SameTails[commonTailIndex].getTailStartPos();
823 MachineBasicBlock *
MBB = SameTails[commonTailIndex].getBlock();
826 << maxCommonTailLength);
833 MachineBasicBlock *newMBB = SplitMBBAt(*
MBB, BBI, BB);
839 SameTails[commonTailIndex].setBlock(newMBB);
840 SameTails[commonTailIndex].setTailStartPos(newMBB->
begin());
865 unsigned CommonTailLen = 0;
866 for (
auto E =
MBB->end(); MBBIStartPos !=
E; ++MBBIStartPos)
874 while (CommonTailLen--) {
875 assert(
MBBI != MBBIE &&
"Reached BB end within common tail length!");
886 assert(MBBICommon != MBBIECommon &&
887 "Reached BB end within common tail length!");
888 assert(MBBICommon->isIdenticalTo(*
MBBI) &&
"Expected matching MIIs!");
891 if (MBBICommon->mayLoadOrStore())
892 MBBICommon->cloneMergedMemRefs(*
MBB->getParent(), {&*MBBICommon, &*MBBI});
902void BranchFolder::mergeCommonTails(
unsigned commonTailIndex) {
903 MachineBasicBlock *
MBB = SameTails[commonTailIndex].getBlock();
905 std::vector<MachineBasicBlock::iterator> NextCommonInsts(SameTails.size());
906 for (
unsigned int i = 0 ; i != SameTails.size() ; ++i) {
907 if (i != commonTailIndex) {
908 NextCommonInsts[i] = SameTails[i].getTailStartPos();
912 "MBB is not a common tail only block");
916 for (
auto &
MI : *
MBB) {
920 for (
unsigned int i = 0 ; i < NextCommonInsts.size() ; i++) {
921 if (i == commonTailIndex)
924 auto &Pos = NextCommonInsts[i];
925 assert(Pos != SameTails[i].getBlock()->
end() &&
926 "Reached BB end within common tail");
929 assert(Pos != SameTails[i].getBlock()->
end() &&
930 "Reached BB end within common tail");
932 assert(
MI.isIdenticalTo(*Pos) &&
"Expected matching MIIs!");
934 NextCommonInsts[i] = ++Pos;
940 LivePhysRegs NewLiveIns(*TRI);
948 LiveRegs.addLiveOuts(*Pred);
951 if (!LiveRegs.available(*MRI,
Reg))
957 return NewLiveIns.contains(SReg) && !MRI->isReserved(SReg);
962 BuildMI(*Pred, InsertBefore,
DL, TII->get(TargetOpcode::IMPLICIT_DEF),
981bool BranchFolder::TryTailMergeBlocks(MachineBasicBlock *SuccBB,
982 MachineBasicBlock *PredBB,
983 unsigned MinCommonTailLength) {
984 bool MadeChange =
false;
987 dbgs() <<
"\nTryTailMergeBlocks: ";
988 for (
unsigned i = 0, e = MergePotentials.size(); i != e; ++i)
990 << (i ==
e - 1 ?
"" :
", ");
998 dbgs() <<
"Looking for common tails of at least " << MinCommonTailLength
999 <<
" instruction" << (MinCommonTailLength == 1 ?
"" :
"s") <<
'\n';
1007 while (MergePotentials.size() > 1) {
1008 unsigned CurHash = MergePotentials.back().getHash();
1009 const DebugLoc &BranchDL = MergePotentials.back().getBranchDebugLoc();
1013 unsigned maxCommonTailLength = ComputeSameTails(CurHash,
1014 MinCommonTailLength,
1019 if (SameTails.empty()) {
1020 RemoveBlocksWithHash(CurHash, SuccBB, PredBB, BranchDL);
1028 MachineBasicBlock *EntryBB =
1029 &MergePotentials.front().getBlock()->getParent()->front();
1030 unsigned commonTailIndex = SameTails.size();
1033 if (SameTails.size() == 2 &&
1034 SameTails[0].getBlock()->isLayoutSuccessor(SameTails[1].getBlock()) &&
1035 SameTails[1].tailIsWholeBlock() && !SameTails[1].getBlock()->isEHPad())
1036 commonTailIndex = 1;
1037 else if (SameTails.size() == 2 &&
1038 SameTails[1].getBlock()->isLayoutSuccessor(
1039 SameTails[0].getBlock()) &&
1040 SameTails[0].tailIsWholeBlock() &&
1041 !SameTails[0].getBlock()->isEHPad())
1042 commonTailIndex = 0;
1046 for (
unsigned i = 0, e = SameTails.size(); i != e; ++i) {
1047 MachineBasicBlock *
MBB = SameTails[i].getBlock();
1049 SameTails[i].tailIsWholeBlock())
1051 if (
MBB == PredBB) {
1052 commonTailIndex = i;
1055 if (SameTails[i].tailIsWholeBlock())
1056 commonTailIndex = i;
1060 if (commonTailIndex == SameTails.size() ||
1061 (SameTails[commonTailIndex].getBlock() == PredBB &&
1062 !SameTails[commonTailIndex].tailIsWholeBlock())) {
1065 if (!CreateCommonTailOnlyBlock(PredBB, SuccBB,
1066 maxCommonTailLength, commonTailIndex)) {
1067 RemoveBlocksWithHash(CurHash, SuccBB, PredBB, BranchDL);
1072 MachineBasicBlock *
MBB = SameTails[commonTailIndex].getBlock();
1075 setCommonTailEdgeWeights(*
MBB);
1079 mergeCommonTails(commonTailIndex);
1085 for (
unsigned int i=0, e = SameTails.size(); i != e; ++i) {
1086 if (commonTailIndex == i)
1089 << (i == e - 1 ?
"" :
", "));
1091 replaceTailWithBranchTo(SameTails[i].getTailStartPos(), *
MBB);
1093 MergePotentials.erase(SameTails[i].getMPIter());
1104 bool MadeChange =
false;
1105 if (!EnableTailMerge)
1110 MergePotentials.clear();
1111 for (MachineBasicBlock &
MBB : MF) {
1122 for (
const MergePotentialsElt &Elt : MergePotentials)
1123 TriedMerging.insert(Elt.getBlock());
1126 if (MergePotentials.size() >= 2)
1127 MadeChange |= TryTailMergeBlocks(
nullptr,
nullptr, MinCommonTailLength);
1150 if (
I->pred_size() < 2)
continue;
1151 SmallPtrSet<MachineBasicBlock *, 8> UniquePreds;
1152 MachineBasicBlock *IBB = &*
I;
1153 MachineBasicBlock *PredBB = &*std::prev(
I);
1154 MergePotentials.clear();
1167 if (AfterBlockPlacement && MLI) {
1168 ML = MLI->getLoopFor(IBB);
1169 if (
ML && IBB ==
ML->getHeader())
1173 for (MachineBasicBlock *PBB :
I->predecessors()) {
1177 if (TriedMerging.count(PBB))
1185 if (!UniquePreds.
insert(PBB).second)
1190 if (PBB->hasEHPadSuccessor() || PBB->mayHaveInlineAsmBr())
1196 if (AfterBlockPlacement && MLI)
1197 if (
ML != MLI->getLoopFor(PBB))
1200 MachineBasicBlock *
TBB =
nullptr, *FBB =
nullptr;
1201 SmallVector<MachineOperand, 4>
Cond;
1202 if (!TII->analyzeBranch(*PBB,
TBB, FBB,
Cond,
true)) {
1205 SmallVector<MachineOperand, 4> NewCond(
Cond);
1207 if (TII->reverseBranchCondition(NewCond))
1211 auto Next = ++PBB->getIterator();
1212 if (
Next != MF.end())
1218 DebugLoc dl = PBB->findBranchDebugLoc();
1220 TII->removeBranch(*PBB);
1223 TII->insertBranch(*PBB, (
TBB == IBB) ? FBB :
TBB,
nullptr,
1227 MergePotentials.push_back(
1235 for (MergePotentialsElt &Elt : MergePotentials)
1236 TriedMerging.insert(Elt.getBlock());
1238 if (MergePotentials.size() >= 2)
1239 MadeChange |= TryTailMergeBlocks(IBB, PredBB, MinCommonTailLength);
1243 PredBB = &*std::prev(
I);
1244 if (MergePotentials.size() == 1 &&
1245 MergePotentials.begin()->getBlock() != PredBB)
1246 FixTail(MergePotentials.begin()->getBlock(), IBB, TII,
1247 MergePotentials.begin()->getBranchDebugLoc());
1253void BranchFolder::setCommonTailEdgeWeights(MachineBasicBlock &TailMBB) {
1255 BlockFrequency AccumulatedMBBFreq;
1260 for (
const auto &Src : SameTails) {
1261 const MachineBasicBlock *SrcMBB = Src.getBlock();
1262 BlockFrequency BlockFreq = MBBFreqInfo.getBlockFreq(SrcMBB);
1263 AccumulatedMBBFreq += BlockFreq;
1270 auto EdgeFreq = EdgeFreqLs.begin();
1273 SuccI != SuccE; ++SuccI, ++EdgeFreq)
1274 *EdgeFreq += BlockFreq * MBPI.getEdgeProbability(SrcMBB, *SuccI);
1277 MBBFreqInfo.setBlockFreq(&TailMBB, AccumulatedMBBFreq);
1283 std::accumulate(EdgeFreqLs.begin(), EdgeFreqLs.end(), BlockFrequency(0))
1285 auto EdgeFreq = EdgeFreqLs.begin();
1287 if (SumEdgeFreq > 0) {
1289 SuccI != SuccE; ++SuccI, ++EdgeFreq) {
1291 EdgeFreq->getFrequency(), SumEdgeFreq);
1302 bool MadeChange =
false;
1309 for (MachineBasicBlock &
MBB :
1311 MadeChange |= OptimizeBlock(&
MBB);
1316 RemoveDeadBlock(&
MBB);
1328 return MBB->getFirstNonDebugInstr(
true) ==
MBB->end();
1336 return I->isBranch();
1345 assert(MBB1 && MBB2 &&
"Unknown MachineBasicBlock");
1353 if (MBB1I == MBB1->
end() || MBB2I == MBB2->
end())
1361 return MBB2I->isCall() && !MBB1I->isCall();
1369 if (
MI.isDebugInstr()) {
1370 TII->duplicate(PredMBB, InsertBefore,
MI);
1371 LLVM_DEBUG(
dbgs() <<
"Copied debug entity from empty block to pred: "
1381 if (
MI.isDebugInstr()) {
1382 TII->duplicate(SuccMBB, InsertBefore,
MI);
1383 LLVM_DEBUG(
dbgs() <<
"Copied debug entity from empty block to succ: "
1413 return !CurCond.
empty() &&
1416 return LHS.isIdenticalTo(
RHS);
1420bool BranchFolder::OptimizeBlock(MachineBasicBlock *
MBB) {
1421 bool MadeChange =
false;
1429 bool SameEHScope =
true;
1430 if (!EHScopeMembership.empty() && FallThrough != MF.
end()) {
1431 auto MBBEHScope = EHScopeMembership.find(
MBB);
1432 assert(MBBEHScope != EHScopeMembership.end());
1433 auto FallThroughEHScope = EHScopeMembership.find(&*FallThrough);
1434 assert(FallThroughEHScope != EHScopeMembership.end());
1435 SameEHScope = MBBEHScope->second == FallThroughEHScope->second;
1440 MachineBasicBlock *CurTBB =
nullptr, *CurFBB =
nullptr;
1441 SmallVector<MachineOperand, 4> CurCond;
1442 bool CurUnAnalyzable =
1443 TII->analyzeBranch(*
MBB, CurTBB, CurFBB, CurCond,
true);
1455 if (FallThrough == MF.
end()) {
1457 }
else if (FallThrough->isEHPad()) {
1473 if (*SI != &*FallThrough && !FallThrough->isSuccessor(*SI)) {
1474 assert((*SI)->isEHPad() &&
"Bad CFG");
1475 FallThrough->copySuccessor(
MBB, SI);
1480 MJTI->ReplaceMBBInJumpTables(
MBB, &*FallThrough);
1490 MachineBasicBlock *PriorTBB =
nullptr, *PriorFBB =
nullptr;
1491 SmallVector<MachineOperand, 4> PriorCond;
1492 bool PriorUnAnalyzable =
1493 TII->analyzeBranch(PrevBB, PriorTBB, PriorFBB, PriorCond,
true);
1494 if (!PriorUnAnalyzable) {
1498 if (PriorTBB && PriorTBB == PriorFBB) {
1500 TII->removeBranch(PrevBB);
1502 if (PriorTBB !=
MBB)
1503 TII->insertBranch(PrevBB, PriorTBB,
nullptr, PriorCond, Dl);
1506 goto ReoptimizeBlock;
1520 <<
"From MBB: " << *
MBB);
1522 if (!PrevBB.
empty()) {
1528 while (PrevBBIter != PrevBB.
begin() && MBBIter !=
MBB->
end()
1529 && PrevBBIter->isDebugInstr() && MBBIter->isDebugInstr()) {
1530 if (!MBBIter->isIdenticalTo(*PrevBBIter))
1532 MachineInstr &DuplicateDbg = *MBBIter;
1533 ++MBBIter; -- PrevBBIter;
1547 if (PriorTBB ==
MBB && !PriorFBB) {
1548 TII->removeBranch(PrevBB);
1551 goto ReoptimizeBlock;
1556 if (PriorFBB ==
MBB) {
1558 TII->removeBranch(PrevBB);
1559 TII->insertBranch(PrevBB, PriorTBB,
nullptr, PriorCond, Dl);
1562 goto ReoptimizeBlock;
1568 if (PriorTBB ==
MBB) {
1569 SmallVector<MachineOperand, 4> NewPriorCond(PriorCond);
1570 if (!TII->reverseBranchCondition(NewPriorCond)) {
1572 TII->removeBranch(PrevBB);
1573 TII->insertBranch(PrevBB, PriorFBB,
nullptr, NewPriorCond, Dl);
1576 goto ReoptimizeBlock;
1589 TII->removeBranch(PrevBB);
1593 goto ReoptimizeBlock;
1607 bool DoTransform =
true;
1614 if (FallThrough == --MF.
end() &&
1616 DoTransform =
false;
1620 SmallVector<MachineOperand, 4> NewPriorCond(PriorCond);
1621 if (!TII->reverseBranchCondition(NewPriorCond)) {
1623 <<
"To make fallthrough to: " << *PriorTBB <<
"\n");
1626 TII->removeBranch(PrevBB);
1627 TII->insertBranch(PrevBB,
MBB,
nullptr, NewPriorCond, Dl);
1641 if (TII->isUnconditionalTailCall(TailCall)) {
1644 MachineBasicBlock *PredTBB =
nullptr, *PredFBB =
nullptr;
1645 SmallVector<MachineOperand, 4> PredCond;
1646 bool PredAnalyzable =
1647 !TII->analyzeBranch(*Pred, PredTBB, PredFBB, PredCond,
true);
1650 if (PredAnalyzable && !PredCond.
empty() && PredTBB ==
MBB &&
1651 PredTBB != PredFBB) {
1655 if (TII->canMakeTailCallConditional(PredCond, TailCall)) {
1659 TII->replaceBranchWithTailCall(*Pred, PredCond, TailCall);
1669 if (!PredsChanged.
empty()) {
1670 NumTailCalls += PredsChanged.
size();
1671 for (
auto &Pred : PredsChanged)
1679 if (!CurUnAnalyzable) {
1685 if (CurTBB && CurFBB && CurFBB ==
MBB && CurTBB !=
MBB) {
1686 SmallVector<MachineOperand, 4> NewCond(CurCond);
1687 if (!TII->reverseBranchCondition(NewCond)) {
1689 TII->removeBranch(*
MBB);
1690 TII->insertBranch(*
MBB, CurFBB, CurTBB, NewCond, Dl);
1693 goto ReoptimizeBlock;
1699 if (CurTBB && CurCond.
empty() && !CurFBB &&
1706 TII->removeBranch(*
MBB);
1722 if (PredHasNoFallThrough || !PriorUnAnalyzable ||
1727 PriorTBB !=
MBB && PriorFBB !=
MBB) {
1730 "Bad branch analysis");
1733 assert(!PriorFBB &&
"Machine CFG out of date!");
1737 TII->removeBranch(PrevBB);
1738 TII->insertBranch(PrevBB, PriorTBB, PriorFBB, PriorCond, PrevDl);
1743 bool DidChange =
false;
1744 bool HasBranchToSelf =
false;
1750 HasBranchToSelf =
true;
1760 assert((*SI)->isEHPad() &&
"Bad CFG");
1766 MachineBasicBlock *NewCurTBB =
nullptr, *NewCurFBB =
nullptr;
1767 SmallVector<MachineOperand, 4> NewCurCond;
1768 bool NewCurUnAnalyzable = TII->analyzeBranch(
1769 *PMBB, NewCurTBB, NewCurFBB, NewCurCond,
true);
1770 if (!NewCurUnAnalyzable && NewCurTBB && NewCurTBB == NewCurFBB) {
1772 TII->removeBranch(*PMBB);
1774 TII->insertBranch(*PMBB, NewCurTBB,
nullptr, NewCurCond,
1784 MJTI->ReplaceMBBInJumpTables(
MBB, CurTBB);
1788 if (!HasBranchToSelf)
return MadeChange;
1794 TII->insertBranch(*
MBB, CurTBB,
nullptr, CurCond, Dl);
1812 MachineBasicBlock *PredTBB =
nullptr, *PredFBB =
nullptr;
1813 SmallVector<MachineOperand, 4> PredCond;
1815 !TII->analyzeBranch(*PredBB, PredTBB, PredFBB, PredCond,
true) &&
1816 (PredTBB ==
MBB || PredFBB ==
MBB) &&
1817 (!CurFallsThru || !CurTBB || !CurFBB) &&
1832 TII->insertBranch(*
MBB, NextBB,
nullptr, CurCond,
DebugLoc());
1836 goto ReoptimizeBlock;
1841 if (!CurFallsThru) {
1844 if (!CurUnAnalyzable) {
1845 for (MachineBasicBlock *SuccBB : {CurFBB, CurTBB}) {
1854 if (SuccBB !=
MBB && &*SuccPrev !=
MBB &&
1855 !SuccPrev->canFallThrough()) {
1858 goto ReoptimizeBlock;
1884 MachineBasicBlock *PrevTBB =
nullptr, *PrevFBB =
nullptr;
1885 SmallVector<MachineOperand, 4> PrevCond;
1887 if (FallThrough != MF.
end() && !FallThrough->isEHPad() &&
1888 !FallThrough->isInlineAsmBrIndirectTarget() &&
1889 !TII->analyzeBranch(PrevBB, PrevTBB, PrevFBB, PrevCond,
true) &&
1906 bool MadeChange =
false;
1908 MadeChange |= HoistCommonCodeInSuccs(&
MBB);
1918 if (SuccBB != TrueBB)
1923template <
class Container>
1926 if (
Reg.isPhysical()) {
1948 if (!
TII->isUnpredicatedTerminator(*
Loc))
1989 if (!MO.isReg() || MO.isUse())
2010 bool DontMoveAcrossStore =
true;
2011 if (!PI->isSafeToMove(DontMoveAcrossStore) ||
TII->isPredicated(*PI))
2026 if (
Reg.isPhysical()) {
2038bool BranchFolder::HoistCommonCodeInSuccs(MachineBasicBlock *
MBB) {
2039 MachineBasicBlock *
TBB =
nullptr, *FBB =
nullptr;
2040 SmallVector<MachineOperand, 4>
Cond;
2051 if (
TBB->pred_size() > 1 || FBB->pred_size() > 1)
2057 SmallSet<Register, 4>
Uses, Defs;
2063 bool HasDups =
false;
2064 SmallSet<Register, 4> ActiveDefsSet, AllDefsSet;
2070 while (TIB != TIE && FIB != FIE) {
2074 if (TIB == TIE || FIB == FIE)
2080 if (TII->isPredicated(*TIB))
2084 if (!TII->isSafeToMove(*TIB,
TBB, MF))
2089 for (MachineOperand &MO : TIB->operands()) {
2091 if (MO.isRegMask()) {
2108 if (Defs.
count(
Reg) && !MO.isDead()) {
2123 }
else if (!ActiveDefsSet.
count(
Reg)) {
2130 if (MO.isKill() &&
Uses.count(
Reg))
2133 MO.setIsKill(
false);
2139 bool DontMoveAcrossStore =
true;
2140 if (!TIB->isSafeToMove(DontMoveAcrossStore))
2144 for (
const MachineOperand &MO : TIB->all_uses()) {
2154 for (MCRegAliasIterator AI(
Reg, TRI,
true); AI.isValid(); ++AI)
2155 ActiveDefsSet.
erase(*AI);
2162 for (
const MachineOperand &MO : TIB->all_defs()) {
2189 MachineInstrBuilder MIRBuilder(*
MBB->
getParent(), Loc);
2191 assert(DI->isDebugInstr() &&
"Expected a debug instruction");
2192 if (DI->isDebugRef()) {
2193 const TargetInstrInfo *TII =
2195 const MCInstrDesc &DBGV = TII->
get(TargetOpcode::DBG_VALUE);
2197 DI->getDebugVariable(), DI->getDebugExpression());
2202 if (DI->isDebugPHI()) {
2203 DI->eraseFromParent();
2207 if (!DI->isDebugLabel())
2208 DI->setDebugValueUndef();
2209 DI->moveBefore(&*Loc);
2221 while (FI != FE && FI->isDebugInstr())
2222 HoistAndKillDbgInstr(FI++);
2225 if (TI->isDebugInstr()) {
2226 HoistAndKillDbgInstr(TI);
2231 assert(FI != FE &&
"Unexpected end of FBB range");
2234 assert(!TI->isPseudoProbe() &&
"Unexpected pseudo probe in range");
2238 "Expected non-debug lockstep");
2247 TI->moveBefore(&*Loc);
2252 FBB->
erase(FBB->begin(), FIB);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
MachineBasicBlock MachineBasicBlock::iterator MBBI
This file implements the BitVector class.
static unsigned EstimateRuntime(MachineBasicBlock::iterator I, MachineBasicBlock::iterator E)
EstimateRuntime - Make a rough estimate for how long it will take to run the specified code.
static unsigned ComputeCommonTailLength(MachineBasicBlock *MBB1, MachineBasicBlock *MBB2, MachineBasicBlock::iterator &I1, MachineBasicBlock::iterator &I2)
Given two machine basic blocks, return the number of instructions they actually have in common togeth...
static cl::opt< cl::boolOrDefault > FlagEnableHoistCommonCode("branch-folder-hoist-common-code", cl::init(cl::boolOrDefault::BOU_UNSET), cl::Hidden, cl::desc("Override common-code hoisting in the BranchFolding pass"))
static void mergeUndefFlag(MachineInstr &Merged, const MachineInstr &Other)
Ensure undef flag is preserved only when it is present in both instructions.
static MachineBasicBlock * findFalseBlock(MachineBasicBlock *BB, MachineBasicBlock *TrueBB)
findFalseBlock - BB has a fallthrough.
static void copyDebugInfoToPredecessor(const TargetInstrInfo *TII, MachineBasicBlock &MBB, MachineBasicBlock &PredMBB)
static unsigned HashMachineInstr(const MachineInstr &MI)
HashMachineInstr - Compute a hash value for MI and its operands.
static bool countsAsInstruction(const MachineInstr &MI)
Whether MI should be counted as an instruction when calculating common tail.
static cl::opt< cl::boolOrDefault > FlagEnableTailMerge("enable-tail-merge", cl::init(cl::boolOrDefault::BOU_UNSET), cl::Hidden)
static unsigned CountTerminators(MachineBasicBlock *MBB, MachineBasicBlock::iterator &I)
CountTerminators - Count the number of terminators in the given block and set I to the position of th...
static bool blockEndsInUnreachable(const MachineBasicBlock *MBB)
A no successor, non-return block probably ends in unreachable and is cold.
static void salvageDebugInfoFromEmptyBlock(const TargetInstrInfo *TII, MachineBasicBlock &MBB)
static MachineBasicBlock::iterator skipBackwardPastNonInstructions(MachineBasicBlock::iterator I, MachineBasicBlock *MBB)
Iterate backwards from the given iterator I, towards the beginning of the block.
static bool haveSamePseudoProbeContext(const MachineInstr &MI1, const MachineInstr &MI2)
static cl::opt< unsigned > TailMergeThreshold("tail-merge-threshold", cl::desc("Max number of predecessors to consider tail merging"), cl::init(150), cl::Hidden)
static void addRegAndItsAliases(Register Reg, const TargetRegisterInfo *TRI, Container &Set)
static cl::opt< unsigned > TailMergeSize("tail-merge-size", cl::desc("Min number of instructions to consider tail merging"), cl::init(3), cl::Hidden)
static bool areConditionalsEqual(ArrayRef< MachineOperand > CurCond, ArrayRef< MachineOperand > PriorCond)
static bool isPseudoProbeSensitiveInstruction(const MachineInstr &MI)
static bool IsEmptyBlock(MachineBasicBlock *MBB)
static bool ProfitableToMerge(MachineBasicBlock *MBB1, MachineBasicBlock *MBB2, unsigned MinCommonTailLength, unsigned &CommonTailLen, MachineBasicBlock::iterator &I1, MachineBasicBlock::iterator &I2, MachineBasicBlock *SuccBB, MachineBasicBlock *PredBB, DenseMap< const MachineBasicBlock *, int > &EHScopeMembership, bool AfterPlacement, MBFIWrapper &MBBFreqInfo, ProfileSummaryInfo *PSI)
ProfitableToMerge - Check if two machine basic blocks have a common tail and decide if it would be pr...
static void copyDebugInfoToSuccessor(const TargetInstrInfo *TII, MachineBasicBlock &MBB, MachineBasicBlock &SuccMBB)
static bool IsBranchOnlyBlock(MachineBasicBlock *MBB)
static void FixTail(MachineBasicBlock *CurMBB, MachineBasicBlock *SuccBB, const TargetInstrInfo *TII, const DebugLoc &BranchDL)
static bool IsBetterFallthrough(MachineBasicBlock *MBB1, MachineBasicBlock *MBB2)
IsBetterFallthrough - Return true if it would be clearly better to fall-through to MBB1 than to fall ...
static unsigned HashEndOfMBB(const MachineBasicBlock &MBB)
HashEndOfMBB - Hash the last instruction in the MBB.
static cl::opt< cl::boolOrDefault > FlagEnableBlockReordering("branch-folder-reorder-blocks", cl::init(cl::boolOrDefault::BOU_UNSET), cl::Hidden, cl::desc("Override basic-block reordering in the BranchFolding pass"))
static void mergeOperations(MachineBasicBlock::iterator MBBIStartPos, MachineBasicBlock &MBBCommon)
static MachineBasicBlock::iterator findHoistingInsertPosAndDeps(MachineBasicBlock *MBB, const TargetInstrInfo *TII, const TargetRegisterInfo *TRI, SmallSet< Register, 4 > &Uses, SmallSet< Register, 4 > &Defs)
findHoistingInsertPosAndDeps - Find the location to move common instructions in successors to.
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
const HexagonInstrInfo * TII
A common definition of LaneBitmask for use in TableGen and CodeGen.
Register const TargetRegisterInfo * TRI
Promote Memory to Register
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
SmallVector< MachineOperand, 4 > Cond
const SmallVectorImpl< MachineOperand > MachineBasicBlock * TBB
Remove Loads Into Fake Uses
This file defines the SmallSet class.
This file defines the SmallVector class.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
Target-Independent Code Generator Pass Configuration Options pass.
AnalysisUsage & addRequired()
AnalysisUsage & addPreserved()
Add the specified Pass class to the set of analyses preserved by this pass.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
bool empty() const
Check if the array is empty.
LLVM Basic Block Representation.
bool test(unsigned Idx) const
Returns true if bit Idx is set.
BitVector & set()
Set all bits in the bitvector.
size_type size() const
Returns the number of bits in this bitvector.
bool OptimizeFunction(MachineFunction &MF, const TargetInstrInfo *tii, const TargetRegisterInfo *tri, MachineLoopInfo *mli=nullptr, bool AfterPlacement=false)
Perhaps branch folding, tail merging and other CFG optimizations on the given function.
BranchFolder(bool DefaultEnableTailMerge, bool CommonHoist, MBFIWrapper &FreqInfo, const MachineBranchProbabilityInfo &ProbInfo, ProfileSummaryInfo *PSI, unsigned MinTailLength=0)
static LLVM_ABI BranchProbability getBranchProbability(uint64_t Numerator, uint64_t Denominator)
static bool isPseudoProbeDiscriminator(unsigned Discriminator)
static LLVM_ABI DILocation * getMergedLocation(DILocation *LocA, DILocation *LocB)
Attempts to merge LocA and LocB into a single location; see DebugLoc::getMergedLocation for more deta...
bool isSameSourceLocation(const DebugLoc &Other) const
Return true if the source locations match, ignoring isImplicitCode and source atom info.
static LLVM_ABI DebugLoc getMergedLocation(DebugLoc LocA, DebugLoc LocB)
When two instructions are combined into a single instruction we also need to combine the original loc...
iterator find(const_arg_type_t< KeyT > Val)
void removeBlock(BlockT *BB)
This method completely removes BB from all data structures, including all of the Loop objects it is n...
const MCInstrDesc & get(unsigned Opcode) const
Return the machine instruction descriptor that corresponds to the specified instruction opcode.
MCRegAliasIterator enumerates all registers aliasing Reg.
An RAII based helper class to modify MachineFunctionProperties when running pass.
unsigned pred_size() const
bool isEHPad() const
Returns true if the block is a landing pad.
MachineInstrBundleIterator< const MachineInstr > const_iterator
LLVM_ABI void moveBefore(MachineBasicBlock *NewAfter)
Move 'this' block before or after the specified block.
LLVM_ABI void transferSuccessors(MachineBasicBlock *FromMBB)
Transfers all the successors from MBB to this machine basic block (i.e., copies all the successors Fr...
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
int getNumber() const
MachineBasicBlocks are uniquely numbered at the function level, unless they're not in a MachineFuncti...
LLVM_ABI iterator SkipPHIsAndLabels(iterator I)
Return the first instruction in MBB after I that is not a PHI or a label.
const BasicBlock * getBasicBlock() const
Return the LLVM basic block that this instance corresponded to originally.
LLVM_ABI bool canFallThrough()
Return true if the block can implicitly transfer control to the block after it by falling off the end...
LLVM_ABI void setSuccProbability(succ_iterator I, BranchProbability Prob)
Set successor probability of a given iterator.
LLVM_ABI iterator getFirstNonDebugInstr(bool SkipPseudoOp=true)
Returns an iterator to the first non-debug instruction in the basic block, or end().
succ_iterator succ_begin()
LLVM_ABI void clearLiveIns()
Clear live in list.
LLVM_ABI iterator getFirstTerminator()
Returns an iterator to the first terminator instruction of this basic block.
unsigned succ_size() const
bool hasAddressTaken() const
Test whether this block is used as something other than the target of a terminator,...
LLVM_ABI void addSuccessor(MachineBasicBlock *Succ, BranchProbability Prob=BranchProbability::getUnknown())
Add Succ as a successor of this MachineBasicBlock.
LLVM_ABI void copySuccessor(const MachineBasicBlock *Orig, succ_iterator I)
Copy a successor (and any probability info) from original block to this block's.
LLVM_ABI void removeSuccessor(MachineBasicBlock *Succ, bool NormalizeSuccProbs=false)
Remove successor from the successors list of this MachineBasicBlock.
pred_iterator pred_begin()
LLVM_ABI iterator getLastNonDebugInstr(bool SkipPseudoOp=true)
Returns an iterator to the last non-debug instruction in the basic block, or end().
LLVM_ABI void ReplaceUsesOfBlockWith(MachineBasicBlock *Old, MachineBasicBlock *New)
Given a machine basic block that branched to 'Old', change the code and CFG so that it branches to 'N...
MachineInstrBundleIterator< MachineInstr, true > reverse_iterator
LLVM_ABI bool isLayoutSuccessor(const MachineBasicBlock *MBB) const
Return true if the specified MBB will be emitted immediately after this block, such that if this bloc...
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 DebugLoc findBranchDebugLoc()
Find and return the merged DebugLoc of the branch instructions of the block.
iterator_range< succ_iterator > successors()
reverse_iterator rbegin()
bool isMachineBlockAddressTaken() const
Test whether this block is used as something other than the target of a terminator,...
LLVM_ABI bool isSuccessor(const MachineBasicBlock *MBB) const
Return true if the specified MBB is a successor of this block.
iterator_range< pred_iterator > predecessors()
void splice(iterator Where, MachineBasicBlock *Other, iterator From)
Take an instruction from MBB 'Other' at the position From, and insert it into this MBB right before '...
MachineInstrBundleIterator< MachineInstr > iterator
LLVM_ABI void moveAfter(MachineBasicBlock *NewBefore)
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.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
Function & getFunction()
Return the LLVM function that this machine code represents.
const MachineBasicBlock & back() const
BasicBlockListType::iterator iterator
void eraseAdditionalCallInfo(const MachineInstr *MI)
Following functions update call site info.
void RenumberBlocks(MachineBasicBlock *MBBFrom=nullptr)
RenumberBlocks - This discards all of the MachineBasicBlock numbers and recomputes them.
const MachineJumpTableInfo * getJumpTableInfo() const
getJumpTableInfo - Return the jump table info object for the current function.
MachineBasicBlock * CreateMachineBasicBlock(const BasicBlock *BB=nullptr, std::optional< UniqueBBID > BBID=std::nullopt)
CreateMachineInstr - Allocate a new MachineInstr.
void erase(iterator MBBI)
void insert(iterator MBBI, MachineBasicBlock *MBB)
const TargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
Representation of each machine instruction.
bool isBarrier(QueryType Type=AnyInBundle) const
Returns true if the specified instruction stops control flow from executing the instruction immediate...
unsigned getNumOperands() const
Retuns the total number of operands.
const DebugLoc & getDebugLoc() const
Returns the debug location id of this MachineInstr.
const MachineOperand & getOperand(unsigned i) const
LLVM_ABI MachineInstrBundleIterator< MachineInstr > eraseFromParent()
Unlink 'this' from the containing basic block and delete it.
void RemoveJumpTable(unsigned Idx)
RemoveJumpTable - Mark the specific index as being dead.
const std::vector< MachineJumpTableEntry > & getJumpTables() const
MachineOperand class - Representation of each machine instruction operand.
bool isReg() const
isReg - Tests if this is a MO_Register operand.
void setIsUndef(bool Val=true)
@ MO_Immediate
Immediate operand.
@ MO_ConstantPoolIndex
Address of indexed Constant in Constant Pool.
@ MO_GlobalAddress
Address of a global value.
@ MO_MachineBasicBlock
MachineBasicBlock reference.
@ MO_FrameIndex
Abstract Stack Frame Index.
@ MO_Register
Register operand.
@ MO_ExternalSymbol
Name of external global symbol.
@ MO_JumpTableIndex
Address of indexed Jump Table for switch.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
bool tracksLiveness() const
tracksLiveness - Returns true when tracking register liveness accurately.
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.
Analysis providing profile information.
Wrapper class representing virtual and physical registers.
constexpr bool isVirtual() const
Return true if the specified register number is in the virtual register namespace.
constexpr bool isPhysical() const
Return true if the specified register number is in the physical register namespace.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallSet - This maintains a set of unique values, optimizing for the case when the set is small (less...
size_type count(const T &V) const
count - Return 1 if the element is in the set, 0 otherwise.
iterator erase(const_iterator CI)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
TargetInstrInfo - Interface to description of machine instruction set.
bool requiresStructuredCFG() const
bool getEnableTailMerge() const
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
virtual const TargetInstrInfo * getInstrInfo() const
virtual const TargetRegisterInfo * getRegisterInfo() const =0
Return the target's register information.
self_iterator getIterator()
@ BasicBlock
Various leaf nodes.
initializer< Ty > init(const Ty &Val)
LLVM_ABI iterator begin() const
This is an optimization pass for GlobalISel generic memory operations.
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
OuterAnalysisManagerProxy< ModuleAnalysisManager, MachineFunction > ModuleAnalysisManagerMachineFunctionProxy
Provide the ModuleAnalysisManager to Function proxy.
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
LLVM_ABI bool shouldOptimizeForSize(const MachineFunction *MF, ProfileSummaryInfo *PSI, const MachineBlockFrequencyInfo *BFI, PGSOQueryType QueryType=PGSOQueryType::Other)
Returns true if machine function MF is suggested to be size-optimized based on the profile.
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...
AnalysisManager< MachineFunction > MachineFunctionAnalysisManager
LLVM_ABI PreservedAnalyses getMachineFunctionPassPreservedAnalyses()
Returns the minimum set of Analyses that all machine function passes must preserve.
IterT skipDebugInstructionsForward(IterT It, IterT End, bool SkipPseudoOp=true)
Increment It until it points to a non-debug instruction or to End and return the resulting iterator.
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
void sort(IteratorTy Start, IteratorTy End)
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
uint16_t MCPhysReg
An unsigned integer type large enough to represent all physical registers, but not necessarily virtua...
DWARFExpression::Operation Op
LLVM_ABI void computeAndAddLiveIns(LivePhysRegs &LiveRegs, MachineBasicBlock &MBB)
Convenience function combining computeLiveIns() and addLiveIns().
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Next
LLVM_ABI void computeLiveIns(LivePhysRegs &LiveRegs, const MachineBasicBlock &MBB)
Computes registers live-in to MBB assuming all of its successors live-in lists are up-to-date.
bool equal(L &&LRange, R &&RRange)
Wrapper function around std::equal to detect if pair-wise elements between two ranges are the same.
LLVM_ABI char & BranchFolderPassID
BranchFolding - This pass performs machine code CFG based optimizations to delete branches to branche...
IterT prev_nodbg(IterT It, IterT Begin, bool SkipPseudoOp=true)
Decrement It, then continue decrementing it while it points to a debug instruction.
void fullyRecomputeLiveIns(ArrayRef< MachineBasicBlock * > MBBs)
Convenience function for recomputing live-in's for a set of MBBs until the computation converges.
LLVM_ABI Printable printMBBReference(const MachineBasicBlock &MBB)
Prints a machine basic block reference.
LLVM_ABI void addLiveIns(MachineBasicBlock &MBB, const LivePhysRegs &LiveRegs)
Adds registers contained in LiveRegs to the block live-in list of MBB.
LLVM_ABI DenseMap< const MachineBasicBlock *, int > getEHScopeMembership(const MachineFunction &MF)
static constexpr LaneBitmask getAll()