97#define DEBUG_TYPE "simplifycfg"
100 "simplifycfg-require-and-preserve-domtree",
cl::Hidden,
103 "Temporary development switch used to gradually uplift SimplifyCFG "
104 "into preserving DomTree,"));
113 "Control the amount of phi node folding to perform (default = 2)"));
117 cl::desc(
"Control the maximal total instruction cost that we are willing "
118 "to speculatively execute to fold a 2-entry PHI node into a "
119 "select (default = 4)"));
123 cl::desc(
"Hoist common instructions up to the parent block"));
127 cl::desc(
"Hoist loads if the target supports conditional faulting"));
131 cl::desc(
"Hoist stores if the target supports conditional faulting"));
135 cl::desc(
"Control the maximal conditional load/store that we are willing "
136 "to speculatively execute to eliminate conditional branch "
142 cl::desc(
"Allow reordering across at most this many "
143 "instructions when hoisting"));
147 cl::desc(
"Sink common instructions down to the end block"));
151 cl::desc(
"Hoist conditional stores if an unconditional store precedes"));
155 cl::desc(
"Hoist conditional stores even if an unconditional store does not "
156 "precede - hoist multiple conditional stores into a single "
157 "predicated store"));
161 cl::desc(
"When merging conditional stores, do so even if the resultant "
162 "basic blocks are unlikely to be if-converted as a result"));
166 cl::desc(
"Allow exactly one expensive instruction to be speculatively "
171 cl::desc(
"Limit maximum recursion depth when calculating costs of "
172 "speculatively executed instructions"));
177 cl::desc(
"Max size of a block which is still considered "
178 "small enough to thread through"));
184 cl::desc(
"Maximum cost of combining conditions when "
185 "folding branches"));
188 "simplifycfg-branch-fold-common-dest-vector-multiplier",
cl::Hidden,
190 cl::desc(
"Multiplier to apply to threshold when determining whether or not "
191 "to fold branch to common destination when vector operations are "
196 cl::desc(
"Allow SimplifyCFG to merge invokes together when appropriate"));
200 cl::desc(
"Limit cases to analyze when converting a switch to select"));
204 cl::desc(
"Limit number of blocks a define in a threaded block is allowed "
209STATISTIC(NumBitMaps,
"Number of switch instructions turned into bitmaps");
211 "Number of switch instructions turned into linear mapping");
213 "Number of switch instructions turned into lookup tables");
215 NumLookupTablesHoles,
216 "Number of switch instructions turned into lookup tables (holes checked)");
217STATISTIC(NumTableCmpReuses,
"Number of reused switch table lookup compares");
219 "Number of value comparisons folded into predecessor basic blocks");
221 "Number of branches folded into predecessor basic block");
224 "Number of common instruction 'blocks' hoisted up to the begin block");
226 "Number of common instructions hoisted up to the begin block");
228 "Number of common instruction 'blocks' sunk down to the end block");
230 "Number of common instructions sunk down to the end block");
231STATISTIC(NumSpeculations,
"Number of speculative executed instructions");
233 "Number of invokes with empty resume blocks simplified into calls");
234STATISTIC(NumInvokesMerged,
"Number of invokes that were merged together");
235STATISTIC(NumInvokeSetsFormed,
"Number of invoke sets that were formed");
242using SwitchCaseResultVectorTy =
251struct ValueEqualityComparisonCase {
263 bool operator==(BasicBlock *RHSDest)
const {
return Dest == RHSDest; }
266class SimplifyCFGOpt {
267 const TargetTransformInfo &TTI;
269 const DataLayout &DL;
271 const SimplifyCFGOptions &Options;
274 Value *isValueEqualityComparison(Instruction *TI);
276 Instruction *TI, std::vector<ValueEqualityComparisonCase> &Cases);
277 bool simplifyEqualityComparisonWithOnlyPredecessor(Instruction *TI,
280 bool performValueComparisonIntoPredecessorFolding(Instruction *TI,
Value *&CV,
283 bool foldValueComparisonIntoPredecessors(Instruction *TI,
286 bool simplifyResume(ResumeInst *RI,
IRBuilder<> &Builder);
287 bool simplifySingleResume(ResumeInst *RI);
288 bool simplifyCommonResume(ResumeInst *RI);
289 bool simplifyCleanupReturn(CleanupReturnInst *RI);
290 bool simplifyUnreachable(UnreachableInst *UI);
291 bool simplifySwitch(SwitchInst *SI,
IRBuilder<> &Builder);
292 bool simplifyDuplicateSwitchArms(SwitchInst *SI, DomTreeUpdater *DTU);
293 bool simplifyIndirectBr(IndirectBrInst *IBI);
294 bool simplifyBranch(BranchInst *Branch,
IRBuilder<> &Builder);
295 bool simplifyUncondBranch(BranchInst *BI,
IRBuilder<> &Builder);
296 bool simplifyCondBranch(BranchInst *BI,
IRBuilder<> &Builder);
297 bool foldCondBranchOnValueKnownInPredecessor(BranchInst *BI);
299 bool tryToSimplifyUncondBranchWithICmpInIt(ICmpInst *ICI,
302 bool hoistCommonCodeFromSuccessors(Instruction *TI,
bool AllInstsEqOnly);
303 bool hoistSuccIdenticalTerminatorToSwitchOrIf(
304 Instruction *TI, Instruction *I1,
305 SmallVectorImpl<Instruction *> &OtherSuccTIs);
306 bool speculativelyExecuteBB(BranchInst *BI, BasicBlock *ThenBB);
307 bool simplifyTerminatorOnSelect(Instruction *OldTerm,
Value *
Cond,
308 BasicBlock *TrueBB, BasicBlock *FalseBB,
309 uint32_t TrueWeight, uint32_t FalseWeight);
310 bool simplifyBranchOnICmpChain(BranchInst *BI,
IRBuilder<> &Builder,
311 const DataLayout &DL);
312 bool simplifySwitchOnSelect(SwitchInst *SI, SelectInst *
Select);
313 bool simplifyIndirectBrOnSelect(IndirectBrInst *IBI, SelectInst *SI);
314 bool turnSwitchRangeIntoICmp(SwitchInst *SI,
IRBuilder<> &Builder);
317 SimplifyCFGOpt(
const TargetTransformInfo &TTI, DomTreeUpdater *DTU,
319 const SimplifyCFGOptions &Opts)
320 : TTI(TTI), DTU(DTU), DL(DL), LoopHeaders(LoopHeaders), Options(Opts) {
321 assert((!DTU || !DTU->hasPostDomTree()) &&
322 "SimplifyCFG is not yet capable of maintaining validity of a "
323 "PostDomTree, so don't ask for it.");
326 bool simplifyOnce(BasicBlock *BB);
327 bool run(BasicBlock *BB);
330 bool requestResimplify() {
340isSelectInRoleOfConjunctionOrDisjunction(
const SelectInst *
SI) {
360 "Only for a pair of incoming blocks at the time!");
366 Value *IV0 = PN.getIncomingValueForBlock(IncomingBlocks[0]);
367 Value *IV1 = PN.getIncomingValueForBlock(IncomingBlocks[1]);
370 if (EquivalenceSet && EquivalenceSet->contains(IV0) &&
371 EquivalenceSet->contains(IV1))
394 if (!SI1Succs.
count(Succ))
400 FailBlocks->insert(Succ);
416 PN.addIncoming(PN.getIncomingValueForBlock(ExistPred), NewPred);
418 if (
auto *MPhi = MSSAU->getMemorySSA()->getMemoryAccess(Succ))
419 MPhi->addIncoming(MPhi->getIncomingValueForBlock(ExistPred), NewPred);
481 if (AggressiveInsts.
count(
I))
497 ZeroCostInstructions.
insert(OverflowInst);
499 }
else if (!ZeroCostInstructions.
contains(
I))
515 for (
Use &
Op :
I->operands())
517 TTI, AC, ZeroCostInstructions,
Depth + 1))
534 if (
DL.hasUnstableRepresentation(V->getType()))
543 return ConstantInt::get(IntPtrTy, 0);
548 if (CE->getOpcode() == Instruction::IntToPtr)
572struct ConstantComparesGatherer {
573 const DataLayout &DL;
576 Value *CompValue =
nullptr;
579 Value *Extra =
nullptr;
585 unsigned UsedICmps = 0;
591 bool IgnoreFirstMatch =
false;
592 bool MultipleMatches =
false;
595 ConstantComparesGatherer(Instruction *
Cond,
const DataLayout &DL) : DL(DL) {
597 if (CompValue || !MultipleMatches)
602 IgnoreFirstMatch =
true;
606 ConstantComparesGatherer(
const ConstantComparesGatherer &) =
delete;
607 ConstantComparesGatherer &
608 operator=(
const ConstantComparesGatherer &) =
delete;
613 bool setValueOnce(
Value *NewVal) {
614 if (IgnoreFirstMatch) {
615 IgnoreFirstMatch =
false;
618 if (CompValue && CompValue != NewVal) {
619 MultipleMatches =
true;
633 bool matchInstruction(Instruction *
I,
bool isEQ) {
640 if (!setValueOnce(Val))
660 if (ICI->
getPredicate() == (isEQ ? ICmpInst::ICMP_EQ : ICmpInst::ICMP_NE)) {
704 if (
Mask.isPowerOf2() && (
C->getValue() & ~Mask) ==
C->getValue()) {
706 if (!setValueOnce(RHSVal))
711 ConstantInt::get(
C->getContext(),
712 C->getValue() | Mask));
727 if (
Mask.isPowerOf2() && (
C->getValue() | Mask) ==
C->getValue()) {
729 if (!setValueOnce(RHSVal))
733 Vals.push_back(ConstantInt::get(
C->getContext(),
734 C->getValue() & ~Mask));
755 Value *CandidateVal =
I->getOperand(0);
758 CandidateVal = RHSVal;
773 if (!setValueOnce(CandidateVal))
778 Vals.push_back(ConstantInt::get(
I->getContext(), Tmp));
789 void gather(
Value *V) {
798 SmallVector<Value *, 8> DFT{Op0, Op1};
799 SmallPtrSet<Value *, 8> Visited{
V, Op0, Op1};
801 while (!DFT.
empty()) {
808 if (Visited.
insert(Op1).second)
810 if (Visited.
insert(Op0).second)
817 if (matchInstruction(
I, IsEq))
844 if (BI->isConditional())
862 if (!
SI->getParent()->hasNPredecessorsOrMore(128 /
SI->getNumSuccessors()))
863 CV =
SI->getCondition();
865 if (BI->isConditional() && BI->getCondition()->hasOneUse()) {
870 if (Trunc->hasNoUnsignedWrap())
871 CV = Trunc->getOperand(0);
878 Value *
Ptr = PTII->getPointerOperand();
879 if (
DL.hasUnstableRepresentation(
Ptr->getType()))
881 if (PTII->getType() ==
DL.getIntPtrType(
Ptr->getType()))
890BasicBlock *SimplifyCFGOpt::getValueEqualityComparisonCases(
891 Instruction *TI, std::vector<ValueEqualityComparisonCase> &Cases) {
893 Cases.reserve(
SI->getNumCases());
894 for (
auto Case :
SI->cases())
895 Cases.push_back(ValueEqualityComparisonCase(Case.getCaseValue(),
896 Case.getCaseSuccessor()));
897 return SI->getDefaultDest();
902 ICmpInst::Predicate Pred;
908 Pred = ICmpInst::ICMP_NE;
913 Cases.push_back(ValueEqualityComparisonCase(
C, Succ));
921 std::vector<ValueEqualityComparisonCase> &Cases) {
927 std::vector<ValueEqualityComparisonCase> &C2) {
928 std::vector<ValueEqualityComparisonCase> *V1 = &C1, *V2 = &C2;
931 if (V1->size() > V2->size())
936 if (V1->size() == 1) {
939 for (
const ValueEqualityComparisonCase &
VECC : *V2)
940 if (TheVal ==
VECC.Value)
947 unsigned i1 = 0, i2 = 0, e1 = V1->size(), e2 = V2->size();
948 while (i1 != e1 && i2 != e2) {
969 SI->setMetadata(LLVMContext::MD_prof,
N);
975 uint32_t FalseWeight,
bool IsExpected) {
980 if (TrueWeight || FalseWeight)
983 I->setMetadata(LLVMContext::MD_prof,
N);
991bool SimplifyCFGOpt::simplifyEqualityComparisonWithOnlyPredecessor(
992 Instruction *TI, BasicBlock *Pred,
IRBuilder<> &Builder) {
997 Value *ThisVal = isValueEqualityComparison(TI);
998 assert(ThisVal &&
"This isn't a value comparison!!");
999 if (ThisVal != PredVal)
1006 std::vector<ValueEqualityComparisonCase> PredCases;
1008 getValueEqualityComparisonCases(Pred->
getTerminator(), PredCases);
1012 std::vector<ValueEqualityComparisonCase> ThisCases;
1013 BasicBlock *ThisDef = getValueEqualityComparisonCases(TI, ThisCases);
1028 assert(ThisCases.size() == 1 &&
"Branch can only have one case!");
1034 ThisCases[0].Dest->removePredecessor(PredDef);
1037 <<
"Through successor TI: " << *TI <<
"Leaving: " << *NI
1044 {{DominatorTree::Delete, PredDef, ThisCases[0].Dest}});
1051 SmallPtrSet<Constant *, 16> DeadCases;
1052 for (
const ValueEqualityComparisonCase &Case : PredCases)
1053 DeadCases.
insert(Case.Value);
1056 <<
"Through successor TI: " << *TI);
1058 SmallDenseMap<BasicBlock *, int, 8> NumPerSuccessorCases;
1061 auto *
Successor = i->getCaseSuccessor();
1064 if (DeadCases.
count(i->getCaseValue())) {
1073 std::vector<DominatorTree::UpdateType> Updates;
1074 for (
const std::pair<BasicBlock *, int> &
I : NumPerSuccessorCases)
1076 Updates.push_back({DominatorTree::Delete, PredDef,
I.first});
1086 ConstantInt *TIV =
nullptr;
1088 for (
const auto &[
Value, Dest] : PredCases)
1094 assert(TIV &&
"No edge from pred to succ?");
1099 for (
const auto &[
Value, Dest] : ThisCases)
1107 TheRealDest = ThisDef;
1109 SmallPtrSet<BasicBlock *, 2> RemovedSuccs;
1114 if (Succ != CheckEdge) {
1115 if (Succ != TheRealDest)
1116 RemovedSuccs.
insert(Succ);
1119 CheckEdge =
nullptr;
1126 <<
"Through successor TI: " << *TI <<
"Leaving: " << *NI
1131 SmallVector<DominatorTree::UpdateType, 2> Updates;
1133 for (
auto *RemovedSucc : RemovedSuccs)
1134 Updates.
push_back({DominatorTree::Delete, TIBB, RemovedSucc});
1145struct ConstantIntOrdering {
1146 bool operator()(
const ConstantInt *
LHS,
const ConstantInt *
RHS)
const {
1147 return LHS->getValue().ult(
RHS->getValue());
1159 return LHS->getValue().ult(
RHS->getValue()) ? 1 : -1;
1168 assert(MD &&
"Invalid branch-weight metadata");
1188 if (Max > UINT_MAX) {
1203 if (BonusInst.isTerminator())
1233 NewBonusInst->
takeName(&BonusInst);
1234 BonusInst.setName(NewBonusInst->
getName() +
".old");
1235 VMap[&BonusInst] = NewBonusInst;
1244 assert(UI->getParent() == BB && BonusInst.comesBefore(UI) &&
1245 "If the user is not a PHI node, then it should be in the same "
1246 "block as, and come after, the original bonus instruction.");
1250 if (PN->getIncomingBlock(U) == BB)
1254 assert(PN->getIncomingBlock(U) == PredBlock &&
1255 "Not in block-closed SSA form?");
1256 U.set(NewBonusInst);
1266 if (!PredDL->getAtomGroup() &&
DL &&
DL->getAtomGroup() &&
1267 PredDL.isSameSourceLocation(
DL)) {
1274bool SimplifyCFGOpt::performValueComparisonIntoPredecessorFolding(
1282 std::vector<ValueEqualityComparisonCase> BBCases;
1283 BasicBlock *BBDefault = getValueEqualityComparisonCases(TI, BBCases);
1285 std::vector<ValueEqualityComparisonCase> PredCases;
1286 BasicBlock *PredDefault = getValueEqualityComparisonCases(PTI, PredCases);
1291 SmallMapVector<BasicBlock *, int, 8> NewSuccessors;
1294 SmallVector<uint64_t, 8> Weights;
1298 if (PredHasWeights) {
1301 if (Weights.
size() != 1 + PredCases.size())
1302 PredHasWeights = SuccHasWeights =
false;
1303 }
else if (SuccHasWeights)
1307 Weights.
assign(1 + PredCases.size(), 1);
1309 SmallVector<uint64_t, 8> SuccWeights;
1310 if (SuccHasWeights) {
1313 if (SuccWeights.
size() != 1 + BBCases.size())
1314 PredHasWeights = SuccHasWeights =
false;
1315 }
else if (PredHasWeights)
1316 SuccWeights.
assign(1 + BBCases.size(), 1);
1318 if (PredDefault == BB) {
1321 std::set<ConstantInt *, ConstantIntOrdering> PTIHandled;
1322 for (
unsigned i = 0, e = PredCases.size(); i != e; ++i)
1323 if (PredCases[i].Dest != BB)
1324 PTIHandled.insert(PredCases[i].
Value);
1327 std::swap(PredCases[i], PredCases.back());
1329 if (PredHasWeights || SuccHasWeights) {
1331 Weights[0] += Weights[i + 1];
1336 PredCases.pop_back();
1342 if (PredDefault != BBDefault) {
1344 if (DTU && PredDefault != BB)
1345 Updates.
push_back({DominatorTree::Delete, Pred, PredDefault});
1346 PredDefault = BBDefault;
1347 ++NewSuccessors[BBDefault];
1350 unsigned CasesFromPred = Weights.
size();
1351 uint64_t ValidTotalSuccWeight = 0;
1352 for (
unsigned i = 0, e = BBCases.size(); i != e; ++i)
1353 if (!PTIHandled.count(BBCases[i].Value) && BBCases[i].Dest != BBDefault) {
1354 PredCases.push_back(BBCases[i]);
1355 ++NewSuccessors[BBCases[i].Dest];
1356 if (SuccHasWeights || PredHasWeights) {
1360 Weights.
push_back(Weights[0] * SuccWeights[i + 1]);
1361 ValidTotalSuccWeight += SuccWeights[i + 1];
1365 if (SuccHasWeights || PredHasWeights) {
1366 ValidTotalSuccWeight += SuccWeights[0];
1368 for (
unsigned i = 1; i < CasesFromPred; ++i)
1369 Weights[i] *= ValidTotalSuccWeight;
1371 Weights[0] *= SuccWeights[0];
1377 std::set<ConstantInt *, ConstantIntOrdering> PTIHandled;
1378 std::map<ConstantInt *, uint64_t> WeightsForHandled;
1379 for (
unsigned i = 0, e = PredCases.size(); i != e; ++i)
1380 if (PredCases[i].Dest == BB) {
1381 PTIHandled.insert(PredCases[i].
Value);
1383 if (PredHasWeights || SuccHasWeights) {
1384 WeightsForHandled[PredCases[i].Value] = Weights[i + 1];
1389 std::swap(PredCases[i], PredCases.back());
1390 PredCases.pop_back();
1397 for (
const ValueEqualityComparisonCase &Case : BBCases)
1398 if (PTIHandled.count(Case.Value)) {
1400 if (PredHasWeights || SuccHasWeights)
1401 Weights.
push_back(WeightsForHandled[Case.Value]);
1402 PredCases.push_back(Case);
1403 ++NewSuccessors[Case.Dest];
1404 PTIHandled.erase(Case.Value);
1409 for (ConstantInt *
I : PTIHandled) {
1410 if (PredHasWeights || SuccHasWeights)
1412 PredCases.push_back(ValueEqualityComparisonCase(
I, BBDefault));
1413 ++NewSuccessors[BBDefault];
1420 SmallPtrSet<BasicBlock *, 2> SuccsOfPred;
1425 for (
const std::pair<BasicBlock *, int /*Num*/> &NewSuccessor :
1427 for (
auto I :
seq(NewSuccessor.second)) {
1431 if (DTU && !SuccsOfPred.
contains(NewSuccessor.first))
1432 Updates.
push_back({DominatorTree::Insert, Pred, NewSuccessor.first});
1439 "Should not end up here with unstable pointers");
1445 SwitchInst *NewSI = Builder.
CreateSwitch(CV, PredDefault, PredCases.size());
1447 for (ValueEqualityComparisonCase &V : PredCases)
1450 if (PredHasWeights || SuccHasWeights) {
1467 if (!InfLoopBlock) {
1475 {DominatorTree::Insert, InfLoopBlock, InfLoopBlock});
1482 Updates.
push_back({DominatorTree::Insert, Pred, InfLoopBlock});
1484 Updates.
push_back({DominatorTree::Delete, Pred, BB});
1489 ++NumFoldValueComparisonIntoPredecessors;
1497bool SimplifyCFGOpt::foldValueComparisonIntoPredecessors(Instruction *TI,
1500 Value *CV = isValueEqualityComparison(TI);
1501 assert(CV &&
"Not a comparison?");
1506 while (!Preds.empty()) {
1515 Value *PCV = isValueEqualityComparison(PTI);
1519 SmallSetVector<BasicBlock *, 4> FailBlocks;
1521 for (
auto *Succ : FailBlocks) {
1527 performValueComparisonIntoPredecessorFolding(TI, CV, PTI, Builder);
1541 Value *BB1V = PN.getIncomingValueForBlock(BB1);
1542 Value *BB2V = PN.getIncomingValueForBlock(BB2);
1543 if (BB1V != BB2V && (BB1V == I1 || BB2V == I2)) {
1562 if (
I->mayReadFromMemory())
1594 if (CB->getIntrinsicID() == Intrinsic::experimental_deoptimize)
1602 if (J->getParent() == BB)
1624 if (C1->isMustTailCall() != C2->isMustTailCall())
1627 if (!
TTI.isProfitableToHoist(I1) || !
TTI.isProfitableToHoist(I2))
1633 if (CB1->cannotMerge() || CB1->isConvergent())
1636 if (CB2->cannotMerge() || CB2->isConvergent())
1651 if (!I1->hasDbgRecords())
1653 using CurrentAndEndIt =
1654 std::pair<DbgRecord::self_iterator, DbgRecord::self_iterator>;
1660 auto atEnd = [](
const CurrentAndEndIt &Pair) {
1661 return Pair.first == Pair.second;
1667 return Itrs[0].first->isIdenticalToWhenDefined(*
I);
1673 {I1->getDbgRecordRange().begin(), I1->getDbgRecordRange().end()});
1675 if (!
Other->hasDbgRecords())
1678 {
Other->getDbgRecordRange().begin(),
Other->getDbgRecordRange().end()});
1685 while (
none_of(Itrs, atEnd)) {
1686 bool HoistDVRs = allIdentical(Itrs);
1687 for (CurrentAndEndIt &Pair : Itrs) {
1701 if (I1->isIdenticalToWhenDefined(I2,
true))
1706 return Cmp1->getPredicate() == Cmp2->getSwappedPredicate() &&
1707 Cmp1->getOperand(0) == Cmp2->getOperand(1) &&
1708 Cmp1->getOperand(1) == Cmp2->getOperand(0);
1710 if (I1->isCommutative() && I1->isSameOperationAs(I2)) {
1711 return I1->getOperand(0) == I2->
getOperand(1) &&
1777 auto &Context = BI->
getParent()->getContext();
1782 Value *Mask =
nullptr;
1783 Value *MaskFalse =
nullptr;
1784 Value *MaskTrue =
nullptr;
1785 if (Invert.has_value()) {
1786 IRBuilder<> Builder(Sel ? Sel : SpeculatedConditionalLoadsStores.
back());
1787 Mask = Builder.CreateBitCast(
1792 MaskFalse = Builder.CreateBitCast(
1794 MaskTrue = Builder.CreateBitCast(
Cond, VCondTy);
1796 auto PeekThroughBitcasts = [](
Value *V) {
1798 V = BitCast->getOperand(0);
1801 for (
auto *
I : SpeculatedConditionalLoadsStores) {
1803 if (!Invert.has_value())
1804 Mask =
I->getParent() == BI->getSuccessor(0) ? MaskTrue : MaskFalse;
1809 auto *Op0 =
I->getOperand(0);
1810 CallInst *MaskedLoadStore =
nullptr;
1813 auto *Ty =
I->getType();
1815 Value *PassThru =
nullptr;
1816 if (Invert.has_value())
1817 for (
User *U :
I->users()) {
1819 PassThru = Builder.CreateBitCast(
1823 Sel && Ins->getParent() == BB) {
1828 Builder.SetInsertPoint(Ins);
1831 MaskedLoadStore = Builder.CreateMaskedLoad(
1833 Value *NewLoadStore = Builder.CreateBitCast(MaskedLoadStore, Ty);
1836 I->replaceAllUsesWith(NewLoadStore);
1839 auto *StoredVal = Builder.CreateBitCast(
1841 MaskedLoadStore = Builder.CreateMaskedStore(
1852 if (
const MDNode *Ranges =
I->getMetadata(LLVMContext::MD_range))
1854 I->dropUBImplyingAttrsAndUnknownMetadata({LLVMContext::MD_annotation});
1858 I->eraseMetadataIf([](
unsigned MDKind,
MDNode *
Node) {
1859 return Node->getMetadataID() == Metadata::DIAssignIDKind;
1862 I->eraseFromParent();
1869 bool IsStore =
false;
1892bool SimplifyCFGOpt::hoistCommonCodeFromSuccessors(Instruction *TI,
1893 bool AllInstsEqOnly) {
1913 using SuccIterPair = std::pair<BasicBlock::iterator, unsigned>;
1919 SuccIterPairs.
push_back(SuccIterPair(SuccItr, 0));
1922 if (AllInstsEqOnly) {
1928 bool AllSame =
none_of(Succs, [&Succs](BasicBlock *Succ) {
1931 return !
Term->isSameOperationAs(Term0) ||
1938 LockstepReverseIterator<true> LRI(Succs);
1939 while (LRI.isValid()) {
1941 if (
any_of(*LRI, [I0](Instruction *
I) {
1956 unsigned NumSkipped = 0;
1959 if (SuccIterPairs.
size() > 2) {
1962 if (SuccIterPairs.
size() < 2)
1969 auto *SuccIterPairBegin = SuccIterPairs.
begin();
1970 auto &BB1ItrPair = *SuccIterPairBegin++;
1971 auto OtherSuccIterPairRange =
1977 bool AllInstsAreIdentical =
true;
1978 bool HasTerminator =
I1->isTerminator();
1979 for (
auto &SuccIter : OtherSuccIterRange) {
1983 MMRAMetadata(*I1) != MMRAMetadata(*I2)))
1984 AllInstsAreIdentical =
false;
1987 SmallVector<Instruction *, 8> OtherInsts;
1988 for (
auto &SuccIter : OtherSuccIterRange)
1993 if (HasTerminator) {
1997 if (NumSkipped || !AllInstsAreIdentical) {
2002 return hoistSuccIdenticalTerminatorToSwitchOrIf(TI, I1, OtherInsts) ||
2006 if (AllInstsAreIdentical) {
2007 unsigned SkipFlagsBB1 = BB1ItrPair.second;
2008 AllInstsAreIdentical =
2010 all_of(OtherSuccIterPairRange, [=](
const auto &Pair) {
2012 unsigned SkipFlagsBB2 = Pair.second;
2022 if (AllInstsAreIdentical) {
2032 for (
auto &SuccIter : OtherSuccIterRange) {
2040 assert(
Success &&
"We should not be trying to hoist callbases "
2041 "with non-intersectable attributes");
2053 NumHoistCommonCode += SuccIterPairs.
size();
2055 NumHoistCommonInstrs += SuccIterPairs.
size();
2064 for (
auto &SuccIterPair : SuccIterPairs) {
2073bool SimplifyCFGOpt::hoistSuccIdenticalTerminatorToSwitchOrIf(
2074 Instruction *TI, Instruction *I1,
2075 SmallVectorImpl<Instruction *> &OtherSuccTIs) {
2084 auto *I2 = *OtherSuccTIs.
begin();
2104 for (PHINode &PN : Succ->
phis()) {
2105 Value *BB1V = PN.getIncomingValueForBlock(BB1);
2106 for (Instruction *OtherSuccTI : OtherSuccTIs) {
2107 Value *BB2V = PN.getIncomingValueForBlock(OtherSuccTI->getParent());
2127 if (!
NT->getType()->isVoidTy()) {
2128 I1->replaceAllUsesWith(NT);
2129 for (Instruction *OtherSuccTI : OtherSuccTIs)
2130 OtherSuccTI->replaceAllUsesWith(NT);
2134 NumHoistCommonInstrs += OtherSuccTIs.size() + 1;
2140 for (
auto *OtherSuccTI : OtherSuccTIs)
2141 Locs.
push_back(OtherSuccTI->getDebugLoc());
2153 std::map<std::pair<Value *, Value *>, SelectInst *> InsertedSelects;
2155 for (PHINode &PN : Succ->
phis()) {
2156 Value *BB1V = PN.getIncomingValueForBlock(BB1);
2157 Value *BB2V = PN.getIncomingValueForBlock(BB2);
2163 SelectInst *&
SI = InsertedSelects[std::make_pair(BB1V, BB2V)];
2173 for (
unsigned i = 0, e = PN.getNumIncomingValues(); i != e; ++i)
2174 if (PN.getIncomingBlock(i) == BB1 || PN.getIncomingBlock(i) == BB2)
2175 PN.setIncomingValue(i, SI);
2186 Updates.
push_back({DominatorTree::Insert, TIParent, Succ});
2191 Updates.
push_back({DominatorTree::Delete, TIParent, Succ});
2204 if (
I->isIntDivRem())
2219 std::optional<unsigned> NumUses;
2220 for (
auto *
I : Insts) {
2223 I->getType()->isTokenTy())
2228 if (
I->getParent()->getSingleSuccessor() ==
I->getParent())
2236 if (
C->isInlineAsm() ||
C->cannotMerge() ||
C->isConvergent())
2240 NumUses =
I->getNumUses();
2241 else if (NumUses !=
I->getNumUses())
2247 for (
auto *
I : Insts) {
2261 for (
const Use &U : I0->
uses()) {
2262 auto It = PHIOperands.find(&U);
2263 if (It == PHIOperands.end())
2266 if (!
equal(Insts, It->second))
2278 bool HaveIndirectCalls =
any_of(Insts, IsIndirectCall);
2279 bool AllCallsAreIndirect =
all_of(Insts, IsIndirectCall);
2280 if (HaveIndirectCalls) {
2281 if (!AllCallsAreIndirect)
2285 Value *Callee =
nullptr;
2289 Callee = CurrCallee;
2290 else if (Callee != CurrCallee)
2296 for (
unsigned OI = 0, OE = I0->
getNumOperands(); OI != OE; ++OI) {
2302 if (!
all_of(Insts, SameAsI0)) {
2308 for (
auto *
I : Insts)
2309 Ops.push_back(
I->getOperand(OI));
2319 auto *BBEnd = Blocks[0]->getTerminator()->getSuccessor(0);
2324 for (
auto *BB : Blocks) {
2326 I =
I->getPrevNode();
2351 assert(!
Op->getType()->isTokenTy() &&
"Can't PHI tokens!");
2354 PN->insertBefore(BBEnd->begin());
2355 for (
auto *
I : Insts)
2356 PN->addIncoming(
I->getOperand(O),
I->getParent());
2365 I0->
moveBefore(*BBEnd, BBEnd->getFirstInsertionPt());
2368 for (
auto *
I : Insts)
2382 assert(
Success &&
"We should not be trying to sink callbases "
2383 "with non-intersectable attributes");
2394 PN->replaceAllUsesWith(I0);
2395 PN->eraseFromParent();
2399 for (
auto *
I : Insts) {
2404 assert(
I->user_empty() &&
"Inst unexpectedly still has non-dbg users");
2405 I->replaceAllUsesWith(I0);
2406 I->eraseFromParent();
2456 bool HaveNonUnconditionalPredecessors =
false;
2459 if (PredBr && PredBr->isUnconditional())
2462 HaveNonUnconditionalPredecessors =
true;
2464 if (UnconditionalPreds.
size() < 2)
2477 for (
const Use &U : PN.incoming_values())
2478 IncomingVals.
insert({PN.getIncomingBlock(U), &U});
2479 auto &
Ops = PHIOperands[IncomingVals[UnconditionalPreds[0]]];
2481 Ops.push_back(*IncomingVals[Pred]);
2489 LLVM_DEBUG(
dbgs() <<
"SINK: instruction can be sunk: " << *(*LRI)[0]
2502 if (!followedByDeoptOrUnreachable) {
2504 auto IsMemOperand = [](
Use &U) {
2517 unsigned NumPHIInsts = 0;
2518 for (
Use &U : (*LRI)[0]->operands()) {
2519 auto It = PHIOperands.
find(&U);
2520 if (It != PHIOperands.
end() && !
all_of(It->second, [&](
Value *V) {
2521 return InstructionsToSink.contains(V);
2528 if (IsMemOperand(U) &&
2529 any_of(It->second, [](
Value *V) { return isa<GEPOperator>(V); }))
2536 LLVM_DEBUG(
dbgs() <<
"SINK: #phi insts: " << NumPHIInsts <<
"\n");
2537 return NumPHIInsts <= 1;
2554 while (Idx < ScanIdx) {
2555 if (!ProfitableToSinkInstruction(LRI)) {
2558 dbgs() <<
"SINK: stopping here, too many PHIs would be created!\n");
2571 if (Idx < ScanIdx) {
2574 InstructionsToSink = InstructionsProfitableToSink;
2580 !ProfitableToSinkInstruction(LRI) &&
2581 "We already know that the last instruction is unprofitable to sink");
2589 for (
auto *
I : *LRI)
2590 InstructionsProfitableToSink.
erase(
I);
2591 if (!ProfitableToSinkInstruction(LRI)) {
2594 InstructionsToSink = InstructionsProfitableToSink;
2608 if (HaveNonUnconditionalPredecessors) {
2609 if (!followedByDeoptOrUnreachable) {
2617 bool Profitable =
false;
2618 while (Idx < ScanIdx) {
2652 for (; SinkIdx != ScanIdx; ++SinkIdx) {
2654 << *UnconditionalPreds[0]->getTerminator()->getPrevNode()
2662 NumSinkCommonInstrs++;
2666 ++NumSinkCommonCode;
2672struct CompatibleSets {
2673 using SetTy = SmallVector<InvokeInst *, 2>;
2679 SetTy &getCompatibleSet(InvokeInst *
II);
2681 void insert(InvokeInst *
II);
2684CompatibleSets::SetTy &CompatibleSets::getCompatibleSet(InvokeInst *
II) {
2689 for (CompatibleSets::SetTy &Set : Sets) {
2690 if (CompatibleSets::shouldBelongToSameSet({
Set.front(),
II}))
2695 return Sets.emplace_back();
2698void CompatibleSets::insert(InvokeInst *
II) {
2699 getCompatibleSet(
II).emplace_back(
II);
2703 assert(Invokes.
size() == 2 &&
"Always called with exactly two candidates.");
2706 auto IsIllegalToMerge = [](InvokeInst *
II) {
2707 return II->cannotMerge() ||
II->isInlineAsm();
2709 if (
any_of(Invokes, IsIllegalToMerge))
2714 auto IsIndirectCall = [](InvokeInst *
II) {
return II->isIndirectCall(); };
2715 bool HaveIndirectCalls =
any_of(Invokes, IsIndirectCall);
2716 bool AllCallsAreIndirect =
all_of(Invokes, IsIndirectCall);
2717 if (HaveIndirectCalls) {
2718 if (!AllCallsAreIndirect)
2723 for (InvokeInst *
II : Invokes) {
2724 Value *CurrCallee =
II->getCalledOperand();
2725 assert(CurrCallee &&
"There is always a called operand.");
2728 else if (Callee != CurrCallee)
2735 auto HasNormalDest = [](InvokeInst *
II) {
2738 if (
any_of(Invokes, HasNormalDest)) {
2741 if (!
all_of(Invokes, HasNormalDest))
2746 for (InvokeInst *
II : Invokes) {
2748 assert(CurrNormalBB &&
"There is always a 'continue to' basic block.");
2750 NormalBB = CurrNormalBB;
2751 else if (NormalBB != CurrNormalBB)
2759 NormalBB, {Invokes[0]->getParent(), Invokes[1]->getParent()},
2768 for (InvokeInst *
II : Invokes) {
2770 assert(CurrUnwindBB &&
"There is always an 'unwind to' basic block.");
2772 UnwindBB = CurrUnwindBB;
2774 assert(UnwindBB == CurrUnwindBB &&
"Unexpected unwind destination.");
2781 Invokes.front()->getUnwindDest(),
2782 {Invokes[0]->getParent(), Invokes[1]->getParent()}))
2787 const InvokeInst *II0 = Invokes.front();
2788 for (
auto *
II : Invokes.drop_front())
2793 auto IsIllegalToMergeArguments = [](
auto Ops) {
2794 Use &U0 = std::get<0>(
Ops);
2795 Use &U1 = std::get<1>(
Ops);
2801 assert(Invokes.size() == 2 &&
"Always called with exactly two candidates.");
2802 if (
any_of(
zip(Invokes[0]->data_ops(), Invokes[1]->data_ops()),
2803 IsIllegalToMergeArguments))
2815 assert(Invokes.
size() >= 2 &&
"Must have at least two invokes to merge.");
2821 bool HasNormalDest =
2826 InvokeInst *MergedInvoke = [&Invokes, HasNormalDest]() {
2830 II0->
getParent()->getIterator()->getNextNode();
2835 Ctx, II0BB->
getName() +
".invoke", Func, InsertBeforeBlock);
2839 MergedInvoke->
insertInto(MergedInvokeBB, MergedInvokeBB->
end());
2841 if (!HasNormalDest) {
2845 Ctx, II0BB->
getName() +
".cont", Func, InsertBeforeBlock);
2853 return MergedInvoke;
2867 SuccBBOfMergedInvoke});
2877 bool IsIndirectCall = Invokes[0]->isIndirectCall();
2883 if (!IsIndirectCall)
2890 return II->getOperand(U.getOperandNo()) != U.get();
2909 Invokes.
front()->getParent());
2917 if (!MergedDebugLoc)
2918 MergedDebugLoc =
II->getDebugLoc();
2926 OrigSuccBB->removePredecessor(
II->getParent());
2932 assert(
Success &&
"Merged invokes with incompatible attributes");
2935 II->replaceAllUsesWith(MergedInvoke);
2936 II->eraseFromParent();
2940 ++NumInvokeSetsFormed;
2976 CompatibleSets Grouper;
2986 if (Invokes.
size() < 2)
2998class EphemeralValueTracker {
2999 SmallPtrSet<const Instruction *, 32> EphValues;
3001 bool isEphemeral(
const Instruction *
I) {
3004 return !
I->mayHaveSideEffects() && !
I->isTerminator() &&
3005 all_of(
I->users(), [&](
const User *U) {
3006 return EphValues.count(cast<Instruction>(U));
3011 bool track(
const Instruction *
I) {
3012 if (isEphemeral(
I)) {
3063 unsigned MaxNumInstToLookAt = 9;
3067 if (!MaxNumInstToLookAt)
3069 --MaxNumInstToLookAt;
3079 if (
SI->getPointerOperand() == StorePtr &&
3080 SI->getValueOperand()->getType() == StoreTy &&
SI->isSimple() &&
3083 return SI->getValueOperand();
3088 if (LI->getPointerOperand() == StorePtr && LI->
getType() == StoreTy &&
3089 LI->isSimple() && LI->getAlign() >= StoreToHoist->
getAlign()) {
3091 bool ExplicitlyDereferenceableOnly;
3096 (!ExplicitlyDereferenceableOnly ||
3098 LI->getDataLayout()))) {
3114 unsigned &SpeculatedInstructions,
3122 bool HaveRewritablePHIs =
false;
3124 Value *OrigV = PN.getIncomingValueForBlock(BB);
3125 Value *ThenV = PN.getIncomingValueForBlock(ThenBB);
3132 Cost +=
TTI.getCmpSelInstrCost(Instruction::Select, PN.getType(),
3141 HaveRewritablePHIs =
true;
3144 if (!OrigCE && !ThenCE)
3151 if (OrigCost + ThenCost > MaxCost)
3158 ++SpeculatedInstructions;
3159 if (SpeculatedInstructions > 1)
3163 return HaveRewritablePHIs;
3167 std::optional<bool> Invert,
3171 if (BI->
getMetadata(LLVMContext::MD_unpredictable))
3178 if (!Invert.has_value())
3181 uint64_t EndWeight = *Invert ? TWeight : FWeight;
3185 return BIEndProb < Likely;
3225bool SimplifyCFGOpt::speculativelyExecuteBB(BranchInst *BI,
3226 BasicBlock *ThenBB) {
3242 bool Invert =
false;
3257 SmallDenseMap<Instruction *, unsigned, 4> SinkCandidateUseCounts;
3259 SmallVector<Instruction *, 4> SpeculatedPseudoProbes;
3261 unsigned SpeculatedInstructions = 0;
3262 bool HoistLoadsStores =
Options.HoistLoadsStoresWithCondFaulting;
3263 SmallVector<Instruction *, 2> SpeculatedConditionalLoadsStores;
3264 Value *SpeculatedStoreValue =
nullptr;
3265 StoreInst *SpeculatedStore =
nullptr;
3266 EphemeralValueTracker EphTracker;
3281 if (EphTracker.track(&
I))
3286 bool IsSafeCheapLoadStore = HoistLoadsStores &&
3288 SpeculatedConditionalLoadsStores.
size() <
3292 if (IsSafeCheapLoadStore)
3293 SpeculatedConditionalLoadsStores.
push_back(&
I);
3295 ++SpeculatedInstructions;
3297 if (SpeculatedInstructions > 1)
3301 if (!IsSafeCheapLoadStore &&
3304 (SpeculatedStoreValue =
3307 if (!IsSafeCheapLoadStore && !SpeculatedStoreValue &&
3313 if (!SpeculatedStore && SpeculatedStoreValue)
3319 for (Use &
Op :
I.operands()) {
3324 ++SinkCandidateUseCounts[OpI];
3331 for (
const auto &[Inst,
Count] : SinkCandidateUseCounts)
3332 if (Inst->hasNUses(
Count)) {
3333 ++SpeculatedInstructions;
3334 if (SpeculatedInstructions > 1)
3341 SpeculatedStore !=
nullptr || !SpeculatedConditionalLoadsStores.
empty();
3344 SpeculatedInstructions,
Cost,
TTI);
3345 if (!Convert ||
Cost > Budget)
3349 LLVM_DEBUG(
dbgs() <<
"SPECULATIVELY EXECUTING BB" << *ThenBB <<
"\n";);
3353 if (SpeculatedStoreValue) {
3357 Value *FalseV = SpeculatedStoreValue;
3361 BrCond, TrueV, FalseV,
"spec.store.select", BI);
3391 for (DbgVariableRecord *DbgAssign :
3394 DbgAssign->replaceVariableLocationOp(OrigV, S);
3404 if (!SpeculatedStoreValue || &
I != SpeculatedStore) {
3407 I.dropUBImplyingAttrsAndMetadata();
3410 if (EphTracker.contains(&
I)) {
3412 I.eraseFromParent();
3418 for (
auto &It : *ThenBB)
3423 !DVR || !DVR->isDbgAssign())
3424 It.dropOneDbgRecord(&DR);
3426 std::prev(ThenBB->end()));
3428 if (!SpeculatedConditionalLoadsStores.
empty())
3434 for (PHINode &PN : EndBB->
phis()) {
3435 unsigned OrigI = PN.getBasicBlockIndex(BB);
3436 unsigned ThenI = PN.getBasicBlockIndex(ThenBB);
3437 Value *OrigV = PN.getIncomingValue(OrigI);
3438 Value *ThenV = PN.getIncomingValue(ThenI);
3447 Value *TrueV = ThenV, *FalseV = OrigV;
3451 PN.setIncomingValue(OrigI, V);
3452 PN.setIncomingValue(ThenI, V);
3456 for (Instruction *
I : SpeculatedPseudoProbes)
3457 I->eraseFromParent();
3470 if (!ReachesNonLocalUses.
insert(BB).second)
3485 EphemeralValueTracker EphTracker;
3492 if (CI->cannotDuplicate() || CI->isConvergent())
3505 for (
User *U :
I.users()) {
3508 if (UsedInBB == BB) {
3512 NonLocalUseBlocks.
insert(UsedInBB);
3526 if (
I &&
I->getParent() == To)
3542static std::optional<bool>
3563 KnownValues[CB].
insert(Pred);
3567 if (KnownValues.
empty())
3592 if (!
findReaching(UseBB, BB, ReachesNonLocalUseBlocks))
3595 for (
const auto &Pair : KnownValues) {
3612 if (ReachesNonLocalUseBlocks.
contains(RealDest))
3617 <<
" has value " << *Pair.first <<
" in predecessors:\n";
3620 dbgs() <<
"Threading to destination " << RealDest->
getName() <<
".\n";
3628 EdgeBB->setName(RealDest->
getName() +
".critedge");
3629 EdgeBB->moveBefore(RealDest);
3639 TranslateMap[
Cond] = CB;
3652 N->insertInto(EdgeBB, InsertPt);
3655 N->setName(BBI->getName() +
".c");
3666 if (!BBI->use_empty())
3667 TranslateMap[&*BBI] = V;
3668 if (!
N->mayHaveSideEffects()) {
3669 N->eraseFromParent();
3674 if (!BBI->use_empty())
3675 TranslateMap[&*BBI] =
N;
3681 for (; SrcDbgCursor != BBI; ++SrcDbgCursor)
3682 N->cloneDebugInfoFrom(&*SrcDbgCursor);
3683 SrcDbgCursor = std::next(BBI);
3685 N->cloneDebugInfoFrom(&*BBI);
3694 for (; &*SrcDbgCursor != BI; ++SrcDbgCursor)
3695 InsertPt->cloneDebugInfoFrom(&*SrcDbgCursor);
3696 InsertPt->cloneDebugInfoFrom(BI);
3717 return std::nullopt;
3723bool SimplifyCFGOpt::foldCondBranchOnValueKnownInPredecessor(BranchInst *BI) {
3730 std::optional<bool>
Result;
3731 bool EverChanged =
false;
3737 }
while (Result == std::nullopt);
3746 bool SpeculateUnpredictables) {
3768 return cast<BranchInst>(IfBlock->getTerminator())->isUnconditional();
3771 "Will have either one or two blocks to speculate.");
3778 bool IsUnpredictable = DomBI->
getMetadata(LLVMContext::MD_unpredictable);
3779 if (!IsUnpredictable) {
3782 (TWeight + FWeight) != 0) {
3787 if (IfBlocks.
size() == 1) {
3789 DomBI->
getSuccessor(0) == BB ? BITrueProb : BIFalseProb;
3790 if (BIBBProb >= Likely)
3793 if (BITrueProb >= Likely || BIFalseProb >= Likely)
3802 if (IfCondPhiInst->getParent() == BB)
3810 unsigned NumPhis = 0;
3823 if (SpeculateUnpredictables && IsUnpredictable)
3824 Budget +=
TTI.getBranchMispredictPenalty();
3837 AggressiveInsts, Cost, Budget,
TTI, AC,
3838 ZeroCostInstructions) ||
3840 AggressiveInsts, Cost, Budget,
TTI, AC,
3841 ZeroCostInstructions))
3853 auto CanHoistNotFromBothValues = [](
Value *V0,
Value *V1) {
3864 auto IsBinOpOrAnd = [](
Value *V) {
3881 if (!AggressiveInsts.
count(&*
I) && !
I->isDebugOrPseudoInst()) {
3894 if (IsUnpredictable)
dbgs() <<
" (unpredictable)";
3896 <<
" F: " << IfFalse->
getName() <<
"\n");
3913 Value *Sel = Builder.CreateSelectFMF(IfCond, TrueVal, FalseVal,
3918 PN->eraseFromParent();
3924 Builder.CreateBr(BB);
3945 return Builder.CreateBinOp(
Opc,
LHS,
RHS, Name);
3946 if (
Opc == Instruction::And)
3947 return Builder.CreateLogicalAnd(
LHS,
RHS, Name);
3948 if (
Opc == Instruction::Or)
3949 return Builder.CreateLogicalOr(
LHS,
RHS, Name);
3961 bool PredHasWeights =
3963 bool SuccHasWeights =
3965 if (PredHasWeights || SuccHasWeights) {
3966 if (!PredHasWeights)
3967 PredTrueWeight = PredFalseWeight = 1;
3968 if (!SuccHasWeights)
3969 SuccTrueWeight = SuccFalseWeight = 1;
3979static std::optional<std::tuple<BasicBlock *, Instruction::BinaryOps, bool>>
3983 "Both blocks must end with a conditional branches.");
3985 "PredBB must be a predecessor of BB.");
3993 (PTWeight + PFWeight) != 0) {
3996 Likely =
TTI->getPredictableBranchThreshold();
4001 if (PBITrueProb.
isUnknown() || PBITrueProb < Likely)
4002 return {{BI->
getSuccessor(0), Instruction::Or,
false}};
4006 return {{BI->
getSuccessor(1), Instruction::And,
false}};
4009 if (PBITrueProb.
isUnknown() || PBITrueProb < Likely)
4010 return {{BI->
getSuccessor(1), Instruction::And,
true}};
4016 return std::nullopt;
4029 bool InvertPredCond;
4030 std::tie(CommonSucc,
Opc, InvertPredCond) =
4033 LLVM_DEBUG(
dbgs() <<
"FOLDING BRANCH TO COMMON DEST:\n" << *PBI << *BB);
4040 {LLVMContext::MD_annotation});
4043 if (InvertPredCond) {
4056 uint64_t PredTrueWeight, PredFalseWeight, SuccTrueWeight, SuccFalseWeight;
4059 SuccTrueWeight, SuccFalseWeight)) {
4066 NewWeights.
push_back(PredTrueWeight * SuccTrueWeight);
4072 (SuccFalseWeight + SuccTrueWeight) +
4073 PredTrueWeight * SuccFalseWeight);
4079 NewWeights.
push_back(PredTrueWeight * (SuccFalseWeight + SuccTrueWeight) +
4080 PredFalseWeight * SuccTrueWeight);
4082 NewWeights.
push_back(PredFalseWeight * SuccFalseWeight);
4127 if (!MDWeights.
empty()) {
4128 assert(isSelectInRoleOfConjunctionOrDisjunction(
SI));
4133 ++NumFoldBranchToCommonDest;
4140 return I.getType()->isVectorTy() ||
any_of(
I.operands(), [](
Use &U) {
4141 return U->getType()->isVectorTy();
4151 unsigned BonusInstThreshold) {
4165 Cond->getParent() != BB || !
Cond->hasOneUse())
4186 bool InvertPredCond;
4188 std::tie(CommonSucc,
Opc, InvertPredCond) = *Recipe;
4220 unsigned NumBonusInsts = 0;
4221 bool SawVectorOp =
false;
4222 const unsigned PredCount = Preds.
size();
4239 NumBonusInsts += PredCount;
4247 auto IsBCSSAUse = [BB, &
I](
Use &U) {
4250 return PN->getIncomingBlock(U) == BB;
4251 return UI->
getParent() == BB &&
I.comesBefore(UI);
4255 if (!
all_of(
I.uses(), IsBCSSAUse))
4259 BonusInstThreshold *
4275 for (
auto *BB : {BB1, BB2}) {
4291 Value *AlternativeV =
nullptr) {
4317 BasicBlock *OtherPredBB = *PredI == BB ? *++PredI : *PredI;
4318 if (
PHI->getIncomingValueForBlock(OtherPredBB) == AlternativeV)
4326 if (!AlternativeV &&
4332 PHI->addIncoming(V, BB);
4342 BasicBlock *PostBB,
Value *Address,
bool InvertPCond,
bool InvertQCond,
4351 if (!PStore || !QStore)
4372 if (
I.mayReadOrWriteMemory())
4374 for (
auto &
I : *QFB)
4375 if (&
I != QStore &&
I.mayReadOrWriteMemory())
4378 for (
auto &
I : *QTB)
4379 if (&
I != QStore &&
I.mayReadOrWriteMemory())
4383 if (&*
I != PStore &&
I->mayReadOrWriteMemory())
4399 if (
I.isTerminator())
4417 "When we run out of budget we will eagerly return from within the "
4418 "per-instruction loop.");
4422 const std::array<StoreInst *, 2> FreeStores = {PStore, QStore};
4424 (!IsWorthwhile(PTB, FreeStores) || !IsWorthwhile(PFB, FreeStores) ||
4425 !IsWorthwhile(QTB, FreeStores) || !IsWorthwhile(QFB, FreeStores)))
4461 InvertPCond ^= (PStore->
getParent() != PTB);
4462 InvertQCond ^= (QStore->
getParent() != QTB);
4547 bool InvertPCond =
false, InvertQCond =
false;
4553 if (QFB == PostBB) {
4572 !HasOnePredAndOneSucc(QFB, QBI->
getParent(), PostBB))
4575 (QTB && !HasOnePredAndOneSucc(QTB, QBI->
getParent(), PostBB)))
4583 for (
auto *BB : {PTB, PFB}) {
4588 PStoreAddresses.
insert(
SI->getPointerOperand());
4590 for (
auto *BB : {QTB, QFB}) {
4595 QStoreAddresses.
insert(
SI->getPointerOperand());
4601 auto &CommonAddresses = PStoreAddresses;
4604 for (
auto *Address : CommonAddresses)
4607 InvertPCond, InvertQCond, DTU,
DL,
TTI);
4625 !BI->
getParent()->getSinglePredecessor())
4627 if (!IfFalseBB->
phis().empty())
4637 return I.mayWriteToMemory() ||
I.mayHaveSideEffects();
4740 if (!PBI->
getMetadata(LLVMContext::MD_unpredictable) &&
4742 (
static_cast<uint64_t>(PredWeights[0]) + PredWeights[1]) != 0) {
4746 static_cast<uint64_t>(PredWeights[0]) + PredWeights[1]);
4749 if (CommonDestProb >= Likely)
4759 unsigned NumPhis = 0;
4781 if (OtherDest == BB) {
4789 OtherDest = InfLoopBlock;
4801 PBICond = Builder.CreateNot(PBICond, PBICond->
getName() +
".not");
4805 BICond = Builder.CreateNot(BICond, BICond->
getName() +
".not");
4809 createLogicalOp(Builder, Instruction::Or, PBICond, BICond,
"brmerge");
4824 uint64_t PredTrueWeight, PredFalseWeight, SuccTrueWeight, SuccFalseWeight;
4825 uint64_t PredCommon, PredOther, SuccCommon, SuccOther;
4828 SuccTrueWeight, SuccFalseWeight);
4830 PredCommon = PBIOp ? PredFalseWeight : PredTrueWeight;
4831 PredOther = PBIOp ? PredTrueWeight : PredFalseWeight;
4832 SuccCommon = BIOp ? SuccFalseWeight : SuccTrueWeight;
4833 SuccOther = BIOp ? SuccTrueWeight : SuccFalseWeight;
4837 uint64_t NewWeights[2] = {PredCommon * (SuccCommon + SuccOther) +
4838 PredOther * SuccCommon,
4839 PredOther * SuccOther};
4848 assert(isSelectInRoleOfConjunctionOrDisjunction(
SI));
4867 Value *BIV = PN.getIncomingValueForBlock(BB);
4868 unsigned PBBIdx = PN.getBasicBlockIndex(PBI->
getParent());
4869 Value *PBIV = PN.getIncomingValue(PBBIdx);
4873 Builder.CreateSelect(PBICond, PBIV, BIV, PBIV->
getName() +
".mux"));
4874 PN.setIncomingValue(PBBIdx, NV);
4878 uint64_t TrueWeight = PBIOp ? PredFalseWeight : PredTrueWeight;
4879 uint64_t FalseWeight = PBIOp ? PredTrueWeight : PredFalseWeight;
4899bool SimplifyCFGOpt::simplifyTerminatorOnSelect(Instruction *OldTerm,
4901 BasicBlock *FalseBB,
4902 uint32_t TrueWeight,
4903 uint32_t FalseWeight) {
4910 BasicBlock *KeepEdge2 = TrueBB != FalseBB ? FalseBB :
nullptr;
4912 SmallSetVector<BasicBlock *, 2> RemovedSuccessors;
4915 for (BasicBlock *Succ :
successors(OldTerm)) {
4917 if (Succ == KeepEdge1)
4918 KeepEdge1 =
nullptr;
4919 else if (Succ == KeepEdge2)
4920 KeepEdge2 =
nullptr;
4925 if (Succ != TrueBB && Succ != FalseBB)
4926 RemovedSuccessors.
insert(Succ);
4934 if (!KeepEdge1 && !KeepEdge2) {
4935 if (TrueBB == FalseBB) {
4943 if (TrueWeight != FalseWeight)
4946 }
else if (KeepEdge1 && (KeepEdge2 || TrueBB == FalseBB)) {
4966 SmallVector<DominatorTree::UpdateType, 2> Updates;
4968 for (
auto *RemovedSuccessor : RemovedSuccessors)
4969 Updates.
push_back({DominatorTree::Delete, BB, RemovedSuccessor});
4980bool SimplifyCFGOpt::simplifySwitchOnSelect(SwitchInst *SI,
4985 if (!TrueVal || !FalseVal)
4990 BasicBlock *TrueBB =
SI->findCaseValue(TrueVal)->getCaseSuccessor();
4991 BasicBlock *FalseBB =
SI->findCaseValue(FalseVal)->getCaseSuccessor();
4994 uint32_t TrueWeight = 0, FalseWeight = 0;
4995 SmallVector<uint64_t, 8> Weights;
4999 if (Weights.
size() == 1 +
SI->getNumCases()) {
5001 (uint32_t)Weights[
SI->findCaseValue(TrueVal)->getSuccessorIndex()];
5003 (uint32_t)Weights[
SI->findCaseValue(FalseVal)->getSuccessorIndex()];
5008 return simplifyTerminatorOnSelect(SI, Condition, TrueBB, FalseBB, TrueWeight,
5017bool SimplifyCFGOpt::simplifyIndirectBrOnSelect(IndirectBrInst *IBI,
5030 return simplifyTerminatorOnSelect(IBI,
SI->getCondition(), TrueBB, FalseBB, 0,
5051bool SimplifyCFGOpt::tryToSimplifyUncondBranchWithICmpInIt(
5071 if (
SI->getCondition() != V)
5077 if (
SI->getDefaultDest() != BB) {
5078 ConstantInt *VVal =
SI->findCaseDest(BB);
5079 assert(VVal &&
"Should have a unique destination value");
5087 return requestResimplify();
5093 if (
SI->findCaseValue(Cst) !=
SI->case_default()) {
5103 return requestResimplify();
5110 if (PHIUse ==
nullptr || PHIUse != &SuccBlock->
front() ||
5127 SmallVector<DominatorTree::UpdateType, 2> Updates;
5134 SwitchInstProfUpdateWrapper SIW(*SI);
5135 auto W0 = SIW.getSuccessorWeight(0);
5138 NewW = ((uint64_t(*W0) + 1) >> 1);
5139 SIW.setSuccessorWeight(0, *NewW);
5141 SIW.addCase(Cst, NewBB, NewW);
5143 Updates.
push_back({DominatorTree::Insert, Pred, NewBB});
5152 Updates.
push_back({DominatorTree::Insert, NewBB, SuccBlock});
5161bool SimplifyCFGOpt::simplifyBranchOnICmpChain(BranchInst *BI,
5163 const DataLayout &
DL) {
5173 ConstantComparesGatherer ConstantCompare(
Cond,
DL);
5175 SmallVectorImpl<ConstantInt *> &Values = ConstantCompare.Vals;
5176 Value *CompVal = ConstantCompare.CompValue;
5177 unsigned UsedICmps = ConstantCompare.UsedICmps;
5178 Value *ExtraCase = ConstantCompare.Extra;
5179 bool TrueWhenEqual = ConstantCompare.IsEq;
5196 if (ExtraCase && Values.
size() < 2)
5211 <<
" cases into SWITCH. BB is:\n"
5214 SmallVector<DominatorTree::UpdateType, 2> Updates;
5221 nullptr,
"switch.early.test");
5232 AssumptionCache *AC =
Options.AC;
5245 Updates.
push_back({DominatorTree::Insert, BB, EdgeBB});
5251 LLVM_DEBUG(
dbgs() <<
" ** 'icmp' chain unhandled condition: " << *ExtraCase
5252 <<
"\nEXTRABB = " << *BB);
5260 "Should not end up here with unstable pointers");
5262 CompVal,
DL.getIntPtrType(CompVal->
getType()),
"magicptr");
5269 for (ConstantInt *Val : Values)
5270 New->addCase(Val, EdgeBB);
5278 for (
unsigned i = 0, e = Values.size() - 1; i != e; ++i)
5287 LLVM_DEBUG(
dbgs() <<
" ** 'icmp' chain result is:\n" << *BB <<
'\n');
5291bool SimplifyCFGOpt::simplifyResume(ResumeInst *RI,
IRBuilder<> &Builder) {
5293 return simplifyCommonResume(RI);
5297 return simplifySingleResume(RI);
5310 switch (IntrinsicID) {
5311 case Intrinsic::dbg_declare:
5312 case Intrinsic::dbg_value:
5313 case Intrinsic::dbg_label:
5314 case Intrinsic::lifetime_end:
5324bool SimplifyCFGOpt::simplifyCommonResume(ResumeInst *RI) {
5333 SmallSetVector<BasicBlock *, 4> TrivialUnwindBlocks;
5337 for (
unsigned Idx = 0, End = PhiLPInst->getNumIncomingValues(); Idx != End;
5339 auto *IncomingBB = PhiLPInst->getIncomingBlock(Idx);
5340 auto *IncomingValue = PhiLPInst->getIncomingValue(Idx);
5344 if (IncomingBB->getUniqueSuccessor() != BB)
5349 if (IncomingValue != LandingPad)
5353 make_range(LandingPad->getNextNode(), IncomingBB->getTerminator())))
5354 TrivialUnwindBlocks.
insert(IncomingBB);
5358 if (TrivialUnwindBlocks.
empty())
5362 for (
auto *TrivialBB : TrivialUnwindBlocks) {
5366 while (PhiLPInst->getBasicBlockIndex(TrivialBB) != -1)
5369 for (BasicBlock *Pred :
5380 TrivialBB->getTerminator()->eraseFromParent();
5381 new UnreachableInst(RI->
getContext(), TrivialBB);
5383 DTU->
applyUpdates({{DominatorTree::Delete, TrivialBB, BB}});
5390 return !TrivialUnwindBlocks.empty();
5394bool SimplifyCFGOpt::simplifySingleResume(ResumeInst *RI) {
5398 "Resume must unwind the exception that caused control to here");
5454 int Idx = DestPN.getBasicBlockIndex(BB);
5468 Value *SrcVal = DestPN.getIncomingValue(Idx);
5471 bool NeedPHITranslation = SrcPN && SrcPN->
getParent() == BB;
5475 DestPN.addIncoming(
Incoming, Pred);
5502 std::vector<DominatorTree::UpdateType> Updates;
5506 if (UnwindDest ==
nullptr) {
5547 if (!SuccessorCleanupPad)
5556 SuccessorCleanupPad->eraseFromParent();
5565bool SimplifyCFGOpt::simplifyCleanupReturn(CleanupReturnInst *RI) {
5582bool SimplifyCFGOpt::simplifyUnreachable(UnreachableInst *UI) {
5614 BBI->dropDbgRecords();
5618 BBI->eraseFromParent();
5624 if (&BB->
front() != UI)
5627 std::vector<DominatorTree::UpdateType> Updates;
5630 for (BasicBlock *Predecessor : Preds) {
5637 [BB](
auto *
Successor) { return Successor == BB; })) {
5645 "The destinations are guaranteed to be different here.");
5646 CallInst *Assumption;
5662 Updates.push_back({DominatorTree::Delete, Predecessor, BB});
5664 SwitchInstProfUpdateWrapper SU(*SI);
5665 for (
auto i = SU->case_begin(), e = SU->case_end(); i != e;) {
5666 if (i->getCaseSuccessor() != BB) {
5671 i = SU.removeCase(i);
5676 if (DTU &&
SI->getDefaultDest() != BB)
5677 Updates.push_back({DominatorTree::Delete, Predecessor, BB});
5679 if (
II->getUnwindDest() == BB) {
5685 if (!CI->doesNotThrow())
5686 CI->setDoesNotThrow();
5690 if (CSI->getUnwindDest() == BB) {
5701 E = CSI->handler_end();
5704 CSI->removeHandler(
I);
5711 Updates.push_back({DominatorTree::Delete, Predecessor, BB});
5712 if (CSI->getNumHandlers() == 0) {
5713 if (CSI->hasUnwindDest()) {
5717 for (
auto *PredecessorOfPredecessor :
predecessors(Predecessor)) {
5718 Updates.push_back({DominatorTree::Insert,
5719 PredecessorOfPredecessor,
5720 CSI->getUnwindDest()});
5721 Updates.push_back({DominatorTree::Delete,
5722 PredecessorOfPredecessor, Predecessor});
5725 Predecessor->replaceAllUsesWith(CSI->getUnwindDest());
5732 SmallVector<BasicBlock *, 8> EHPreds(
predecessors(Predecessor));
5733 for (BasicBlock *EHPred : EHPreds)
5737 new UnreachableInst(CSI->getContext(), CSI->getIterator());
5738 CSI->eraseFromParent();
5743 assert(CRI->hasUnwindDest() && CRI->getUnwindDest() == BB &&
5744 "Expected to always have an unwind to BB.");
5746 Updates.push_back({DominatorTree::Delete, Predecessor, BB});
5769 for (
size_t I = 1,
E = Cases.
size();
I !=
E; ++
I) {
5770 if (Cases[
I - 1]->getValue() != Cases[
I]->getValue() + 1)
5778 bool RemoveOrigDefaultBlock =
true) {
5780 auto *BB = Switch->getParent();
5781 auto *OrigDefaultBlock = Switch->getDefaultDest();
5782 if (RemoveOrigDefaultBlock)
5783 OrigDefaultBlock->removePredecessor(BB);
5787 auto *UI =
new UnreachableInst(Switch->getContext(), NewDefaultBlock);
5789 Switch->setDefaultDest(&*NewDefaultBlock);
5793 if (RemoveOrigDefaultBlock &&
5803bool SimplifyCFGOpt::turnSwitchRangeIntoICmp(SwitchInst *SI,
5805 assert(
SI->getNumCases() > 1 &&
"Degenerate switch?");
5807 bool HasDefault = !
SI->defaultDestUnreachable();
5809 auto *BB =
SI->getParent();
5812 BasicBlock *DestA = HasDefault ?
SI->getDefaultDest() :
nullptr;
5817 for (
auto Case :
SI->cases()) {
5821 if (Dest == DestA) {
5827 if (Dest == DestB) {
5837 "Single-destination switch should have been folded.");
5839 assert(DestB !=
SI->getDefaultDest());
5840 assert(!CasesB.
empty() &&
"There must be non-default cases.");
5844 SmallVectorImpl<ConstantInt *> *ContiguousCases =
nullptr;
5848 ContiguousCases = &CasesA;
5849 ContiguousDest = DestA;
5852 ContiguousCases = &CasesB;
5853 ContiguousDest = DestB;
5862 ConstantInt::get(
Offset->getType(), ContiguousCases->
size());
5865 if (!
Offset->isNullValue())
5874 BranchInst *NewBI = Builder.
CreateCondBr(Cmp, ContiguousDest, OtherDest);
5878 SmallVector<uint64_t, 8> Weights;
5880 if (Weights.
size() == 1 +
SI->getNumCases()) {
5881 uint64_t TrueWeight = 0;
5882 uint64_t FalseWeight = 0;
5883 for (
size_t I = 0,
E = Weights.
size();
I !=
E; ++
I) {
5884 if (
SI->getSuccessor(
I) == ContiguousDest)
5885 TrueWeight += Weights[
I];
5887 FalseWeight += Weights[
I];
5889 while (TrueWeight > UINT32_MAX || FalseWeight > UINT32_MAX) {
5899 unsigned PreviousEdges = ContiguousCases->
size();
5900 if (ContiguousDest ==
SI->getDefaultDest())
5902 for (
unsigned I = 0,
E = PreviousEdges - 1;
I !=
E; ++
I)
5906 unsigned PreviousEdges =
SI->getNumCases() - ContiguousCases->
size();
5907 if (OtherDest ==
SI->getDefaultDest())
5909 for (
unsigned I = 0,
E = PreviousEdges - 1;
I !=
E; ++
I)
5918 auto *UnreachableDefault =
SI->getDefaultDest();
5921 SI->eraseFromParent();
5923 if (!HasDefault && DTU)
5924 DTU->
applyUpdates({{DominatorTree::Delete, BB, UnreachableDefault}});
5940 unsigned MaxSignificantBitsInCond =
5947 for (
const auto &Case :
SI->cases()) {
5948 auto *
Successor = Case.getCaseSuccessor();
5955 const APInt &CaseVal = Case.getCaseValue()->getValue();
5958 DeadCases.
push_back(Case.getCaseValue());
5970 bool HasDefault = !
SI->defaultDestUnreachable();
5971 const unsigned NumUnknownBits =
5974 if (HasDefault && DeadCases.
empty() &&
5975 NumUnknownBits < 64 ) {
5976 uint64_t AllNumCases = 1ULL << NumUnknownBits;
5977 if (
SI->getNumCases() == AllNumCases) {
5984 if (
SI->getNumCases() == AllNumCases - 1) {
5985 assert(NumUnknownBits > 1 &&
"Should be canonicalized to a branch");
5992 for (
const auto &Case :
SI->cases())
5993 MissingCaseVal ^= Case.getCaseValue()->getValue().getLimitedValue();
6004 if (DeadCases.
empty())
6010 assert(CaseI !=
SI->case_default() &&
6011 "Case was not found. Probably mistake in DeadCases forming.");
6013 CaseI->getCaseSuccessor()->removePredecessor(
SI->getParent());
6018 std::vector<DominatorTree::UpdateType> Updates;
6019 for (
auto *
Successor : UniqueSuccessors)
6020 if (NumPerSuccessorCases[
Successor] == 0)
6041 if (!Branch || !Branch->isUnconditional())
6047 int Idx =
PHI.getBasicBlockIndex(BB);
6048 assert(Idx >= 0 &&
"PHI has no entry for predecessor?");
6050 Value *InValue =
PHI.getIncomingValue(Idx);
6051 if (InValue != CaseValue)
6067 ForwardingNodesMap ForwardingNodes;
6070 for (
const auto &Case :
SI->cases()) {
6072 BasicBlock *CaseDest = Case.getCaseSuccessor();
6091 int SwitchBBIdx = Phi.getBasicBlockIndex(SwitchBlock);
6092 if (Phi.getIncomingValue(SwitchBBIdx) == CaseValue &&
6093 count(Phi.blocks(), SwitchBlock) == 1) {
6094 Phi.setIncomingValue(SwitchBBIdx,
SI->getCondition());
6102 ForwardingNodes[Phi].push_back(PhiIdx);
6105 for (
auto &ForwardingNode : ForwardingNodes) {
6106 PHINode *Phi = ForwardingNode.first;
6112 for (
int Index : Indexes)
6113 Phi->setIncomingValue(Index,
SI->getCondition());
6123 if (
C->isThreadDependent())
6125 if (
C->isDLLImportDependent())
6141 if (!
TTI.shouldBuildLookupTablesForConstant(
C))
6168 if (
A->isAllOnesValue())
6170 if (
A->isNullValue())
6176 for (
unsigned N = 0,
E =
I->getNumOperands();
N !=
E; ++
N) {
6201 ConstantPool.insert(std::make_pair(
SI->getCondition(), CaseVal));
6203 if (
I.isTerminator()) {
6205 if (
I.getNumSuccessors() != 1 ||
I.isSpecialTerminator())
6208 CaseDest =
I.getSuccessor(0);
6215 for (
auto &
Use :
I.uses()) {
6218 if (
I->getParent() == CaseDest)
6221 if (Phi->getIncomingBlock(
Use) == CaseDest)
6234 *CommonDest = CaseDest;
6236 if (CaseDest != *CommonDest)
6241 int Idx =
PHI.getBasicBlockIndex(Pred);
6254 Res.push_back(std::make_pair(&
PHI, ConstVal));
6257 return Res.
size() > 0;
6263 SwitchCaseResultVectorTy &UniqueResults,
6265 for (
auto &
I : UniqueResults) {
6266 if (
I.first == Result) {
6267 I.second.push_back(CaseVal);
6268 return I.second.size();
6271 UniqueResults.push_back(
6282 SwitchCaseResultVectorTy &UniqueResults,
6286 uintptr_t MaxUniqueResults) {
6287 for (
const auto &
I :
SI->cases()) {
6301 const size_t NumCasesForResult =
6309 if (UniqueResults.size() > MaxUniqueResults)
6325 DefaultResults.
size() == 1 ? DefaultResults.
begin()->second :
nullptr;
6327 return DefaultResult ||
SI->defaultDestUnreachable();
6348 const bool HasBranchWeights =
6351 if (ResultVector.size() == 2 && ResultVector[0].second.size() == 1 &&
6352 ResultVector[1].second.size() == 1) {
6353 ConstantInt *FirstCase = ResultVector[0].second[0];
6354 ConstantInt *SecondCase = ResultVector[1].second[0];
6355 Value *SelectValue = ResultVector[1].first;
6356 if (DefaultResult) {
6357 Value *ValueCompare =
6358 Builder.CreateICmpEQ(Condition, SecondCase,
"switch.selectcmp");
6360 ValueCompare, ResultVector[1].first, DefaultResult,
"switch.select"));
6361 SelectValue = SelectValueInst;
6362 if (HasBranchWeights) {
6369 BranchWeights[0] + BranchWeights[1],
6373 Value *ValueCompare =
6374 Builder.CreateICmpEQ(Condition, FirstCase,
"switch.selectcmp");
6376 ValueCompare, ResultVector[0].first, SelectValue,
"switch.select"));
6377 if (HasBranchWeights) {
6382 size_t FirstCasePos = (Condition !=
nullptr);
6383 size_t SecondCasePos = FirstCasePos + 1;
6384 uint32_t DefaultCase = (Condition !=
nullptr) ? BranchWeights[0] : 0;
6386 DefaultCase + BranchWeights[SecondCasePos],
6393 if (ResultVector.size() == 1 && DefaultResult) {
6395 unsigned CaseCount = CaseValues.
size();
6408 for (
auto *Case : CaseValues) {
6409 if (Case->getValue().slt(MinCaseVal->
getValue()))
6411 AndMask &= Case->getValue();
6421 if (FreeBits ==
Log2_32(CaseCount)) {
6422 Value *
And = Builder.CreateAnd(Condition, AndMask);
6423 Value *Cmp = Builder.CreateICmpEQ(
6426 Builder.CreateSelect(Cmp, ResultVector[0].first, DefaultResult));
6427 if (HasBranchWeights) {
6432 BranchWeights[0],
false);
6440 for (
auto *Case : CaseValues)
6441 BitMask |= (Case->getValue() - MinCaseVal->
getValue());
6447 Condition = Builder.CreateSub(Condition, MinCaseVal);
6448 Value *
And = Builder.CreateAnd(Condition, ~BitMask,
"switch.and");
6449 Value *Cmp = Builder.CreateICmpEQ(
6452 Builder.CreateSelect(Cmp, ResultVector[0].first, DefaultResult));
6453 if (HasBranchWeights) {
6456 BranchWeights[0],
false);
6463 if (CaseValues.
size() == 2) {
6464 Value *Cmp1 = Builder.CreateICmpEQ(Condition, CaseValues[0],
6465 "switch.selectcmp.case1");
6466 Value *Cmp2 = Builder.CreateICmpEQ(Condition, CaseValues[1],
6467 "switch.selectcmp.case2");
6468 Value *Cmp = Builder.CreateOr(Cmp1, Cmp2,
"switch.selectcmp");
6470 Builder.CreateSelect(Cmp, ResultVector[0].first, DefaultResult));
6471 if (HasBranchWeights) {
6474 BranchWeights[0],
false);
6489 std::vector<DominatorTree::UpdateType> Updates;
6496 Builder.CreateBr(DestBB);
6500 PHI->removeIncomingValueIf(
6501 [&](
unsigned Idx) {
return PHI->getIncomingBlock(Idx) == SelectBB; });
6502 PHI->addIncoming(SelectValue, SelectBB);
6505 for (
unsigned i = 0, e =
SI->getNumSuccessors(); i < e; ++i) {
6511 if (DTU && RemovedSuccessors.
insert(Succ).second)
6514 SI->eraseFromParent();
6529 SwitchCaseResultVectorTy UniqueResults;
6535 assert(
PHI !=
nullptr &&
"PHI for value select not found");
6536 Builder.SetInsertPoint(
SI);
6539 [[maybe_unused]]
auto HasWeights =
6544 (BranchWeights.
size() >=
6545 UniqueResults.size() + (DefaultResult !=
nullptr)));
6548 Builder,
DL, BranchWeights);
6560class SwitchReplacement {
6567 const SmallVectorImpl<std::pair<ConstantInt *, Constant *>> &Values,
6568 Constant *DefaultValue,
const DataLayout &
DL,
const StringRef &FuncName);
6577 static bool wouldFitInRegister(
const DataLayout &
DL, uint64_t TableSize,
6584 bool isLookupTable();
6618 ConstantInt *BitMap =
nullptr;
6619 IntegerType *BitMapElementTy =
nullptr;
6622 ConstantInt *LinearOffset =
nullptr;
6623 ConstantInt *LinearMultiplier =
nullptr;
6624 bool LinearMapValWrapped =
false;
6632SwitchReplacement::SwitchReplacement(
6634 const SmallVectorImpl<std::pair<ConstantInt *, Constant *>> &Values,
6635 Constant *DefaultValue,
const DataLayout &
DL,
const StringRef &FuncName)
6636 : DefaultValue(DefaultValue) {
6637 assert(Values.size() &&
"Can't build lookup table without values!");
6638 assert(TableSize >= Values.size() &&
"Can't fit values in table!");
6641 SingleValue = Values.begin()->second;
6643 ValueType = Values.begin()->second->getType();
6647 for (
const auto &[CaseVal, CaseRes] : Values) {
6650 uint64_t Idx = (CaseVal->getValue() -
Offset->getValue()).getLimitedValue();
6651 TableContents[Idx] = CaseRes;
6658 if (Values.size() < TableSize) {
6660 "Need a default value to fill the lookup table holes.");
6663 if (!TableContents[
I])
6664 TableContents[
I] = DefaultValue;
6670 if (DefaultValue != SingleValue && !DefaultValueIsPoison)
6671 SingleValue =
nullptr;
6677 Kind = SingleValueKind;
6684 bool LinearMappingPossible =
true;
6689 bool NonMonotonic =
false;
6690 assert(TableSize >= 2 &&
"Should be a SingleValue table.");
6707 LinearMappingPossible =
false;
6712 APInt Dist = Val - PrevVal;
6715 }
else if (Dist != DistToPrev) {
6716 LinearMappingPossible =
false;
6724 if (LinearMappingPossible) {
6726 LinearMultiplier = ConstantInt::get(M.getContext(), DistToPrev);
6727 APInt M = LinearMultiplier->getValue();
6728 bool MayWrap =
true;
6729 if (
isIntN(M.getBitWidth(), TableSize - 1))
6730 (void)M.
smul_ov(
APInt(M.getBitWidth(), TableSize - 1), MayWrap);
6731 LinearMapValWrapped = NonMonotonic || MayWrap;
6732 Kind = LinearMapKind;
6738 if (wouldFitInRegister(
DL, TableSize,
ValueType)) {
6740 APInt TableInt(TableSize *
IT->getBitWidth(), 0);
6742 TableInt <<=
IT->getBitWidth();
6746 TableInt |= Val->
getValue().
zext(TableInt.getBitWidth());
6749 BitMap = ConstantInt::get(M.getContext(), TableInt);
6750 BitMapElementTy =
IT;
6759 Kind = LookupTableKind;
6765 case SingleValueKind:
6767 case LinearMapKind: {
6771 false,
"switch.idx.cast");
6772 if (!LinearMultiplier->
isOne())
6773 Result = Builder.
CreateMul(Result, LinearMultiplier,
"switch.idx.mult",
6775 !LinearMapValWrapped);
6777 if (!LinearOffset->
isZero())
6780 !LinearMapValWrapped);
6797 ShiftAmt, ConstantInt::get(MapTy, BitMapElementTy->
getBitWidth()),
6798 "switch.shiftamt",
true,
true);
6801 Value *DownShifted =
6802 Builder.
CreateLShr(BitMap, ShiftAmt,
"switch.downshift");
6804 return Builder.
CreateTrunc(DownShifted, BitMapElementTy,
"switch.masked");
6806 case LookupTableKind: {
6809 new GlobalVariable(*
Func->getParent(), Initializer->
getType(),
6810 true, GlobalVariable::PrivateLinkage,
6811 Initializer,
"switch.table." +
Func->getName());
6812 Table->setUnnamedAddr(GlobalValue::UnnamedAddr::Global);
6815 Table->setAlignment(
DL.getPrefTypeAlign(
ValueType));
6816 Type *IndexTy =
DL.getIndexType(Table->getType());
6819 if (
Index->getType() != IndexTy) {
6820 unsigned OldBitWidth =
Index->getType()->getIntegerBitWidth();
6824 isUIntN(OldBitWidth - 1, ArrayTy->getNumElements() - 1));
6827 Value *GEPIndices[] = {ConstantInt::get(IndexTy, 0),
Index};
6830 return Builder.
CreateLoad(ArrayTy->getElementType(),
GEP,
"switch.load");
6836bool SwitchReplacement::wouldFitInRegister(
const DataLayout &
DL,
6838 Type *ElementType) {
6846 if (TableSize >= UINT_MAX /
IT->getBitWidth())
6848 return DL.fitsInLegalInteger(TableSize *
IT->getBitWidth());
6854 if (
TTI.isTypeLegal(Ty))
6869 DL.fitsInLegalInteger(
IT->getBitWidth());
6872Constant *SwitchReplacement::getDefaultValue() {
return DefaultValue; }
6874bool SwitchReplacement::isLookupTable() {
return Kind == LookupTableKind; }
6885 return NumCases * 100 >= CaseRange * MinDensity;
6906 if (
SI->getNumCases() > TableSize)
6909 bool AllTablesFitInRegister =
true;
6910 bool HasIllegalType =
false;
6911 for (
const auto &Ty : ResultTypes) {
6916 AllTablesFitInRegister =
6917 AllTablesFitInRegister &&
6918 SwitchReplacement::wouldFitInRegister(
DL, TableSize, Ty);
6923 if (HasIllegalType && !AllTablesFitInRegister)
6928 if (AllTablesFitInRegister)
6945 MaxCaseVal.
getLimitedValue() == std::numeric_limits<uint64_t>::max() ||
6948 return all_of(ResultTypes, [&](
const auto &ResultType) {
6949 return SwitchReplacement::wouldFitInRegister(
6977 const SmallVectorImpl<std::pair<ConstantInt *, Constant *>> &Values) {
6999 if (DefaultConst != TrueConst && DefaultConst != FalseConst)
7004 for (
auto ValuePair : Values) {
7007 if (!CaseConst || CaseConst == DefaultConst ||
7008 (CaseConst != TrueConst && CaseConst != FalseConst))
7022 if (DefaultConst == FalseConst) {
7025 ++NumTableCmpReuses;
7028 Value *InvertedTableCmp = BinaryOperator::CreateXor(
7029 RangeCmp, ConstantInt::get(RangeCmp->
getType(), 1),
"inverted.cmp",
7032 ++NumTableCmpReuses;
7042 assert(
SI->getNumCases() > 1 &&
"Degenerate switch?");
7056 if (
SI->getNumCases() < 3)
7078 MinCaseVal = CaseVal;
7080 MaxCaseVal = CaseVal;
7097 It->second.push_back(std::make_pair(CaseVal,
Value));
7105 bool HasDefaultResults =
7107 DefaultResultsList,
DL,
TTI);
7108 for (
const auto &
I : DefaultResultsList) {
7111 DefaultResults[
PHI] = Result;
7115 *MinCaseVal, *MaxCaseVal, HasDefaultResults, ResultTypes,
DL,
TTI);
7118 if (UseSwitchConditionAsTableIndex) {
7120 TableIndexOffset = ConstantInt::get(MaxCaseVal->
getIntegerType(), 0);
7125 TableIndexOffset = MinCaseVal;
7132 bool DefaultIsReachable = !
SI->defaultDestUnreachable();
7134 bool TableHasHoles = (NumResults < TableSize);
7139 bool AllHolesArePoison = TableHasHoles && !HasDefaultResults;
7147 bool NeedMask = AllHolesArePoison && DefaultIsReachable;
7150 if (
SI->getNumCases() < 4)
7152 if (!
DL.fitsInLegalInteger(TableSize))
7161 if (UseSwitchConditionAsTableIndex) {
7162 TableIndex =
SI->getCondition();
7163 if (HasDefaultResults) {
7175 all_of(ResultTypes, [&](
const auto &ResultType) {
7176 return SwitchReplacement::wouldFitInRegister(
DL, UpperBound,
7181 TableSize = std::max(UpperBound, TableSize);
7184 DefaultIsReachable =
false;
7192 const auto &ResultList = ResultLists[
PHI];
7194 Type *ResultType = ResultList.begin()->second->getType();
7199 SwitchReplacement Replacement(*Fn->
getParent(), TableSize, TableIndexOffset,
7201 PhiToReplacementMap.
insert({
PHI, Replacement});
7204 bool AnyLookupTables =
any_of(
7205 PhiToReplacementMap, [](
auto &KV) {
return KV.second.isLookupTable(); });
7213 if (AnyLookupTables &&
7214 (!
TTI.shouldBuildLookupTables() ||
7218 Builder.SetInsertPoint(
SI);
7221 if (!UseSwitchConditionAsTableIndex) {
7224 bool MayWrap =
true;
7225 if (!DefaultIsReachable) {
7230 TableIndex = Builder.CreateSub(
SI->getCondition(), TableIndexOffset,
7231 "switch.tableidx",
false,
7235 std::vector<DominatorTree::UpdateType> Updates;
7241 assert(MaxTableSize >= TableSize &&
7242 "It is impossible for a switch to have more entries than the max "
7243 "representable value of its input integer type's size.");
7248 Mod.getContext(),
"switch.lookup", CommonDest->
getParent(), CommonDest);
7252 Builder.SetInsertPoint(
SI);
7253 const bool GeneratingCoveredLookupTable = (MaxTableSize == TableSize);
7254 if (!DefaultIsReachable || GeneratingCoveredLookupTable) {
7255 Builder.CreateBr(LookupBB);
7261 Value *Cmp = Builder.CreateICmpULT(
7262 TableIndex, ConstantInt::get(MinCaseVal->
getType(), TableSize));
7264 Builder.CreateCondBr(Cmp, LookupBB,
SI->getDefaultDest());
7270 Builder.SetInsertPoint(LookupBB);
7276 MaskBB->
setName(
"switch.hole_check");
7283 APInt MaskInt(TableSizePowOf2, 0);
7284 APInt One(TableSizePowOf2, 1);
7286 const ResultListTy &ResultList = ResultLists[PHIs[0]];
7287 for (
const auto &Result : ResultList) {
7290 MaskInt |= One << Idx;
7292 ConstantInt *TableMask = ConstantInt::get(
Mod.getContext(), MaskInt);
7299 Builder.CreateZExtOrTrunc(TableIndex, MapTy,
"switch.maskindex");
7300 Value *Shifted = Builder.CreateLShr(TableMask, MaskIndex,
"switch.shifted");
7301 Value *LoBit = Builder.CreateTrunc(
7303 Builder.CreateCondBr(LoBit, LookupBB,
SI->getDefaultDest());
7308 Builder.SetInsertPoint(LookupBB);
7312 if (!DefaultIsReachable || GeneratingCoveredLookupTable) {
7315 SI->getDefaultDest()->removePredecessor(BB,
7322 const ResultListTy &ResultList = ResultLists[
PHI];
7323 auto Replacement = PhiToReplacementMap.
at(
PHI);
7324 auto *Result = Replacement.replaceSwitch(TableIndex, Builder,
DL, Fn);
7327 if (!TableHasHoles && HasDefaultResults && RangeCheckBranch) {
7330 for (
auto *
User :
PHI->users()) {
7332 Replacement.getDefaultValue(), ResultList);
7336 PHI->addIncoming(Result, LookupBB);
7339 Builder.CreateBr(CommonDest);
7345 for (
unsigned i = 0, e =
SI->getNumSuccessors(); i < e; ++i) {
7348 if (Succ ==
SI->getDefaultDest())
7351 if (DTU && RemovedSuccessors.
insert(Succ).second)
7354 SI->eraseFromParent();
7360 ++NumLookupTablesHoles;
7376 if (CondTy->getIntegerBitWidth() > 64 ||
7377 !
DL.fitsInLegalInteger(CondTy->getIntegerBitWidth()))
7381 if (
SI->getNumCases() < 4)
7389 for (
const auto &
C :
SI->cases())
7390 Values.
push_back(
C.getCaseValue()->getValue().getSExtValue());
7398 int64_t
Base = Values[0];
7399 for (
auto &V : Values)
7412 unsigned Shift = 64;
7413 for (
auto &V : Values)
7417 for (
auto &V : Values)
7418 V = (int64_t)((
uint64_t)V >> Shift);
7435 Builder.SetInsertPoint(
SI);
7437 Builder.CreateSub(
SI->getCondition(), ConstantInt::get(Ty,
Base));
7438 Value *Rot = Builder.CreateIntrinsic(
7439 Ty, Intrinsic::fshl,
7440 {
Sub,
Sub, ConstantInt::get(Ty, Ty->getBitWidth() - Shift)});
7441 SI->replaceUsesOfWith(
SI->getCondition(), Rot);
7443 for (
auto Case :
SI->cases()) {
7444 auto *Orig = Case.getCaseValue();
7445 auto Sub = Orig->getValue() -
APInt(Ty->getBitWidth(),
Base,
true);
7464 Value *Condition =
SI->getCondition();
7468 if (CondTy->getIntegerBitWidth() > 64 ||
7469 !
DL.fitsInLegalInteger(CondTy->getIntegerBitWidth()))
7481 if (
SI->getNumCases() < 4)
7487 if (!
SI->defaultDestUnreachable())
7492 for (
const auto &Case :
SI->cases()) {
7493 uint64_t CaseValue = Case.getCaseValue()->getValue().getZExtValue();
7507 Builder.SetInsertPoint(
SI);
7510 for (
auto &Case :
SI->cases()) {
7511 auto *OrigValue = Case.getCaseValue();
7512 Case.setValue(ConstantInt::get(OrigValue->getIntegerType(),
7513 OrigValue->getValue().countr_zero()));
7517 auto *ConditionTrailingZeros = Builder.CreateIntrinsic(
7520 SI->setCondition(ConditionTrailingZeros);
7530 if (!Cmp || !Cmp->hasOneUse())
7541 uint32_t SuccWeight = 0, OtherSuccWeight = 0;
7544 if (
SI->getNumCases() == 2) {
7551 Succ =
SI->getDefaultDest();
7552 SuccWeight = Weights[0];
7554 for (
auto &Case :
SI->cases()) {
7555 std::optional<int64_t> Val =
7559 if (!Missing.erase(*Val))
7564 OtherSuccWeight += Weights[Case.getSuccessorIndex()];
7567 assert(Missing.size() == 1 &&
"Should have one case left");
7568 Res = *Missing.begin();
7569 }
else if (
SI->getNumCases() == 3 &&
SI->defaultDestUnreachable()) {
7571 Unreachable =
SI->getDefaultDest();
7573 for (
auto &Case :
SI->cases()) {
7574 BasicBlock *NewSucc = Case.getCaseSuccessor();
7575 uint32_t Weight = Weights[Case.getSuccessorIndex()];
7578 OtherSuccWeight += Weight;
7581 SuccWeight = Weight;
7582 }
else if (Succ == NewSucc) {
7588 for (
auto &Case :
SI->cases()) {
7589 std::optional<int64_t> Val =
7591 if (!Val || (Val != 1 && Val != 0 && Val != -1))
7593 if (Case.getCaseSuccessor() == Succ) {
7615 if (Cmp->isSigned())
7618 MDNode *NewWeights =
nullptr;
7624 Builder.SetInsertPoint(
SI->getIterator());
7625 Value *ICmp = Builder.CreateICmp(Pred, Cmp->getLHS(), Cmp->getRHS());
7626 Builder.CreateCondBr(ICmp, Succ,
OtherSucc, NewWeights,
7627 SI->getMetadata(LLVMContext::MD_unpredictable));
7631 SI->eraseFromParent();
7632 Cmp->eraseFromParent();
7633 if (DTU && Unreachable)
7665 "Only supporting unconditional branches for now");
7667 "Expected unconditional branches to have one successor");
7668 assert(Succ->
size() == 1 &&
"Expected just a single branch in the BB");
7689 if (LHS == EKey || RHS == EKey || LHS == TKey || RHS == TKey)
7705 "Only supporting unconditional branches for now");
7712 auto &PredIVs = (*LHS->PhiPredIVs)[&Phi];
7713 if (PredIVs[
A] != PredIVs[
B])
7722bool SimplifyCFGOpt::simplifyDuplicateSwitchArms(SwitchInst *SI,
7723 DomTreeUpdater *DTU) {
7729 SmallPtrSet<PHINode *, 8> Phis;
7730 SmallPtrSet<BasicBlock *, 8> Seen;
7731 DenseMap<PHINode *, SmallDenseMap<BasicBlock *, Value *, 8>> PhiPredIVs;
7732 DenseMap<BasicBlock *, SmallVector<unsigned, 32>> BBToSuccessorIndexes;
7736 for (
unsigned I = 0;
I <
SI->getNumSuccessors(); ++
I) {
7741 if (BB->
size() != 1)
7751 if (!Seen.
insert(BB).second) {
7752 auto It = BBToSuccessorIndexes.
find(BB);
7753 if (It != BBToSuccessorIndexes.
end())
7754 It->second.emplace_back(
I);
7768 Cases.
emplace_back(SwitchSuccWrapper{BB, &PhiPredIVs});
7769 BBToSuccessorIndexes[BB].emplace_back(
I);
7775 for (PHINode *Phi : Phis) {
7777 PhiPredIVs.
try_emplace(Phi,
Phi->getNumIncomingValues()).first->second;
7778 for (
auto &
IV :
Phi->incoming_values())
7779 IVs.insert({
Phi->getIncomingBlock(
IV),
IV.get()});
7790 DenseSet<const SwitchSuccWrapper *> ReplaceWith;
7795 bool MadeChange =
false;
7796 for (
auto &SSW : Cases) {
7803 Updates.
push_back({DominatorTree::Delete,
SI->getParent(), SSW.Dest});
7804 const auto &Successors = BBToSuccessorIndexes.
at(SSW.Dest);
7805 for (
unsigned Idx : Successors)
7806 SI->setSuccessor(Idx, (*It)->Dest);
7817bool SimplifyCFGOpt::simplifySwitch(SwitchInst *SI,
IRBuilder<> &Builder) {
7820 if (isValueEqualityComparison(SI)) {
7824 if (simplifyEqualityComparisonWithOnlyPredecessor(SI, OnlyPred, Builder))
7825 return requestResimplify();
7829 if (simplifySwitchOnSelect(SI,
Select))
7830 return requestResimplify();
7835 if (foldValueComparisonIntoPredecessors(SI, Builder))
7836 return requestResimplify();
7842 if (
Options.ConvertSwitchRangeToICmp && turnSwitchRangeIntoICmp(SI, Builder))
7843 return requestResimplify();
7847 return requestResimplify();
7850 return requestResimplify();
7853 return requestResimplify();
7856 return requestResimplify();
7863 if (
Options.ConvertSwitchToLookupTable &&
7865 return requestResimplify();
7868 return requestResimplify();
7871 return requestResimplify();
7874 hoistCommonCodeFromSuccessors(SI, !
Options.HoistCommonInsts))
7875 return requestResimplify();
7877 if (simplifyDuplicateSwitchArms(SI, DTU))
7878 return requestResimplify();
7883bool SimplifyCFGOpt::simplifyIndirectBr(IndirectBrInst *IBI) {
7888 SmallPtrSet<Value *, 8> Succs;
7889 SmallSetVector<BasicBlock *, 8> RemovedSuccs;
7894 RemovedSuccs.
insert(Dest);
7904 std::vector<DominatorTree::UpdateType> Updates;
7905 Updates.reserve(RemovedSuccs.
size());
7906 for (
auto *RemovedSucc : RemovedSuccs)
7907 Updates.push_back({DominatorTree::Delete, BB, RemovedSucc});
7926 if (simplifyIndirectBrOnSelect(IBI, SI))
7927 return requestResimplify();
7963 if (BB == OtherPred)
7974 std::vector<DominatorTree::UpdateType> Updates;
7981 assert(
II->getNormalDest() != BB &&
II->getUnwindDest() == BB &&
7982 "unexpected successor");
7983 II->setUnwindDest(OtherPred);
7998 Builder.CreateUnreachable();
8007bool SimplifyCFGOpt::simplifyBranch(BranchInst *Branch,
IRBuilder<> &Builder) {
8008 return Branch->isUnconditional() ? simplifyUncondBranch(Branch, Builder)
8009 : simplifyCondBranch(
Branch, Builder);
8012bool SimplifyCFGOpt::simplifyUncondBranch(BranchInst *BI,
8024 bool NeedCanonicalLoop =
8038 if (
I->isTerminator() &&
8039 tryToSimplifyUncondBranchWithICmpInIt(ICI, Builder))
8055 if (
Options.SpeculateBlocks &&
8058 return requestResimplify();
8066 if (!PPred || (PredPred && PredPred != PPred))
8103 if (!SuccBI || !SuccBI->isConditional())
8107 return Succ1 != Succ && Succ2 != Succ && Succ1 != BB && Succ2 != BB &&
8111 if (!IsSimpleSuccessor(BB1, BB1BI) || !IsSimpleSuccessor(BB2, BB2BI))
8137 bool HasWeight =
false;
8142 BBTWeight = BBFWeight = 1;
8147 BB1TWeight = BB1FWeight = 1;
8152 BB2TWeight = BB2FWeight = 1;
8154 uint64_t Weights[2] = {BBTWeight * BB1FWeight + BBFWeight * BB2TWeight,
8155 BBTWeight * BB1TWeight + BBFWeight * BB2FWeight};
8162bool SimplifyCFGOpt::simplifyCondBranch(BranchInst *BI,
IRBuilder<> &Builder) {
8166 "Tautological conditional branch should have been eliminated already.");
8169 if (!
Options.SimplifyCondBranch ||
8174 if (isValueEqualityComparison(BI)) {
8179 if (simplifyEqualityComparisonWithOnlyPredecessor(BI, OnlyPred, Builder))
8180 return requestResimplify();
8186 if (foldValueComparisonIntoPredecessors(BI, Builder))
8187 return requestResimplify();
8190 if (&*
I == BI && foldValueComparisonIntoPredecessors(BI, Builder))
8191 return requestResimplify();
8196 if (simplifyBranchOnICmpChain(BI, Builder,
DL))
8209 return requestResimplify();
8215 if (
Options.SpeculateBlocks &&
8218 return requestResimplify();
8227 hoistCommonCodeFromSuccessors(BI, !
Options.HoistCommonInsts))
8228 return requestResimplify();
8230 if (BI &&
Options.HoistLoadsStoresWithCondFaulting &&
8232 SmallVector<Instruction *, 2> SpeculatedConditionalLoadsStores;
8233 auto CanSpeculateConditionalLoadsStores = [&]() {
8235 for (Instruction &
I : *Succ) {
8236 if (
I.isTerminator()) {
8237 if (
I.getNumSuccessors() > 1)
8241 SpeculatedConditionalLoadsStores.
size() ==
8245 SpeculatedConditionalLoadsStores.
push_back(&
I);
8248 return !SpeculatedConditionalLoadsStores.
empty();
8251 if (CanSpeculateConditionalLoadsStores()) {
8253 std::nullopt,
nullptr);
8254 return requestResimplify();
8264 return requestResimplify();
8273 return requestResimplify();
8279 if (foldCondBranchOnValueKnownInPredecessor(BI))
8280 return requestResimplify();
8285 if (PBI != BI && PBI->isConditional())
8287 return requestResimplify();
8293 if (PBI != BI && PBI->isConditional())
8295 return requestResimplify();
8299 return requestResimplify();
8306 assert(V->getType() ==
I->getType() &&
"Mismatched types");
8318 auto *Use = cast<Instruction>(U.getUser());
8320 switch (Use->getOpcode()) {
8323 case Instruction::GetElementPtr:
8324 case Instruction::Ret:
8325 case Instruction::BitCast:
8326 case Instruction::Load:
8327 case Instruction::Store:
8328 case Instruction::Call:
8329 case Instruction::CallBr:
8330 case Instruction::Invoke:
8331 case Instruction::UDiv:
8332 case Instruction::URem:
8336 case Instruction::SDiv:
8337 case Instruction::SRem:
8341 if (FindUse ==
I->use_end())
8343 auto &
Use = *FindUse;
8348 if (
User->getParent() !=
I->getParent() ||
User ==
I ||
8349 User->comesBefore(
I))
8363 if (
GEP->getPointerOperand() ==
I) {
8366 if (
GEP->getType()->isVectorTy())
8374 if (!
GEP->hasAllZeroIndices() &&
8375 (!
GEP->isInBounds() ||
8377 GEP->getPointerAddressSpace())))
8378 PtrValueMayBeModified =
true;
8384 bool HasNoUndefAttr =
8385 Ret->getFunction()->hasRetAttribute(Attribute::NoUndef);
8390 if (
C->isNullValue() && HasNoUndefAttr &&
8391 Ret->getFunction()->hasRetAttribute(Attribute::NonNull)) {
8392 return !PtrValueMayBeModified;
8398 if (!LI->isVolatile())
8400 LI->getPointerAddressSpace());
8404 if (!
SI->isVolatile())
8406 SI->getPointerAddressSpace())) &&
8407 SI->getPointerOperand() ==
I;
8412 if (
I == Assume->getArgOperand(0))
8420 if (CB->getCalledOperand() ==
I)
8423 if (CB->isArgOperand(&
Use)) {
8424 unsigned ArgIdx = CB->getArgOperandNo(&
Use);
8427 CB->paramHasNonNullAttr(ArgIdx,
false))
8428 return !PtrValueMayBeModified;
8447 for (
unsigned i = 0, e =
PHI.getNumIncomingValues(); i != e; ++i)
8457 Builder.CreateUnreachable();
8464 Assumption = Builder.CreateAssumption(Builder.CreateNot(
Cond));
8466 Assumption = Builder.CreateAssumption(
Cond);
8481 Builder.SetInsertPoint(Unreachable);
8483 Builder.CreateUnreachable();
8484 for (
const auto &Case :
SI->cases())
8485 if (Case.getCaseSuccessor() == BB) {
8487 Case.setSuccessor(Unreachable);
8489 if (
SI->getDefaultDest() == BB) {
8491 SI->setDefaultDest(Unreachable);
8505bool SimplifyCFGOpt::simplifyOnce(BasicBlock *BB) {
8530 return requestResimplify();
8551 if (
Options.SpeculateBlocks &&
8558 Options.SpeculateUnpredictables))
8565 case Instruction::Br:
8568 case Instruction::Resume:
8571 case Instruction::CleanupRet:
8574 case Instruction::Switch:
8577 case Instruction::Unreachable:
8580 case Instruction::IndirectBr:
8588bool SimplifyCFGOpt::run(BasicBlock *BB) {
8598 }
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 void fitWeights(MutableArrayRef< uint64_t > Weights)
Keep halving the weights until all can fit in uint32_t.
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.
MutableArrayRef - Represent a mutable reference to an array (0 or more elements consecutively in memo...
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.
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
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.
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.
int countl_zero(T Val)
Count number of 0's from the most significant bit to the least stopping at the first 1.
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)
LLVM_ABI void setBranchWeights(Instruction &I, ArrayRef< uint32_t > Weights, bool IsExpected)
Create a new branch_weights metadata node and add or overwrite a prof metadata reference to instructi...
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
auto max_element(R &&Range)
Provide wrappers to std::max_element which take ranges instead of having to pass begin/end explicitly...
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 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.