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");
84 cl::desc(
"Max number of predecessors to consider tail merging"),
90 cl::desc(
"Min number of instructions to consider tail merging"),
102 bool runOnMachineFunction(MachineFunction &MF)
override;
104 void getAnalysisUsage(AnalysisUsage &AU)
const override {
105 AU.
addRequired<MachineBlockFrequencyInfoWrapperPass>();
106 AU.
addRequired<MachineBranchProbabilityInfoWrapperPass>();
112 MachineFunctionProperties getRequiredProperties()
const override {
113 return MachineFunctionProperties().setNoPHIs();
119char BranchFolderLegacy::ID = 0;
129 bool EnableTailMerge =
130 !MF.getTarget().requiresStructuredCFG() && this->EnableTailMerge;
134 .getCachedResult<ProfileSummaryAnalysis>(
135 *MF.getFunction().getParent());
138 "ProfileSummaryAnalysis is required for BranchFoldingPass",
false);
142 BranchFolder Folder(EnableTailMerge,
true, MBBFreqInfo, MBPI,
144 if (Folder.OptimizeFunction(MF, MF.getSubtarget().getInstrInfo(),
145 MF.getSubtarget().getRegisterInfo()))
155 TargetPassConfig *PassConfig = &getAnalysis<TargetPassConfig>();
160 MBFIWrapper MBBFreqInfo(
161 getAnalysis<MachineBlockFrequencyInfoWrapperPass>().getMBFI());
163 EnableTailMerge,
true, MBBFreqInfo,
164 getAnalysis<MachineBranchProbabilityInfoWrapperPass>().getMBPI(),
165 &getAnalysis<ProfileSummaryInfoWrapperPass>().getPSI());
174 : EnableHoistCommonCode(CommonHoist), MinCommonTailLength(MinTailLength),
175 MBBFreqInfo(FreqInfo), MBPI(ProbInfo), PSI(PSI) {
178 EnableTailMerge = DefaultEnableTailMerge;
181 EnableTailMerge =
true;
184 EnableTailMerge =
false;
190 assert(
MBB->pred_empty() &&
"MBB must be dead!");
195 while (!
MBB->succ_empty())
196 MBB->removeSuccessor(
MBB->succ_end()-1);
199 TriedMerging.erase(
MBB);
203 if (
MI.shouldUpdateAdditionalCallInfo())
210 EHScopeMembership.erase(
MBB);
217 if (!tii)
return false;
219 TriedMerging.clear();
222 AfterBlockPlacement = AfterPlacement;
228 if (MinCommonTailLength == 0) {
231 : TII->getTailMergeSize(MF);
234 UpdateLiveIns = MRI.
tracksLiveness() && TRI->trackLivenessAfterRegAlloc(MF);
236 MRI.invalidateLiveness();
238 bool MadeChange =
false;
243 bool MadeChangeThisIteration =
true;
244 while (MadeChangeThisIteration) {
245 MadeChangeThisIteration = TailMergeBlocks(MF);
248 if (!AfterBlockPlacement || MadeChangeThisIteration)
249 MadeChangeThisIteration |= OptimizeBranches(MF);
250 if (EnableHoistCommonCode)
251 MadeChangeThisIteration |= HoistCommonCode(MF);
252 MadeChange |= MadeChangeThisIteration;
266 if (!
Op.isJTI())
continue;
269 JTIsLive.
set(
Op.getIndex());
275 for (
unsigned i = 0, e = JTIsLive.
size(); i != e; ++i)
276 if (!JTIsLive.
test(i)) {
290 unsigned Hash =
MI.getOpcode();
291 for (
unsigned i = 0, e =
MI.getNumOperands(); i != e; ++i) {
297 unsigned OperandHash = 0;
298 switch (
Op.getType()) {
300 OperandHash =
Op.getReg().id();
303 OperandHash =
Op.getImm();
306 OperandHash =
Op.getMBB()->getNumber();
311 OperandHash =
Op.getIndex();
317 OperandHash =
Op.getOffset();
323 Hash += ((OperandHash << 3) |
Op.getType()) << (i & 31);
339 return !(
MI.isDebugInstr() ||
MI.isCFIInstruction());
348 while (
I !=
MBB->begin()) {
369 unsigned TailLen = 0;
373 if (MBBI1 == MBB1->
end() || MBBI2 == MBB2->
end())
375 if (!MBBI1->isIdenticalTo(*MBBI2) ||
381 MBBI1->isInlineAsm()) {
399 MachineBasicBlock &OldMBB = *OldInst->getParent();
401 LiveRegs.addLiveOuts(OldMBB);
406 LiveRegs.stepBackward(*
I);
407 }
while (
I != OldInst);
412 for (MachineBasicBlock::RegisterMaskPair
P : NewDest.
liveins()) {
416 "Can only handle full register.");
417 MCRegister
Reg =
P.PhysReg;
418 if (!LiveRegs.available(*MRI,
Reg))
421 BuildMI(OldMBB, OldInst,
DL, TII->get(TargetOpcode::IMPLICIT_DEF),
Reg);
425 TII->ReplaceTailWithBranchTo(OldInst, &NewDest);
432 if (!TII->isLegalToSplitMBBAt(CurMBB, BBI1))
435 MachineFunction &MF = *CurMBB.
getParent();
449 NewMBB->
splice(NewMBB->
end(), &CurMBB, BBI1, CurMBB.
end());
453 if (MachineLoop *
ML = MLI->getLoopFor(&CurMBB))
454 ML->addBasicBlockToLoop(NewMBB, *MLI);
457 MBBFreqInfo.setBlockFreq(NewMBB, MBBFreqInfo.getBlockFreq(&CurMBB));
463 const auto &EHScopeI = EHScopeMembership.find(&CurMBB);
464 if (EHScopeI != EHScopeMembership.end()) {
465 auto n = EHScopeI->second;
466 EHScopeMembership[NewMBB] = n;
477 for (;
I !=
E; ++
I) {
482 else if (
I->mayLoadOrStore())
503 if (
I != MF->
end() && !
TII->analyzeBranch(*CurMBB,
TBB, FBB,
Cond,
true)) {
505 if (
TBB == NextBB && !
Cond.empty() && !FBB) {
506 if (!
TII->reverseBranchCondition(
Cond)) {
507 TII->removeBranch(*CurMBB);
508 TII->insertBranch(*CurMBB, SuccBB,
nullptr,
Cond, dl);
513 TII->insertBranch(*CurMBB, SuccBB,
nullptr,
518BranchFolder::MergePotentialsElt::operator<(
const MergePotentialsElt &o)
const {
519 if (getHash() <
o.getHash())
521 if (getHash() >
o.getHash())
523 if (getBlock()->getNumber() <
o.getBlock()->getNumber())
525 if (getBlock()->getNumber() >
o.getBlock()->getNumber())
536 unsigned NumTerms = 0;
538 if (
I ==
MBB->begin()) {
543 if (!
I->isTerminator())
break;
553 if (!
MBB->succ_empty())
557 return !(
MBB->back().isReturn() ||
MBB->back().isIndirectBranch());
578 unsigned MinCommonTailLength,
unsigned &CommonTailLen,
587 if (!EHScopeMembership.
empty()) {
588 auto EHScope1 = EHScopeMembership.
find(MBB1);
589 assert(EHScope1 != EHScopeMembership.
end());
590 auto EHScope2 = EHScopeMembership.
find(MBB2);
591 assert(EHScope2 != EHScopeMembership.
end());
592 if (EHScope1->second != EHScope2->second)
597 if (CommonTailLen == 0)
601 << CommonTailLen <<
'\n');
611 bool FullBlockTail1 = I1 == MBB1->
begin();
612 bool FullBlockTail2 = I2 == MBB2->
begin();
619 if ((MBB1 == PredBB || MBB2 == PredBB) &&
620 (!AfterPlacement || MBB1->
succ_size() == 1)) {
623 if (CommonTailLen > NumTerms)
632 if (FullBlockTail1 && FullBlockTail2 &&
649 if (AfterPlacement && FullBlockTail1 && FullBlockTail2) {
651 if (!
MBB->succ_empty() && !
MBB->canFallThrough())
655 return (
MBB != &*MF->
begin()) && std::prev(
I)->canFallThrough();
657 if (!BothFallThrough(MBB1) || !BothFallThrough(MBB2))
666 unsigned EffectiveTailLen = CommonTailLen;
667 if (SuccBB && MBB1 != PredBB && MBB2 != PredBB &&
668 (MBB1->
succ_size() == 1 || !AfterPlacement) &&
674 if (EffectiveTailLen >= MinCommonTailLength)
683 return EffectiveTailLen >= 2 && OptForSize &&
684 (FullBlockTail1 || FullBlockTail2);
687unsigned BranchFolder::ComputeSameTails(
unsigned CurHash,
688 unsigned MinCommonTailLength,
689 MachineBasicBlock *SuccBB,
690 MachineBasicBlock *PredBB) {
691 unsigned maxCommonTailLength = 0
U;
694 MPIterator HighestMPIter = std::prev(MergePotentials.end());
695 for (MPIterator CurMPIter = std::prev(MergePotentials.end()),
696 B = MergePotentials.begin();
697 CurMPIter !=
B && CurMPIter->getHash() == CurHash; --CurMPIter) {
698 for (MPIterator
I = std::prev(CurMPIter);
I->getHash() == CurHash; --
I) {
699 unsigned CommonTailLen;
702 CommonTailLen, TrialBBI1, TrialBBI2,
705 AfterBlockPlacement, MBBFreqInfo, PSI)) {
706 if (CommonTailLen > maxCommonTailLength) {
708 maxCommonTailLength = CommonTailLen;
709 HighestMPIter = CurMPIter;
710 SameTails.push_back(SameTailElt(CurMPIter, TrialBBI1));
712 if (HighestMPIter == CurMPIter &&
713 CommonTailLen == maxCommonTailLength)
714 SameTails.push_back(SameTailElt(
I, TrialBBI2));
720 return maxCommonTailLength;
723void BranchFolder::RemoveBlocksWithHash(
unsigned CurHash,
724 MachineBasicBlock *SuccBB,
725 MachineBasicBlock *PredBB,
727 MPIterator CurMPIter,
B;
728 for (CurMPIter = std::prev(MergePotentials.end()),
729 B = MergePotentials.begin();
730 CurMPIter->getHash() == CurHash; --CurMPIter) {
732 MachineBasicBlock *CurMBB = CurMPIter->getBlock();
733 if (SuccBB && CurMBB != PredBB)
734 FixTail(CurMBB, SuccBB, TII, BranchDL);
738 if (CurMPIter->getHash() != CurHash)
740 MergePotentials.erase(CurMPIter, MergePotentials.end());
743bool BranchFolder::CreateCommonTailOnlyBlock(MachineBasicBlock *&PredBB,
744 MachineBasicBlock *SuccBB,
745 unsigned maxCommonTailLength,
746 unsigned &commonTailIndex) {
748 unsigned TimeEstimate = ~0
U;
749 for (
unsigned i = 0, e = SameTails.size(); i != e; ++i) {
751 if (SameTails[i].getBlock() == PredBB) {
758 SameTails[i].getTailStartPos());
759 if (t <= TimeEstimate) {
766 SameTails[commonTailIndex].getTailStartPos();
767 MachineBasicBlock *
MBB = SameTails[commonTailIndex].getBlock();
770 << maxCommonTailLength);
777 MachineBasicBlock *newMBB = SplitMBBAt(*
MBB, BBI, BB);
783 SameTails[commonTailIndex].setBlock(newMBB);
784 SameTails[commonTailIndex].setTailStartPos(newMBB->
begin());
809 unsigned CommonTailLen = 0;
810 for (
auto E =
MBB->end(); MBBIStartPos !=
E; ++MBBIStartPos)
818 while (CommonTailLen--) {
819 assert(
MBBI != MBBIE &&
"Reached BB end within common tail length!");
830 assert(MBBICommon != MBBIECommon &&
831 "Reached BB end within common tail length!");
832 assert(MBBICommon->isIdenticalTo(*
MBBI) &&
"Expected matching MIIs!");
835 if (MBBICommon->mayLoadOrStore())
836 MBBICommon->cloneMergedMemRefs(*
MBB->getParent(), {&*MBBICommon, &*MBBI});
846void BranchFolder::mergeCommonTails(
unsigned commonTailIndex) {
847 MachineBasicBlock *
MBB = SameTails[commonTailIndex].getBlock();
849 std::vector<MachineBasicBlock::iterator> NextCommonInsts(SameTails.size());
850 for (
unsigned int i = 0 ; i != SameTails.size() ; ++i) {
851 if (i != commonTailIndex) {
852 NextCommonInsts[i] = SameTails[i].getTailStartPos();
856 "MBB is not a common tail only block");
860 for (
auto &
MI : *
MBB) {
864 for (
unsigned int i = 0 ; i < NextCommonInsts.size() ; i++) {
865 if (i == commonTailIndex)
868 auto &Pos = NextCommonInsts[i];
869 assert(Pos != SameTails[i].getBlock()->
end() &&
870 "Reached BB end within common tail");
873 assert(Pos != SameTails[i].getBlock()->
end() &&
874 "Reached BB end within common tail");
876 assert(
MI.isIdenticalTo(*Pos) &&
"Expected matching MIIs!");
878 NextCommonInsts[i] = ++Pos;
884 LivePhysRegs NewLiveIns(*TRI);
892 LiveRegs.addLiveOuts(*Pred);
895 if (!LiveRegs.available(*MRI,
Reg))
901 return NewLiveIns.contains(SReg) && !MRI->isReserved(SReg);
906 BuildMI(*Pred, InsertBefore,
DL, TII->get(TargetOpcode::IMPLICIT_DEF),
925bool BranchFolder::TryTailMergeBlocks(MachineBasicBlock *SuccBB,
926 MachineBasicBlock *PredBB,
927 unsigned MinCommonTailLength) {
928 bool MadeChange =
false;
931 dbgs() <<
"\nTryTailMergeBlocks: ";
932 for (
unsigned i = 0, e = MergePotentials.size(); i != e; ++i)
934 << (i ==
e - 1 ?
"" :
", ");
942 dbgs() <<
"Looking for common tails of at least " << MinCommonTailLength
943 <<
" instruction" << (MinCommonTailLength == 1 ?
"" :
"s") <<
'\n';
948#if LLVM_ENABLE_DEBUGLOC_TRACKING_ORIGIN
951 std::sort(MergePotentials.begin(), MergePotentials.end());
957 while (MergePotentials.size() > 1) {
958 unsigned CurHash = MergePotentials.back().getHash();
959 const DebugLoc &BranchDL = MergePotentials.back().getBranchDebugLoc();
963 unsigned maxCommonTailLength = ComputeSameTails(CurHash,
969 if (SameTails.empty()) {
970 RemoveBlocksWithHash(CurHash, SuccBB, PredBB, BranchDL);
978 MachineBasicBlock *EntryBB =
979 &MergePotentials.front().getBlock()->getParent()->front();
980 unsigned commonTailIndex = SameTails.size();
983 if (SameTails.size() == 2 &&
984 SameTails[0].getBlock()->isLayoutSuccessor(SameTails[1].getBlock()) &&
985 SameTails[1].tailIsWholeBlock() && !SameTails[1].getBlock()->isEHPad())
987 else if (SameTails.size() == 2 &&
988 SameTails[1].getBlock()->isLayoutSuccessor(
989 SameTails[0].getBlock()) &&
990 SameTails[0].tailIsWholeBlock() &&
991 !SameTails[0].getBlock()->isEHPad())
996 for (
unsigned i = 0, e = SameTails.size(); i != e; ++i) {
997 MachineBasicBlock *
MBB = SameTails[i].getBlock();
999 SameTails[i].tailIsWholeBlock())
1001 if (
MBB == PredBB) {
1002 commonTailIndex = i;
1005 if (SameTails[i].tailIsWholeBlock())
1006 commonTailIndex = i;
1010 if (commonTailIndex == SameTails.size() ||
1011 (SameTails[commonTailIndex].getBlock() == PredBB &&
1012 !SameTails[commonTailIndex].tailIsWholeBlock())) {
1015 if (!CreateCommonTailOnlyBlock(PredBB, SuccBB,
1016 maxCommonTailLength, commonTailIndex)) {
1017 RemoveBlocksWithHash(CurHash, SuccBB, PredBB, BranchDL);
1022 MachineBasicBlock *
MBB = SameTails[commonTailIndex].getBlock();
1025 setCommonTailEdgeWeights(*
MBB);
1029 mergeCommonTails(commonTailIndex);
1035 for (
unsigned int i=0, e = SameTails.size(); i != e; ++i) {
1036 if (commonTailIndex == i)
1039 << (i == e - 1 ?
"" :
", "));
1041 replaceTailWithBranchTo(SameTails[i].getTailStartPos(), *
MBB);
1043 MergePotentials.erase(SameTails[i].getMPIter());
1053bool BranchFolder::TailMergeBlocks(MachineFunction &MF) {
1054 bool MadeChange =
false;
1055 if (!EnableTailMerge)
1060 MergePotentials.clear();
1061 for (MachineBasicBlock &
MBB : MF) {
1072 for (
const MergePotentialsElt &Elt : MergePotentials)
1073 TriedMerging.insert(Elt.getBlock());
1076 if (MergePotentials.size() >= 2)
1077 MadeChange |= TryTailMergeBlocks(
nullptr,
nullptr, MinCommonTailLength);
1100 if (
I->pred_size() < 2)
continue;
1101 SmallPtrSet<MachineBasicBlock *, 8> UniquePreds;
1102 MachineBasicBlock *IBB = &*
I;
1103 MachineBasicBlock *PredBB = &*std::prev(
I);
1104 MergePotentials.clear();
1117 if (AfterBlockPlacement && MLI) {
1118 ML = MLI->getLoopFor(IBB);
1119 if (
ML && IBB ==
ML->getHeader())
1123 for (MachineBasicBlock *PBB :
I->predecessors()) {
1127 if (TriedMerging.count(PBB))
1135 if (!UniquePreds.
insert(PBB).second)
1140 if (PBB->hasEHPadSuccessor() || PBB->mayHaveInlineAsmBr())
1146 if (AfterBlockPlacement && MLI)
1147 if (
ML != MLI->getLoopFor(PBB))
1150 MachineBasicBlock *
TBB =
nullptr, *FBB =
nullptr;
1152 if (!TII->analyzeBranch(*PBB,
TBB, FBB,
Cond,
true)) {
1156 if (!
Cond.empty() &&
TBB == IBB) {
1157 if (TII->reverseBranchCondition(NewCond))
1161 auto Next = ++PBB->getIterator();
1162 if (
Next != MF.end())
1168 DebugLoc dl = PBB->findBranchDebugLoc();
1169 if (
TBB && (
Cond.empty() || FBB)) {
1170 TII->removeBranch(*PBB);
1173 TII->insertBranch(*PBB, (
TBB == IBB) ? FBB :
TBB,
nullptr,
1177 MergePotentials.push_back(
1185 for (MergePotentialsElt &Elt : MergePotentials)
1186 TriedMerging.insert(Elt.getBlock());
1188 if (MergePotentials.size() >= 2)
1189 MadeChange |= TryTailMergeBlocks(IBB, PredBB, MinCommonTailLength);
1193 PredBB = &*std::prev(
I);
1194 if (MergePotentials.size() == 1 &&
1195 MergePotentials.begin()->getBlock() != PredBB)
1196 FixTail(MergePotentials.begin()->getBlock(), IBB, TII,
1197 MergePotentials.begin()->getBranchDebugLoc());
1203void BranchFolder::setCommonTailEdgeWeights(MachineBasicBlock &TailMBB) {
1205 BlockFrequency AccumulatedMBBFreq;
1210 for (
const auto &Src : SameTails) {
1211 const MachineBasicBlock *SrcMBB = Src.getBlock();
1212 BlockFrequency BlockFreq = MBBFreqInfo.getBlockFreq(SrcMBB);
1213 AccumulatedMBBFreq += BlockFreq;
1220 auto EdgeFreq = EdgeFreqLs.begin();
1223 SuccI != SuccE; ++SuccI, ++EdgeFreq)
1224 *EdgeFreq += BlockFreq * MBPI.getEdgeProbability(SrcMBB, *SuccI);
1227 MBBFreqInfo.setBlockFreq(&TailMBB, AccumulatedMBBFreq);
1233 std::accumulate(EdgeFreqLs.begin(), EdgeFreqLs.end(), BlockFrequency(0))
1235 auto EdgeFreq = EdgeFreqLs.begin();
1237 if (SumEdgeFreq > 0) {
1239 SuccI != SuccE; ++SuccI, ++EdgeFreq) {
1241 EdgeFreq->getFrequency(), SumEdgeFreq);
1251bool BranchFolder::OptimizeBranches(MachineFunction &MF) {
1252 bool MadeChange =
false;
1259 for (MachineBasicBlock &
MBB :
1261 MadeChange |= OptimizeBlock(&
MBB);
1266 RemoveDeadBlock(&
MBB);
1278 return MBB->getFirstNonDebugInstr(
true) ==
MBB->end();
1286 return I->isBranch();
1295 assert(MBB1 && MBB2 &&
"Unknown MachineBasicBlock");
1303 if (MBB1I == MBB1->
end() || MBB2I == MBB2->
end())
1311 return MBB2I->isCall() && !MBB1I->isCall();
1319 if (
MI.isDebugInstr()) {
1320 TII->duplicate(PredMBB, InsertBefore,
MI);
1321 LLVM_DEBUG(
dbgs() <<
"Copied debug entity from empty block to pred: "
1331 if (
MI.isDebugInstr()) {
1332 TII->duplicate(SuccMBB, InsertBefore,
MI);
1333 LLVM_DEBUG(
dbgs() <<
"Copied debug entity from empty block to succ: "
1361bool BranchFolder::OptimizeBlock(MachineBasicBlock *
MBB) {
1362 bool MadeChange =
false;
1370 bool SameEHScope =
true;
1371 if (!EHScopeMembership.empty() && FallThrough != MF.
end()) {
1372 auto MBBEHScope = EHScopeMembership.find(
MBB);
1373 assert(MBBEHScope != EHScopeMembership.end());
1374 auto FallThroughEHScope = EHScopeMembership.find(&*FallThrough);
1375 assert(FallThroughEHScope != EHScopeMembership.end());
1376 SameEHScope = MBBEHScope->second == FallThroughEHScope->second;
1381 MachineBasicBlock *CurTBB =
nullptr, *CurFBB =
nullptr;
1383 bool CurUnAnalyzable =
1384 TII->analyzeBranch(*
MBB, CurTBB, CurFBB, CurCond,
true);
1396 if (FallThrough == MF.
end()) {
1398 }
else if (FallThrough->isEHPad()) {
1414 if (*SI != &*FallThrough && !FallThrough->isSuccessor(*SI)) {
1415 assert((*SI)->isEHPad() &&
"Bad CFG");
1416 FallThrough->copySuccessor(
MBB, SI);
1421 MJTI->ReplaceMBBInJumpTables(
MBB, &*FallThrough);
1431 MachineBasicBlock *PriorTBB =
nullptr, *PriorFBB =
nullptr;
1433 bool PriorUnAnalyzable =
1434 TII->analyzeBranch(PrevBB, PriorTBB, PriorFBB, PriorCond,
true);
1435 if (!PriorUnAnalyzable) {
1439 if (PriorTBB && PriorTBB == PriorFBB) {
1441 TII->removeBranch(PrevBB);
1443 if (PriorTBB !=
MBB)
1444 TII->insertBranch(PrevBB, PriorTBB,
nullptr, PriorCond, Dl);
1447 goto ReoptimizeBlock;
1461 <<
"From MBB: " << *
MBB);
1463 if (!PrevBB.
empty()) {
1469 while (PrevBBIter != PrevBB.
begin() && MBBIter !=
MBB->
end()
1470 && PrevBBIter->isDebugInstr() && MBBIter->isDebugInstr()) {
1471 if (!MBBIter->isIdenticalTo(*PrevBBIter))
1473 MachineInstr &DuplicateDbg = *MBBIter;
1474 ++MBBIter; -- PrevBBIter;
1488 if (PriorTBB ==
MBB && !PriorFBB) {
1489 TII->removeBranch(PrevBB);
1492 goto ReoptimizeBlock;
1497 if (PriorFBB ==
MBB) {
1499 TII->removeBranch(PrevBB);
1500 TII->insertBranch(PrevBB, PriorTBB,
nullptr, PriorCond, Dl);
1503 goto ReoptimizeBlock;
1509 if (PriorTBB ==
MBB) {
1511 if (!TII->reverseBranchCondition(NewPriorCond)) {
1513 TII->removeBranch(PrevBB);
1514 TII->insertBranch(PrevBB, PriorFBB,
nullptr, NewPriorCond, Dl);
1517 goto ReoptimizeBlock;
1532 bool DoTransform =
true;
1539 if (FallThrough == --MF.
end() &&
1541 DoTransform =
false;
1546 if (!TII->reverseBranchCondition(NewPriorCond)) {
1548 <<
"To make fallthrough to: " << *PriorTBB <<
"\n");
1551 TII->removeBranch(PrevBB);
1552 TII->insertBranch(PrevBB,
MBB,
nullptr, NewPriorCond, Dl);
1566 if (TII->isUnconditionalTailCall(TailCall)) {
1569 MachineBasicBlock *PredTBB =
nullptr, *PredFBB =
nullptr;
1571 bool PredAnalyzable =
1572 !TII->analyzeBranch(*Pred, PredTBB, PredFBB, PredCond,
true);
1575 if (PredAnalyzable && !PredCond.
empty() && PredTBB ==
MBB &&
1576 PredTBB != PredFBB) {
1580 if (TII->canMakeTailCallConditional(PredCond, TailCall)) {
1584 TII->replaceBranchWithTailCall(*Pred, PredCond, TailCall);
1594 if (!PredsChanged.
empty()) {
1595 NumTailCalls += PredsChanged.
size();
1596 for (
auto &Pred : PredsChanged)
1604 if (!CurUnAnalyzable) {
1610 if (CurTBB && CurFBB && CurFBB ==
MBB && CurTBB !=
MBB) {
1612 if (!TII->reverseBranchCondition(NewCond)) {
1614 TII->removeBranch(*
MBB);
1615 TII->insertBranch(*
MBB, CurFBB, CurTBB, NewCond, Dl);
1618 goto ReoptimizeBlock;
1624 if (CurTBB && CurCond.
empty() && !CurFBB &&
1631 TII->removeBranch(*
MBB);
1647 if (PredHasNoFallThrough || !PriorUnAnalyzable ||
1652 PriorTBB !=
MBB && PriorFBB !=
MBB) {
1655 "Bad branch analysis");
1658 assert(!PriorFBB &&
"Machine CFG out of date!");
1662 TII->removeBranch(PrevBB);
1663 TII->insertBranch(PrevBB, PriorTBB, PriorFBB, PriorCond, PrevDl);
1668 bool DidChange =
false;
1669 bool HasBranchToSelf =
false;
1675 HasBranchToSelf =
true;
1685 assert((*SI)->isEHPad() &&
"Bad CFG");
1691 MachineBasicBlock *NewCurTBB =
nullptr, *NewCurFBB =
nullptr;
1693 bool NewCurUnAnalyzable = TII->analyzeBranch(
1694 *PMBB, NewCurTBB, NewCurFBB, NewCurCond,
true);
1695 if (!NewCurUnAnalyzable && NewCurTBB && NewCurTBB == NewCurFBB) {
1697 TII->removeBranch(*PMBB);
1699 TII->insertBranch(*PMBB, NewCurTBB,
nullptr, NewCurCond,
1709 MJTI->ReplaceMBBInJumpTables(
MBB, CurTBB);
1713 if (!HasBranchToSelf)
return MadeChange;
1719 TII->insertBranch(*
MBB, CurTBB,
nullptr, CurCond, Dl);
1737 MachineBasicBlock *PredTBB =
nullptr, *PredFBB =
nullptr;
1740 !TII->analyzeBranch(*PredBB, PredTBB, PredFBB, PredCond,
true) &&
1741 (PredTBB ==
MBB || PredFBB ==
MBB) &&
1742 (!CurFallsThru || !CurTBB || !CurFBB) &&
1757 TII->insertBranch(*
MBB, NextBB,
nullptr, CurCond,
DebugLoc());
1761 goto ReoptimizeBlock;
1766 if (!CurFallsThru) {
1769 if (!CurUnAnalyzable) {
1770 for (MachineBasicBlock *SuccBB : {CurFBB, CurTBB}) {
1779 if (SuccBB !=
MBB && &*SuccPrev !=
MBB &&
1780 !SuccPrev->canFallThrough()) {
1783 goto ReoptimizeBlock;
1809 MachineBasicBlock *PrevTBB =
nullptr, *PrevFBB =
nullptr;
1812 if (FallThrough != MF.
end() && !FallThrough->isEHPad() &&
1813 !FallThrough->isInlineAsmBrIndirectTarget() &&
1814 !TII->analyzeBranch(PrevBB, PrevTBB, PrevFBB, PrevCond,
true) &&
1830bool BranchFolder::HoistCommonCode(MachineFunction &MF) {
1831 bool MadeChange =
false;
1833 MadeChange |= HoistCommonCodeInSuccs(&
MBB);
1843 if (SuccBB != TrueBB)
1848template <
class Container>
1851 if (
Reg.isPhysical()) {
1873 if (!
TII->isUnpredicatedTerminator(*
Loc))
1914 if (!MO.isReg() || MO.isUse())
1935 bool DontMoveAcrossStore =
true;
1936 if (!PI->isSafeToMove(DontMoveAcrossStore) ||
TII->isPredicated(*PI))
1951 if (
Reg.isPhysical()) {
1963bool BranchFolder::HoistCommonCodeInSuccs(MachineBasicBlock *
MBB) {
1964 MachineBasicBlock *
TBB =
nullptr, *FBB =
nullptr;
1982 SmallSet<Register, 4>
Uses, Defs;
1988 bool HasDups =
false;
1989 SmallSet<Register, 4> ActiveDefsSet, AllDefsSet;
1995 while (TIB != TIE && FIB != FIE) {
1999 if (TIB == TIE || FIB == FIE)
2005 if (TII->isPredicated(*TIB))
2009 if (!TII->isSafeToMove(*TIB,
TBB, MF))
2014 for (MachineOperand &MO : TIB->operands()) {
2016 if (MO.isRegMask()) {
2033 if (Defs.
count(
Reg) && !MO.isDead()) {
2048 }
else if (!ActiveDefsSet.
count(
Reg)) {
2055 if (MO.isKill() &&
Uses.count(
Reg))
2058 MO.setIsKill(
false);
2064 bool DontMoveAcrossStore =
true;
2065 if (!TIB->isSafeToMove(DontMoveAcrossStore))
2069 for (
const MachineOperand &MO : TIB->all_uses()) {
2079 for (MCRegAliasIterator AI(
Reg, TRI,
true); AI.isValid(); ++AI)
2080 ActiveDefsSet.
erase(*AI);
2087 for (
const MachineOperand &MO : TIB->all_defs()) {
2114 MachineInstrBuilder MIRBuilder(*
MBB->
getParent(), Loc);
2116 assert(DI->isDebugInstr() &&
"Expected a debug instruction");
2117 if (DI->isDebugRef()) {
2118 const TargetInstrInfo *TII =
2120 const MCInstrDesc &DBGV = TII->
get(TargetOpcode::DBG_VALUE);
2122 DI->getDebugVariable(), DI->getDebugExpression());
2127 if (DI->isDebugPHI()) {
2128 DI->eraseFromParent();
2132 if (!DI->isDebugLabel())
2133 DI->setDebugValueUndef();
2134 DI->moveBefore(&*Loc);
2146 while (FI != FE && FI->isDebugInstr())
2147 HoistAndKillDbgInstr(FI++);
2150 if (TI->isDebugInstr()) {
2151 HoistAndKillDbgInstr(TI);
2156 assert(FI != FE &&
"Unexpected end of FBB range");
2159 assert(!TI->isPseudoProbe() &&
"Unexpected pseudo probe in range");
2163 "Expected non-debug lockstep");
2172 TI->moveBefore(&*Loc);
2177 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 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 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 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 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)
const SmallVectorImpl< MachineOperand > MachineBasicBlock * TBB
const SmallVectorImpl< MachineOperand > & Cond
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()
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 LLVM_ABI DILocation * getMergedLocation(DILocation *LocA, DILocation *LocB)
Attempts to merge LocA and LocB into a single location; see DebugLoc::getMergedLocation for more deta...
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 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.
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()
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
@ 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.
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
void array_pod_sort(IteratorTy Start, IteratorTy End)
array_pod_sort - This sorts an array with the specified start and end extent.
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.
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()