96#define DEBUG_TYPE "simplifycfg"
99 "simplifycfg-require-and-preserve-domtree",
cl::Hidden,
102 "Temporary development switch used to gradually uplift SimplifyCFG "
103 "into preserving DomTree,"));
112 "Control the amount of phi node folding to perform (default = 2)"));
116 cl::desc(
"Control the maximal total instruction cost that we are willing "
117 "to speculatively execute to fold a 2-entry PHI node into a "
118 "select (default = 4)"));
122 cl::desc(
"Hoist common instructions up to the parent block"));
126 cl::desc(
"Hoist loads if the target supports conditional faulting"));
130 cl::desc(
"Hoist stores if the target supports conditional faulting"));
134 cl::desc(
"Control the maximal conditional load/store that we are willing "
135 "to speculatively execute to eliminate conditional branch "
141 cl::desc(
"Allow reordering across at most this many "
142 "instructions when hoisting"));
146 cl::desc(
"Sink common instructions down to the end block"));
150 cl::desc(
"Hoist conditional stores if an unconditional store precedes"));
154 cl::desc(
"Hoist conditional stores even if an unconditional store does not "
155 "precede - hoist multiple conditional stores into a single "
156 "predicated store"));
160 cl::desc(
"When merging conditional stores, do so even if the resultant "
161 "basic blocks are unlikely to be if-converted as a result"));
165 cl::desc(
"Allow exactly one expensive instruction to be speculatively "
170 cl::desc(
"Limit maximum recursion depth when calculating costs of "
171 "speculatively executed instructions"));
176 cl::desc(
"Max size of a block which is still considered "
177 "small enough to thread through"));
183 cl::desc(
"Maximum cost of combining conditions when "
184 "folding branches"));
187 "simplifycfg-branch-fold-common-dest-vector-multiplier",
cl::Hidden,
189 cl::desc(
"Multiplier to apply to threshold when determining whether or not "
190 "to fold branch to common destination when vector operations are "
195 cl::desc(
"Allow SimplifyCFG to merge invokes together when appropriate"));
199 cl::desc(
"Limit cases to analyze when converting a switch to select"));
203 cl::desc(
"Limit number of blocks a define in a threaded block is allowed "
208STATISTIC(NumBitMaps,
"Number of switch instructions turned into bitmaps");
210 "Number of switch instructions turned into linear mapping");
212 "Number of switch instructions turned into lookup tables");
214 NumLookupTablesHoles,
215 "Number of switch instructions turned into lookup tables (holes checked)");
216STATISTIC(NumTableCmpReuses,
"Number of reused switch table lookup compares");
218 "Number of value comparisons folded into predecessor basic blocks");
220 "Number of branches folded into predecessor basic block");
223 "Number of common instruction 'blocks' hoisted up to the begin block");
225 "Number of common instructions hoisted up to the begin block");
227 "Number of common instruction 'blocks' sunk down to the end block");
229 "Number of common instructions sunk down to the end block");
230STATISTIC(NumSpeculations,
"Number of speculative executed instructions");
232 "Number of invokes with empty resume blocks simplified into calls");
233STATISTIC(NumInvokesMerged,
"Number of invokes that were merged together");
234STATISTIC(NumInvokeSetsFormed,
"Number of invoke sets that were formed");
241using SwitchCaseResultVectorTy =
250struct ValueEqualityComparisonCase {
262 bool operator==(BasicBlock *RHSDest)
const {
return Dest == RHSDest; }
265class SimplifyCFGOpt {
266 const TargetTransformInfo &TTI;
268 const DataLayout &DL;
270 const SimplifyCFGOptions &Options;
273 Value *isValueEqualityComparison(Instruction *TI);
275 Instruction *TI, std::vector<ValueEqualityComparisonCase> &Cases);
276 bool simplifyEqualityComparisonWithOnlyPredecessor(Instruction *TI,
279 bool performValueComparisonIntoPredecessorFolding(Instruction *TI,
Value *&CV,
282 bool foldValueComparisonIntoPredecessors(Instruction *TI,
285 bool simplifyResume(ResumeInst *RI,
IRBuilder<> &Builder);
286 bool simplifySingleResume(ResumeInst *RI);
287 bool simplifyCommonResume(ResumeInst *RI);
288 bool simplifyCleanupReturn(CleanupReturnInst *RI);
289 bool simplifyUnreachable(UnreachableInst *UI);
290 bool simplifySwitch(SwitchInst *SI,
IRBuilder<> &Builder);
291 bool simplifyDuplicateSwitchArms(SwitchInst *SI, DomTreeUpdater *DTU);
292 bool simplifyIndirectBr(IndirectBrInst *IBI);
293 bool simplifyBranch(BranchInst *Branch,
IRBuilder<> &Builder);
294 bool simplifyUncondBranch(BranchInst *BI,
IRBuilder<> &Builder);
295 bool simplifyCondBranch(BranchInst *BI,
IRBuilder<> &Builder);
296 bool foldCondBranchOnValueKnownInPredecessor(BranchInst *BI);
298 bool tryToSimplifyUncondBranchWithICmpInIt(ICmpInst *ICI,
301 bool hoistCommonCodeFromSuccessors(Instruction *TI,
bool AllInstsEqOnly);
302 bool hoistSuccIdenticalTerminatorToSwitchOrIf(
303 Instruction *TI, Instruction *I1,
304 SmallVectorImpl<Instruction *> &OtherSuccTIs);
305 bool speculativelyExecuteBB(BranchInst *BI, BasicBlock *ThenBB);
306 bool simplifyTerminatorOnSelect(Instruction *OldTerm,
Value *
Cond,
307 BasicBlock *TrueBB, BasicBlock *FalseBB,
308 uint32_t TrueWeight, uint32_t FalseWeight);
309 bool simplifyBranchOnICmpChain(BranchInst *BI,
IRBuilder<> &Builder,
310 const DataLayout &DL);
311 bool simplifySwitchOnSelect(SwitchInst *SI, SelectInst *
Select);
312 bool simplifyIndirectBrOnSelect(IndirectBrInst *IBI, SelectInst *SI);
313 bool turnSwitchRangeIntoICmp(SwitchInst *SI,
IRBuilder<> &Builder);
316 SimplifyCFGOpt(
const TargetTransformInfo &TTI, DomTreeUpdater *DTU,
318 const SimplifyCFGOptions &Opts)
319 : TTI(TTI), DTU(DTU), DL(DL), LoopHeaders(LoopHeaders), Options(Opts) {
320 assert((!DTU || !DTU->hasPostDomTree()) &&
321 "SimplifyCFG is not yet capable of maintaining validity of a "
322 "PostDomTree, so don't ask for it.");
325 bool simplifyOnce(BasicBlock *BB);
326 bool run(BasicBlock *BB);
329 bool requestResimplify() {
339isSelectInRoleOfConjunctionOrDisjunction(
const SelectInst *
SI) {
359 "Only for a pair of incoming blocks at the time!");
365 Value *IV0 = PN.getIncomingValueForBlock(IncomingBlocks[0]);
366 Value *IV1 = PN.getIncomingValueForBlock(IncomingBlocks[1]);
369 if (EquivalenceSet && EquivalenceSet->contains(IV0) &&
370 EquivalenceSet->contains(IV1))
393 if (!SI1Succs.
count(Succ))
399 FailBlocks->insert(Succ);
415 PN.addIncoming(PN.getIncomingValueForBlock(ExistPred), NewPred);
417 if (
auto *MPhi = MSSAU->getMemorySSA()->getMemoryAccess(Succ))
418 MPhi->addIncoming(MPhi->getIncomingValueForBlock(ExistPred), NewPred);
480 if (AggressiveInsts.
count(
I))
496 ZeroCostInstructions.
insert(OverflowInst);
498 }
else if (!ZeroCostInstructions.
contains(
I))
514 for (
Use &
Op :
I->operands())
516 TTI, AC, ZeroCostInstructions,
Depth + 1))
533 if (
DL.hasUnstableRepresentation(V->getType()))
542 return ConstantInt::get(IntPtrTy, 0);
547 if (CE->getOpcode() == Instruction::IntToPtr)
571struct ConstantComparesGatherer {
572 const DataLayout &DL;
575 Value *CompValue =
nullptr;
578 Value *Extra =
nullptr;
584 unsigned UsedICmps = 0;
590 bool IgnoreFirstMatch =
false;
591 bool MultipleMatches =
false;
594 ConstantComparesGatherer(Instruction *
Cond,
const DataLayout &DL) : DL(DL) {
596 if (CompValue || !MultipleMatches)
601 IgnoreFirstMatch =
true;
605 ConstantComparesGatherer(
const ConstantComparesGatherer &) =
delete;
606 ConstantComparesGatherer &
607 operator=(
const ConstantComparesGatherer &) =
delete;
612 bool setValueOnce(
Value *NewVal) {
613 if (IgnoreFirstMatch) {
614 IgnoreFirstMatch =
false;
617 if (CompValue && CompValue != NewVal) {
618 MultipleMatches =
true;
632 bool matchInstruction(Instruction *
I,
bool isEQ) {
639 if (!setValueOnce(Val))
659 if (ICI->
getPredicate() == (isEQ ? ICmpInst::ICMP_EQ : ICmpInst::ICMP_NE)) {
703 if (
Mask.isPowerOf2() && (
C->getValue() & ~Mask) ==
C->getValue()) {
705 if (!setValueOnce(RHSVal))
710 ConstantInt::get(
C->getContext(),
711 C->getValue() | Mask));
726 if (
Mask.isPowerOf2() && (
C->getValue() | Mask) ==
C->getValue()) {
728 if (!setValueOnce(RHSVal))
732 Vals.push_back(ConstantInt::get(
C->getContext(),
733 C->getValue() & ~Mask));
754 Value *CandidateVal =
I->getOperand(0);
757 CandidateVal = RHSVal;
772 if (!setValueOnce(CandidateVal))
777 Vals.push_back(ConstantInt::get(
I->getContext(), Tmp));
788 void gather(
Value *V) {
797 SmallVector<Value *, 8> DFT{Op0, Op1};
798 SmallPtrSet<Value *, 8> Visited{
V, Op0, Op1};
800 while (!DFT.
empty()) {
807 if (Visited.
insert(Op1).second)
809 if (Visited.
insert(Op0).second)
816 if (matchInstruction(
I, IsEq))
843 if (BI->isConditional())
861 if (!
SI->getParent()->hasNPredecessorsOrMore(128 /
SI->getNumSuccessors()))
862 CV =
SI->getCondition();
864 if (BI->isConditional() && BI->getCondition()->hasOneUse()) {
869 if (Trunc->hasNoUnsignedWrap())
870 CV = Trunc->getOperand(0);
877 Value *
Ptr = PTII->getPointerOperand();
878 if (
DL.hasUnstableRepresentation(
Ptr->getType()))
880 if (PTII->getType() ==
DL.getIntPtrType(
Ptr->getType()))
889BasicBlock *SimplifyCFGOpt::getValueEqualityComparisonCases(
890 Instruction *TI, std::vector<ValueEqualityComparisonCase> &Cases) {
892 Cases.reserve(
SI->getNumCases());
893 for (
auto Case :
SI->cases())
894 Cases.push_back(ValueEqualityComparisonCase(Case.getCaseValue(),
895 Case.getCaseSuccessor()));
896 return SI->getDefaultDest();
901 ICmpInst::Predicate Pred;
907 Pred = ICmpInst::ICMP_NE;
912 Cases.push_back(ValueEqualityComparisonCase(
C, Succ));
920 std::vector<ValueEqualityComparisonCase> &Cases) {
926 std::vector<ValueEqualityComparisonCase> &C2) {
927 std::vector<ValueEqualityComparisonCase> *V1 = &C1, *V2 = &C2;
930 if (V1->size() > V2->size())
935 if (V1->size() == 1) {
938 for (
const ValueEqualityComparisonCase &
VECC : *V2)
939 if (TheVal ==
VECC.Value)
946 unsigned i1 = 0, i2 = 0, e1 = V1->size(), e2 = V2->size();
947 while (i1 != e1 && i2 != e2) {
963bool SimplifyCFGOpt::simplifyEqualityComparisonWithOnlyPredecessor(
964 Instruction *TI, BasicBlock *Pred,
IRBuilder<> &Builder) {
969 Value *ThisVal = isValueEqualityComparison(TI);
970 assert(ThisVal &&
"This isn't a value comparison!!");
971 if (ThisVal != PredVal)
978 std::vector<ValueEqualityComparisonCase> PredCases;
980 getValueEqualityComparisonCases(Pred->
getTerminator(), PredCases);
984 std::vector<ValueEqualityComparisonCase> ThisCases;
985 BasicBlock *ThisDef = getValueEqualityComparisonCases(TI, ThisCases);
1000 assert(ThisCases.size() == 1 &&
"Branch can only have one case!");
1006 ThisCases[0].Dest->removePredecessor(PredDef);
1009 <<
"Through successor TI: " << *TI <<
"Leaving: " << *NI
1016 {{DominatorTree::Delete, PredDef, ThisCases[0].Dest}});
1023 SmallPtrSet<Constant *, 16> DeadCases;
1024 for (
const ValueEqualityComparisonCase &Case : PredCases)
1025 DeadCases.
insert(Case.Value);
1028 <<
"Through successor TI: " << *TI);
1030 SmallDenseMap<BasicBlock *, int, 8> NumPerSuccessorCases;
1033 auto *
Successor = i->getCaseSuccessor();
1036 if (DeadCases.
count(i->getCaseValue())) {
1045 std::vector<DominatorTree::UpdateType> Updates;
1046 for (
const std::pair<BasicBlock *, int> &
I : NumPerSuccessorCases)
1048 Updates.push_back({DominatorTree::Delete, PredDef,
I.first});
1058 ConstantInt *TIV =
nullptr;
1060 for (
const auto &[
Value, Dest] : PredCases)
1066 assert(TIV &&
"No edge from pred to succ?");
1071 for (
const auto &[
Value, Dest] : ThisCases)
1079 TheRealDest = ThisDef;
1081 SmallPtrSet<BasicBlock *, 2> RemovedSuccs;
1086 if (Succ != CheckEdge) {
1087 if (Succ != TheRealDest)
1088 RemovedSuccs.
insert(Succ);
1091 CheckEdge =
nullptr;
1098 <<
"Through successor TI: " << *TI <<
"Leaving: " << *NI
1103 SmallVector<DominatorTree::UpdateType, 2> Updates;
1105 for (
auto *RemovedSucc : RemovedSuccs)
1106 Updates.
push_back({DominatorTree::Delete, TIBB, RemovedSucc});
1117struct ConstantIntOrdering {
1118 bool operator()(
const ConstantInt *
LHS,
const ConstantInt *
RHS)
const {
1119 return LHS->getValue().ult(
RHS->getValue());
1131 return LHS->getValue().ult(
RHS->getValue()) ? 1 : -1;
1140 assert(MD &&
"Invalid branch-weight metadata");
1165 if (BonusInst.isTerminator())
1195 NewBonusInst->
takeName(&BonusInst);
1196 BonusInst.setName(NewBonusInst->
getName() +
".old");
1197 VMap[&BonusInst] = NewBonusInst;
1206 assert(UI->getParent() == BB && BonusInst.comesBefore(UI) &&
1207 "If the user is not a PHI node, then it should be in the same "
1208 "block as, and come after, the original bonus instruction.");
1212 if (PN->getIncomingBlock(U) == BB)
1216 assert(PN->getIncomingBlock(U) == PredBlock &&
1217 "Not in block-closed SSA form?");
1218 U.set(NewBonusInst);
1228 if (!PredDL->getAtomGroup() &&
DL &&
DL->getAtomGroup() &&
1229 PredDL.isSameSourceLocation(
DL)) {
1236bool SimplifyCFGOpt::performValueComparisonIntoPredecessorFolding(
1244 std::vector<ValueEqualityComparisonCase> BBCases;
1245 BasicBlock *BBDefault = getValueEqualityComparisonCases(TI, BBCases);
1247 std::vector<ValueEqualityComparisonCase> PredCases;
1248 BasicBlock *PredDefault = getValueEqualityComparisonCases(PTI, PredCases);
1253 SmallMapVector<BasicBlock *, int, 8> NewSuccessors;
1256 SmallVector<uint64_t, 8> Weights;
1260 if (PredHasWeights) {
1263 if (Weights.
size() != 1 + PredCases.size())
1264 PredHasWeights = SuccHasWeights =
false;
1265 }
else if (SuccHasWeights)
1269 Weights.
assign(1 + PredCases.size(), 1);
1271 SmallVector<uint64_t, 8> SuccWeights;
1272 if (SuccHasWeights) {
1275 if (SuccWeights.
size() != 1 + BBCases.size())
1276 PredHasWeights = SuccHasWeights =
false;
1277 }
else if (PredHasWeights)
1278 SuccWeights.
assign(1 + BBCases.size(), 1);
1280 if (PredDefault == BB) {
1283 std::set<ConstantInt *, ConstantIntOrdering> PTIHandled;
1284 for (
unsigned i = 0, e = PredCases.size(); i != e; ++i)
1285 if (PredCases[i].Dest != BB)
1286 PTIHandled.insert(PredCases[i].
Value);
1289 std::swap(PredCases[i], PredCases.back());
1291 if (PredHasWeights || SuccHasWeights) {
1293 Weights[0] += Weights[i + 1];
1298 PredCases.pop_back();
1304 if (PredDefault != BBDefault) {
1306 if (DTU && PredDefault != BB)
1307 Updates.
push_back({DominatorTree::Delete, Pred, PredDefault});
1308 PredDefault = BBDefault;
1309 ++NewSuccessors[BBDefault];
1312 unsigned CasesFromPred = Weights.
size();
1313 uint64_t ValidTotalSuccWeight = 0;
1314 for (
unsigned i = 0, e = BBCases.size(); i != e; ++i)
1315 if (!PTIHandled.count(BBCases[i].Value) && BBCases[i].Dest != BBDefault) {
1316 PredCases.push_back(BBCases[i]);
1317 ++NewSuccessors[BBCases[i].Dest];
1318 if (SuccHasWeights || PredHasWeights) {
1322 Weights.
push_back(Weights[0] * SuccWeights[i + 1]);
1323 ValidTotalSuccWeight += SuccWeights[i + 1];
1327 if (SuccHasWeights || PredHasWeights) {
1328 ValidTotalSuccWeight += SuccWeights[0];
1330 for (
unsigned i = 1; i < CasesFromPred; ++i)
1331 Weights[i] *= ValidTotalSuccWeight;
1333 Weights[0] *= SuccWeights[0];
1339 std::set<ConstantInt *, ConstantIntOrdering> PTIHandled;
1340 std::map<ConstantInt *, uint64_t> WeightsForHandled;
1341 for (
unsigned i = 0, e = PredCases.size(); i != e; ++i)
1342 if (PredCases[i].Dest == BB) {
1343 PTIHandled.insert(PredCases[i].
Value);
1345 if (PredHasWeights || SuccHasWeights) {
1346 WeightsForHandled[PredCases[i].Value] = Weights[i + 1];
1351 std::swap(PredCases[i], PredCases.back());
1352 PredCases.pop_back();
1359 for (
const ValueEqualityComparisonCase &Case : BBCases)
1360 if (PTIHandled.count(Case.Value)) {
1362 if (PredHasWeights || SuccHasWeights)
1363 Weights.
push_back(WeightsForHandled[Case.Value]);
1364 PredCases.push_back(Case);
1365 ++NewSuccessors[Case.Dest];
1366 PTIHandled.erase(Case.Value);
1371 for (ConstantInt *
I : PTIHandled) {
1372 if (PredHasWeights || SuccHasWeights)
1374 PredCases.push_back(ValueEqualityComparisonCase(
I, BBDefault));
1375 ++NewSuccessors[BBDefault];
1382 SmallPtrSet<BasicBlock *, 2> SuccsOfPred;
1387 for (
const std::pair<BasicBlock *, int /*Num*/> &NewSuccessor :
1389 for (
auto I :
seq(NewSuccessor.second)) {
1393 if (DTU && !SuccsOfPred.
contains(NewSuccessor.first))
1394 Updates.
push_back({DominatorTree::Insert, Pred, NewSuccessor.first});
1401 "Should not end up here with unstable pointers");
1407 SwitchInst *NewSI = Builder.
CreateSwitch(CV, PredDefault, PredCases.size());
1409 for (ValueEqualityComparisonCase &V : PredCases)
1412 if (PredHasWeights || SuccHasWeights)
1424 if (!InfLoopBlock) {
1432 {DominatorTree::Insert, InfLoopBlock, InfLoopBlock});
1439 Updates.
push_back({DominatorTree::Insert, Pred, InfLoopBlock});
1441 Updates.
push_back({DominatorTree::Delete, Pred, BB});
1446 ++NumFoldValueComparisonIntoPredecessors;
1454bool SimplifyCFGOpt::foldValueComparisonIntoPredecessors(Instruction *TI,
1457 Value *CV = isValueEqualityComparison(TI);
1458 assert(CV &&
"Not a comparison?");
1463 while (!Preds.empty()) {
1472 Value *PCV = isValueEqualityComparison(PTI);
1476 SmallSetVector<BasicBlock *, 4> FailBlocks;
1478 for (
auto *Succ : FailBlocks) {
1484 performValueComparisonIntoPredecessorFolding(TI, CV, PTI, Builder);
1498 Value *BB1V = PN.getIncomingValueForBlock(BB1);
1499 Value *BB2V = PN.getIncomingValueForBlock(BB2);
1500 if (BB1V != BB2V && (BB1V == I1 || BB2V == I2)) {
1519 if (
I->mayReadFromMemory())
1551 if (CB->getIntrinsicID() == Intrinsic::experimental_deoptimize)
1559 if (J->getParent() == BB)
1581 if (C1->isMustTailCall() != C2->isMustTailCall())
1584 if (!
TTI.isProfitableToHoist(I1) || !
TTI.isProfitableToHoist(I2))
1590 if (CB1->cannotMerge() || CB1->isConvergent())
1593 if (CB2->cannotMerge() || CB2->isConvergent())
1608 if (!I1->hasDbgRecords())
1610 using CurrentAndEndIt =
1611 std::pair<DbgRecord::self_iterator, DbgRecord::self_iterator>;
1617 auto atEnd = [](
const CurrentAndEndIt &Pair) {
1618 return Pair.first == Pair.second;
1624 return Itrs[0].first->isIdenticalToWhenDefined(*
I);
1630 {I1->getDbgRecordRange().begin(), I1->getDbgRecordRange().end()});
1632 if (!
Other->hasDbgRecords())
1635 {
Other->getDbgRecordRange().begin(),
Other->getDbgRecordRange().end()});
1642 while (
none_of(Itrs, atEnd)) {
1643 bool HoistDVRs = allIdentical(Itrs);
1644 for (CurrentAndEndIt &Pair : Itrs) {
1658 if (I1->isIdenticalToWhenDefined(I2,
true))
1663 return Cmp1->getPredicate() == Cmp2->getSwappedPredicate() &&
1664 Cmp1->getOperand(0) == Cmp2->getOperand(1) &&
1665 Cmp1->getOperand(1) == Cmp2->getOperand(0);
1667 if (I1->isCommutative() && I1->isSameOperationAs(I2)) {
1668 return I1->getOperand(0) == I2->
getOperand(1) &&
1734 auto &Context = BI->
getParent()->getContext();
1739 Value *Mask =
nullptr;
1740 Value *MaskFalse =
nullptr;
1741 Value *MaskTrue =
nullptr;
1742 if (Invert.has_value()) {
1743 IRBuilder<> Builder(Sel ? Sel : SpeculatedConditionalLoadsStores.
back());
1744 Mask = Builder.CreateBitCast(
1749 MaskFalse = Builder.CreateBitCast(
1751 MaskTrue = Builder.CreateBitCast(
Cond, VCondTy);
1753 auto PeekThroughBitcasts = [](
Value *V) {
1755 V = BitCast->getOperand(0);
1758 for (
auto *
I : SpeculatedConditionalLoadsStores) {
1760 if (!Invert.has_value())
1761 Mask =
I->getParent() == BI->getSuccessor(0) ? MaskTrue : MaskFalse;
1766 auto *Op0 =
I->getOperand(0);
1767 CallInst *MaskedLoadStore =
nullptr;
1770 auto *Ty =
I->getType();
1772 Value *PassThru =
nullptr;
1773 if (Invert.has_value())
1774 for (
User *U :
I->users()) {
1776 PassThru = Builder.CreateBitCast(
1780 Sel && Ins->getParent() == BB) {
1785 Builder.SetInsertPoint(Ins);
1788 MaskedLoadStore = Builder.CreateMaskedLoad(
1790 Value *NewLoadStore = Builder.CreateBitCast(MaskedLoadStore, Ty);
1793 I->replaceAllUsesWith(NewLoadStore);
1796 auto *StoredVal = Builder.CreateBitCast(
1798 MaskedLoadStore = Builder.CreateMaskedStore(
1809 if (
const MDNode *Ranges =
I->getMetadata(LLVMContext::MD_range))
1811 I->dropUBImplyingAttrsAndUnknownMetadata({LLVMContext::MD_annotation});
1815 I->eraseMetadataIf([](
unsigned MDKind,
MDNode *
Node) {
1816 return Node->getMetadataID() == Metadata::DIAssignIDKind;
1819 I->eraseFromParent();
1826 bool IsStore =
false;
1849bool SimplifyCFGOpt::hoistCommonCodeFromSuccessors(Instruction *TI,
1850 bool AllInstsEqOnly) {
1870 using SuccIterPair = std::pair<BasicBlock::iterator, unsigned>;
1876 SuccIterPairs.
push_back(SuccIterPair(SuccItr, 0));
1879 if (AllInstsEqOnly) {
1885 bool AllSame =
none_of(Succs, [&Succs](BasicBlock *Succ) {
1888 return !
Term->isSameOperationAs(Term0) ||
1895 LockstepReverseIterator<true> LRI(Succs);
1896 while (LRI.isValid()) {
1898 if (
any_of(*LRI, [I0](Instruction *
I) {
1913 unsigned NumSkipped = 0;
1916 if (SuccIterPairs.
size() > 2) {
1919 if (SuccIterPairs.
size() < 2)
1926 auto *SuccIterPairBegin = SuccIterPairs.
begin();
1927 auto &BB1ItrPair = *SuccIterPairBegin++;
1928 auto OtherSuccIterPairRange =
1934 bool AllInstsAreIdentical =
true;
1935 bool HasTerminator =
I1->isTerminator();
1936 for (
auto &SuccIter : OtherSuccIterRange) {
1940 MMRAMetadata(*I1) != MMRAMetadata(*I2)))
1941 AllInstsAreIdentical =
false;
1944 SmallVector<Instruction *, 8> OtherInsts;
1945 for (
auto &SuccIter : OtherSuccIterRange)
1950 if (HasTerminator) {
1954 if (NumSkipped || !AllInstsAreIdentical) {
1959 return hoistSuccIdenticalTerminatorToSwitchOrIf(TI, I1, OtherInsts) ||
1963 if (AllInstsAreIdentical) {
1964 unsigned SkipFlagsBB1 = BB1ItrPair.second;
1965 AllInstsAreIdentical =
1967 all_of(OtherSuccIterPairRange, [=](
const auto &Pair) {
1969 unsigned SkipFlagsBB2 = Pair.second;
1979 if (AllInstsAreIdentical) {
1989 for (
auto &SuccIter : OtherSuccIterRange) {
1997 assert(
Success &&
"We should not be trying to hoist callbases "
1998 "with non-intersectable attributes");
2010 NumHoistCommonCode += SuccIterPairs.
size();
2012 NumHoistCommonInstrs += SuccIterPairs.
size();
2021 for (
auto &SuccIterPair : SuccIterPairs) {
2030bool SimplifyCFGOpt::hoistSuccIdenticalTerminatorToSwitchOrIf(
2031 Instruction *TI, Instruction *I1,
2032 SmallVectorImpl<Instruction *> &OtherSuccTIs) {
2041 auto *I2 = *OtherSuccTIs.
begin();
2061 for (PHINode &PN : Succ->
phis()) {
2062 Value *BB1V = PN.getIncomingValueForBlock(BB1);
2063 for (Instruction *OtherSuccTI : OtherSuccTIs) {
2064 Value *BB2V = PN.getIncomingValueForBlock(OtherSuccTI->getParent());
2084 if (!
NT->getType()->isVoidTy()) {
2085 I1->replaceAllUsesWith(NT);
2086 for (Instruction *OtherSuccTI : OtherSuccTIs)
2087 OtherSuccTI->replaceAllUsesWith(NT);
2091 NumHoistCommonInstrs += OtherSuccTIs.size() + 1;
2097 for (
auto *OtherSuccTI : OtherSuccTIs)
2098 Locs.
push_back(OtherSuccTI->getDebugLoc());
2110 std::map<std::pair<Value *, Value *>, SelectInst *> InsertedSelects;
2112 for (PHINode &PN : Succ->
phis()) {
2113 Value *BB1V = PN.getIncomingValueForBlock(BB1);
2114 Value *BB2V = PN.getIncomingValueForBlock(BB2);
2120 SelectInst *&
SI = InsertedSelects[std::make_pair(BB1V, BB2V)];
2130 for (
unsigned i = 0, e = PN.getNumIncomingValues(); i != e; ++i)
2131 if (PN.getIncomingBlock(i) == BB1 || PN.getIncomingBlock(i) == BB2)
2132 PN.setIncomingValue(i, SI);
2143 Updates.
push_back({DominatorTree::Insert, TIParent, Succ});
2148 Updates.
push_back({DominatorTree::Delete, TIParent, Succ});
2161 if (
I->isIntDivRem())
2176 std::optional<unsigned> NumUses;
2177 for (
auto *
I : Insts) {
2180 I->getType()->isTokenTy())
2185 if (
I->getParent()->getSingleSuccessor() ==
I->getParent())
2193 if (
C->isInlineAsm() ||
C->cannotMerge() ||
C->isConvergent())
2197 NumUses =
I->getNumUses();
2198 else if (NumUses !=
I->getNumUses())
2204 for (
auto *
I : Insts) {
2218 for (
const Use &U : I0->
uses()) {
2219 auto It = PHIOperands.find(&U);
2220 if (It == PHIOperands.end())
2223 if (!
equal(Insts, It->second))
2235 bool HaveIndirectCalls =
any_of(Insts, IsIndirectCall);
2236 bool AllCallsAreIndirect =
all_of(Insts, IsIndirectCall);
2237 if (HaveIndirectCalls) {
2238 if (!AllCallsAreIndirect)
2242 Value *Callee =
nullptr;
2246 Callee = CurrCallee;
2247 else if (Callee != CurrCallee)
2253 for (
unsigned OI = 0, OE = I0->
getNumOperands(); OI != OE; ++OI) {
2259 if (!
all_of(Insts, SameAsI0)) {
2265 for (
auto *
I : Insts)
2266 Ops.push_back(
I->getOperand(OI));
2276 auto *BBEnd = Blocks[0]->getTerminator()->getSuccessor(0);
2281 for (
auto *BB : Blocks) {
2283 I =
I->getPrevNode();
2308 assert(!
Op->getType()->isTokenTy() &&
"Can't PHI tokens!");
2311 PN->insertBefore(BBEnd->begin());
2312 for (
auto *
I : Insts)
2313 PN->addIncoming(
I->getOperand(O),
I->getParent());
2322 I0->
moveBefore(*BBEnd, BBEnd->getFirstInsertionPt());
2325 for (
auto *
I : Insts)
2339 assert(
Success &&
"We should not be trying to sink callbases "
2340 "with non-intersectable attributes");
2351 PN->replaceAllUsesWith(I0);
2352 PN->eraseFromParent();
2356 for (
auto *
I : Insts) {
2361 assert(
I->user_empty() &&
"Inst unexpectedly still has non-dbg users");
2362 I->replaceAllUsesWith(I0);
2363 I->eraseFromParent();
2413 bool HaveNonUnconditionalPredecessors =
false;
2416 if (PredBr && PredBr->isUnconditional())
2419 HaveNonUnconditionalPredecessors =
true;
2421 if (UnconditionalPreds.
size() < 2)
2434 for (
const Use &U : PN.incoming_values())
2435 IncomingVals.
insert({PN.getIncomingBlock(U), &U});
2436 auto &
Ops = PHIOperands[IncomingVals[UnconditionalPreds[0]]];
2438 Ops.push_back(*IncomingVals[Pred]);
2446 LLVM_DEBUG(
dbgs() <<
"SINK: instruction can be sunk: " << *(*LRI)[0]
2459 if (!followedByDeoptOrUnreachable) {
2461 auto IsMemOperand = [](
Use &U) {
2474 unsigned NumPHIInsts = 0;
2475 for (
Use &U : (*LRI)[0]->operands()) {
2476 auto It = PHIOperands.
find(&U);
2477 if (It != PHIOperands.
end() && !
all_of(It->second, [&](
Value *V) {
2478 return InstructionsToSink.contains(V);
2485 if (IsMemOperand(U) &&
2486 any_of(It->second, [](
Value *V) { return isa<GEPOperator>(V); }))
2493 LLVM_DEBUG(
dbgs() <<
"SINK: #phi insts: " << NumPHIInsts <<
"\n");
2494 return NumPHIInsts <= 1;
2511 while (Idx < ScanIdx) {
2512 if (!ProfitableToSinkInstruction(LRI)) {
2515 dbgs() <<
"SINK: stopping here, too many PHIs would be created!\n");
2528 if (Idx < ScanIdx) {
2531 InstructionsToSink = InstructionsProfitableToSink;
2537 !ProfitableToSinkInstruction(LRI) &&
2538 "We already know that the last instruction is unprofitable to sink");
2546 for (
auto *
I : *LRI)
2547 InstructionsProfitableToSink.
erase(
I);
2548 if (!ProfitableToSinkInstruction(LRI)) {
2551 InstructionsToSink = InstructionsProfitableToSink;
2565 if (HaveNonUnconditionalPredecessors) {
2566 if (!followedByDeoptOrUnreachable) {
2574 bool Profitable =
false;
2575 while (Idx < ScanIdx) {
2609 for (; SinkIdx != ScanIdx; ++SinkIdx) {
2611 << *UnconditionalPreds[0]->getTerminator()->getPrevNode()
2619 NumSinkCommonInstrs++;
2623 ++NumSinkCommonCode;
2629struct CompatibleSets {
2630 using SetTy = SmallVector<InvokeInst *, 2>;
2636 SetTy &getCompatibleSet(InvokeInst *
II);
2638 void insert(InvokeInst *
II);
2641CompatibleSets::SetTy &CompatibleSets::getCompatibleSet(InvokeInst *
II) {
2646 for (CompatibleSets::SetTy &Set : Sets) {
2647 if (CompatibleSets::shouldBelongToSameSet({
Set.front(),
II}))
2652 return Sets.emplace_back();
2655void CompatibleSets::insert(InvokeInst *
II) {
2656 getCompatibleSet(
II).emplace_back(
II);
2660 assert(Invokes.
size() == 2 &&
"Always called with exactly two candidates.");
2663 auto IsIllegalToMerge = [](InvokeInst *
II) {
2664 return II->cannotMerge() ||
II->isInlineAsm();
2666 if (
any_of(Invokes, IsIllegalToMerge))
2671 auto IsIndirectCall = [](InvokeInst *
II) {
return II->isIndirectCall(); };
2672 bool HaveIndirectCalls =
any_of(Invokes, IsIndirectCall);
2673 bool AllCallsAreIndirect =
all_of(Invokes, IsIndirectCall);
2674 if (HaveIndirectCalls) {
2675 if (!AllCallsAreIndirect)
2680 for (InvokeInst *
II : Invokes) {
2681 Value *CurrCallee =
II->getCalledOperand();
2682 assert(CurrCallee &&
"There is always a called operand.");
2685 else if (Callee != CurrCallee)
2692 auto HasNormalDest = [](InvokeInst *
II) {
2695 if (
any_of(Invokes, HasNormalDest)) {
2698 if (!
all_of(Invokes, HasNormalDest))
2703 for (InvokeInst *
II : Invokes) {
2705 assert(CurrNormalBB &&
"There is always a 'continue to' basic block.");
2707 NormalBB = CurrNormalBB;
2708 else if (NormalBB != CurrNormalBB)
2716 NormalBB, {Invokes[0]->getParent(), Invokes[1]->getParent()},
2725 for (InvokeInst *
II : Invokes) {
2727 assert(CurrUnwindBB &&
"There is always an 'unwind to' basic block.");
2729 UnwindBB = CurrUnwindBB;
2731 assert(UnwindBB == CurrUnwindBB &&
"Unexpected unwind destination.");
2738 Invokes.front()->getUnwindDest(),
2739 {Invokes[0]->getParent(), Invokes[1]->getParent()}))
2744 const InvokeInst *II0 = Invokes.front();
2745 for (
auto *
II : Invokes.drop_front())
2750 auto IsIllegalToMergeArguments = [](
auto Ops) {
2751 Use &U0 = std::get<0>(
Ops);
2752 Use &U1 = std::get<1>(
Ops);
2758 assert(Invokes.size() == 2 &&
"Always called with exactly two candidates.");
2759 if (
any_of(
zip(Invokes[0]->data_ops(), Invokes[1]->data_ops()),
2760 IsIllegalToMergeArguments))
2772 assert(Invokes.
size() >= 2 &&
"Must have at least two invokes to merge.");
2778 bool HasNormalDest =
2783 InvokeInst *MergedInvoke = [&Invokes, HasNormalDest]() {
2787 II0->
getParent()->getIterator()->getNextNode();
2792 Ctx, II0BB->
getName() +
".invoke", Func, InsertBeforeBlock);
2796 MergedInvoke->
insertInto(MergedInvokeBB, MergedInvokeBB->
end());
2798 if (!HasNormalDest) {
2802 Ctx, II0BB->
getName() +
".cont", Func, InsertBeforeBlock);
2810 return MergedInvoke;
2824 SuccBBOfMergedInvoke});
2834 bool IsIndirectCall = Invokes[0]->isIndirectCall();
2840 if (!IsIndirectCall)
2847 return II->getOperand(U.getOperandNo()) != U.get();
2866 Invokes.
front()->getParent());
2874 if (!MergedDebugLoc)
2875 MergedDebugLoc =
II->getDebugLoc();
2883 OrigSuccBB->removePredecessor(
II->getParent());
2889 assert(
Success &&
"Merged invokes with incompatible attributes");
2892 II->replaceAllUsesWith(MergedInvoke);
2893 II->eraseFromParent();
2897 ++NumInvokeSetsFormed;
2933 CompatibleSets Grouper;
2943 if (Invokes.
size() < 2)
2955class EphemeralValueTracker {
2956 SmallPtrSet<const Instruction *, 32> EphValues;
2958 bool isEphemeral(
const Instruction *
I) {
2961 return !
I->mayHaveSideEffects() && !
I->isTerminator() &&
2962 all_of(
I->users(), [&](
const User *U) {
2963 return EphValues.count(cast<Instruction>(U));
2968 bool track(
const Instruction *
I) {
2969 if (isEphemeral(
I)) {
3020 unsigned MaxNumInstToLookAt = 9;
3024 if (!MaxNumInstToLookAt)
3026 --MaxNumInstToLookAt;
3036 if (
SI->getPointerOperand() == StorePtr &&
3037 SI->getValueOperand()->getType() == StoreTy &&
SI->isSimple() &&
3040 return SI->getValueOperand();
3045 if (LI->getPointerOperand() == StorePtr && LI->
getType() == StoreTy &&
3046 LI->isSimple() && LI->getAlign() >= StoreToHoist->
getAlign()) {
3048 bool ExplicitlyDereferenceableOnly;
3053 (!ExplicitlyDereferenceableOnly ||
3055 LI->getDataLayout()))) {
3071 unsigned &SpeculatedInstructions,
3079 bool HaveRewritablePHIs =
false;
3081 Value *OrigV = PN.getIncomingValueForBlock(BB);
3082 Value *ThenV = PN.getIncomingValueForBlock(ThenBB);
3089 Cost +=
TTI.getCmpSelInstrCost(Instruction::Select, PN.getType(),
3098 HaveRewritablePHIs =
true;
3101 if (!OrigCE && !ThenCE)
3108 if (OrigCost + ThenCost > MaxCost)
3115 ++SpeculatedInstructions;
3116 if (SpeculatedInstructions > 1)
3120 return HaveRewritablePHIs;
3124 std::optional<bool> Invert,
3128 if (BI->
getMetadata(LLVMContext::MD_unpredictable))
3135 if (!Invert.has_value())
3138 uint64_t EndWeight = *Invert ? TWeight : FWeight;
3142 return BIEndProb < Likely;
3182bool SimplifyCFGOpt::speculativelyExecuteBB(BranchInst *BI,
3183 BasicBlock *ThenBB) {
3199 bool Invert =
false;
3214 SmallDenseMap<Instruction *, unsigned, 4> SinkCandidateUseCounts;
3216 SmallVector<Instruction *, 4> SpeculatedPseudoProbes;
3218 unsigned SpeculatedInstructions = 0;
3219 bool HoistLoadsStores =
Options.HoistLoadsStoresWithCondFaulting;
3220 SmallVector<Instruction *, 2> SpeculatedConditionalLoadsStores;
3221 Value *SpeculatedStoreValue =
nullptr;
3222 StoreInst *SpeculatedStore =
nullptr;
3223 EphemeralValueTracker EphTracker;
3238 if (EphTracker.track(&
I))
3243 bool IsSafeCheapLoadStore = HoistLoadsStores &&
3245 SpeculatedConditionalLoadsStores.
size() <
3249 if (IsSafeCheapLoadStore)
3250 SpeculatedConditionalLoadsStores.
push_back(&
I);
3252 ++SpeculatedInstructions;
3254 if (SpeculatedInstructions > 1)
3258 if (!IsSafeCheapLoadStore &&
3261 (SpeculatedStoreValue =
3264 if (!IsSafeCheapLoadStore && !SpeculatedStoreValue &&
3270 if (!SpeculatedStore && SpeculatedStoreValue)
3276 for (Use &
Op :
I.operands()) {
3281 ++SinkCandidateUseCounts[OpI];
3288 for (
const auto &[Inst,
Count] : SinkCandidateUseCounts)
3289 if (Inst->hasNUses(
Count)) {
3290 ++SpeculatedInstructions;
3291 if (SpeculatedInstructions > 1)
3298 SpeculatedStore !=
nullptr || !SpeculatedConditionalLoadsStores.
empty();
3301 SpeculatedInstructions,
Cost,
TTI);
3302 if (!Convert ||
Cost > Budget)
3306 LLVM_DEBUG(
dbgs() <<
"SPECULATIVELY EXECUTING BB" << *ThenBB <<
"\n";);
3310 if (SpeculatedStoreValue) {
3314 Value *FalseV = SpeculatedStoreValue;
3318 BrCond, TrueV, FalseV,
"spec.store.select", BI);
3348 for (DbgVariableRecord *DbgAssign :
3351 DbgAssign->replaceVariableLocationOp(OrigV, S);
3361 if (!SpeculatedStoreValue || &
I != SpeculatedStore) {
3364 I.dropUBImplyingAttrsAndMetadata();
3367 if (EphTracker.contains(&
I)) {
3369 I.eraseFromParent();
3375 for (
auto &It : *ThenBB)
3380 !DVR || !DVR->isDbgAssign())
3381 It.dropOneDbgRecord(&DR);
3383 std::prev(ThenBB->end()));
3385 if (!SpeculatedConditionalLoadsStores.
empty())
3391 for (PHINode &PN : EndBB->
phis()) {
3392 unsigned OrigI = PN.getBasicBlockIndex(BB);
3393 unsigned ThenI = PN.getBasicBlockIndex(ThenBB);
3394 Value *OrigV = PN.getIncomingValue(OrigI);
3395 Value *ThenV = PN.getIncomingValue(ThenI);
3404 Value *TrueV = ThenV, *FalseV = OrigV;
3408 PN.setIncomingValue(OrigI, V);
3409 PN.setIncomingValue(ThenI, V);
3413 for (Instruction *
I : SpeculatedPseudoProbes)
3414 I->eraseFromParent();
3427 if (!ReachesNonLocalUses.
insert(BB).second)
3442 EphemeralValueTracker EphTracker;
3449 if (CI->cannotDuplicate() || CI->isConvergent())
3462 for (
User *U :
I.users()) {
3465 if (UsedInBB == BB) {
3469 NonLocalUseBlocks.
insert(UsedInBB);
3483 if (
I &&
I->getParent() == To)
3499static std::optional<bool>
3520 KnownValues[CB].
insert(Pred);
3524 if (KnownValues.
empty())
3549 if (!
findReaching(UseBB, BB, ReachesNonLocalUseBlocks))
3552 for (
const auto &Pair : KnownValues) {
3569 if (ReachesNonLocalUseBlocks.
contains(RealDest))
3574 <<
" has value " << *Pair.first <<
" in predecessors:\n";
3577 dbgs() <<
"Threading to destination " << RealDest->
getName() <<
".\n";
3585 EdgeBB->setName(RealDest->
getName() +
".critedge");
3586 EdgeBB->moveBefore(RealDest);
3596 TranslateMap[
Cond] = CB;
3609 N->insertInto(EdgeBB, InsertPt);
3612 N->setName(BBI->getName() +
".c");
3623 if (!BBI->use_empty())
3624 TranslateMap[&*BBI] = V;
3625 if (!
N->mayHaveSideEffects()) {
3626 N->eraseFromParent();
3631 if (!BBI->use_empty())
3632 TranslateMap[&*BBI] =
N;
3638 for (; SrcDbgCursor != BBI; ++SrcDbgCursor)
3639 N->cloneDebugInfoFrom(&*SrcDbgCursor);
3640 SrcDbgCursor = std::next(BBI);
3642 N->cloneDebugInfoFrom(&*BBI);
3651 for (; &*SrcDbgCursor != BI; ++SrcDbgCursor)
3652 InsertPt->cloneDebugInfoFrom(&*SrcDbgCursor);
3653 InsertPt->cloneDebugInfoFrom(BI);
3674 return std::nullopt;
3680bool SimplifyCFGOpt::foldCondBranchOnValueKnownInPredecessor(BranchInst *BI) {
3687 std::optional<bool>
Result;
3688 bool EverChanged =
false;
3694 }
while (Result == std::nullopt);
3703 bool SpeculateUnpredictables) {
3725 return cast<BranchInst>(IfBlock->getTerminator())->isUnconditional();
3728 "Will have either one or two blocks to speculate.");
3735 bool IsUnpredictable = DomBI->
getMetadata(LLVMContext::MD_unpredictable);
3736 if (!IsUnpredictable) {
3739 (TWeight + FWeight) != 0) {
3744 if (IfBlocks.
size() == 1) {
3746 DomBI->
getSuccessor(0) == BB ? BITrueProb : BIFalseProb;
3747 if (BIBBProb >= Likely)
3750 if (BITrueProb >= Likely || BIFalseProb >= Likely)
3759 if (IfCondPhiInst->getParent() == BB)
3767 unsigned NumPhis = 0;
3780 if (SpeculateUnpredictables && IsUnpredictable)
3781 Budget +=
TTI.getBranchMispredictPenalty();
3794 AggressiveInsts, Cost, Budget,
TTI, AC,
3795 ZeroCostInstructions) ||
3797 AggressiveInsts, Cost, Budget,
TTI, AC,
3798 ZeroCostInstructions))
3810 auto CanHoistNotFromBothValues = [](
Value *V0,
Value *V1) {
3821 auto IsBinOpOrAnd = [](
Value *V) {
3838 if (!AggressiveInsts.
count(&*
I) && !
I->isDebugOrPseudoInst()) {
3851 if (IsUnpredictable)
dbgs() <<
" (unpredictable)";
3853 <<
" F: " << IfFalse->
getName() <<
"\n");
3870 Value *Sel = Builder.CreateSelectFMF(IfCond, TrueVal, FalseVal,
3875 PN->eraseFromParent();
3881 Builder.CreateBr(BB);
3902 return Builder.CreateBinOp(
Opc,
LHS,
RHS, Name);
3903 if (
Opc == Instruction::And)
3904 return Builder.CreateLogicalAnd(
LHS,
RHS, Name);
3905 if (
Opc == Instruction::Or)
3906 return Builder.CreateLogicalOr(
LHS,
RHS, Name);
3918 bool PredHasWeights =
3920 bool SuccHasWeights =
3922 if (PredHasWeights || SuccHasWeights) {
3923 if (!PredHasWeights)
3924 PredTrueWeight = PredFalseWeight = 1;
3925 if (!SuccHasWeights)
3926 SuccTrueWeight = SuccFalseWeight = 1;
3936static std::optional<std::tuple<BasicBlock *, Instruction::BinaryOps, bool>>
3940 "Both blocks must end with a conditional branches.");
3942 "PredBB must be a predecessor of BB.");
3950 (PTWeight + PFWeight) != 0) {
3953 Likely =
TTI->getPredictableBranchThreshold();
3958 if (PBITrueProb.
isUnknown() || PBITrueProb < Likely)
3959 return {{BI->
getSuccessor(0), Instruction::Or,
false}};
3963 return {{BI->
getSuccessor(1), Instruction::And,
false}};
3966 if (PBITrueProb.
isUnknown() || PBITrueProb < Likely)
3967 return {{BI->
getSuccessor(1), Instruction::And,
true}};
3973 return std::nullopt;
3986 bool InvertPredCond;
3987 std::tie(CommonSucc,
Opc, InvertPredCond) =
3990 LLVM_DEBUG(
dbgs() <<
"FOLDING BRANCH TO COMMON DEST:\n" << *PBI << *BB);
3997 {LLVMContext::MD_annotation});
4000 if (InvertPredCond) {
4013 uint64_t PredTrueWeight, PredFalseWeight, SuccTrueWeight, SuccFalseWeight;
4016 SuccTrueWeight, SuccFalseWeight)) {
4022 MDWeights.
push_back(PredTrueWeight * SuccTrueWeight);
4027 MDWeights.
push_back(PredFalseWeight * (SuccFalseWeight + SuccTrueWeight) +
4028 PredTrueWeight * SuccFalseWeight);
4034 MDWeights.
push_back(PredTrueWeight * (SuccFalseWeight + SuccTrueWeight) +
4035 PredFalseWeight * SuccTrueWeight);
4037 MDWeights.
push_back(PredFalseWeight * SuccFalseWeight);
4079 if (!MDWeights.
empty()) {
4080 assert(isSelectInRoleOfConjunctionOrDisjunction(
SI));
4085 ++NumFoldBranchToCommonDest;
4092 return I.getType()->isVectorTy() ||
any_of(
I.operands(), [](
Use &U) {
4093 return U->getType()->isVectorTy();
4103 unsigned BonusInstThreshold) {
4117 Cond->getParent() != BB || !
Cond->hasOneUse())
4138 bool InvertPredCond;
4140 std::tie(CommonSucc,
Opc, InvertPredCond) = *Recipe;
4172 unsigned NumBonusInsts = 0;
4173 bool SawVectorOp =
false;
4174 const unsigned PredCount = Preds.
size();
4191 NumBonusInsts += PredCount;
4199 auto IsBCSSAUse = [BB, &
I](
Use &U) {
4202 return PN->getIncomingBlock(U) == BB;
4203 return UI->
getParent() == BB &&
I.comesBefore(UI);
4207 if (!
all_of(
I.uses(), IsBCSSAUse))
4211 BonusInstThreshold *
4227 for (
auto *BB : {BB1, BB2}) {
4243 Value *AlternativeV =
nullptr) {
4269 BasicBlock *OtherPredBB = *PredI == BB ? *++PredI : *PredI;
4270 if (
PHI->getIncomingValueForBlock(OtherPredBB) == AlternativeV)
4278 if (!AlternativeV &&
4284 PHI->addIncoming(V, BB);
4294 BasicBlock *PostBB,
Value *Address,
bool InvertPCond,
bool InvertQCond,
4303 if (!PStore || !QStore)
4324 if (
I.mayReadOrWriteMemory())
4326 for (
auto &
I : *QFB)
4327 if (&
I != QStore &&
I.mayReadOrWriteMemory())
4330 for (
auto &
I : *QTB)
4331 if (&
I != QStore &&
I.mayReadOrWriteMemory())
4335 if (&*
I != PStore &&
I->mayReadOrWriteMemory())
4351 if (
I.isTerminator())
4369 "When we run out of budget we will eagerly return from within the "
4370 "per-instruction loop.");
4374 const std::array<StoreInst *, 2> FreeStores = {PStore, QStore};
4376 (!IsWorthwhile(PTB, FreeStores) || !IsWorthwhile(PFB, FreeStores) ||
4377 !IsWorthwhile(QTB, FreeStores) || !IsWorthwhile(QFB, FreeStores)))
4413 InvertPCond ^= (PStore->
getParent() != PTB);
4414 InvertQCond ^= (QStore->
getParent() != QTB);
4435 {CombinedWeights[0], CombinedWeights[1]},
4499 bool InvertPCond =
false, InvertQCond =
false;
4505 if (QFB == PostBB) {
4524 !HasOnePredAndOneSucc(QFB, QBI->
getParent(), PostBB))
4527 (QTB && !HasOnePredAndOneSucc(QTB, QBI->
getParent(), PostBB)))
4535 for (
auto *BB : {PTB, PFB}) {
4540 PStoreAddresses.
insert(
SI->getPointerOperand());
4542 for (
auto *BB : {QTB, QFB}) {
4547 QStoreAddresses.
insert(
SI->getPointerOperand());
4553 auto &CommonAddresses = PStoreAddresses;
4556 for (
auto *Address : CommonAddresses)
4559 InvertPCond, InvertQCond, DTU,
DL,
TTI);
4577 !BI->
getParent()->getSinglePredecessor())
4579 if (!IfFalseBB->
phis().empty())
4589 return I.mayWriteToMemory() ||
I.mayHaveSideEffects();
4692 if (!PBI->
getMetadata(LLVMContext::MD_unpredictable) &&
4694 (
static_cast<uint64_t>(PredWeights[0]) + PredWeights[1]) != 0) {
4698 static_cast<uint64_t>(PredWeights[0]) + PredWeights[1]);
4701 if (CommonDestProb >= Likely)
4711 unsigned NumPhis = 0;
4733 if (OtherDest == BB) {
4741 OtherDest = InfLoopBlock;
4753 PBICond = Builder.CreateNot(PBICond, PBICond->
getName() +
".not");
4757 BICond = Builder.CreateNot(BICond, BICond->
getName() +
".not");
4761 createLogicalOp(Builder, Instruction::Or, PBICond, BICond,
"brmerge");
4776 uint64_t PredTrueWeight, PredFalseWeight, SuccTrueWeight, SuccFalseWeight;
4777 uint64_t PredCommon, PredOther, SuccCommon, SuccOther;
4780 SuccTrueWeight, SuccFalseWeight);
4782 PredCommon = PBIOp ? PredFalseWeight : PredTrueWeight;
4783 PredOther = PBIOp ? PredTrueWeight : PredFalseWeight;
4784 SuccCommon = BIOp ? SuccFalseWeight : SuccTrueWeight;
4785 SuccOther = BIOp ? SuccTrueWeight : SuccFalseWeight;
4789 uint64_t NewWeights[2] = {PredCommon * (SuccCommon + SuccOther) +
4790 PredOther * SuccCommon,
4791 PredOther * SuccOther};
4799 assert(isSelectInRoleOfConjunctionOrDisjunction(
SI));
4818 Value *BIV = PN.getIncomingValueForBlock(BB);
4819 unsigned PBBIdx = PN.getBasicBlockIndex(PBI->
getParent());
4820 Value *PBIV = PN.getIncomingValue(PBBIdx);
4824 Builder.CreateSelect(PBICond, PBIV, BIV, PBIV->
getName() +
".mux"));
4825 PN.setIncomingValue(PBBIdx, NV);
4829 uint64_t TrueWeight = PBIOp ? PredFalseWeight : PredTrueWeight;
4830 uint64_t FalseWeight = PBIOp ? PredTrueWeight : PredFalseWeight;
4850bool SimplifyCFGOpt::simplifyTerminatorOnSelect(Instruction *OldTerm,
4852 BasicBlock *FalseBB,
4853 uint32_t TrueWeight,
4854 uint32_t FalseWeight) {
4861 BasicBlock *KeepEdge2 = TrueBB != FalseBB ? FalseBB :
nullptr;
4863 SmallSetVector<BasicBlock *, 2> RemovedSuccessors;
4866 for (BasicBlock *Succ :
successors(OldTerm)) {
4868 if (Succ == KeepEdge1)
4869 KeepEdge1 =
nullptr;
4870 else if (Succ == KeepEdge2)
4871 KeepEdge2 =
nullptr;
4876 if (Succ != TrueBB && Succ != FalseBB)
4877 RemovedSuccessors.
insert(Succ);
4885 if (!KeepEdge1 && !KeepEdge2) {
4886 if (TrueBB == FalseBB) {
4894 if (TrueWeight != FalseWeight)
4898 }
else if (KeepEdge1 && (KeepEdge2 || TrueBB == FalseBB)) {
4918 SmallVector<DominatorTree::UpdateType, 2> Updates;
4920 for (
auto *RemovedSuccessor : RemovedSuccessors)
4921 Updates.
push_back({DominatorTree::Delete, BB, RemovedSuccessor});
4932bool SimplifyCFGOpt::simplifySwitchOnSelect(SwitchInst *SI,
4937 if (!TrueVal || !FalseVal)
4942 BasicBlock *TrueBB =
SI->findCaseValue(TrueVal)->getCaseSuccessor();
4943 BasicBlock *FalseBB =
SI->findCaseValue(FalseVal)->getCaseSuccessor();
4946 uint32_t TrueWeight = 0, FalseWeight = 0;
4947 SmallVector<uint64_t, 8> Weights;
4951 if (Weights.
size() == 1 +
SI->getNumCases()) {
4953 (uint32_t)Weights[
SI->findCaseValue(TrueVal)->getSuccessorIndex()];
4955 (uint32_t)Weights[
SI->findCaseValue(FalseVal)->getSuccessorIndex()];
4960 return simplifyTerminatorOnSelect(SI, Condition, TrueBB, FalseBB, TrueWeight,
4969bool SimplifyCFGOpt::simplifyIndirectBrOnSelect(IndirectBrInst *IBI,
4982 return simplifyTerminatorOnSelect(IBI,
SI->getCondition(), TrueBB, FalseBB, 0,
5003bool SimplifyCFGOpt::tryToSimplifyUncondBranchWithICmpInIt(
5023 if (
SI->getCondition() != V)
5029 if (
SI->getDefaultDest() != BB) {
5030 ConstantInt *VVal =
SI->findCaseDest(BB);
5031 assert(VVal &&
"Should have a unique destination value");
5039 return requestResimplify();
5045 if (
SI->findCaseValue(Cst) !=
SI->case_default()) {
5055 return requestResimplify();
5062 if (PHIUse ==
nullptr || PHIUse != &SuccBlock->
front() ||
5079 SmallVector<DominatorTree::UpdateType, 2> Updates;
5086 SwitchInstProfUpdateWrapper SIW(*SI);
5087 auto W0 = SIW.getSuccessorWeight(0);
5090 NewW = ((uint64_t(*W0) + 1) >> 1);
5091 SIW.setSuccessorWeight(0, *NewW);
5093 SIW.addCase(Cst, NewBB, NewW);
5095 Updates.
push_back({DominatorTree::Insert, Pred, NewBB});
5104 Updates.
push_back({DominatorTree::Insert, NewBB, SuccBlock});
5113bool SimplifyCFGOpt::simplifyBranchOnICmpChain(BranchInst *BI,
5115 const DataLayout &
DL) {
5125 ConstantComparesGatherer ConstantCompare(
Cond,
DL);
5127 SmallVectorImpl<ConstantInt *> &Values = ConstantCompare.Vals;
5128 Value *CompVal = ConstantCompare.CompValue;
5129 unsigned UsedICmps = ConstantCompare.UsedICmps;
5130 Value *ExtraCase = ConstantCompare.Extra;
5131 bool TrueWhenEqual = ConstantCompare.IsEq;
5148 if (ExtraCase && Values.
size() < 2)
5163 <<
" cases into SWITCH. BB is:\n"
5166 SmallVector<DominatorTree::UpdateType, 2> Updates;
5173 nullptr,
"switch.early.test");
5184 AssumptionCache *AC =
Options.AC;
5197 Updates.
push_back({DominatorTree::Insert, BB, EdgeBB});
5203 LLVM_DEBUG(
dbgs() <<
" ** 'icmp' chain unhandled condition: " << *ExtraCase
5204 <<
"\nEXTRABB = " << *BB);
5212 "Should not end up here with unstable pointers");
5214 CompVal,
DL.getIntPtrType(CompVal->
getType()),
"magicptr");
5221 for (ConstantInt *Val : Values)
5222 New->addCase(Val, EdgeBB);
5230 for (
unsigned i = 0, e = Values.size() - 1; i != e; ++i)
5239 LLVM_DEBUG(
dbgs() <<
" ** 'icmp' chain result is:\n" << *BB <<
'\n');
5243bool SimplifyCFGOpt::simplifyResume(ResumeInst *RI,
IRBuilder<> &Builder) {
5245 return simplifyCommonResume(RI);
5249 return simplifySingleResume(RI);
5262 switch (IntrinsicID) {
5263 case Intrinsic::dbg_declare:
5264 case Intrinsic::dbg_value:
5265 case Intrinsic::dbg_label:
5266 case Intrinsic::lifetime_end:
5276bool SimplifyCFGOpt::simplifyCommonResume(ResumeInst *RI) {
5285 SmallSetVector<BasicBlock *, 4> TrivialUnwindBlocks;
5289 for (
unsigned Idx = 0, End = PhiLPInst->getNumIncomingValues(); Idx != End;
5291 auto *IncomingBB = PhiLPInst->getIncomingBlock(Idx);
5292 auto *IncomingValue = PhiLPInst->getIncomingValue(Idx);
5296 if (IncomingBB->getUniqueSuccessor() != BB)
5301 if (IncomingValue != LandingPad)
5305 make_range(LandingPad->getNextNode(), IncomingBB->getTerminator())))
5306 TrivialUnwindBlocks.
insert(IncomingBB);
5310 if (TrivialUnwindBlocks.
empty())
5314 for (
auto *TrivialBB : TrivialUnwindBlocks) {
5318 while (PhiLPInst->getBasicBlockIndex(TrivialBB) != -1)
5321 for (BasicBlock *Pred :
5332 TrivialBB->getTerminator()->eraseFromParent();
5333 new UnreachableInst(RI->
getContext(), TrivialBB);
5335 DTU->
applyUpdates({{DominatorTree::Delete, TrivialBB, BB}});
5342 return !TrivialUnwindBlocks.empty();
5346bool SimplifyCFGOpt::simplifySingleResume(ResumeInst *RI) {
5350 "Resume must unwind the exception that caused control to here");
5406 int Idx = DestPN.getBasicBlockIndex(BB);
5420 Value *SrcVal = DestPN.getIncomingValue(Idx);
5423 bool NeedPHITranslation = SrcPN && SrcPN->
getParent() == BB;
5427 DestPN.addIncoming(
Incoming, Pred);
5454 std::vector<DominatorTree::UpdateType> Updates;
5458 if (UnwindDest ==
nullptr) {
5499 if (!SuccessorCleanupPad)
5508 SuccessorCleanupPad->eraseFromParent();
5517bool SimplifyCFGOpt::simplifyCleanupReturn(CleanupReturnInst *RI) {
5534bool SimplifyCFGOpt::simplifyUnreachable(UnreachableInst *UI) {
5566 BBI->dropDbgRecords();
5570 BBI->eraseFromParent();
5576 if (&BB->
front() != UI)
5579 std::vector<DominatorTree::UpdateType> Updates;
5582 for (BasicBlock *Predecessor : Preds) {
5589 [BB](
auto *
Successor) { return Successor == BB; })) {
5597 "The destinations are guaranteed to be different here.");
5598 CallInst *Assumption;
5614 Updates.push_back({DominatorTree::Delete, Predecessor, BB});
5616 SwitchInstProfUpdateWrapper SU(*SI);
5617 for (
auto i = SU->case_begin(), e = SU->case_end(); i != e;) {
5618 if (i->getCaseSuccessor() != BB) {
5623 i = SU.removeCase(i);
5628 if (DTU &&
SI->getDefaultDest() != BB)
5629 Updates.push_back({DominatorTree::Delete, Predecessor, BB});
5631 if (
II->getUnwindDest() == BB) {
5637 if (!CI->doesNotThrow())
5638 CI->setDoesNotThrow();
5642 if (CSI->getUnwindDest() == BB) {
5653 E = CSI->handler_end();
5656 CSI->removeHandler(
I);
5663 Updates.push_back({DominatorTree::Delete, Predecessor, BB});
5664 if (CSI->getNumHandlers() == 0) {
5665 if (CSI->hasUnwindDest()) {
5669 for (
auto *PredecessorOfPredecessor :
predecessors(Predecessor)) {
5670 Updates.push_back({DominatorTree::Insert,
5671 PredecessorOfPredecessor,
5672 CSI->getUnwindDest()});
5673 Updates.push_back({DominatorTree::Delete,
5674 PredecessorOfPredecessor, Predecessor});
5677 Predecessor->replaceAllUsesWith(CSI->getUnwindDest());
5684 SmallVector<BasicBlock *, 8> EHPreds(
predecessors(Predecessor));
5685 for (BasicBlock *EHPred : EHPreds)
5689 new UnreachableInst(CSI->getContext(), CSI->getIterator());
5690 CSI->eraseFromParent();
5695 assert(CRI->hasUnwindDest() && CRI->getUnwindDest() == BB &&
5696 "Expected to always have an unwind to BB.");
5698 Updates.push_back({DominatorTree::Delete, Predecessor, BB});
5721 for (
size_t I = 1,
E = Cases.
size();
I !=
E; ++
I) {
5722 if (Cases[
I - 1]->getValue() != Cases[
I]->getValue() + 1)
5730 bool RemoveOrigDefaultBlock =
true) {
5732 auto *BB = Switch->getParent();
5733 auto *OrigDefaultBlock = Switch->getDefaultDest();
5734 if (RemoveOrigDefaultBlock)
5735 OrigDefaultBlock->removePredecessor(BB);
5739 auto *UI =
new UnreachableInst(Switch->getContext(), NewDefaultBlock);
5741 Switch->setDefaultDest(&*NewDefaultBlock);
5745 if (RemoveOrigDefaultBlock &&
5755bool SimplifyCFGOpt::turnSwitchRangeIntoICmp(SwitchInst *SI,
5757 assert(
SI->getNumCases() > 1 &&
"Degenerate switch?");
5759 bool HasDefault = !
SI->defaultDestUnreachable();
5761 auto *BB =
SI->getParent();
5764 BasicBlock *DestA = HasDefault ?
SI->getDefaultDest() :
nullptr;
5769 for (
auto Case :
SI->cases()) {
5773 if (Dest == DestA) {
5779 if (Dest == DestB) {
5789 "Single-destination switch should have been folded.");
5791 assert(DestB !=
SI->getDefaultDest());
5792 assert(!CasesB.
empty() &&
"There must be non-default cases.");
5796 SmallVectorImpl<ConstantInt *> *ContiguousCases =
nullptr;
5800 ContiguousCases = &CasesA;
5801 ContiguousDest = DestA;
5804 ContiguousCases = &CasesB;
5805 ContiguousDest = DestB;
5814 ConstantInt::get(
Offset->getType(), ContiguousCases->
size());
5817 if (!
Offset->isNullValue())
5826 BranchInst *NewBI = Builder.
CreateCondBr(Cmp, ContiguousDest, OtherDest);
5830 SmallVector<uint64_t, 8> Weights;
5832 if (Weights.
size() == 1 +
SI->getNumCases()) {
5833 uint64_t TrueWeight = 0;
5834 uint64_t FalseWeight = 0;
5835 for (
size_t I = 0,
E = Weights.
size();
I !=
E; ++
I) {
5836 if (
SI->getSuccessor(
I) == ContiguousDest)
5837 TrueWeight += Weights[
I];
5839 FalseWeight += Weights[
I];
5841 while (TrueWeight > UINT32_MAX || FalseWeight > UINT32_MAX) {
5852 unsigned PreviousEdges = ContiguousCases->
size();
5853 if (ContiguousDest ==
SI->getDefaultDest())
5855 for (
unsigned I = 0,
E = PreviousEdges - 1;
I !=
E; ++
I)
5859 unsigned PreviousEdges =
SI->getNumCases() - ContiguousCases->
size();
5860 if (OtherDest ==
SI->getDefaultDest())
5862 for (
unsigned I = 0,
E = PreviousEdges - 1;
I !=
E; ++
I)
5871 auto *UnreachableDefault =
SI->getDefaultDest();
5874 SI->eraseFromParent();
5876 if (!HasDefault && DTU)
5877 DTU->
applyUpdates({{DominatorTree::Delete, BB, UnreachableDefault}});
5893 unsigned MaxSignificantBitsInCond =
5900 for (
const auto &Case :
SI->cases()) {
5901 auto *
Successor = Case.getCaseSuccessor();
5908 const APInt &CaseVal = Case.getCaseValue()->getValue();
5911 DeadCases.
push_back(Case.getCaseValue());
5923 bool HasDefault = !
SI->defaultDestUnreachable();
5924 const unsigned NumUnknownBits =
5927 if (HasDefault && DeadCases.
empty() &&
5928 NumUnknownBits < 64 ) {
5929 uint64_t AllNumCases = 1ULL << NumUnknownBits;
5930 if (
SI->getNumCases() == AllNumCases) {
5937 if (
SI->getNumCases() == AllNumCases - 1) {
5938 assert(NumUnknownBits > 1 &&
"Should be canonicalized to a branch");
5945 for (
const auto &Case :
SI->cases())
5946 MissingCaseVal ^= Case.getCaseValue()->getValue().getLimitedValue();
5957 if (DeadCases.
empty())
5963 assert(CaseI !=
SI->case_default() &&
5964 "Case was not found. Probably mistake in DeadCases forming.");
5966 CaseI->getCaseSuccessor()->removePredecessor(
SI->getParent());
5971 std::vector<DominatorTree::UpdateType> Updates;
5972 for (
auto *
Successor : UniqueSuccessors)
5973 if (NumPerSuccessorCases[
Successor] == 0)
5994 if (!Branch || !Branch->isUnconditional())
6000 int Idx =
PHI.getBasicBlockIndex(BB);
6001 assert(Idx >= 0 &&
"PHI has no entry for predecessor?");
6003 Value *InValue =
PHI.getIncomingValue(Idx);
6004 if (InValue != CaseValue)
6020 ForwardingNodesMap ForwardingNodes;
6023 for (
const auto &Case :
SI->cases()) {
6025 BasicBlock *CaseDest = Case.getCaseSuccessor();
6044 int SwitchBBIdx = Phi.getBasicBlockIndex(SwitchBlock);
6045 if (Phi.getIncomingValue(SwitchBBIdx) == CaseValue &&
6046 count(Phi.blocks(), SwitchBlock) == 1) {
6047 Phi.setIncomingValue(SwitchBBIdx,
SI->getCondition());
6055 ForwardingNodes[Phi].push_back(PhiIdx);
6058 for (
auto &ForwardingNode : ForwardingNodes) {
6059 PHINode *Phi = ForwardingNode.first;
6065 for (
int Index : Indexes)
6066 Phi->setIncomingValue(Index,
SI->getCondition());
6076 if (
C->isThreadDependent())
6078 if (
C->isDLLImportDependent())
6094 if (!
TTI.shouldBuildLookupTablesForConstant(
C))
6121 if (
A->isAllOnesValue())
6123 if (
A->isNullValue())
6129 for (
unsigned N = 0,
E =
I->getNumOperands();
N !=
E; ++
N) {
6154 ConstantPool.insert(std::make_pair(
SI->getCondition(), CaseVal));
6156 if (
I.isTerminator()) {
6158 if (
I.getNumSuccessors() != 1 ||
I.isSpecialTerminator())
6161 CaseDest =
I.getSuccessor(0);
6168 for (
auto &
Use :
I.uses()) {
6171 if (
I->getParent() == CaseDest)
6174 if (Phi->getIncomingBlock(
Use) == CaseDest)
6187 *CommonDest = CaseDest;
6189 if (CaseDest != *CommonDest)
6194 int Idx =
PHI.getBasicBlockIndex(Pred);
6207 Res.push_back(std::make_pair(&
PHI, ConstVal));
6210 return Res.
size() > 0;
6216 SwitchCaseResultVectorTy &UniqueResults,
6218 for (
auto &
I : UniqueResults) {
6219 if (
I.first == Result) {
6220 I.second.push_back(CaseVal);
6221 return I.second.size();
6224 UniqueResults.push_back(
6235 SwitchCaseResultVectorTy &UniqueResults,
6239 uintptr_t MaxUniqueResults) {
6240 for (
const auto &
I :
SI->cases()) {
6254 const size_t NumCasesForResult =
6262 if (UniqueResults.size() > MaxUniqueResults)
6278 DefaultResults.
size() == 1 ? DefaultResults.
begin()->second :
nullptr;
6280 return DefaultResult ||
SI->defaultDestUnreachable();
6301 const bool HasBranchWeights =
6304 if (ResultVector.size() == 2 && ResultVector[0].second.size() == 1 &&
6305 ResultVector[1].second.size() == 1) {
6306 ConstantInt *FirstCase = ResultVector[0].second[0];
6307 ConstantInt *SecondCase = ResultVector[1].second[0];
6308 Value *SelectValue = ResultVector[1].first;
6309 if (DefaultResult) {
6310 Value *ValueCompare =
6311 Builder.CreateICmpEQ(Condition, SecondCase,
"switch.selectcmp");
6312 SelectValue = Builder.CreateSelect(ValueCompare, ResultVector[1].first,
6313 DefaultResult,
"switch.select");
6315 SI && HasBranchWeights) {
6322 *
SI, {BranchWeights[2], BranchWeights[0] + BranchWeights[1]},
6326 Value *ValueCompare =
6327 Builder.CreateICmpEQ(Condition, FirstCase,
"switch.selectcmp");
6328 Value *Ret = Builder.CreateSelect(ValueCompare, ResultVector[0].first,
6329 SelectValue,
"switch.select");
6335 size_t FirstCasePos = (Condition !=
nullptr);
6336 size_t SecondCasePos = FirstCasePos + 1;
6337 uint32_t DefaultCase = (Condition !=
nullptr) ? BranchWeights[0] : 0;
6339 {BranchWeights[FirstCasePos],
6340 DefaultCase + BranchWeights[SecondCasePos]},
6347 if (ResultVector.size() == 1 && DefaultResult) {
6349 unsigned CaseCount = CaseValues.
size();
6362 for (
auto *Case : CaseValues) {
6363 if (Case->getValue().slt(MinCaseVal->
getValue()))
6365 AndMask &= Case->getValue();
6375 if (FreeBits ==
Log2_32(CaseCount)) {
6376 Value *
And = Builder.CreateAnd(Condition, AndMask);
6377 Value *Cmp = Builder.CreateICmpEQ(
6380 Builder.CreateSelect(Cmp, ResultVector[0].first, DefaultResult);
6396 for (
auto *Case : CaseValues)
6397 BitMask |= (Case->getValue() - MinCaseVal->
getValue());
6403 Condition = Builder.CreateSub(Condition, MinCaseVal);
6404 Value *
And = Builder.CreateAnd(Condition, ~BitMask,
"switch.and");
6405 Value *Cmp = Builder.CreateICmpEQ(
6408 Builder.CreateSelect(Cmp, ResultVector[0].first, DefaultResult);
6421 if (CaseValues.
size() == 2) {
6422 Value *Cmp1 = Builder.CreateICmpEQ(Condition, CaseValues[0],
6423 "switch.selectcmp.case1");
6424 Value *Cmp2 = Builder.CreateICmpEQ(Condition, CaseValues[1],
6425 "switch.selectcmp.case2");
6426 Value *Cmp = Builder.CreateOr(Cmp1, Cmp2,
"switch.selectcmp");
6428 Builder.CreateSelect(Cmp, ResultVector[0].first, DefaultResult);
6448 std::vector<DominatorTree::UpdateType> Updates;
6455 Builder.CreateBr(DestBB);
6459 PHI->removeIncomingValueIf(
6460 [&](
unsigned Idx) {
return PHI->getIncomingBlock(Idx) == SelectBB; });
6461 PHI->addIncoming(SelectValue, SelectBB);
6464 for (
unsigned i = 0, e =
SI->getNumSuccessors(); i < e; ++i) {
6470 if (DTU && RemovedSuccessors.
insert(Succ).second)
6473 SI->eraseFromParent();
6488 SwitchCaseResultVectorTy UniqueResults;
6494 assert(
PHI !=
nullptr &&
"PHI for value select not found");
6495 Builder.SetInsertPoint(
SI);
6498 [[maybe_unused]]
auto HasWeights =
6503 (BranchWeights.
size() >=
6504 UniqueResults.size() + (DefaultResult !=
nullptr)));
6507 Builder,
DL, BranchWeights);
6519class SwitchReplacement {
6526 const SmallVectorImpl<std::pair<ConstantInt *, Constant *>> &Values,
6527 Constant *DefaultValue,
const DataLayout &
DL,
const StringRef &FuncName);
6536 static bool wouldFitInRegister(
const DataLayout &
DL, uint64_t TableSize,
6543 bool isLookupTable();
6577 ConstantInt *BitMap =
nullptr;
6578 IntegerType *BitMapElementTy =
nullptr;
6581 ConstantInt *LinearOffset =
nullptr;
6582 ConstantInt *LinearMultiplier =
nullptr;
6583 bool LinearMapValWrapped =
false;
6591SwitchReplacement::SwitchReplacement(
6593 const SmallVectorImpl<std::pair<ConstantInt *, Constant *>> &Values,
6594 Constant *DefaultValue,
const DataLayout &
DL,
const StringRef &FuncName)
6595 : DefaultValue(DefaultValue) {
6596 assert(Values.size() &&
"Can't build lookup table without values!");
6597 assert(TableSize >= Values.size() &&
"Can't fit values in table!");
6600 SingleValue = Values.begin()->second;
6602 ValueType = Values.begin()->second->getType();
6606 for (
const auto &[CaseVal, CaseRes] : Values) {
6609 uint64_t Idx = (CaseVal->getValue() -
Offset->getValue()).getLimitedValue();
6610 TableContents[Idx] = CaseRes;
6617 if (Values.size() < TableSize) {
6619 "Need a default value to fill the lookup table holes.");
6622 if (!TableContents[
I])
6623 TableContents[
I] = DefaultValue;
6629 if (DefaultValue != SingleValue && !DefaultValueIsPoison)
6630 SingleValue =
nullptr;
6636 Kind = SingleValueKind;
6643 bool LinearMappingPossible =
true;
6648 bool NonMonotonic =
false;
6649 assert(TableSize >= 2 &&
"Should be a SingleValue table.");
6666 LinearMappingPossible =
false;
6671 APInt Dist = Val - PrevVal;
6674 }
else if (Dist != DistToPrev) {
6675 LinearMappingPossible =
false;
6683 if (LinearMappingPossible) {
6685 LinearMultiplier = ConstantInt::get(M.getContext(), DistToPrev);
6686 APInt M = LinearMultiplier->getValue();
6687 bool MayWrap =
true;
6688 if (
isIntN(M.getBitWidth(), TableSize - 1))
6689 (void)M.
smul_ov(
APInt(M.getBitWidth(), TableSize - 1), MayWrap);
6690 LinearMapValWrapped = NonMonotonic || MayWrap;
6691 Kind = LinearMapKind;
6697 if (wouldFitInRegister(
DL, TableSize,
ValueType)) {
6699 APInt TableInt(TableSize *
IT->getBitWidth(), 0);
6701 TableInt <<=
IT->getBitWidth();
6705 TableInt |= Val->
getValue().
zext(TableInt.getBitWidth());
6708 BitMap = ConstantInt::get(M.getContext(), TableInt);
6709 BitMapElementTy =
IT;
6718 Kind = LookupTableKind;
6724 case SingleValueKind:
6726 case LinearMapKind: {
6730 false,
"switch.idx.cast");
6731 if (!LinearMultiplier->
isOne())
6732 Result = Builder.
CreateMul(Result, LinearMultiplier,
"switch.idx.mult",
6734 !LinearMapValWrapped);
6736 if (!LinearOffset->
isZero())
6739 !LinearMapValWrapped);
6756 ShiftAmt, ConstantInt::get(MapTy, BitMapElementTy->
getBitWidth()),
6757 "switch.shiftamt",
true,
true);
6760 Value *DownShifted =
6761 Builder.
CreateLShr(BitMap, ShiftAmt,
"switch.downshift");
6763 return Builder.
CreateTrunc(DownShifted, BitMapElementTy,
"switch.masked");
6765 case LookupTableKind: {
6768 new GlobalVariable(*
Func->getParent(), Initializer->
getType(),
6769 true, GlobalVariable::PrivateLinkage,
6770 Initializer,
"switch.table." +
Func->getName());
6771 Table->setUnnamedAddr(GlobalValue::UnnamedAddr::Global);
6774 Table->setAlignment(
DL.getPrefTypeAlign(
ValueType));
6775 Type *IndexTy =
DL.getIndexType(Table->getType());
6778 if (
Index->getType() != IndexTy) {
6779 unsigned OldBitWidth =
Index->getType()->getIntegerBitWidth();
6783 isUIntN(OldBitWidth - 1, ArrayTy->getNumElements() - 1));
6786 Value *GEPIndices[] = {ConstantInt::get(IndexTy, 0),
Index};
6789 return Builder.
CreateLoad(ArrayTy->getElementType(),
GEP,
"switch.load");
6795bool SwitchReplacement::wouldFitInRegister(
const DataLayout &
DL,
6797 Type *ElementType) {
6805 if (TableSize >= UINT_MAX /
IT->getBitWidth())
6807 return DL.fitsInLegalInteger(TableSize *
IT->getBitWidth());
6813 if (
TTI.isTypeLegal(Ty))
6828 DL.fitsInLegalInteger(
IT->getBitWidth());
6831Constant *SwitchReplacement::getDefaultValue() {
return DefaultValue; }
6833bool SwitchReplacement::isLookupTable() {
return Kind == LookupTableKind; }
6844 return NumCases * 100 >= CaseRange * MinDensity;
6865 if (
SI->getNumCases() > TableSize)
6868 bool AllTablesFitInRegister =
true;
6869 bool HasIllegalType =
false;
6870 for (
const auto &Ty : ResultTypes) {
6875 AllTablesFitInRegister =
6876 AllTablesFitInRegister &&
6877 SwitchReplacement::wouldFitInRegister(
DL, TableSize, Ty);
6882 if (HasIllegalType && !AllTablesFitInRegister)
6887 if (AllTablesFitInRegister)
6904 MaxCaseVal.
getLimitedValue() == std::numeric_limits<uint64_t>::max() ||
6907 return all_of(ResultTypes, [&](
const auto &ResultType) {
6908 return SwitchReplacement::wouldFitInRegister(
6936 const SmallVectorImpl<std::pair<ConstantInt *, Constant *>> &Values) {
6958 if (DefaultConst != TrueConst && DefaultConst != FalseConst)
6963 for (
auto ValuePair : Values) {
6966 if (!CaseConst || CaseConst == DefaultConst ||
6967 (CaseConst != TrueConst && CaseConst != FalseConst))
6981 if (DefaultConst == FalseConst) {
6984 ++NumTableCmpReuses;
6987 Value *InvertedTableCmp = BinaryOperator::CreateXor(
6988 RangeCmp, ConstantInt::get(RangeCmp->
getType(), 1),
"inverted.cmp",
6991 ++NumTableCmpReuses;
7001 assert(
SI->getNumCases() > 1 &&
"Degenerate switch?");
7015 if (
SI->getNumCases() < 3)
7037 MinCaseVal = CaseVal;
7039 MaxCaseVal = CaseVal;
7056 It->second.push_back(std::make_pair(CaseVal,
Value));
7064 bool HasDefaultResults =
7066 DefaultResultsList,
DL,
TTI);
7067 for (
const auto &
I : DefaultResultsList) {
7070 DefaultResults[
PHI] = Result;
7074 *MinCaseVal, *MaxCaseVal, HasDefaultResults, ResultTypes,
DL,
TTI);
7077 if (UseSwitchConditionAsTableIndex) {
7079 TableIndexOffset = ConstantInt::get(MaxCaseVal->
getIntegerType(), 0);
7084 TableIndexOffset = MinCaseVal;
7091 bool DefaultIsReachable = !
SI->defaultDestUnreachable();
7093 bool TableHasHoles = (NumResults < TableSize);
7098 bool AllHolesArePoison = TableHasHoles && !HasDefaultResults;
7106 bool NeedMask = AllHolesArePoison && DefaultIsReachable;
7109 if (
SI->getNumCases() < 4)
7111 if (!
DL.fitsInLegalInteger(TableSize))
7120 if (UseSwitchConditionAsTableIndex) {
7121 TableIndex =
SI->getCondition();
7122 if (HasDefaultResults) {
7134 all_of(ResultTypes, [&](
const auto &ResultType) {
7135 return SwitchReplacement::wouldFitInRegister(
DL, UpperBound,
7140 TableSize = std::max(UpperBound, TableSize);
7143 DefaultIsReachable =
false;
7151 const auto &ResultList = ResultLists[
PHI];
7153 Type *ResultType = ResultList.begin()->second->getType();
7158 SwitchReplacement Replacement(*Fn->
getParent(), TableSize, TableIndexOffset,
7160 PhiToReplacementMap.
insert({
PHI, Replacement});
7163 bool AnyLookupTables =
any_of(
7164 PhiToReplacementMap, [](
auto &KV) {
return KV.second.isLookupTable(); });
7172 if (AnyLookupTables &&
7173 (!
TTI.shouldBuildLookupTables() ||
7177 Builder.SetInsertPoint(
SI);
7180 if (!UseSwitchConditionAsTableIndex) {
7183 bool MayWrap =
true;
7184 if (!DefaultIsReachable) {
7189 TableIndex = Builder.CreateSub(
SI->getCondition(), TableIndexOffset,
7190 "switch.tableidx",
false,
7194 std::vector<DominatorTree::UpdateType> Updates;
7200 assert(MaxTableSize >= TableSize &&
7201 "It is impossible for a switch to have more entries than the max "
7202 "representable value of its input integer type's size.");
7207 Mod.getContext(),
"switch.lookup", CommonDest->
getParent(), CommonDest);
7211 Builder.SetInsertPoint(
SI);
7212 const bool GeneratingCoveredLookupTable = (MaxTableSize == TableSize);
7213 if (!DefaultIsReachable || GeneratingCoveredLookupTable) {
7214 Builder.CreateBr(LookupBB);
7220 Value *Cmp = Builder.CreateICmpULT(
7221 TableIndex, ConstantInt::get(MinCaseVal->
getType(), TableSize));
7223 Builder.CreateCondBr(Cmp, LookupBB,
SI->getDefaultDest());
7229 Builder.SetInsertPoint(LookupBB);
7235 MaskBB->
setName(
"switch.hole_check");
7242 APInt MaskInt(TableSizePowOf2, 0);
7243 APInt One(TableSizePowOf2, 1);
7245 const ResultListTy &ResultList = ResultLists[PHIs[0]];
7246 for (
const auto &Result : ResultList) {
7249 MaskInt |= One << Idx;
7251 ConstantInt *TableMask = ConstantInt::get(
Mod.getContext(), MaskInt);
7258 Builder.CreateZExtOrTrunc(TableIndex, MapTy,
"switch.maskindex");
7259 Value *Shifted = Builder.CreateLShr(TableMask, MaskIndex,
"switch.shifted");
7260 Value *LoBit = Builder.CreateTrunc(
7262 Builder.CreateCondBr(LoBit, LookupBB,
SI->getDefaultDest());
7267 Builder.SetInsertPoint(LookupBB);
7271 if (!DefaultIsReachable || GeneratingCoveredLookupTable) {
7274 SI->getDefaultDest()->removePredecessor(BB,
7281 const ResultListTy &ResultList = ResultLists[
PHI];
7282 auto Replacement = PhiToReplacementMap.
at(
PHI);
7283 auto *Result = Replacement.replaceSwitch(TableIndex, Builder,
DL, Fn);
7286 if (!TableHasHoles && HasDefaultResults && RangeCheckBranch) {
7289 for (
auto *
User :
PHI->users()) {
7291 Replacement.getDefaultValue(), ResultList);
7295 PHI->addIncoming(Result, LookupBB);
7298 Builder.CreateBr(CommonDest);
7304 for (
unsigned i = 0, e =
SI->getNumSuccessors(); i < e; ++i) {
7307 if (Succ ==
SI->getDefaultDest())
7310 if (DTU && RemovedSuccessors.
insert(Succ).second)
7313 SI->eraseFromParent();
7319 ++NumLookupTablesHoles;
7335 if (CondTy->getIntegerBitWidth() > 64 ||
7336 !
DL.fitsInLegalInteger(CondTy->getIntegerBitWidth()))
7340 if (
SI->getNumCases() < 4)
7348 for (
const auto &
C :
SI->cases())
7349 Values.
push_back(
C.getCaseValue()->getValue().getSExtValue());
7357 int64_t
Base = Values[0];
7358 for (
auto &V : Values)
7371 unsigned Shift = 64;
7372 for (
auto &V : Values)
7376 for (
auto &V : Values)
7377 V = (int64_t)((
uint64_t)V >> Shift);
7394 Builder.SetInsertPoint(
SI);
7396 Builder.CreateSub(
SI->getCondition(), ConstantInt::get(Ty,
Base));
7397 Value *Rot = Builder.CreateIntrinsic(
7398 Ty, Intrinsic::fshl,
7399 {
Sub,
Sub, ConstantInt::get(Ty, Ty->getBitWidth() - Shift)});
7400 SI->replaceUsesOfWith(
SI->getCondition(), Rot);
7402 for (
auto Case :
SI->cases()) {
7403 auto *Orig = Case.getCaseValue();
7404 auto Sub = Orig->getValue() -
APInt(Ty->getBitWidth(),
Base,
true);
7423 Value *Condition =
SI->getCondition();
7427 if (CondTy->getIntegerBitWidth() > 64 ||
7428 !
DL.fitsInLegalInteger(CondTy->getIntegerBitWidth()))
7440 if (
SI->getNumCases() < 4)
7446 if (!
SI->defaultDestUnreachable())
7451 for (
const auto &Case :
SI->cases()) {
7452 uint64_t CaseValue = Case.getCaseValue()->getValue().getZExtValue();
7466 Builder.SetInsertPoint(
SI);
7469 for (
auto &Case :
SI->cases()) {
7470 auto *OrigValue = Case.getCaseValue();
7471 Case.setValue(ConstantInt::get(OrigValue->getIntegerType(),
7472 OrigValue->getValue().countr_zero()));
7476 auto *ConditionTrailingZeros = Builder.CreateIntrinsic(
7479 SI->setCondition(ConditionTrailingZeros);
7489 if (!Cmp || !Cmp->hasOneUse())
7500 uint32_t SuccWeight = 0, OtherSuccWeight = 0;
7503 if (
SI->getNumCases() == 2) {
7510 Succ =
SI->getDefaultDest();
7511 SuccWeight = Weights[0];
7513 for (
auto &Case :
SI->cases()) {
7514 std::optional<int64_t> Val =
7518 if (!Missing.erase(*Val))
7523 OtherSuccWeight += Weights[Case.getSuccessorIndex()];
7526 assert(Missing.size() == 1 &&
"Should have one case left");
7527 Res = *Missing.begin();
7528 }
else if (
SI->getNumCases() == 3 &&
SI->defaultDestUnreachable()) {
7530 Unreachable =
SI->getDefaultDest();
7532 for (
auto &Case :
SI->cases()) {
7533 BasicBlock *NewSucc = Case.getCaseSuccessor();
7534 uint32_t Weight = Weights[Case.getSuccessorIndex()];
7537 OtherSuccWeight += Weight;
7540 SuccWeight = Weight;
7541 }
else if (Succ == NewSucc) {
7547 for (
auto &Case :
SI->cases()) {
7548 std::optional<int64_t> Val =
7550 if (!Val || (Val != 1 && Val != 0 && Val != -1))
7552 if (Case.getCaseSuccessor() == Succ) {
7574 if (Cmp->isSigned())
7577 MDNode *NewWeights =
nullptr;
7583 Builder.SetInsertPoint(
SI->getIterator());
7584 Value *ICmp = Builder.CreateICmp(Pred, Cmp->getLHS(), Cmp->getRHS());
7585 Builder.CreateCondBr(ICmp, Succ,
OtherSucc, NewWeights,
7586 SI->getMetadata(LLVMContext::MD_unpredictable));
7590 SI->eraseFromParent();
7591 Cmp->eraseFromParent();
7592 if (DTU && Unreachable)
7624 "Only supporting unconditional branches for now");
7626 "Expected unconditional branches to have one successor");
7627 assert(Succ->
size() == 1 &&
"Expected just a single branch in the BB");
7648 if (LHS == EKey || RHS == EKey || LHS == TKey || RHS == TKey)
7664 "Only supporting unconditional branches for now");
7671 auto &PredIVs = (*LHS->PhiPredIVs)[&Phi];
7672 if (PredIVs[
A] != PredIVs[
B])
7681bool SimplifyCFGOpt::simplifyDuplicateSwitchArms(SwitchInst *SI,
7682 DomTreeUpdater *DTU) {
7688 SmallPtrSet<PHINode *, 8> Phis;
7689 SmallPtrSet<BasicBlock *, 8> Seen;
7690 DenseMap<PHINode *, SmallDenseMap<BasicBlock *, Value *, 8>> PhiPredIVs;
7691 DenseMap<BasicBlock *, SmallVector<unsigned, 32>> BBToSuccessorIndexes;
7695 for (
unsigned I = 0;
I <
SI->getNumSuccessors(); ++
I) {
7700 if (BB->
size() != 1)
7710 if (!Seen.
insert(BB).second) {
7711 auto It = BBToSuccessorIndexes.
find(BB);
7712 if (It != BBToSuccessorIndexes.
end())
7713 It->second.emplace_back(
I);
7727 Cases.
emplace_back(SwitchSuccWrapper{BB, &PhiPredIVs});
7728 BBToSuccessorIndexes[BB].emplace_back(
I);
7734 for (PHINode *Phi : Phis) {
7736 PhiPredIVs.
try_emplace(Phi,
Phi->getNumIncomingValues()).first->second;
7737 for (
auto &
IV :
Phi->incoming_values())
7738 IVs.insert({
Phi->getIncomingBlock(
IV),
IV.get()});
7749 DenseSet<const SwitchSuccWrapper *> ReplaceWith;
7754 bool MadeChange =
false;
7755 for (
auto &SSW : Cases) {
7762 Updates.
push_back({DominatorTree::Delete,
SI->getParent(), SSW.Dest});
7763 const auto &Successors = BBToSuccessorIndexes.
at(SSW.Dest);
7764 for (
unsigned Idx : Successors)
7765 SI->setSuccessor(Idx, (*It)->Dest);
7776bool SimplifyCFGOpt::simplifySwitch(SwitchInst *SI,
IRBuilder<> &Builder) {
7779 if (isValueEqualityComparison(SI)) {
7783 if (simplifyEqualityComparisonWithOnlyPredecessor(SI, OnlyPred, Builder))
7784 return requestResimplify();
7788 if (simplifySwitchOnSelect(SI,
Select))
7789 return requestResimplify();
7794 if (foldValueComparisonIntoPredecessors(SI, Builder))
7795 return requestResimplify();
7801 if (
Options.ConvertSwitchRangeToICmp && turnSwitchRangeIntoICmp(SI, Builder))
7802 return requestResimplify();
7806 return requestResimplify();
7809 return requestResimplify();
7812 return requestResimplify();
7815 return requestResimplify();
7822 if (
Options.ConvertSwitchToLookupTable &&
7824 return requestResimplify();
7827 return requestResimplify();
7830 return requestResimplify();
7833 hoistCommonCodeFromSuccessors(SI, !
Options.HoistCommonInsts))
7834 return requestResimplify();
7836 if (simplifyDuplicateSwitchArms(SI, DTU))
7837 return requestResimplify();
7842bool SimplifyCFGOpt::simplifyIndirectBr(IndirectBrInst *IBI) {
7847 SmallPtrSet<Value *, 8> Succs;
7848 SmallSetVector<BasicBlock *, 8> RemovedSuccs;
7853 RemovedSuccs.
insert(Dest);
7863 std::vector<DominatorTree::UpdateType> Updates;
7864 Updates.reserve(RemovedSuccs.
size());
7865 for (
auto *RemovedSucc : RemovedSuccs)
7866 Updates.push_back({DominatorTree::Delete, BB, RemovedSucc});
7885 if (simplifyIndirectBrOnSelect(IBI, SI))
7886 return requestResimplify();
7922 if (BB == OtherPred)
7933 std::vector<DominatorTree::UpdateType> Updates;
7940 assert(
II->getNormalDest() != BB &&
II->getUnwindDest() == BB &&
7941 "unexpected successor");
7942 II->setUnwindDest(OtherPred);
7957 Builder.CreateUnreachable();
7966bool SimplifyCFGOpt::simplifyBranch(BranchInst *Branch,
IRBuilder<> &Builder) {
7967 return Branch->isUnconditional() ? simplifyUncondBranch(Branch, Builder)
7968 : simplifyCondBranch(
Branch, Builder);
7971bool SimplifyCFGOpt::simplifyUncondBranch(BranchInst *BI,
7983 bool NeedCanonicalLoop =
7997 if (
I->isTerminator() &&
7998 tryToSimplifyUncondBranchWithICmpInIt(ICI, Builder))
8014 if (
Options.SpeculateBlocks &&
8017 return requestResimplify();
8025 if (!PPred || (PredPred && PredPred != PPred))
8062 if (!SuccBI || !SuccBI->isConditional())
8066 return Succ1 != Succ && Succ2 != Succ && Succ1 != BB && Succ2 != BB &&
8070 if (!IsSimpleSuccessor(BB1, BB1BI) || !IsSimpleSuccessor(BB2, BB2BI))
8096 bool HasWeight =
false;
8101 BBTWeight = BBFWeight = 1;
8106 BB1TWeight = BB1FWeight = 1;
8111 BB2TWeight = BB2FWeight = 1;
8113 uint64_t Weights[2] = {BBTWeight * BB1FWeight + BBFWeight * BB2TWeight,
8114 BBTWeight * BB1TWeight + BBFWeight * BB2FWeight};
8121bool SimplifyCFGOpt::simplifyCondBranch(BranchInst *BI,
IRBuilder<> &Builder) {
8125 "Tautological conditional branch should have been eliminated already.");
8128 if (!
Options.SimplifyCondBranch ||
8133 if (isValueEqualityComparison(BI)) {
8138 if (simplifyEqualityComparisonWithOnlyPredecessor(BI, OnlyPred, Builder))
8139 return requestResimplify();
8145 if (foldValueComparisonIntoPredecessors(BI, Builder))
8146 return requestResimplify();
8149 if (&*
I == BI && foldValueComparisonIntoPredecessors(BI, Builder))
8150 return requestResimplify();
8155 if (simplifyBranchOnICmpChain(BI, Builder,
DL))
8168 return requestResimplify();
8174 if (
Options.SpeculateBlocks &&
8177 return requestResimplify();
8186 hoistCommonCodeFromSuccessors(BI, !
Options.HoistCommonInsts))
8187 return requestResimplify();
8189 if (BI &&
Options.HoistLoadsStoresWithCondFaulting &&
8191 SmallVector<Instruction *, 2> SpeculatedConditionalLoadsStores;
8192 auto CanSpeculateConditionalLoadsStores = [&]() {
8194 for (Instruction &
I : *Succ) {
8195 if (
I.isTerminator()) {
8196 if (
I.getNumSuccessors() > 1)
8200 SpeculatedConditionalLoadsStores.
size() ==
8204 SpeculatedConditionalLoadsStores.
push_back(&
I);
8207 return !SpeculatedConditionalLoadsStores.
empty();
8210 if (CanSpeculateConditionalLoadsStores()) {
8212 std::nullopt,
nullptr);
8213 return requestResimplify();
8223 return requestResimplify();
8232 return requestResimplify();
8238 if (foldCondBranchOnValueKnownInPredecessor(BI))
8239 return requestResimplify();
8244 if (PBI != BI && PBI->isConditional())
8246 return requestResimplify();
8252 if (PBI != BI && PBI->isConditional())
8254 return requestResimplify();
8258 return requestResimplify();
8265 assert(V->getType() ==
I->getType() &&
"Mismatched types");
8277 auto *Use = cast<Instruction>(U.getUser());
8279 switch (Use->getOpcode()) {
8282 case Instruction::GetElementPtr:
8283 case Instruction::Ret:
8284 case Instruction::BitCast:
8285 case Instruction::Load:
8286 case Instruction::Store:
8287 case Instruction::Call:
8288 case Instruction::CallBr:
8289 case Instruction::Invoke:
8290 case Instruction::UDiv:
8291 case Instruction::URem:
8295 case Instruction::SDiv:
8296 case Instruction::SRem:
8300 if (FindUse ==
I->use_end())
8302 auto &
Use = *FindUse;
8307 if (
User->getParent() !=
I->getParent() ||
User ==
I ||
8308 User->comesBefore(
I))
8322 if (
GEP->getPointerOperand() ==
I) {
8325 if (
GEP->getType()->isVectorTy())
8333 if (!
GEP->hasAllZeroIndices() &&
8334 (!
GEP->isInBounds() ||
8336 GEP->getPointerAddressSpace())))
8337 PtrValueMayBeModified =
true;
8343 bool HasNoUndefAttr =
8344 Ret->getFunction()->hasRetAttribute(Attribute::NoUndef);
8349 if (
C->isNullValue() && HasNoUndefAttr &&
8350 Ret->getFunction()->hasRetAttribute(Attribute::NonNull)) {
8351 return !PtrValueMayBeModified;
8357 if (!LI->isVolatile())
8359 LI->getPointerAddressSpace());
8363 if (!
SI->isVolatile())
8365 SI->getPointerAddressSpace())) &&
8366 SI->getPointerOperand() ==
I;
8371 if (
I == Assume->getArgOperand(0))
8379 if (CB->getCalledOperand() ==
I)
8382 if (CB->isArgOperand(&
Use)) {
8383 unsigned ArgIdx = CB->getArgOperandNo(&
Use);
8386 CB->paramHasNonNullAttr(ArgIdx,
false))
8387 return !PtrValueMayBeModified;
8406 for (
unsigned i = 0, e =
PHI.getNumIncomingValues(); i != e; ++i)
8416 Builder.CreateUnreachable();
8423 Assumption = Builder.CreateAssumption(Builder.CreateNot(
Cond));
8425 Assumption = Builder.CreateAssumption(
Cond);
8440 Builder.SetInsertPoint(Unreachable);
8442 Builder.CreateUnreachable();
8443 for (
const auto &Case :
SI->cases())
8444 if (Case.getCaseSuccessor() == BB) {
8446 Case.setSuccessor(Unreachable);
8448 if (
SI->getDefaultDest() == BB) {
8450 SI->setDefaultDest(Unreachable);
8464bool SimplifyCFGOpt::simplifyOnce(BasicBlock *BB) {
8489 return requestResimplify();
8510 if (
Options.SpeculateBlocks &&
8517 Options.SpeculateUnpredictables))
8524 case Instruction::Br:
8527 case Instruction::Resume:
8530 case Instruction::CleanupRet:
8533 case Instruction::Switch:
8536 case Instruction::Unreachable:
8539 case Instruction::IndirectBr:
8547bool SimplifyCFGOpt::run(BasicBlock *BB) {
8557 }
while (Resimplify);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
AMDGPU Register Bank Select
This file implements a class to represent arbitrary precision integral constant values and operations...
static MachineBasicBlock * OtherSucc(MachineBasicBlock *MBB, MachineBasicBlock *Succ)
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static cl::opt< ITMode > IT(cl::desc("IT block support"), cl::Hidden, cl::init(DefaultIT), cl::values(clEnumValN(DefaultIT, "arm-default-it", "Generate any type of IT block"), clEnumValN(RestrictedIT, "arm-restrict-it", "Disallow complex IT blocks")))
Function Alias Analysis Results
This file contains the simple types necessary to represent the attributes associated with functions a...
static const Function * getParent(const Value *V)
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
static cl::opt< OutputCostKind > CostKind("cost-kind", cl::desc("Target cost kind"), cl::init(OutputCostKind::RecipThroughput), cl::values(clEnumValN(OutputCostKind::RecipThroughput, "throughput", "Reciprocal throughput"), clEnumValN(OutputCostKind::Latency, "latency", "Instruction latency"), clEnumValN(OutputCostKind::CodeSize, "code-size", "Code size"), clEnumValN(OutputCostKind::SizeAndLatency, "size-latency", "Code size and latency"), clEnumValN(OutputCostKind::All, "all", "Print all cost kinds")))
This file defines the DenseMap class.
This file provides various utilities for inspecting and working with the control flow graph in LLVM I...
Module.h This file contains the declarations for the Module class.
This defines the Use class.
static Constant * getFalse(Type *Ty)
For a boolean type or a vector of boolean type, return false or a vector with every element false.
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
Machine Check Debug Module
This file implements a map that provides insertion order iteration.
This file provides utility for Memory Model Relaxation Annotations (MMRAs).
This file exposes an interface to building/using memory SSA to walk memory instructions using a use/d...
MachineInstr unsigned OpIdx
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
uint64_t IntrinsicInst * II
if(auto Err=PB.parsePassPipeline(MPM, Passes)) return wrap(std MPM run * Mod
This file contains the declarations for profiling metadata utility functions.
const SmallVectorImpl< MachineOperand > & Cond
unsigned unsigned DefaultVal
cl::opt< bool > ProfcheckDisableMetadataFixes("profcheck-disable-metadata-fixes", cl::Hidden, cl::init(false), cl::desc("Disable metadata propagation fixes discovered through Issue #147390"))
static bool contains(SmallPtrSetImpl< ConstantExpr * > &Cache, ConstantExpr *Expr, Constant *C)
Provides some synthesis utilities to produce sequences of values.
This file defines generic set operations that may be used on set's of different types,...
This file implements a set that has insertion order iteration characteristics.
static void addPredecessorToBlock(BasicBlock *Succ, BasicBlock *NewPred, BasicBlock *ExistPred, MemorySSAUpdater *MSSAU=nullptr)
Update PHI nodes in Succ to indicate that there will now be entries in it from the 'NewPred' block.
static bool validLookupTableConstant(Constant *C, const TargetTransformInfo &TTI)
Return true if the backend will be able to handle initializing an array of constants like C.
static StoreInst * findUniqueStoreInBlocks(BasicBlock *BB1, BasicBlock *BB2)
static bool simplifySwitchLookup(SwitchInst *SI, IRBuilder<> &Builder, DomTreeUpdater *DTU, const DataLayout &DL, const TargetTransformInfo &TTI)
If the switch is only used to initialize one or more phi nodes in a common successor block with diffe...
static bool isProfitableToSpeculate(const BranchInst *BI, std::optional< bool > Invert, const TargetTransformInfo &TTI)
static bool validateAndCostRequiredSelects(BasicBlock *BB, BasicBlock *ThenBB, BasicBlock *EndBB, unsigned &SpeculatedInstructions, InstructionCost &Cost, const TargetTransformInfo &TTI)
Estimate the cost of the insertion(s) and check that the PHI nodes can be converted to selects.
static cl::opt< bool > SinkCommon("simplifycfg-sink-common", cl::Hidden, cl::init(true), cl::desc("Sink common instructions down to the end block"))
static void removeSwitchAfterSelectFold(SwitchInst *SI, PHINode *PHI, Value *SelectValue, IRBuilder<> &Builder, DomTreeUpdater *DTU)
static bool valuesOverlap(std::vector< ValueEqualityComparisonCase > &C1, std::vector< ValueEqualityComparisonCase > &C2)
Return true if there are any keys in C1 that exist in C2 as well.
static bool mergeConditionalStoreToAddress(BasicBlock *PTB, BasicBlock *PFB, BasicBlock *QTB, BasicBlock *QFB, BasicBlock *PostBB, Value *Address, bool InvertPCond, bool InvertQCond, DomTreeUpdater *DTU, const DataLayout &DL, const TargetTransformInfo &TTI)
static cl::opt< unsigned > MaxSpeculationDepth("max-speculation-depth", cl::Hidden, cl::init(10), cl::desc("Limit maximum recursion depth when calculating costs of " "speculatively executed instructions"))
static std::optional< std::tuple< BasicBlock *, Instruction::BinaryOps, bool > > shouldFoldCondBranchesToCommonDestination(BranchInst *BI, BranchInst *PBI, const TargetTransformInfo *TTI)
Determine if the two branches share a common destination and deduce a glue that joins the branches' c...
static bool mergeCleanupPad(CleanupReturnInst *RI)
static void hoistConditionalLoadsStores(BranchInst *BI, SmallVectorImpl< Instruction * > &SpeculatedConditionalLoadsStores, std::optional< bool > Invert, Instruction *Sel)
If the target supports conditional faulting, we look for the following pattern:
static bool isVectorOp(Instruction &I)
Return if an instruction's type or any of its operands' types are a vector type.
static cl::opt< unsigned > MaxSwitchCasesPerResult("max-switch-cases-per-result", cl::Hidden, cl::init(16), cl::desc("Limit cases to analyze when converting a switch to select"))
static BasicBlock * allPredecessorsComeFromSameSource(BasicBlock *BB)
static void cloneInstructionsIntoPredecessorBlockAndUpdateSSAUses(BasicBlock *BB, BasicBlock *PredBlock, ValueToValueMapTy &VMap)
static int constantIntSortPredicate(ConstantInt *const *P1, ConstantInt *const *P2)
static bool getCaseResults(SwitchInst *SI, ConstantInt *CaseVal, BasicBlock *CaseDest, BasicBlock **CommonDest, SmallVectorImpl< std::pair< PHINode *, Constant * > > &Res, const DataLayout &DL, const TargetTransformInfo &TTI)
Try to determine the resulting constant values in phi nodes at the common destination basic block,...
static bool performBranchToCommonDestFolding(BranchInst *BI, BranchInst *PBI, DomTreeUpdater *DTU, MemorySSAUpdater *MSSAU, const TargetTransformInfo *TTI)
static bool passingValueIsAlwaysUndefined(Value *V, Instruction *I, bool PtrValueMayBeModified=false)
Check if passing a value to an instruction will cause undefined behavior.
static cl::opt< bool > HoistStoresWithCondFaulting("simplifycfg-hoist-stores-with-cond-faulting", cl::Hidden, cl::init(true), cl::desc("Hoist stores if the target supports conditional faulting"))
static bool isSafeToHoistInstr(Instruction *I, unsigned Flags)
static bool isSafeToHoistInvoke(BasicBlock *BB1, BasicBlock *BB2, Instruction *I1, Instruction *I2)
static ConstantInt * getConstantInt(Value *V, const DataLayout &DL)
Extract ConstantInt from value, looking through IntToPtr and PointerNullValue.
static cl::opt< bool > MergeCondStoresAggressively("simplifycfg-merge-cond-stores-aggressively", cl::Hidden, cl::init(false), cl::desc("When merging conditional stores, do so even if the resultant " "basic blocks are unlikely to be if-converted as a result"))
static bool simplifySwitchOfCmpIntrinsic(SwitchInst *SI, IRBuilderBase &Builder, DomTreeUpdater *DTU)
Fold switch over ucmp/scmp intrinsic to br if two of the switch arms have the same destination.
static bool shouldBuildLookupTable(SwitchInst *SI, uint64_t TableSize, const TargetTransformInfo &TTI, const DataLayout &DL, const SmallVector< Type * > &ResultTypes)
Determine whether a lookup table should be built for this switch, based on the number of cases,...
static bool extractPredSuccWeights(BranchInst *PBI, BranchInst *BI, uint64_t &PredTrueWeight, uint64_t &PredFalseWeight, uint64_t &SuccTrueWeight, uint64_t &SuccFalseWeight)
Return true if either PBI or BI has branch weight available, and store the weights in {Pred|Succ}...
static cl::opt< unsigned > TwoEntryPHINodeFoldingThreshold("two-entry-phi-node-folding-threshold", cl::Hidden, cl::init(4), cl::desc("Control the maximal total instruction cost that we are willing " "to speculatively execute to fold a 2-entry PHI node into a " "select (default = 4)"))
static Constant * constantFold(Instruction *I, const DataLayout &DL, const SmallDenseMap< Value *, Constant * > &ConstantPool)
Try to fold instruction I into a constant.
static bool SimplifyCondBranchToCondBranch(BranchInst *PBI, BranchInst *BI, DomTreeUpdater *DTU, const DataLayout &DL, const TargetTransformInfo &TTI)
If we have a conditional branch as a predecessor of another block, this function tries to simplify it...
static bool tryToMergeLandingPad(LandingPadInst *LPad, BranchInst *BI, BasicBlock *BB, DomTreeUpdater *DTU)
Given an block with only a single landing pad and a unconditional branch try to find another basic bl...
static cl::opt< bool > SpeculateOneExpensiveInst("speculate-one-expensive-inst", cl::Hidden, cl::init(true), cl::desc("Allow exactly one expensive instruction to be speculatively " "executed"))
static bool areIdenticalUpToCommutativity(const Instruction *I1, const Instruction *I2)
static cl::opt< int > MaxSmallBlockSize("simplifycfg-max-small-block-size", cl::Hidden, cl::init(10), cl::desc("Max size of a block which is still considered " "small enough to thread through"))
static bool forwardSwitchConditionToPHI(SwitchInst *SI)
Try to forward the condition of a switch instruction to a phi node dominated by the switch,...
static PHINode * findPHIForConditionForwarding(ConstantInt *CaseValue, BasicBlock *BB, int *PhiIndex)
If BB would be eligible for simplification by TryToSimplifyUncondBranchFromEmptyBlock (i....
static bool isCleanupBlockEmpty(iterator_range< BasicBlock::iterator > R)
static Value * ensureValueAvailableInSuccessor(Value *V, BasicBlock *BB, Value *AlternativeV=nullptr)
static Value * createLogicalOp(IRBuilderBase &Builder, Instruction::BinaryOps Opc, Value *LHS, Value *RHS, const Twine &Name="")
static bool shouldHoistCommonInstructions(Instruction *I1, Instruction *I2, const TargetTransformInfo &TTI)
Helper function for hoistCommonCodeFromSuccessors.
static bool reduceSwitchRange(SwitchInst *SI, IRBuilder<> &Builder, const DataLayout &DL, const TargetTransformInfo &TTI)
Try to transform a switch that has "holes" in it to a contiguous sequence of cases.
static bool mergeConditionalStores(BranchInst *PBI, BranchInst *QBI, DomTreeUpdater *DTU, const DataLayout &DL, const TargetTransformInfo &TTI)
static bool safeToMergeTerminators(Instruction *SI1, Instruction *SI2, SmallSetVector< BasicBlock *, 4 > *FailBlocks=nullptr)
Return true if it is safe to merge these two terminator instructions together.
@ SkipImplicitControlFlow
static cl::opt< bool > EnableMergeCompatibleInvokes("simplifycfg-merge-compatible-invokes", cl::Hidden, cl::init(true), cl::desc("Allow SimplifyCFG to merge invokes together when appropriate"))
static bool incomingValuesAreCompatible(BasicBlock *BB, ArrayRef< BasicBlock * > IncomingBlocks, SmallPtrSetImpl< Value * > *EquivalenceSet=nullptr)
Return true if all the PHI nodes in the basic block BB receive compatible (identical) incoming values...
static bool trySwitchToSelect(SwitchInst *SI, IRBuilder<> &Builder, DomTreeUpdater *DTU, const DataLayout &DL, const TargetTransformInfo &TTI)
If a switch is only used to initialize one or more phi nodes in a common successor block with only tw...
static cl::opt< unsigned > BranchFoldThreshold("simplifycfg-branch-fold-threshold", cl::Hidden, cl::init(2), cl::desc("Maximum cost of combining conditions when " "folding branches"))
static void createUnreachableSwitchDefault(SwitchInst *Switch, DomTreeUpdater *DTU, bool RemoveOrigDefaultBlock=true)
static Value * foldSwitchToSelect(const SwitchCaseResultVectorTy &ResultVector, Constant *DefaultResult, Value *Condition, IRBuilder<> &Builder, const DataLayout &DL, ArrayRef< uint32_t > BranchWeights)
static bool isSwitchDense(uint64_t NumCases, uint64_t CaseRange)
static bool sinkCommonCodeFromPredecessors(BasicBlock *BB, DomTreeUpdater *DTU)
Check whether BB's predecessors end with unconditional branches.
static bool casesAreContiguous(SmallVectorImpl< ConstantInt * > &Cases)
static bool isTypeLegalForLookupTable(Type *Ty, const TargetTransformInfo &TTI, const DataLayout &DL)
static bool eliminateDeadSwitchCases(SwitchInst *SI, DomTreeUpdater *DTU, AssumptionCache *AC, const DataLayout &DL)
Compute masked bits for the condition of a switch and use it to remove dead cases.
static bool blockIsSimpleEnoughToThreadThrough(BasicBlock *BB, BlocksSet &NonLocalUseBlocks)
Return true if we can thread a branch across this block.
static Value * isSafeToSpeculateStore(Instruction *I, BasicBlock *BrBB, BasicBlock *StoreBB, BasicBlock *EndBB)
Determine if we can hoist sink a sole store instruction out of a conditional block.
static cl::opt< bool > HoistCommon("simplifycfg-hoist-common", cl::Hidden, cl::init(true), cl::desc("Hoist common instructions up to the parent block"))
static bool foldTwoEntryPHINode(PHINode *PN, const TargetTransformInfo &TTI, DomTreeUpdater *DTU, AssumptionCache *AC, const DataLayout &DL, bool SpeculateUnpredictables)
Given a BB that starts with the specified two-entry PHI node, see if we can eliminate it.
static bool findReaching(BasicBlock *BB, BasicBlock *DefBB, BlocksSet &ReachesNonLocalUses)
static bool initializeUniqueCases(SwitchInst *SI, PHINode *&PHI, BasicBlock *&CommonDest, SwitchCaseResultVectorTy &UniqueResults, Constant *&DefaultResult, const DataLayout &DL, const TargetTransformInfo &TTI, uintptr_t MaxUniqueResults)
static bool shouldUseSwitchConditionAsTableIndex(ConstantInt &MinCaseVal, const ConstantInt &MaxCaseVal, bool HasDefaultResults, const SmallVector< Type * > &ResultTypes, const DataLayout &DL, const TargetTransformInfo &TTI)
static cl::opt< bool > HoistCondStores("simplifycfg-hoist-cond-stores", cl::Hidden, cl::init(true), cl::desc("Hoist conditional stores if an unconditional store precedes"))
static InstructionCost computeSpeculationCost(const User *I, const TargetTransformInfo &TTI)
Compute an abstract "cost" of speculating the given instruction, which is assumed to be safe to specu...
SmallPtrSet< BasicBlock *, 8 > BlocksSet
static unsigned skippedInstrFlags(Instruction *I)
static bool mergeCompatibleInvokes(BasicBlock *BB, DomTreeUpdater *DTU)
If this block is a landingpad exception handling block, categorize all the predecessor invokes into s...
static bool replacingOperandWithVariableIsCheap(const Instruction *I, int OpIdx)
static void eraseTerminatorAndDCECond(Instruction *TI, MemorySSAUpdater *MSSAU=nullptr)
static void eliminateBlockCases(BasicBlock *BB, std::vector< ValueEqualityComparisonCase > &Cases)
Given a vector of bb/value pairs, remove any entries in the list that match the specified block.
static void sinkLastInstruction(ArrayRef< BasicBlock * > Blocks)
static std::optional< bool > foldCondBranchOnValueKnownInPredecessorImpl(BranchInst *BI, DomTreeUpdater *DTU, const DataLayout &DL, AssumptionCache *AC)
If we have a conditional branch on something for which we know the constant value in predecessors (e....
static cl::opt< bool > HoistLoadsWithCondFaulting("simplifycfg-hoist-loads-with-cond-faulting", cl::Hidden, cl::init(true), cl::desc("Hoist loads if the target supports conditional faulting"))
static size_t mapCaseToResult(ConstantInt *CaseVal, SwitchCaseResultVectorTy &UniqueResults, Constant *Result)
static void mergeCompatibleInvokesImpl(ArrayRef< InvokeInst * > Invokes, DomTreeUpdater *DTU)
static void getBranchWeights(Instruction *TI, SmallVectorImpl< uint64_t > &Weights)
Get Weights of a given terminator, the default weight is at the front of the vector.
static void reuseTableCompare(User *PhiUser, BasicBlock *PhiBlock, BranchInst *RangeCheckBranch, Constant *DefaultValue, const SmallVectorImpl< std::pair< ConstantInt *, Constant * > > &Values)
Try to reuse the switch table index compare.
static bool tryWidenCondBranchToCondBranch(BranchInst *PBI, BranchInst *BI, DomTreeUpdater *DTU)
If the previous block ended with a widenable branch, determine if reusing the target block is profita...
static bool mergeNestedCondBranch(BranchInst *BI, DomTreeUpdater *DTU)
Fold the following pattern: bb0: br i1 cond1, label bb1, label bb2 bb1: br i1 cond2,...
static bool simplifySwitchOfPowersOfTwo(SwitchInst *SI, IRBuilder<> &Builder, const DataLayout &DL, const TargetTransformInfo &TTI)
Tries to transform switch of powers of two to reduce switch range.
static Constant * lookupConstant(Value *V, const SmallDenseMap< Value *, Constant * > &ConstantPool)
If V is a Constant, return it.
static cl::opt< bool > MergeCondStores("simplifycfg-merge-cond-stores", cl::Hidden, cl::init(true), cl::desc("Hoist conditional stores even if an unconditional store does not " "precede - hoist multiple conditional stores into a single " "predicated store"))
static bool canSinkInstructions(ArrayRef< Instruction * > Insts, DenseMap< const Use *, SmallVector< Value *, 4 > > &PHIOperands)
static cl::opt< unsigned > BranchFoldToCommonDestVectorMultiplier("simplifycfg-branch-fold-common-dest-vector-multiplier", cl::Hidden, cl::init(2), cl::desc("Multiplier to apply to threshold when determining whether or not " "to fold branch to common destination when vector operations are " "present"))
static void hoistLockstepIdenticalDbgVariableRecords(Instruction *TI, Instruction *I1, SmallVectorImpl< Instruction * > &OtherInsts)
Hoists DbgVariableRecords from I1 and OtherInstrs that are identical in lock-step to TI.
static cl::opt< unsigned > HoistCommonSkipLimit("simplifycfg-hoist-common-skip-limit", cl::Hidden, cl::init(20), cl::desc("Allow reordering across at most this many " "instructions when hoisting"))
static bool removeEmptyCleanup(CleanupReturnInst *RI, DomTreeUpdater *DTU)
static cl::opt< unsigned > PHINodeFoldingThreshold("phi-node-folding-threshold", cl::Hidden, cl::init(2), cl::desc("Control the amount of phi node folding to perform (default = 2)"))
static bool removeUndefIntroducingPredecessor(BasicBlock *BB, DomTreeUpdater *DTU, AssumptionCache *AC)
If BB has an incoming value that will always trigger undefined behavior (eg.
static bool isSafeCheapLoadStore(const Instruction *I, const TargetTransformInfo &TTI)
static cl::opt< unsigned > MaxJumpThreadingLiveBlocks("max-jump-threading-live-blocks", cl::Hidden, cl::init(24), cl::desc("Limit number of blocks a define in a threaded block is allowed " "to be live in"))
static ConstantInt * getKnownValueOnEdge(Value *V, BasicBlock *From, BasicBlock *To)
static cl::opt< unsigned > HoistLoadsStoresWithCondFaultingThreshold("hoist-loads-stores-with-cond-faulting-threshold", cl::Hidden, cl::init(6), cl::desc("Control the maximal conditional load/store that we are willing " "to speculatively execute to eliminate conditional branch " "(default = 6)"))
static bool dominatesMergePoint(Value *V, BasicBlock *BB, Instruction *InsertPt, SmallPtrSetImpl< Instruction * > &AggressiveInsts, InstructionCost &Cost, InstructionCost Budget, const TargetTransformInfo &TTI, AssumptionCache *AC, SmallPtrSetImpl< Instruction * > &ZeroCostInstructions, unsigned Depth=0)
If we have a merge point of an "if condition" as accepted above, return true if the specified value d...
This file defines the SmallPtrSet 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)
static const uint32_t IV[8]
Class for arbitrary precision integers.
static APInt getAllOnes(unsigned numBits)
Return an APInt of a specified width with all bits set.
LLVM_ABI APInt zext(unsigned width) const
Zero extend to a new width.
unsigned popcount() const
Count the number of bits set.
bool sgt(const APInt &RHS) const
Signed greater than comparison.
bool isZero() const
Determine if this value is zero, i.e. all bits are clear.
bool intersects(const APInt &RHS) const
This operation tests if there are any pairs of corresponding bits between this APInt and RHS that are...
bool sle(const APInt &RHS) const
Signed less or equal comparison.
unsigned getSignificantBits() const
Get the minimum bit size for this signed APInt.
bool isStrictlyPositive() const
Determine if this APInt Value is positive.
uint64_t getLimitedValue(uint64_t Limit=UINT64_MAX) const
If this value is smaller than the specified limit, return it, otherwise return the limit value.
LLVM_ABI APInt smul_ov(const APInt &RHS, bool &Overflow) const
bool isSubsetOf(const APInt &RHS) const
This operation checks that all bits set in this APInt are also set in RHS.
bool slt(const APInt &RHS) const
Signed less than comparison.
static APInt getZero(unsigned numBits)
Get the '0' value for the specified bit-width.
std::optional< int64_t > trySExtValue() const
Get sign extended value if possible.
LLVM_ABI APInt ssub_ov(const APInt &RHS, bool &Overflow) const
bool uge(const APInt &RHS) const
Unsigned greater or equal comparison.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
const T & back() const
back - Get the last element.
const T & front() const
front - Get the first element.
size_t size() const
size - Get the array size.
bool empty() const
empty - Check if the array is empty.
static LLVM_ABI ArrayType * get(Type *ElementType, uint64_t NumElements)
This static method is the primary way to construct an ArrayType.
A cache of @llvm.assume calls within a function.
LLVM_ABI void registerAssumption(AssumeInst *CI)
Add an @llvm.assume intrinsic to this function's cache.
LLVM_ABI bool getValueAsBool() const
Return the attribute's value as a boolean.
LLVM Basic Block Representation.
iterator begin()
Instruction iterator methods.
iterator_range< const_phi_iterator > phis() const
Returns a range that iterates over the phis in the basic block.
LLVM_ABI const_iterator getFirstInsertionPt() const
Returns an iterator to the first instruction in this block that is suitable for inserting a non-PHI i...
const Function * getParent() const
Return the enclosing method, or null if none.
LLVM_ABI iterator_range< filter_iterator< BasicBlock::const_iterator, std::function< bool(const Instruction &)> > > instructionsWithoutDebug(bool SkipPseudoOp=true) const
Return a const iterator range over the instructions in the block, skipping any debug instructions.
bool hasAddressTaken() const
Returns true if there are any uses of this basic block other than direct branches,...
LLVM_ABI InstListType::const_iterator getFirstNonPHIIt() const
Returns an iterator to the first instruction in this block that is not a PHINode instruction.
static BasicBlock * Create(LLVMContext &Context, const Twine &Name="", Function *Parent=nullptr, BasicBlock *InsertBefore=nullptr)
Creates a new BasicBlock.
LLVM_ABI InstListType::const_iterator getFirstNonPHIOrDbg(bool SkipPseudoOp=true) const
Returns a pointer to the first instruction in this block that is not a PHINode or a debug intrinsic,...
LLVM_ABI bool hasNPredecessors(unsigned N) const
Return true if this block has exactly N predecessors.
LLVM_ABI const BasicBlock * getUniqueSuccessor() const
Return the successor of this block if it has a unique successor.
LLVM_ABI const BasicBlock * getSinglePredecessor() const
Return the predecessor of this block if it has a single predecessor block.
const Instruction & front() const
LLVM_ABI const CallInst * getTerminatingDeoptimizeCall() const
Returns the call instruction calling @llvm.experimental.deoptimize prior to the terminating return in...
LLVM_ABI const BasicBlock * getUniquePredecessor() const
Return the predecessor of this block if it has a unique predecessor block.
LLVM_ABI const BasicBlock * getSingleSuccessor() const
Return the successor of this block if it has a single successor.
LLVM_ABI void flushTerminatorDbgRecords()
Eject any debug-info trailing at the end of a block.
LLVM_ABI const DataLayout & getDataLayout() const
Get the data layout of the module this basic block belongs to.
InstListType::iterator iterator
Instruction iterators...
LLVM_ABI LLVMContext & getContext() const
Get the context in which this basic block lives.
LLVM_ABI bool isLandingPad() const
Return true if this basic block is a landing pad.
LLVM_ABI bool hasNPredecessorsOrMore(unsigned N) const
Return true if this block has N predecessors or more.
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction if the block is well formed or null if the block is not well forme...
void splice(BasicBlock::iterator ToIt, BasicBlock *FromBB)
Transfer all instructions from FromBB to this basic block at ToIt.
LLVM_ABI const Module * getModule() const
Return the module owning the function this basic block belongs to, or nullptr if the function does no...
LLVM_ABI void removePredecessor(BasicBlock *Pred, bool KeepOneInputPHIs=false)
Update PHI nodes in this BasicBlock before removal of predecessor Pred.
BasicBlock * getBasicBlock() const
Conditional or Unconditional Branch instruction.
iterator_range< succ_op_iterator > successors()
void setCondition(Value *V)
bool isConditional() const
unsigned getNumSuccessors() const
static BranchInst * Create(BasicBlock *IfTrue, InsertPosition InsertBefore=nullptr)
BasicBlock * getSuccessor(unsigned i) const
bool isUnconditional() const
void setSuccessor(unsigned idx, BasicBlock *NewSucc)
Value * getCondition() const
static LLVM_ABI BranchProbability getBranchProbability(uint64_t Numerator, uint64_t Denominator)
BranchProbability getCompl() const
void addRangeRetAttr(const ConstantRange &CR)
adds the range attribute to the list of attributes.
bool isCallee(Value::const_user_iterator UI) const
Determine whether the passed iterator points to the callee operand's Use.
bool isDataOperand(const Use *U) const
bool tryIntersectAttributes(const CallBase *Other)
Try to intersect the attributes from 'this' CallBase and the 'Other' CallBase.
This class represents a function call, abstracting a target machine's calling convention.
mapped_iterator< op_iterator, DerefFnTy > handler_iterator
CleanupPadInst * getCleanupPad() const
Convenience accessor.
BasicBlock * getUnwindDest() const
This class is the base class for the comparison instructions.
static Type * makeCmpResultType(Type *opnd_type)
Create a result type for fcmp/icmp.
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
@ ICMP_UGT
unsigned greater than
@ ICMP_ULT
unsigned less than
Predicate getPredicate() const
Return the predicate for this instruction.
static LLVM_ABI Constant * get(ArrayType *T, ArrayRef< Constant * > V)
A constant value that is initialized with an expression using other constant values.
static LLVM_ABI Constant * getNeg(Constant *C, bool HasNSW=false)
This is the shared class of boolean and integer constants.
bool isOne() const
This is just a convenience method to make client code smaller for a common case.
uint64_t getLimitedValue(uint64_t Limit=~0ULL) const
getLimitedValue - If the value is smaller than the specified limit, return it, otherwise return the l...
IntegerType * getIntegerType() const
Variant of the getType() method to always return an IntegerType, which reduces the amount of casting ...
static LLVM_ABI ConstantInt * getTrue(LLVMContext &Context)
bool isZero() const
This is just a convenience method to make client code smaller for a common code.
static LLVM_ABI ConstantInt * getFalse(LLVMContext &Context)
unsigned getBitWidth() const
getBitWidth - Return the scalar bitwidth of this constant.
uint64_t getZExtValue() const
Return the constant as a 64-bit unsigned integer value after it has been zero extended as appropriate...
const APInt & getValue() const
Return the constant as an APInt value reference.
This class represents a range of values.
LLVM_ABI ConstantRange subtract(const APInt &CI) const
Subtract the specified constant from the endpoints of this constant range.
const APInt & getLower() const
Return the lower value for this range.
LLVM_ABI bool isEmptySet() const
Return true if this set contains no members.
LLVM_ABI bool isSizeLargerThan(uint64_t MaxSize) const
Compare set size of this range with Value.
const APInt & getUpper() const
Return the upper value for this range.
LLVM_ABI bool isUpperWrapped() const
Return true if the exclusive upper bound wraps around the unsigned domain.
static LLVM_ABI ConstantRange makeExactICmpRegion(CmpInst::Predicate Pred, const APInt &Other)
Produce the exact range such that all values in the returned range satisfy the given predicate with a...
LLVM_ABI ConstantRange inverse() const
Return a new range that is the logical not of the current set.
This is an important base class in LLVM.
static LLVM_ABI Constant * getIntegerValue(Type *Ty, const APInt &V)
Return the value for an integer or pointer constant, or a vector thereof, with the given scalar value...
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
LLVM_ABI bool isNullValue() const
Return true if this is the value that would be returned by getNullValue.
A parsed version of the target data layout string in and methods for querying it.
Base class for non-instruction debug metadata records that have positions within IR.
LLVM_ABI void removeFromParent()
simple_ilist< DbgRecord >::iterator self_iterator
Record of a variable value-assignment, aka a non instruction representation of the dbg....
bool isSameSourceLocation(const DebugLoc &Other) const
Return true if the source locations match, ignoring isImplicitCode and source atom info.
static DebugLoc getTemporary()
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...
static LLVM_ABI DebugLoc getMergedLocations(ArrayRef< DebugLoc > Locs)
Try to combine the vector of locations passed as input in a single one.
static DebugLoc getDropped()
iterator find(const_arg_type_t< KeyT > Val)
std::pair< iterator, bool > try_emplace(KeyT &&Key, Ts &&...Args)
const ValueT & at(const_arg_type_t< KeyT > Val) const
at - Return the entry for the specified key, or abort if no such entry exists.
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
void reserve(size_type NumEntries)
Grow the densemap so that it can contain at least NumEntries items before resizing again.
static constexpr UpdateKind Delete
static constexpr UpdateKind Insert
static LLVM_ABI FixedVectorType * get(Type *ElementType, unsigned NumElts)
const BasicBlock & getEntryBlock() const
Attribute getFnAttribute(Attribute::AttrKind Kind) const
Return the attribute for the given attribute kind.
bool hasMinSize() const
Optimize this function for minimum size (-Oz).
bool hasFnAttribute(Attribute::AttrKind Kind) const
Return true if the function has the attribute.
void applyUpdates(ArrayRef< UpdateT > Updates)
Submit updates to all available trees.
an instruction for type-safe pointer arithmetic to access elements of arrays and structs
Module * getParent()
Get the module that this global value is contained inside of...
This instruction compares its operands according to the predicate given to the constructor.
Predicate getSignedPredicate() const
For example, EQ->EQ, SLE->SLE, UGT->SGT, etc.
static bool isEquality(Predicate P)
Return true if this predicate is either EQ or NE.
Common base class shared among various IRBuilders.
Value * CreateICmpULT(Value *LHS, Value *RHS, const Twine &Name="")
Value * CreateZExtOrTrunc(Value *V, Type *DestTy, const Twine &Name="")
Create a ZExt or Trunc from the integer value V to DestTy.
LLVM_ABI Value * CreateSelectFMF(Value *C, Value *True, Value *False, FMFSource FMFSource, const Twine &Name="", Instruction *MDFrom=nullptr)
LLVM_ABI CallInst * CreateAssumption(Value *Cond, ArrayRef< OperandBundleDef > OpBundles={})
Create an assume intrinsic call that allows the optimizer to assume that the provided condition will ...
LLVM_ABI Value * CreateSelect(Value *C, Value *True, Value *False, const Twine &Name="", Instruction *MDFrom=nullptr)
BasicBlock::iterator GetInsertPoint() const
Value * CreateFreeze(Value *V, const Twine &Name="")
Value * CreateLShr(Value *LHS, Value *RHS, const Twine &Name="", bool isExact=false)
void SetCurrentDebugLocation(DebugLoc L)
Set location information used by debugging information.
Value * CreateInBoundsGEP(Type *Ty, Value *Ptr, ArrayRef< Value * > IdxList, const Twine &Name="")
Value * CreateNot(Value *V, const Twine &Name="")
SwitchInst * CreateSwitch(Value *V, BasicBlock *Dest, unsigned NumCases=10, MDNode *BranchWeights=nullptr, MDNode *Unpredictable=nullptr)
Create a switch instruction with the specified value, default dest, and with a hint for the number of...
BranchInst * CreateCondBr(Value *Cond, BasicBlock *True, BasicBlock *False, MDNode *BranchWeights=nullptr, MDNode *Unpredictable=nullptr)
Create a conditional 'br Cond, TrueDest, FalseDest' instruction.
LoadInst * CreateLoad(Type *Ty, Value *Ptr, const char *Name)
Provided to resolve 'CreateLoad(Ty, Ptr, "...")' correctly, instead of converting the string to 'bool...
StoreInst * CreateStore(Value *Val, Value *Ptr, bool isVolatile=false)
Value * CreateAdd(Value *LHS, Value *RHS, const Twine &Name="", bool HasNUW=false, bool HasNSW=false)
Value * CreatePtrToInt(Value *V, Type *DestTy, const Twine &Name="")
Value * CreateTrunc(Value *V, Type *DestTy, const Twine &Name="", bool IsNUW=false, bool IsNSW=false)
BranchInst * CreateBr(BasicBlock *Dest)
Create an unconditional 'br label X' instruction.
Value * CreateIntCast(Value *V, Type *DestTy, bool isSigned, const Twine &Name="")
void SetInsertPoint(BasicBlock *TheBB)
This specifies that created instructions should be appended to the end of the specified block.
Value * CreateOr(Value *LHS, Value *RHS, const Twine &Name="", bool IsDisjoint=false)
Value * CreateMul(Value *LHS, Value *RHS, const Twine &Name="", bool HasNUW=false, bool HasNSW=false)
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
Indirect Branch Instruction.
BasicBlock * getDestination(unsigned i)
Return the specified destination.
unsigned getNumDestinations() const
return the number of possible destinations in this indirectbr instruction.
LLVM_ABI void removeDestination(unsigned i)
This method removes the specified successor from the indirectbr instruction.
LLVM_ABI void dropUBImplyingAttrsAndMetadata(ArrayRef< unsigned > Keep={})
Drop any attributes or metadata that can cause immediate undefined behavior.
LLVM_ABI Instruction * clone() const
Create a copy of 'this' instruction that is identical in all ways except the following:
LLVM_ABI iterator_range< simple_ilist< DbgRecord >::iterator > cloneDebugInfoFrom(const Instruction *From, std::optional< simple_ilist< DbgRecord >::iterator > FromHere=std::nullopt, bool InsertAtHead=false)
Clone any debug-info attached to From onto this instruction.
LLVM_ABI unsigned getNumSuccessors() const LLVM_READONLY
Return the number of successors that this instruction has.
iterator_range< simple_ilist< DbgRecord >::iterator > getDbgRecordRange() const
Return a range over the DbgRecords attached to this instruction.
const DebugLoc & getDebugLoc() const
Return the debug location for this node as a DebugLoc.
LLVM_ABI const Module * getModule() const
Return the module owning the function this instruction belongs to or nullptr it the function does not...
LLVM_ABI void andIRFlags(const Value *V)
Logical 'and' of any supported wrapping, exact, and fast-math flags of V and this instruction.
LLVM_ABI void moveBefore(InstListType::iterator InsertPos)
Unlink this instruction from its current basic block and insert it into the basic block that MovePos ...
LLVM_ABI InstListType::iterator eraseFromParent()
This method unlinks 'this' from the containing basic block and deletes it.
Instruction * user_back()
Specialize the methods defined in Value, as we know that an instruction can only be used by other ins...
LLVM_ABI const Function * getFunction() const
Return the function this instruction belongs to.
MDNode * getMetadata(unsigned KindID) const
Get the metadata of given kind attached to this Instruction.
LLVM_ABI BasicBlock * getSuccessor(unsigned Idx) const LLVM_READONLY
Return the specified successor. This instruction must be a terminator.
LLVM_ABI bool mayHaveSideEffects() const LLVM_READONLY
Return true if the instruction may have side effects.
bool isTerminator() const
LLVM_ABI bool isUsedOutsideOfBlock(const BasicBlock *BB) const LLVM_READONLY
Return true if there are any uses of this instruction in blocks other than the specified block.
LLVM_ABI void setMetadata(unsigned KindID, MDNode *Node)
Set the metadata of the specified kind to the specified node.
@ CompareUsingIntersectedAttrs
Check for equivalence with intersected callbase attrs.
LLVM_ABI AAMDNodes getAAMetadata() const
Returns the AA metadata for this instruction.
LLVM_ABI bool isIdenticalTo(const Instruction *I) const LLVM_READONLY
Return true if the specified instruction is exactly identical to the current one.
void setDebugLoc(DebugLoc Loc)
Set the debug location information for this instruction.
LLVM_ABI void copyMetadata(const Instruction &SrcInst, ArrayRef< unsigned > WL=ArrayRef< unsigned >())
Copy metadata from SrcInst to this instruction.
LLVM_ABI void applyMergedLocation(DebugLoc LocA, DebugLoc LocB)
Merge 2 debug locations and apply it to the Instruction.
LLVM_ABI void dropDbgRecords()
Erase any DbgRecords attached to this instruction.
LLVM_ABI InstListType::iterator insertInto(BasicBlock *ParentBB, InstListType::iterator It)
Inserts an unlinked instruction into ParentBB at position It and returns the iterator of the inserted...
Class to represent integer types.
unsigned getBitWidth() const
Get the number of bits in this IntegerType.
void setNormalDest(BasicBlock *B)
This is an important class for using LLVM in a threaded context.
The landingpad instruction holds all of the information necessary to generate correct exception handl...
An instruction for reading from memory.
static unsigned getPointerOperandIndex()
Iterates through instructions in a set of blocks in reverse order from the first non-terminator.
LLVM_ABI MDNode * createBranchWeights(uint32_t TrueWeight, uint32_t FalseWeight, bool IsExpected=false)
Return metadata containing two branch weights.
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
A Module instance is used to store all the information related to an LLVM module.
void addIncoming(Value *V, BasicBlock *BB)
Add an incoming value to the end of the PHI list.
iterator_range< const_block_iterator > blocks() const
op_range incoming_values()
void setIncomingValue(unsigned i, Value *V)
Value * getIncomingValueForBlock(const BasicBlock *BB) const
BasicBlock * getIncomingBlock(unsigned i) const
Return incoming basic block number i.
Value * getIncomingValue(unsigned i) const
Return incoming value number x.
int getBasicBlockIndex(const BasicBlock *BB) const
Return the first index of the specified basic block in the value list for this PHI.
unsigned getNumIncomingValues() const
Return the number of incoming edges.
static PHINode * Create(Type *Ty, unsigned NumReservedValues, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructors - NumReservedValues is a hint for the number of incoming edges that this phi node will h...
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
Value * getValue() const
Convenience accessor.
Return a value (possibly void), from a function.
This class represents the LLVM 'select' instruction.
size_type size() const
Determine the number of elements in the SetVector.
bool empty() const
Determine if the SetVector is empty or not.
bool insert(const value_type &X)
Insert a new element into the SetVector.
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
bool erase(PtrType Ptr)
Remove pointer from the set.
size_type count(ConstPtrType Ptr) const
count - Return 1 if the specified pointer is in the set, 0 otherwise.
void insert_range(Range &&R)
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
bool contains(ConstPtrType Ptr) const
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
A SetVector that performs no allocations if smaller than a certain size.
SmallSet - This maintains a set of unique values, optimizing for the case when the set is small (less...
std::pair< const_iterator, bool > insert(const T &V)
insert - Insert an element into the set if it isn't already there.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void assign(size_type NumElts, ValueParamT Elt)
reference emplace_back(ArgTypes &&... Args)
void reserve(size_type N)
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.
An instruction for storing to memory.
Value * getValueOperand()
static unsigned getPointerOperandIndex()
Value * getPointerOperand()
StringRef - Represent a constant reference to a string, i.e.
A wrapper class to simplify modification of SwitchInst cases along with their prof branch_weights met...
LLVM_ABI void setSuccessorWeight(unsigned idx, CaseWeightOpt W)
LLVM_ABI void addCase(ConstantInt *OnVal, BasicBlock *Dest, CaseWeightOpt W)
Delegate the call to the underlying SwitchInst::addCase() and set the specified branch weight for the...
LLVM_ABI CaseWeightOpt getSuccessorWeight(unsigned idx)
std::optional< uint32_t > CaseWeightOpt
LLVM_ABI SwitchInst::CaseIt removeCase(SwitchInst::CaseIt I)
Delegate the call to the underlying SwitchInst::removeCase() and remove correspondent branch weight.
BasicBlock * getSuccessor(unsigned idx) const
LLVM_ABI void addCase(ConstantInt *OnVal, BasicBlock *Dest)
Add an entry to the switch instruction.
CaseIteratorImpl< CaseHandle > CaseIt
void setSuccessor(unsigned idx, BasicBlock *NewSucc)
unsigned getNumSuccessors() const
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
The instances of the Type class are immutable: once they are created, they are never changed.
LLVM_ABI unsigned getIntegerBitWidth() const
bool isPointerTy() const
True if this is an instance of PointerType.
LLVM_ABI TypeSize getPrimitiveSizeInBits() const LLVM_READONLY
Return the basic size of this type if it is a primitive type.
static LLVM_ABI IntegerType * getInt1Ty(LLVMContext &C)
bool isIntegerTy() const
True if this is an instance of IntegerType.
This function has undefined behavior.
A Use represents the edge between a Value definition and its users.
LLVM_ABI void set(Value *Val)
User * getUser() const
Returns the User that contains this Use.
LLVM_ABI unsigned getOperandNo() const
Return the operand # of this use in its User.
LLVM_ABI bool replaceUsesOfWith(Value *From, Value *To)
Replace uses of one Value with another.
const Use & getOperandUse(unsigned i) const
void setOperand(unsigned i, Value *Val)
Value * getOperand(unsigned i) const
unsigned getNumOperands() const
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
static constexpr uint64_t MaximumAlignment
LLVM_ABI Value(Type *Ty, unsigned scid)
LLVM_ABI void setName(const Twine &Name)
Change the name of the value.
bool hasOneUse() const
Return true if there is exactly one use of this value.
LLVM_ABI void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
iterator_range< user_iterator > users()
LLVM_ABI LLVMContext & getContext() const
All values hold a context through their type.
iterator_range< use_iterator > uses()
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
LLVM_ABI void takeName(Value *V)
Transfer the name from V to this value.
Represents an op.with.overflow intrinsic.
std::pair< iterator, bool > insert(const ValueT &V)
void reserve(size_t Size)
Grow the DenseSet so that it can contain at least NumEntries items before resizing again.
const ParentTy * getParent() const
self_iterator getIterator()
NodeTy * getNextNode()
Get the next node, or nullptr for the list tail.
A range adaptor for a pair of iterators.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr std::underlying_type_t< E > Mask()
Get a bitmask with 1s in all places up to the high-order bit of E's largest value.
@ C
The default llvm calling convention, compatible with C.
@ BasicBlock
Various leaf nodes.
BinaryOp_match< SrcTy, SpecificConstantMatch, TargetOpcode::G_XOR, true > m_Not(const SrcTy &&Src)
Matches a register not-ed by a G_XOR.
OneUse_match< SubPat > m_OneUse(const SubPat &SP)
BinaryOp_match< LHS, RHS, Instruction::And > m_And(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::Add > m_Add(const LHS &L, const RHS &R)
class_match< BinaryOperator > m_BinOp()
Match an arbitrary binary operation and ignore it.
ap_match< APInt > m_APInt(const APInt *&Res)
Match a ConstantInt or splatted ConstantVector, binding the specified pointer to the contained APInt.
bool match(Val *V, const Pattern &P)
bind_ty< Instruction > m_Instruction(Instruction *&I)
Match an instruction, capturing it if we match.
specificval_ty m_Specific(const Value *V)
Match if we have a specific specified value.
ExtractValue_match< Ind, Val_t > m_ExtractValue(const Val_t &V)
Match a single index ExtractValue instruction.
cst_pred_ty< is_any_apint > m_AnyIntegralConstant()
Match an integer or vector with any integral constant.
bind_ty< WithOverflowInst > m_WithOverflowInst(WithOverflowInst *&I)
Match a with overflow intrinsic, capturing it if we match.
auto m_LogicalOr()
Matches L || R where L and R are arbitrary values.
ThreeOps_match< decltype(m_Value()), LHS, RHS, Instruction::Select, true > m_c_Select(const LHS &L, const RHS &R)
Match Select(C, LHS, RHS) or Select(C, RHS, LHS)
match_immconstant_ty m_ImmConstant()
Match an arbitrary immediate Constant and ignore it.
NoWrapTrunc_match< OpTy, TruncInst::NoUnsignedWrap > m_NUWTrunc(const OpTy &Op)
Matches trunc nuw.
class_match< Value > m_Value()
Match an arbitrary value and ignore it.
auto m_LogicalAnd()
Matches L && R where L and R are arbitrary values.
BinaryOp_match< LHS, RHS, Instruction::Or > m_Or(const LHS &L, const RHS &R)
match_combine_or< LTy, RTy > m_CombineOr(const LTy &L, const RTy &R)
Combine two pattern matchers matching L || R.
SmallVector< DbgVariableRecord * > getDVRAssignmentMarkers(const Instruction *Inst)
Return a range of dbg_assign records for which Inst performs the assignment they encode.
LLVM_ABI void deleteAssignmentMarkers(const Instruction *Inst)
Delete the llvm.dbg.assign intrinsics linked to Inst.
initializer< Ty > init(const Ty &Val)
PointerTypeMap run(const Module &M)
Compute the PointerTypeMap for the module M.
NodeAddr< PhiNode * > Phi
NodeAddr< UseNode * > Use
NodeAddr< FuncNode * > Func
Context & getContext() const
friend class Instruction
Iterator for Instructions in a `BasicBlock.
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.
detail::zippy< detail::zip_shortest, T, U, Args... > zip(T &&t, U &&u, Args &&...args)
zip iterator for two or more iteratable types.
bool operator<(int64_t V1, const APSInt &V2)
FunctionAddr VTableAddr Value
auto find(R &&Range, const T &Val)
Provide wrappers to std::find which take ranges instead of having to pass begin/end explicitly.
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
LLVM_ABI bool RecursivelyDeleteTriviallyDeadInstructions(Value *V, const TargetLibraryInfo *TLI=nullptr, MemorySSAUpdater *MSSAU=nullptr, std::function< void(Value *)> AboutToDeleteCallback=std::function< void(Value *)>())
If the specified value is a trivially dead instruction, delete it.
bool succ_empty(const Instruction *I)
LLVM_ABI bool IsBlockFollowedByDeoptOrUnreachable(const BasicBlock *BB)
Check if we can prove that all paths starting from this block converge to a block that either has a @...
LLVM_ABI bool ConstantFoldTerminator(BasicBlock *BB, bool DeleteDeadConditions=false, const TargetLibraryInfo *TLI=nullptr, DomTreeUpdater *DTU=nullptr)
If a terminator instruction is predicated on a constant value, convert it into an unconditional branc...
LLVM_ABI BranchInst * GetIfCondition(BasicBlock *BB, BasicBlock *&IfTrue, BasicBlock *&IfFalse)
Check whether BB is the merge point of a if-region.
auto pred_end(const MachineBasicBlock *BB)
void set_intersect(S1Ty &S1, const S2Ty &S2)
set_intersect(A, B) - Compute A := A ^ B Identical to set_intersection, except that it works on set<>...
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
auto successors(const MachineBasicBlock *BB)
auto accumulate(R &&Range, E &&Init)
Wrapper for std::accumulate.
constexpr from_range_t from_range
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
LLVM_ABI MDNode * getBranchWeightMDNode(const Instruction &I)
Get the branch weights metadata node.
constexpr bool isUIntN(unsigned N, uint64_t x)
Checks if an unsigned integer fits into the given (dynamic) bit width.
LLVM_ABI Constant * ConstantFoldCompareInstOperands(unsigned Predicate, Constant *LHS, Constant *RHS, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr, const Instruction *I=nullptr)
Attempt to constant fold a compare instruction (icmp/fcmp) with the specified operands.
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...
Align getLoadStoreAlignment(const Value *I)
A helper function that returns the alignment of load or store instruction.
LLVM_ABI void DeleteDeadBlock(BasicBlock *BB, DomTreeUpdater *DTU=nullptr, bool KeepOneInputPHIs=false)
Delete the specified block, which must have no predecessors.
LLVM_ABI bool isSafeToSpeculativelyExecute(const Instruction *I, const Instruction *CtxI=nullptr, AssumptionCache *AC=nullptr, const DominatorTree *DT=nullptr, const TargetLibraryInfo *TLI=nullptr, bool UseVariableInfo=true, bool IgnoreUBImplyingAttrs=true)
Return true if the instruction does not have any effects besides calculating the result and does not ...
auto unique(Range &&R, Predicate P)
OutputIt copy_if(R &&Range, OutputIt Out, UnaryPredicate P)
Provide wrappers to std::copy_if which take ranges instead of having to pass begin/end explicitly.
bool operator==(const AddressRangeValuePair &LHS, const AddressRangeValuePair &RHS)
LLVM_ABI ConstantRange getConstantRangeFromMetadata(const MDNode &RangeMD)
Parse out a conservative ConstantRange from !range metadata.
LLVM_ABI ConstantRange computeConstantRange(const Value *V, bool ForSigned, bool UseInstrInfo=true, AssumptionCache *AC=nullptr, const Instruction *CtxI=nullptr, const DominatorTree *DT=nullptr, unsigned Depth=0)
Determine the possible constant range of an integer or vector of integer value.
int countr_zero(T Val)
Count number of 0's from the least significant bit to the most stopping at the first 1.
LLVM_ABI Value * simplifyInstruction(Instruction *I, const SimplifyQuery &Q)
See if we can compute a simplified version of this instruction.
LLVM_ABI void setBranchWeights(Instruction &I, ArrayRef< uint32_t > Weights, bool IsExpected, bool ElideAllZero=false)
Create a new branch_weights metadata node and add or overwrite a prof metadata reference to instructi...
void erase(Container &C, ValueType V)
Wrapper function to remove a value from a container:
constexpr bool has_single_bit(T Value) noexcept
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
unsigned Log2_32(uint32_t Value)
Return the floor log base 2 of the specified value, -1 if the value is zero.
LLVM_ABI bool TryToSimplifyUncondBranchFromEmptyBlock(BasicBlock *BB, DomTreeUpdater *DTU=nullptr)
BB is known to contain an unconditional branch, and contains no instructions other than PHI nodes,...
void RemapDbgRecordRange(Module *M, iterator_range< DbgRecordIterator > Range, ValueToValueMapTy &VM, RemapFlags Flags=RF_None, ValueMapTypeRemapper *TypeMapper=nullptr, ValueMaterializer *Materializer=nullptr, const MetadataPredicate *IdentityMD=nullptr)
Remap the Values used in the DbgRecords Range using the value map VM.
auto reverse(ContainerTy &&C)
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
LLVM_ABI void InvertBranch(BranchInst *PBI, IRBuilderBase &Builder)
LLVM_ABI bool impliesPoison(const Value *ValAssumedPoison, const Value *V)
Return true if V is poison given that ValAssumedPoison is already poison.
SmallVector< uint64_t, 2 > getDisjunctionWeights(const SmallVector< uint32_t, 2 > &B1, const SmallVector< uint32_t, 2 > &B2)
Get the branch weights of a branch conditioned on b1 || b2, where b1 and b2 are 2 booleans that are t...
void sort(IteratorTy Start, IteratorTy End)
@ RF_IgnoreMissingLocals
If this flag is set, the remapper ignores missing function-local entries (Argument,...
@ RF_NoModuleLevelChanges
If this flag is set, the remapper knows that only local values within a function (such as an instruct...
LLVM_ABI void computeKnownBits(const Value *V, KnownBits &Known, const DataLayout &DL, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr, const DominatorTree *DT=nullptr, bool UseInstrInfo=true, unsigned Depth=0)
Determine which bits of V are known to be either zero or one and return them in the KnownZero/KnownOn...
LLVM_ABI bool NullPointerIsDefined(const Function *F, unsigned AS=0)
Check whether null pointer dereferencing is considered undefined behavior for a given function or an ...
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
bool none_of(R &&Range, UnaryPredicate P)
Provide wrappers to std::none_of which take ranges instead of having to pass begin/end explicitly.
auto make_first_range(ContainerTy &&c)
Given a container of pairs, return a range over the first elements.
LLVM_ABI Instruction * removeUnwindEdge(BasicBlock *BB, DomTreeUpdater *DTU=nullptr)
Replace 'BB's terminator with one that does not have an unwind successor block.
FunctionAddr VTableAddr Count
auto succ_size(const MachineBasicBlock *BB)
SmallVector< ValueTypeFromRangeType< R >, Size > to_vector(R &&Range)
Given a range of type R, iterate the entire range and return a SmallVector with elements of the vecto...
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
LLVM_ABI cl::opt< bool > RequireAndPreserveDomTree
This function is used to do simplification of a CFG.
RNSuccIterator< NodeRef, BlockT, RegionT > succ_begin(NodeRef Node)
LLVM_ABI void combineMetadataForCSE(Instruction *K, const Instruction *J, bool DoesKMove)
Combine the metadata of two instructions so that K can replace J.
iterator_range(Container &&) -> iterator_range< llvm::detail::IterOfRange< Container > >
auto drop_end(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the last N elements excluded.
LLVM_ABI BasicBlock * SplitBlockPredecessors(BasicBlock *BB, ArrayRef< BasicBlock * > Preds, const char *Suffix, DominatorTree *DT, LoopInfo *LI=nullptr, MemorySSAUpdater *MSSAU=nullptr, bool PreserveLCSSA=false)
This method introduces at least one new basic block into the function and moves some of the predecess...
bool isWidenableBranch(const User *U)
Returns true iff U is a widenable branch (that is, extractWidenableCondition returns widenable condit...
IRBuilder(LLVMContext &, FolderTy, InserterTy, MDNode *, ArrayRef< OperandBundleDef >) -> IRBuilder< FolderTy, InserterTy >
RNSuccIterator< NodeRef, BlockT, RegionT > succ_end(NodeRef Node)
LLVM_ABI bool MergeBlockIntoPredecessor(BasicBlock *BB, DomTreeUpdater *DTU=nullptr, LoopInfo *LI=nullptr, MemorySSAUpdater *MSSAU=nullptr, MemoryDependenceResults *MemDep=nullptr, bool PredecessorWithTwoSuccessors=false, DominatorTree *DT=nullptr)
Attempts to merge a block into its predecessor, if possible.
LLVM_ABI void hoistAllInstructionsInto(BasicBlock *DomBlock, Instruction *InsertPt, BasicBlock *BB)
Hoist all of the instructions in the IfBlock to the dominant block DomBlock, by moving its instructio...
@ Sub
Subtraction of integers.
auto count(R &&Range, const E &Element)
Wrapper function around std::count to count the number of times an element Element occurs in the give...
void RemapInstruction(Instruction *I, ValueToValueMapTy &VM, RemapFlags Flags=RF_None, ValueMapTypeRemapper *TypeMapper=nullptr, ValueMaterializer *Materializer=nullptr, const MetadataPredicate *IdentityMD=nullptr)
Convert the instruction operands from referencing the current values into those specified by VM.
LLVM_ABI bool canReplaceOperandWithVariable(const Instruction *I, unsigned OpIdx)
Given an instruction, is it legal to set operand OpIdx to a non-constant value?
DWARFExpression::Operation Op
LLVM_ABI bool PointerMayBeCaptured(const Value *V, bool ReturnCaptures, unsigned MaxUsesToExplore=0)
PointerMayBeCaptured - Return true if this pointer value may be captured by the enclosing function (w...
LLVM_ABI bool FoldSingleEntryPHINodes(BasicBlock *BB, MemoryDependenceResults *MemDep=nullptr)
We know that BB has one predecessor.
LLVM_ABI bool isGuaranteedNotToBeUndefOrPoison(const Value *V, AssumptionCache *AC=nullptr, const Instruction *CtxI=nullptr, const DominatorTree *DT=nullptr, unsigned Depth=0)
Return true if this function can prove that V does not have undef bits and is never poison.
void RemapDbgRecord(Module *M, DbgRecord *DR, ValueToValueMapTy &VM, RemapFlags Flags=RF_None, ValueMapTypeRemapper *TypeMapper=nullptr, ValueMaterializer *Materializer=nullptr, const MetadataPredicate *IdentityMD=nullptr)
Remap the Values used in the DbgRecord DR using the value map VM.
ArrayRef(const T &OneElt) -> ArrayRef< T >
constexpr unsigned BitWidth
ValueMap< const Value *, WeakTrackingVH > ValueToValueMapTy
LLVM_ABI bool isDereferenceablePointer(const Value *V, Type *Ty, const DataLayout &DL, const Instruction *CtxI=nullptr, AssumptionCache *AC=nullptr, const DominatorTree *DT=nullptr, const TargetLibraryInfo *TLI=nullptr)
Return true if this is always a dereferenceable pointer.
LLVM_ABI bool isGuaranteedToTransferExecutionToSuccessor(const Instruction *I)
Return true if this function can prove that the instruction I will always transfer execution to one o...
LLVM_ABI bool extractBranchWeights(const MDNode *ProfileData, SmallVectorImpl< uint32_t > &Weights)
Extract branch weights from MD_prof metadata.
LLVM_ABI bool simplifyCFG(BasicBlock *BB, const TargetTransformInfo &TTI, DomTreeUpdater *DTU=nullptr, const SimplifyCFGOptions &Options={}, ArrayRef< WeakVH > LoopHeaders={})
auto pred_begin(const MachineBasicBlock *BB)
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
LLVM_ABI BasicBlock * SplitBlock(BasicBlock *Old, BasicBlock::iterator SplitPt, DominatorTree *DT, LoopInfo *LI=nullptr, MemorySSAUpdater *MSSAU=nullptr, const Twine &BBName="", bool Before=false)
Split the specified block at the specified instruction.
auto find_if(R &&Range, UnaryPredicate P)
Provide wrappers to std::find_if which take ranges instead of having to pass begin/end explicitly.
void erase_if(Container &C, UnaryPredicate P)
Provide a container algorithm similar to C++ Library Fundamentals v2's erase_if which is equivalent t...
constexpr bool isIntN(unsigned N, int64_t x)
Checks if an signed integer fits into the given (dynamic) bit width.
auto predecessors(const MachineBasicBlock *BB)
iterator_range< pointer_iterator< WrappedIteratorT > > make_pointer_range(RangeT &&Range)
LLVM_ABI unsigned ComputeMaxSignificantBits(const Value *Op, const DataLayout &DL, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr, const DominatorTree *DT=nullptr, unsigned Depth=0)
Get the upper bound on bit size for this Value Op as a signed integer.
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Type * getLoadStoreType(const Value *I)
A helper function that returns the type of a load or store instruction.
PointerUnion< const Value *, const PseudoSourceValue * > ValueType
LLVM_ABI bool foldBranchToCommonDest(BranchInst *BI, llvm::DomTreeUpdater *DTU=nullptr, MemorySSAUpdater *MSSAU=nullptr, const TargetTransformInfo *TTI=nullptr, unsigned BonusInstThreshold=1)
If this basic block is ONLY a setcc and a branch, and if a predecessor branches to us and one of our ...
bool pred_empty(const BasicBlock *BB)
LLVM_ABI Instruction * SplitBlockAndInsertIfThen(Value *Cond, BasicBlock::iterator SplitBefore, bool Unreachable, MDNode *BranchWeights=nullptr, DomTreeUpdater *DTU=nullptr, LoopInfo *LI=nullptr, BasicBlock *ThenBlock=nullptr)
Split the containing block at the specified instruction - everything before SplitBefore stays in the ...
LLVM_ABI std::optional< bool > isImpliedByDomCondition(const Value *Cond, const Instruction *ContextI, const DataLayout &DL)
Return the boolean condition value in the context of the given instruction if it is known based on do...
auto seq(T Begin, T End)
Iterate over an integral type from Begin up to - but not including - End.
void array_pod_sort(IteratorTy Start, IteratorTy End)
array_pod_sort - This sorts an array with the specified start and end extent.
LLVM_ABI bool hasBranchWeightMD(const Instruction &I)
Checks if an instructions has Branch Weight Metadata.
hash_code hash_combine(const Ts &...args)
Combine values into a single hash_code.
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 Constant * ConstantFoldInstOperands(const Instruction *I, ArrayRef< Constant * > Ops, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr, bool AllowNonDeterministic=true)
ConstantFoldInstOperands - Attempt to constant fold an instruction with the specified operands.
LLVM_ABI void setFittedBranchWeights(Instruction &I, ArrayRef< uint64_t > Weights, bool IsExpected, bool ElideAllZero=false)
Variant of setBranchWeights where the Weights will be fit first to uint32_t by shifting right.
LLVM_ABI const Value * getUnderlyingObject(const Value *V, unsigned MaxLookup=MaxLookupSearchDepth)
This method strips off any GEP address adjustments, pointer casts or llvm.threadlocal....
LLVM_ABI Constant * ConstantFoldIntegerCast(Constant *C, Type *DestTy, bool IsSigned, const DataLayout &DL)
Constant fold a zext, sext or trunc, depending on IsSigned and whether the DestTy is wider or narrowe...
bool capturesNothing(CaptureComponents CC)
static auto filterDbgVars(iterator_range< simple_ilist< DbgRecord >::iterator > R)
Filter the DbgRecord range to DbgVariableRecord types only and downcast.
LLVM_ABI bool EliminateDuplicatePHINodes(BasicBlock *BB)
Check for and eliminate duplicate PHI nodes in this block.
LLVM_ABI void RemapSourceAtom(Instruction *I, ValueToValueMapTy &VM)
Remap source location atom.
hash_code hash_combine_range(InputIteratorT first, InputIteratorT last)
Compute a hash_code for a sequence of values.
LLVM_ABI bool isWritableObject(const Value *Object, bool &ExplicitlyDereferenceableOnly)
Return true if the Object is writable, in the sense that any location based on this pointer that can ...
int popcount(T Value) noexcept
Count the number of set bits in a value.
LLVM_ABI void mapAtomInstance(const DebugLoc &DL, ValueToValueMapTy &VMap)
Mark a cloned instruction as a new instance so that its source loc can be updated when remapped.
constexpr uint64_t NextPowerOf2(uint64_t A)
Returns the next power of two (in 64-bits) that is strictly greater than A.
LLVM_ABI void extractFromBranchWeightMD64(const MDNode *ProfileData, SmallVectorImpl< uint64_t > &Weights)
Faster version of extractBranchWeights() that skips checks and must only be called with "branch_weigh...
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Checking whether two cases of SI are equal depends on the contents of the BasicBlock and the incoming...
DenseMap< PHINode *, SmallDenseMap< BasicBlock *, Value *, 8 > > * PhiPredIVs
LLVM_ABI AAMDNodes merge(const AAMDNodes &Other) const
Given two sets of AAMDNodes applying to potentially different locations, determine the best AAMDNodes...
static const SwitchSuccWrapper * getEmptyKey()
static const SwitchSuccWrapper * getTombstoneKey()
static unsigned getHashValue(const SwitchSuccWrapper *SSW)
static bool isEqual(const SwitchSuccWrapper *LHS, const SwitchSuccWrapper *RHS)
An information struct used to provide DenseMap with the various necessary components for a given valu...
Incoming for lane maks phi as machine instruction, incoming register Reg and incoming block Block are...
unsigned getBitWidth() const
Get the bit width of this value.
unsigned countMaxActiveBits() const
Returns the maximum number of bits needed to represent all possible unsigned values with these known ...
APInt getMaxValue() const
Return the maximal unsigned value possible given these KnownBits.
A MapVector that performs no allocations if smaller than a certain size.