49#define DEBUG_TYPE "lazy-value-info"
58 "Lazy Value Information Analysis",
false,
true)
92 class LazyValueInfoCache;
93 struct LVIValueHandle final :
public CallbackVH {
94 LazyValueInfoCache *Parent;
96 LVIValueHandle(
Value *
V, LazyValueInfoCache *
P =
nullptr)
97 : CallbackVH(
V), Parent(
P) { }
99 void deleted()
override;
100 void allUsesReplacedWith(
Value *
V)
override {
108using BBLatticeElementMap =
110using PredecessorValueLatticeMap =
115class LazyValueInfoCache {
120 struct BlockCacheEntry {
121 SmallDenseMap<AssertingVH<Value>, ValueLatticeElement, 4> LatticeElements;
122 SmallDenseSet<AssertingVH<Value>, 4> OverDefined;
125 std::optional<NonNullPointerSet> NonNullPointers;
129 std::optional<PredecessorValueLatticeMap> PredecessorLatticeElements;
132 const bool PerPredRanges;
137 DenseSet<LVIValueHandle, DenseMapInfo<Value *>> ValueHandles;
139 unsigned BlockNumberEpoch;
141 const BlockCacheEntry *getBlockEntry(BasicBlock *BB)
const {
144 return BlockCache[BB->
getNumber()].get();
148 BlockCacheEntry *getOrCreateBlockEntry(BasicBlock *BB) {
154 if (BlockCacheEntry *Entry = BlockCache[
Number].
get())
157 BlockCache[
Number] = std::make_unique<BlockCacheEntry>();
159 BlockCache[
Number]->PredecessorLatticeElements =
160 std::make_optional<PredecessorValueLatticeMap>();
162 return BlockCache[
Number].get();
165 void addValueHandle(
Value *Val) {
166 auto HandleIt = ValueHandles.
find_as(Val);
167 if (HandleIt == ValueHandles.
end())
168 ValueHandles.
insert({Val,
this});
172 LazyValueInfoCache(
const Function *
F,
bool PerPredRanges)
173 : PerPredRanges(PerPredRanges),
174 BlockNumberEpoch(
F->getBlockNumberEpoch()) {}
176 void insertResult(
Value *Val, BasicBlock *BB,
177 const ValueLatticeElement &Result) {
178 BlockCacheEntry *
Entry = getOrCreateBlockEntry(BB);
182 if (
Result.isOverdefined())
183 Entry->OverDefined.insert(Val);
190 void insertPredecessorResults(
Value *Val, BasicBlock *BB,
191 BBLatticeElementMap &PredLatticeElements) {
192 BlockCacheEntry *
Entry = getOrCreateBlockEntry(BB);
194 Entry->PredecessorLatticeElements->insert({Val, PredLatticeElements});
199 std::optional<BBLatticeElementMap>
200 getCachedPredecessorInfo(
Value *
V, BasicBlock *BB)
const {
201 const BlockCacheEntry *
Entry = getBlockEntry(BB);
205 auto LatticeIt =
Entry->PredecessorLatticeElements->find_as(
V);
206 if (LatticeIt ==
Entry->PredecessorLatticeElements->end())
209 return LatticeIt->second;
212 std::optional<ValueLatticeElement> getCachedValueInfo(
Value *
V,
213 BasicBlock *BB)
const {
214 const BlockCacheEntry *
Entry = getBlockEntry(BB);
218 if (
Entry->OverDefined.count(
V))
221 auto LatticeIt =
Entry->LatticeElements.find_as(
V);
222 if (LatticeIt ==
Entry->LatticeElements.end())
225 return LatticeIt->second;
229 isNonNullAtEndOfBlock(
Value *
V, BasicBlock *BB,
230 function_ref<NonNullPointerSet(BasicBlock *)> InitFn) {
231 BlockCacheEntry *
Entry = getOrCreateBlockEntry(BB);
232 if (!
Entry->NonNullPointers) {
233 Entry->NonNullPointers = InitFn(BB);
238 return Entry->NonNullPointers->count(
V);
244 ValueHandles.
clear();
248 void eraseValue(
Value *
V);
257 void threadEdgeImpl(BasicBlock *OldSucc, BasicBlock *NewSucc);
261void LazyValueInfoCache::eraseValue(
Value *
V) {
262 for (
auto &Elem : BlockCache) {
266 Elem->LatticeElements.erase(
V);
267 Elem->OverDefined.erase(
V);
268 if (Elem->NonNullPointers)
269 Elem->NonNullPointers->erase(
V);
271 Elem->PredecessorLatticeElements->erase(
V);
274 auto HandleIt = ValueHandles.
find_as(
V);
275 if (HandleIt != ValueHandles.
end())
276 ValueHandles.
erase(HandleIt);
279void LVIValueHandle::deleted() {
282 Parent->eraseValue(*
this);
285void LazyValueInfoCache::eraseBlock(
BasicBlock *BB) {
289 for (
auto &Elem : BlockCache)
291 Elem->PredecessorLatticeElements->clear();
296void LazyValueInfoCache::threadEdgeImpl(
BasicBlock *OldSucc,
308 std::vector<BasicBlock*> worklist;
309 worklist.push_back(OldSucc);
311 const BlockCacheEntry *
Entry = getBlockEntry(OldSucc);
312 if (!Entry ||
Entry->OverDefined.empty())
315 Entry->OverDefined.end());
321 while (!worklist.empty()) {
326 if (ToUpdate == NewSucc)
continue;
329 BlockCacheEntry *WorklistEntry =
330 ToUpdate->
getNumber() < BlockCache.size()
331 ? BlockCache[ToUpdate->
getNumber()].get()
333 if (!WorklistEntry || WorklistEntry->OverDefined.empty())
335 auto &ValueSet = WorklistEntry->OverDefined;
337 bool changed =
false;
338 for (
Value *
V : ValsToClear) {
339 if (!ValueSet.erase(
V))
347 if (!changed)
continue;
358 LazyValueInfoImpl *LVIImpl;
364 LazyValueInfoAnnotatedWriter(LazyValueInfoImpl *L, DominatorTree &DTree)
365 : LVIImpl(
L), DT(DTree) {}
367 void emitBasicBlockStartAnnot(
const BasicBlock *BB,
368 formatted_raw_ostream &OS)
override;
370 void emitInstructionAnnot(
const Instruction *
I,
371 formatted_raw_ostream &OS)
override;
376 const bool PerPredRanges;
379 LazyValueInfoCache TheCache;
391 bool pushBlockValue(
const std::pair<BasicBlock *, Value *> &BV) {
392 if (!BlockValueSet.insert(BV).second)
396 << BV.first->getName() <<
"\n");
397 BlockValueStack.push_back(BV);
408 std::optional<ValueLatticeElement> getBlockValue(
Value *Val,
BasicBlock *BB,
418 std::optional<ValueLatticeElement> solveBlockValueImpl(
Value *Val,
420 std::optional<ValueLatticeElement> solveBlockValueNonLocal(
Value *Val,
422 std::optional<ValueLatticeElement> solveBlockValuePHINode(
PHINode *PN,
424 std::optional<ValueLatticeElement> solveBlockValueSelect(
SelectInst *S,
428 std::optional<ValueLatticeElement> solveBlockValueBinaryOpImpl(
432 std::optional<ValueLatticeElement>
434 std::optional<ValueLatticeElement> solveBlockValueCast(
CastInst *CI,
436 std::optional<ValueLatticeElement>
438 std::optional<ValueLatticeElement> solveBlockValueIntrinsic(
IntrinsicInst *
II,
440 std::optional<ValueLatticeElement>
442 std::optional<ValueLatticeElement>
445 void intersectAssumeOrGuardBlockValueConstantRange(
Value *Val,
455 std::optional<ValueLatticeElement>
460 std::optional<ValueLatticeElement>
461 getValueFromICmpCondition(
Value *Val,
ICmpInst *ICI,
bool isTrueDest,
466 std::optional<ValueLatticeElement>
468 bool UseBlockValue,
unsigned Depth = 0);
470 std::optional<ValueLatticeElement> getEdgeValueLocal(
Value *Val,
503 LazyValueInfoAnnotatedWriter Writer(
this, DTree);
504 F.print(OS, &Writer);
514 TheCache.eraseBlock(BB);
524 TheCache(
F, PerPredRanges), AC(AC), DL(DL), GuardDecl(GuardDecl) {}
528void LazyValueInfoImpl::solve() {
532 unsigned processedCount = 0;
533 while (!BlockValueStack.empty()) {
545 dbgs() <<
"Giving up on stack because we are getting too deep\n");
547 while (!StartingStack.
empty()) {
548 std::pair<BasicBlock *, Value *> &
e = StartingStack.
back();
549 TheCache.insertResult(
e.second,
e.first,
553 BlockValueSet.clear();
554 BlockValueStack.clear();
557 std::pair<BasicBlock *, Value *>
e = BlockValueStack.back();
558 assert(BlockValueSet.count(e) &&
"Stack value should be in BlockValueSet!");
559 unsigned StackSize = BlockValueStack.size();
562 if (solveBlockValue(
e.second,
e.first)) {
564 assert(BlockValueStack.size() == StackSize &&
565 BlockValueStack.back() == e &&
"Nothing should have been pushed!");
567 std::optional<ValueLatticeElement> BBLV =
568 TheCache.getCachedValueInfo(
e.second,
e.first);
569 assert(BBLV &&
"Result should be in cache!");
571 dbgs() <<
"POP " << *
e.second <<
" in " <<
e.first->getName() <<
" = "
575 BlockValueStack.pop_back();
576 BlockValueSet.erase(e);
579 assert(BlockValueStack.size() == StackSize + 1 &&
580 "Exactly one element should have been pushed!");
585std::optional<ValueLatticeElement>
592 if (std::optional<ValueLatticeElement> OptLatticeVal =
593 TheCache.getCachedValueInfo(Val, BB)) {
594 intersectAssumeOrGuardBlockValueConstantRange(Val, *OptLatticeVal, CtxI);
595 return OptLatticeVal;
599 if (!pushBlockValue({ BB, Val }))
610 case Instruction::Call:
611 case Instruction::Invoke:
615 case Instruction::Load:
629 assert(!TheCache.getCachedValueInfo(Val, BB) &&
630 "Value should not be in cache");
634 std::optional<ValueLatticeElement> Res = solveBlockValueImpl(Val, BB);
639 TheCache.insertResult(Val, BB, *Res);
643std::optional<ValueLatticeElement>
647 return solveBlockValueNonLocal(Val, BB);
650 return solveBlockValuePHINode(PN, BB);
653 return solveBlockValueSelect(SI, BB);
670 return solveBlockValueCast(CI, BB);
673 return solveBlockValueBinaryOp(BO, BB);
676 return solveBlockValueInsertElement(IEI, BB);
679 return solveBlockValueExtractValue(EVI, BB);
682 return solveBlockValueIntrinsic(
II, BB);
686 <<
"' - unknown inst def found.\n");
691 bool IsDereferenced =
true) {
705 if (
MI->isVolatile())
return;
709 if (!Len || Len->isZero())
return;
715 for (
auto &U : CB->args()) {
716 if (U->getType()->isPointerTy() &&
717 CB->paramHasNonNullAttr(CB->getArgOperandNo(&U),
724bool LazyValueInfoImpl::isNonNullAtEndOfBlock(
Value *Val,
BasicBlock *BB) {
730 return TheCache.isNonNullAtEndOfBlock(Val, BB, [](BasicBlock *BB) {
731 NonNullPointerSet NonNullPointers;
732 for (Instruction &
I : *BB)
734 return NonNullPointers;
738std::optional<ValueLatticeElement>
739LazyValueInfoImpl::solveBlockValueNonLocal(
Value *Val,
BasicBlock *BB) {
740 ValueLatticeElement
Result;
759 std::optional<BBLatticeElementMap> PredLatticeElements;
761 PredLatticeElements = std::make_optional<BBLatticeElementMap>();
766 std::optional<ValueLatticeElement> EdgeResult = getEdgeValue(Val,
Pred, BB);
771 Result.mergeIn(*EdgeResult);
775 if (
Result.isOverdefined()) {
777 <<
"' - overdefined because of pred '"
778 <<
Pred->getName() <<
"' (non local).\n");
782 PredLatticeElements->insert({
Pred, *EdgeResult});
786 TheCache.insertPredecessorResults(Val, BB, *PredLatticeElements);
793std::optional<ValueLatticeElement>
795 ValueLatticeElement
Result;
800 std::optional<BBLatticeElementMap> PredLatticeElements;
802 PredLatticeElements = std::make_optional<BBLatticeElementMap>();
809 std::optional<ValueLatticeElement> EdgeResult =
810 getEdgeValue(PhiVal, PhiBB, BB, PN);
815 Result.mergeIn(*EdgeResult);
819 if (
Result.isOverdefined()) {
821 <<
"' - overdefined because of pred (local).\n");
827 PredLatticeElements->insert({PhiBB, *EdgeResult});
831 TheCache.insertPredecessorResults(PN, BB, *PredLatticeElements);
834 assert(!
Result.isOverdefined() &&
"Possible PHI in entry block?");
840void LazyValueInfoImpl::intersectAssumeOrGuardBlockValueConstantRange(
847 for (
auto &AssumeVH : AC->assumptionsFor(Val)) {
860 auto OBU =
I->getOperandBundleAt(AssumeVH.Index);
862 case BundleAttr::Range: {
871 I->getOperandBundleAt(AssumeVH.Index)))
876 BBLV = BBLV.
intersect(*getValueFromCondition(Val,
I->getArgOperand(0),
883 if (GuardDecl && !GuardDecl->use_empty() &&
885 for (Instruction &
I :
900 isNonNullAtEndOfBlock(Val, BB))
905std::optional<ValueLatticeElement>
908 std::optional<ValueLatticeElement> OptTrueVal =
909 getBlockValue(
SI->getTrueValue(), BB, SI);
912 ValueLatticeElement &
TrueVal = *OptTrueVal;
914 std::optional<ValueLatticeElement> OptFalseVal =
915 getBlockValue(
SI->getFalseValue(), BB, SI);
918 ValueLatticeElement &
FalseVal = *OptFalseVal;
921 const ConstantRange &TrueCR =
TrueVal.asConstantRange(
SI->getType());
922 const ConstantRange &FalseCR =
FalseVal.asConstantRange(
SI->getType());
929 ((
LHS ==
SI->getTrueValue() &&
RHS ==
SI->getFalseValue()) ||
930 (
RHS ==
SI->getTrueValue() &&
LHS ==
SI->getFalseValue()))) {
931 ConstantRange ResultCR = [&]() {
936 return TrueCR.
smin(FalseCR);
938 return TrueCR.
umin(FalseCR);
940 return TrueCR.
smax(FalseCR);
942 return TrueCR.
umax(FalseCR);
946 ResultCR,
TrueVal.isConstantRangeIncludingUndef() ||
947 FalseVal.isConstantRangeIncludingUndef());
951 if (
LHS ==
SI->getTrueValue())
953 TrueCR.
abs(),
TrueVal.isConstantRangeIncludingUndef());
954 if (
LHS ==
SI->getFalseValue())
956 FalseCR.
abs(),
FalseVal.isConstantRangeIncludingUndef());
961 if (
LHS ==
SI->getTrueValue())
964 if (
LHS ==
SI->getFalseValue())
978 TrueVal.intersect(*getValueFromCondition(
SI->getTrueValue(),
Cond,
982 FalseVal.intersect(*getValueFromCondition(
SI->getFalseValue(),
Cond,
991std::optional<ConstantRange>
993 std::optional<ValueLatticeElement> OptVal = getBlockValue(
V, BB, CtxI);
996 return OptVal->asConstantRange(
V->getType());
999std::optional<ValueLatticeElement>
1005 case Instruction::Trunc:
1006 case Instruction::SExt:
1007 case Instruction::ZExt:
1012 <<
"' - overdefined (unknown cast).\n");
1019 std::optional<ConstantRange> LHSRes = getRangeFor(CI->
getOperand(0), CI, BB);
1022 return std::nullopt;
1023 const ConstantRange &LHSRange = *LHSRes;
1030 ConstantRange Res = ConstantRange::getEmpty(ResultBitWidth);
1032 Res = LHSRange.
truncate(ResultBitWidth, Trunc->getNoWrapKind());
1039std::optional<ValueLatticeElement>
1040LazyValueInfoImpl::solveBlockValueBinaryOpImpl(
1047 auto ThreadBinOpOverSelect =
1048 [&](
Value *
X,
const ConstantRange &CRX, SelectInst *
Y,
1049 bool XIsLHS) -> std::optional<ValueLatticeElement> {
1054 return std::nullopt;
1057 return std::nullopt;
1059 return std::nullopt;
1061 ConstantRange TrueX =
1062 CRX.intersectWith(getValueFromCondition(
X,
Cond,
true,
1064 ->asConstantRange(
X->getType()));
1065 ConstantRange FalseX =
1066 CRX.intersectWith(getValueFromCondition(
X,
Cond,
false,
1068 ->asConstantRange(
X->getType()));
1074 OpFn(TrueX, TrueY).unionWith(OpFn(FalseX, FalseY)));
1076 OpFn(TrueY, TrueX).unionWith(OpFn(FalseY, FalseX)));
1083 std::optional<ConstantRange> LHSRes = getRangeFor(
LHS,
I, BB);
1085 return std::nullopt;
1089 if (
auto Res = ThreadBinOpOverSelect(
LHS, *LHSRes, SI,
true))
1093 std::optional<ConstantRange> RHSRes = getRangeFor(
RHS,
I, BB);
1095 return std::nullopt;
1099 if (
auto Res = ThreadBinOpOverSelect(
RHS, *RHSRes, SI,
false))
1103 const ConstantRange &LHSRange = *LHSRes;
1104 const ConstantRange &RHSRange = *RHSRes;
1106 std::optional<ValueLatticeElement> MergedResult =
1110 return MergedResult;
1112 std::optional<BBLatticeElementMap> PredLHS =
1113 TheCache.getCachedPredecessorInfo(
LHS, BB);
1115 return MergedResult;
1116 std::optional<BBLatticeElementMap> PredRHS =
1117 TheCache.getCachedPredecessorInfo(
RHS, BB);
1119 return MergedResult;
1121 const BBLatticeElementMap &LHSPredMap = *PredLHS;
1122 const BBLatticeElementMap &RHSPredMap = *PredRHS;
1124 BBLatticeElementMap PredLatticeElements;
1125 ValueLatticeElement OverallPredResult;
1127 auto LHSIt = LHSPredMap.find_as(
Pred);
1128 if (LHSIt == LHSPredMap.end())
1129 return MergedResult;
1130 const ValueLatticeElement &LHSFromPred = LHSIt->second;
1131 std::optional<ConstantRange> LHSFromPredRes =
1133 if (!LHSFromPredRes)
1134 return MergedResult;
1136 auto RHSIt = RHSPredMap.find_as(
Pred);
1137 if (RHSIt == RHSPredMap.end())
1138 return MergedResult;
1139 const ValueLatticeElement &RHSFromPred = RHSIt->second;
1140 std::optional<ConstantRange> RHSFromPredRes =
1142 if (!RHSFromPredRes)
1143 return MergedResult;
1145 const ConstantRange &LHSFromPredRange = *LHSFromPredRes;
1146 const ConstantRange &RHSFromPredRange = *RHSFromPredRes;
1147 std::optional<ValueLatticeElement> PredResult =
1150 return MergedResult;
1151 if (PredResult->isOverdefined()) {
1153 dbgs() <<
" pred BB '" <<
Pred->getName() <<
"' for BB '"
1155 <<
"' overdefined. Discarding all predecessor intervals.\n");
1156 return MergedResult;
1158 PredLatticeElements.insert({
Pred, *PredResult});
1159 OverallPredResult.
mergeIn(*PredResult);
1165 TheCache.insertPredecessorResults(
I, BB, PredLatticeElements);
1168 <<
" to: " << OverallPredResult <<
".\n");
1171 return OverallPredResult;
1174 << OverallPredResult <<
" and " << MergedResult <<
".\n");
1175 return MergedResult->intersect(OverallPredResult);
1178std::optional<ValueLatticeElement>
1181 "all operands to binary operators are sized");
1183 return solveBlockValueBinaryOpImpl(
1184 BO, BB, [BO](
const ConstantRange &CR1,
const ConstantRange &CR2) {
1189std::optional<ValueLatticeElement>
1192 return solveBlockValueBinaryOpImpl(
1193 WO, BB, [WO](
const ConstantRange &CR1,
const ConstantRange &CR2) {
1198std::optional<ValueLatticeElement>
1203 <<
"' - unknown intrinsic.\n");
1209 std::optional<ConstantRange>
Range = getRangeFor(
Op,
II, BB);
1211 return std::nullopt;
1220std::optional<ValueLatticeElement>
1223 std::optional<ValueLatticeElement> OptEltVal =
1226 return std::nullopt;
1227 ValueLatticeElement &Res = *OptEltVal;
1229 std::optional<ValueLatticeElement> OptVecVal =
1232 return std::nullopt;
1238 if (OptEltVal->isConstant())
1245std::optional<ValueLatticeElement>
1250 return solveBlockValueOverflowIntrinsic(WO, BB);
1257 return getBlockValue(
V, BB, EVI);
1260 <<
"' - overdefined (unknown extractvalue).\n");
1298std::optional<ValueLatticeElement>
1303 bool UseBlockValue) {
1307 RHSRange =
C->toConstantRange();
1308 }
else if (UseBlockValue) {
1309 std::optional<ValueLatticeElement>
R =
1312 return std::nullopt;
1316 ConstantRange TrueValues =
1321static std::optional<ConstantRange>
1324 bool Invert =
false;
1331 if (
RHS.isMaxSignedValue())
1332 return std::nullopt;
1336 if (
auto CR = Fn(
RHS))
1337 return Invert ? CR->inverse() : CR;
1338 return std::nullopt;
1344 unsigned BitWidth =
RHS->getType()->getScalarSizeInBits();
1363static std::optional<ConstantRange>
1366 if (!
V->getType()->isIntegerTy())
1367 return std::nullopt;
1371 return std::nullopt;
1378 ConstantRange::getFull(
V->getType()->getScalarSizeInBits());
1385 return std::nullopt;
1389std::optional<ValueLatticeElement> LazyValueInfoImpl::getValueFromICmpCondition(
1390 Value *Val,
ICmpInst *ICI,
bool isTrueDest,
bool UseBlockValue) {
1417 return getValueFromSimpleICmpCondition(EdgePred,
RHS,
Offset, ICI,
1422 return getValueFromSimpleICmpCondition(SwappedPred,
LHS,
Offset, ICI,
1428 const APInt *
Mask, *
C;
1462 const APInt *ShAmtC;
1467 EdgePred, *
C, [&](
const APInt &
RHS) -> std::optional<ConstantRange> {
1468 APInt
New =
RHS << *ShAmtC;
1469 if ((
New.ashr(*ShAmtC)) !=
RHS)
1470 return std::nullopt;
1538std::optional<ValueLatticeElement>
1540 bool IsTrueDest,
bool UseBlockValue,
1543 return getValueFromICmpCondition(Val, ICI, IsTrueDest, UseBlockValue);
1546 return getValueFromTrunc(Val, Trunc, IsTrueDest);
1558 return getValueFromCondition(Val,
N, !IsTrueDest, UseBlockValue,
Depth);
1569 std::optional<ValueLatticeElement> LV =
1570 getValueFromCondition(Val, L, IsTrueDest, UseBlockValue,
Depth);
1572 return std::nullopt;
1573 std::optional<ValueLatticeElement> RV =
1574 getValueFromCondition(Val, R, IsTrueDest, UseBlockValue,
Depth);
1576 return std::nullopt;
1582 if (IsTrueDest ^ IsAnd) {
1587 return LV->intersect(*RV);
1608 const APInt &OpConstVal,
1623 assert((Op0Match || Op1Match) &&
1624 "Operand 0 nor Operand 1 isn't a match");
1639std::optional<ValueLatticeElement>
1647 if (BI->getSuccessor(0) != BI->getSuccessor(1)) {
1648 bool isTrueDest = BI->getSuccessor(0) == BBTo;
1649 assert(BI->getSuccessor(!isTrueDest) == BBTo &&
1650 "BBTo isn't a successor of BBFrom");
1651 Value *Condition = BI->getCondition();
1656 if (Condition == Val)
1662 std::optional<ValueLatticeElement>
Result =
1663 getValueFromCondition(Val, Condition, isTrueDest, UseBlockValue);
1665 return std::nullopt;
1667 if (!
Result->isOverdefined())
1671 assert(
Result->isOverdefined() &&
"Result isn't overdefined");
1677 Value *TempCond = Condition;
1688 APInt ConditionVal(1, isTrueDest ^ (TempCond != Condition) ? 1 : 0);
1691 ValueLatticeElement OpLatticeVal =
1692 *getValueFromCondition(Usr->getOperand(0), Condition,
1696 const unsigned ResultBitWidth =
1697 Usr->getType()->getScalarSizeInBits();
1722 for (
unsigned i = 0; i < Usr->getNumOperands(); ++i) {
1723 Value *
Op = Usr->getOperand(i);
1724 ValueLatticeElement OpLatticeVal = *getValueFromCondition(
1725 Op, Condition, isTrueDest,
false);
1726 if (std::optional<APInt> OpConst =
1735 if (!
Result->isOverdefined())
1743 Value *Condition =
SI->getCondition();
1746 bool ValUsesConditionAndMayBeFoldable =
false;
1747 if (Condition != Val) {
1752 if (!ValUsesConditionAndMayBeFoldable)
1755 assert((Condition == Val || ValUsesConditionAndMayBeFoldable) &&
1756 "Condition != Val nor Val doesn't use Condition");
1758 bool DefaultCase =
SI->getDefaultDest() == BBTo;
1760 ConstantRange EdgesVals(
BitWidth, DefaultCase);
1762 for (
auto Case :
SI->cases()) {
1763 APInt CaseValue = Case.getCaseValue()->getValue();
1764 ConstantRange EdgeVal(CaseValue);
1765 if (ValUsesConditionAndMayBeFoldable) {
1768 ValueLatticeElement EdgeLatticeVal =
1781 if (Case.getCaseSuccessor() != BBTo && Condition == Val)
1782 EdgesVals = EdgesVals.difference(EdgeVal);
1783 }
else if (Case.getCaseSuccessor() == BBTo)
1784 EdgesVals = EdgesVals.unionWith(EdgeVal);
1793std::optional<ValueLatticeElement>
1800 std::optional<ValueLatticeElement> LocalResult =
1801 getEdgeValueLocal(Val, BBFrom, BBTo,
true);
1803 return std::nullopt;
1809 std::optional<ValueLatticeElement> OptInBlock =
1812 return std::nullopt;
1813 ValueLatticeElement &
InBlock = *OptInBlock;
1823 intersectAssumeOrGuardBlockValueConstantRange(Val,
InBlock, CtxI);
1825 return LocalResult->intersect(
InBlock);
1830 LLVM_DEBUG(
dbgs() <<
"LVI Getting block end value " << *V <<
" at '"
1833 assert(BlockValueStack.empty() && BlockValueSet.empty());
1834 std::optional<ValueLatticeElement> OptResult = getBlockValue(V, BB, CtxI);
1837 OptResult = getBlockValue(V, BB, CtxI);
1838 assert(OptResult &&
"Value not available after solving");
1855 intersectAssumeOrGuardBlockValueConstantRange(V, Result, CtxI);
1864 LLVM_DEBUG(
dbgs() <<
"LVI Getting edge value " << *V <<
" from '"
1868 std::optional<ValueLatticeElement> Result =
1869 getEdgeValue(V, FromBB, ToBB, CtxI);
1875 Result = getEdgeValue(V, FromBB, ToBB, CtxI);
1890 const Use *CurrU = &U;
1892 const unsigned MaxUsesToInspect = 3;
1893 for (
unsigned I = 0;
I < MaxUsesToInspect; ++
I) {
1894 std::optional<ValueLatticeElement> CondVal;
1902 if (
I != 0 && !
isa<PHINode>(CurrI) && CurrI->getParent() != LastQueriedBB) {
1912 if (CurrU->getOperandNo() == 1)
1914 *getValueFromCondition(V,
SI->getCondition(),
true,
1916 else if (CurrU->getOperandNo() == 2)
1918 *getValueFromCondition(V,
SI->getCondition(),
false,
1922 CondVal = *getEdgeValueLocal(V,
PHI->getIncomingBlock(*CurrU),
1923 PHI->getParent(),
false);
1937 if (!CurrI->hasOneUse() ||
1953 TheCache.threadEdgeImpl(OldSucc, NewSucc);
1964 if (
auto *Impl = Info.getImpl())
1984 F->getParent(), Intrinsic::experimental_guard);
1996 if (
auto *Impl = getImpl()) {
2003 FunctionAnalysisManager::Invalidator &Inv) {
2029 V =
V->stripPointerCasts();
2044 if (Result.isConstant())
2045 return Result.getConstant();
2046 if (Result.isConstantRange()) {
2049 return ConstantInt::get(V->getType(), *SingleVal);
2055 bool UndefAllowed) {
2058 return Result.asConstantRange(V->getType(), UndefAllowed);
2062 bool UndefAllowed) {
2064 return Result.asConstantRange(U->getType(), UndefAllowed);
2073 getOrCreateImpl().getValueOnEdge(V, FromBB, ToBB, CtxI);
2075 if (Result.isConstant())
2076 return Result.getConstant();
2077 if (Result.isConstantRange()) {
2080 return ConstantInt::get(V->getType(), *SingleVal);
2090 getOrCreateImpl().getValueOnEdge(V, FromBB, ToBB, CtxI);
2092 return Result.asConstantRange(V->getType(),
true);
2142 getOrCreateImpl().getValueOnEdge(V, FromBB, ToBB, CtxI);
2149 bool UseBlockValue) {
2159 if (V->getType()->isPointerTy() &&
C->isNullValue() &&
2168 auto &Impl = getOrCreateImpl();
2170 UseBlockValue ? Impl.getValueInBlock(V, CtxI->
getParent(), CtxI)
2171 : Impl.getValueAt(V, CtxI);
2211 if (
PHI->getParent() == BB) {
2213 for (
unsigned i = 0, e =
PHI->getNumIncomingValues(); i < e; i++) {
2214 Value *Incoming =
PHI->getIncomingValue(i);
2222 Baseline = (i == 0) ? Result
2223 : (Baseline == Result ? Baseline
2242 while (++PI != PE) {
2244 if (Ret != Baseline)
2259 bool UseBlockValue) {
2269 if (UseBlockValue) {
2271 getOrCreateImpl().getValueInBlock(LHS, CtxI->
getParent(), CtxI);
2272 if (L.isOverdefined())
2276 getOrCreateImpl().getValueInBlock(RHS, CtxI->
getParent(), CtxI);
2285 if (
auto *Impl = getImpl())
2286 Impl->threadEdge(PredBB, OldSucc, NewSucc);
2290 if (
auto *Impl = getImpl())
2291 Impl->forgetValue(V);
2295 if (
auto *Impl = getImpl())
2296 Impl->eraseBlock(BB);
2300 if (
auto *Impl = getImpl())
2305 if (
auto *Impl = getImpl())
2306 Impl->printLVI(F, DTree, OS);
2310void LazyValueInfoAnnotatedWriter::emitBasicBlockStartAnnot(
2314 for (
const auto &Arg :
F->args()) {
2317 if (Result.isUnknown())
2319 OS <<
"; LatticeVal for: '" << Arg <<
"' is: " << Result <<
"\n";
2327void LazyValueInfoAnnotatedWriter::emitInstructionAnnot(
2328 const Instruction *
I, formatted_raw_ostream &OS) {
2331 SmallPtrSet<const BasicBlock*, 16> BlocksContainingLVI;
2337 auto printResult = [&](
const BasicBlock *BB) {
2338 if (!BlocksContainingLVI.
insert(BB).second)
2342 OS <<
"; LatticeVal for: '" << *
I <<
"' in BB: '";
2344 OS <<
"' is: " <<
Result <<
"\n";
2347 printResult(ParentBB);
2350 for (
const auto *BBSucc :
successors(ParentBB))
2352 printResult(BBSucc);
2355 for (
const auto *U :
I->users())
2358 printResult(UseI->getParent());
2364 OS <<
"LVI for function '" <<
F.getName() <<
"':\n";
2367 LVI.printLVI(
F, DTree, OS);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static const Function * getParent(const Value *V)
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
This file defines the DenseSet and SmallDenseSet classes.
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.
static bool isOperationFoldable(User *Usr)
static std::optional< ConstantRange > getRangeForNUWMulSquare(const Value *V, CmpInst::Predicate Pred, const Value *LHS, const Value *RHS)
Get the unsigned range for V from a mul nuw V, V comparison.
static void AddNonNullPointer(Value *Ptr, NonNullPointerSet &PtrSet, bool IsDereferenced=true)
static void AddNonNullPointersByInstruction(Instruction *I, NonNullPointerSet &PtrSet)
static std::optional< ConstantRange > getRangeViaSLT(CmpInst::Predicate Pred, APInt RHS, function_ref< std::optional< ConstantRange >(const APInt &)> Fn)
static const unsigned MaxProcessedPerValue
static ValueLatticeElement getValueFromICmpCtpop(ICmpInst::Predicate Pred, Value *RHS)
Get value range for a "ctpop(Val) Pred RHS" condition.
static bool usesOperand(User *Usr, Value *Op)
static ValueLatticeElement constantFoldUser(User *Usr, Value *Op, const APInt &OpConstVal, const DataLayout &DL)
static ValueLatticeElement getFromRangeMetadata(Instruction *BBI)
static Constant * getPredicateResult(CmpInst::Predicate Pred, Constant *C, const ValueLatticeElement &Val, const DataLayout &DL)
static ValueLatticeElement getValueFromOverflowCondition(Value *Val, WithOverflowInst *WO, bool IsTrueDest)
static bool isKnownNonConstant(Value *V)
Returns true if we can statically tell that this value will never be a "useful" constant.
static bool matchICmpOperand(APInt &Offset, Value *LHS, Value *Val, ICmpInst::Predicate Pred)
static void eraseBlock(MachineBasicBlock *MBB, LiveIntervals &LIS, MachineDomTreeUpdater &MDTU)
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
uint64_t IntrinsicInst * II
FunctionAnalysisManager FAM
#define INITIALIZE_PASS_DEPENDENCY(depName)
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
SmallVector< MachineOperand, 4 > Cond
static bool InBlock(const Value *V, const BasicBlock *BB)
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
Class for arbitrary precision integers.
LLVM_ABI APInt zext(unsigned width) const
Zero extend to a new width.
static APInt getSignedMinValue(unsigned numBits)
Gets minimum signed value of APInt for a specific bit width.
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.
static APInt getLowBitsSet(unsigned numBits, unsigned loBitsSet)
Constructs an APInt value that has the bottom loBitsSet bits set.
static APInt getHighBitsSet(unsigned numBits, unsigned hiBitsSet)
Constructs an APInt value that has the top hiBitsSet bits set.
static APInt getZero(unsigned numBits)
Get the '0' value for the specified bit-width.
This templated class represents "all analyses that operate over <aparticular IR unit>" (e....
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
Represent the analysis usage information of a pass.
AnalysisUsage & addRequired()
void setPreservesAll()
Set by analyses that do not transform their input at all.
This class represents an incoming formal argument to a Function.
A function analysis which provides an AssumptionCache.
An immutable pass that tracks lazily created AssumptionCache objects.
A cache of @llvm.assume calls within a function.
LLVM Basic Block Representation.
unsigned getNumber() const
iterator begin()
Instruction iterator methods.
const Function * getParent() const
Return the enclosing method, or null if none.
LLVM_ABI bool isEntryBlock() const
Return true if this is the entry block of the containing function.
LLVM_ABI const DataLayout & getDataLayout() const
Get the data layout of the module this basic block belongs to.
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction; assumes that the block is well-formed.
LLVM_ABI unsigned getNoWrapKind() const
Returns one of OBO::NoSignedWrap or OBO::NoUnsignedWrap.
LLVM_ABI Instruction::BinaryOps getBinaryOp() const
Returns the binary operation underlying the intrinsic.
BinaryOps getOpcode() const
Value handle with callbacks on RAUW and destruction.
This is the base class for all instructions that perform data casts.
Instruction::CastOps getOpcode() const
Return the opcode of this CastInst.
Type * getDestTy() const
Return the destination type, as a convenience.
static Type * makeCmpResultType(Type *opnd_type)
Create a result type for fcmp/icmp.
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
@ ICMP_SLT
signed less than
@ ICMP_SLE
signed less or equal
@ ICMP_UGE
unsigned greater or equal
@ ICMP_UGT
unsigned greater than
@ ICMP_SGT
signed greater than
@ ICMP_ULT
unsigned less than
@ ICMP_SGE
signed greater or equal
@ ICMP_ULE
unsigned less or equal
Predicate getSwappedPredicate() const
For example, EQ->EQ, SLE->SGE, ULT->UGT, OEQ->OEQ, ULE->UGE, OLT->OGT, etc.
Predicate getInversePredicate() const
For example, EQ -> NE, UGT -> ULE, SLT -> SGE, OEQ -> UNE, UGT -> OLE, OLT -> UGE,...
Predicate getPredicate() const
Return the predicate for this instruction.
This is the shared class of boolean and integer constants.
static LLVM_ABI ConstantInt * getTrue(LLVMContext &Context)
static LLVM_ABI ConstantInt * getFalse(LLVMContext &Context)
static LLVM_ABI ConstantPointerNull * get(PointerType *T)
Static factory methods - Return objects of the specified value.
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 * getSingleElement() const
If this set contains a single element, return it, otherwise return null.
static LLVM_ABI ConstantRange fromKnownBits(const KnownBits &Known, bool IsSigned)
Initialize a range based on a known bits constraint.
LLVM_ABI ConstantRange sqrtFloor() const
Calculate sqrtFloor range. See APInt::sqrtFloor().
LLVM_ABI ConstantRange castOp(Instruction::CastOps CastOp, uint32_t BitWidth) const
Return a new range representing the possible values resulting from an application of the specified ca...
LLVM_ABI ConstantRange umin(const ConstantRange &Other) const
Return a new range representing the possible values resulting from an unsigned minimum of a value in ...
LLVM_ABI APInt getUnsignedMin() const
Return the smallest unsigned value contained in the ConstantRange.
LLVM_ABI bool isFullSet() const
Return true if this set contains all of the elements possible for this data-type.
LLVM_ABI bool icmp(CmpInst::Predicate Pred, const ConstantRange &Other) const
Does the predicate Pred hold between ranges this and Other?
static LLVM_ABI ConstantRange intrinsic(Intrinsic::ID IntrinsicID, ArrayRef< ConstantRange > Ops)
Compute range of intrinsic result for the given operand ranges.
LLVM_ABI bool isEmptySet() const
Return true if this set contains no members.
LLVM_ABI ConstantRange abs(bool IntMinIsPoison=false) const
Calculate absolute value range.
static LLVM_ABI bool isIntrinsicSupported(Intrinsic::ID IntrinsicID)
Returns true if ConstantRange calculations are supported for intrinsic with IntrinsicID.
bool isSingleElement() const
Return true if this set contains exactly one member.
LLVM_ABI ConstantRange truncate(uint32_t BitWidth, unsigned NoWrapKind=0) const
Return a new range in the specified integer type, which must be strictly smaller than the current typ...
LLVM_ABI ConstantRange umax(const ConstantRange &Other) const
Return a new range representing the possible values resulting from an unsigned maximum of a value in ...
static LLVM_ABI ConstantRange makeAllowedICmpRegion(CmpInst::Predicate Pred, const ConstantRange &Other)
Produce the smallest range such that all values that may satisfy the given predicate with any value c...
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.
LLVM_ABI APInt getUnsignedMax() const
Return the largest unsigned value contained in the ConstantRange.
static LLVM_ABI ConstantRange makeMaskNotEqualRange(const APInt &Mask, const APInt &C)
Initialize a range containing all values X that satisfy (X & Mask) / != C.
static ConstantRange getNonEmpty(APInt Lower, APInt Upper)
Create non-empty constant range with the given bounds.
LLVM_ABI ConstantRange smin(const ConstantRange &Other) const
Return a new range representing the possible values resulting from a signed minimum of a value in thi...
uint32_t getBitWidth() const
Get the bit width of this ConstantRange.
LLVM_ABI ConstantRange smax(const ConstantRange &Other) const
Return a new range representing the possible values resulting from a signed maximum of a value in thi...
LLVM_ABI ConstantRange binaryOp(Instruction::BinaryOps BinOp, const ConstantRange &Other) const
Return a new range representing the possible values resulting from an application of the specified bi...
static LLVM_ABI ConstantRange makeExactNoWrapRegion(Instruction::BinaryOps BinOp, const APInt &Other, unsigned NoWrapKind)
Produce the range that contains X if and only if "X BinOp Other" does not wrap.
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...
LLVM_ABI ConstantRange toConstantRange() const
Convert constant to an approximate constant range.
bool isNullValue() const
Return true if this is the value that would be returned by getNullValue.
static LLVM_ABI Constant * getAllOnesValue(Type *Ty)
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
A parsed version of the target data layout string in and methods for querying it.
Implements a dense probed hash-table based set.
Analysis pass which computes a DominatorTree.
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
LLVM_ABI bool dominates(const BasicBlock *BB, const Use &U) const
Return true if the (end of the) basic block BB dominates the use U.
FunctionPass class - This class is used to implement most global optimizations.
unsigned getMaxBlockNumber() const
Return a value larger than the largest block number.
unsigned getBlockNumberEpoch() const
Return the "epoch" of current block numbers.
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.
static bool isEquality(Predicate P)
Return true if this predicate is either EQ or NE.
This instruction inserts a single (scalar) element into a VectorType value.
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.
unsigned getOpcode() const
Returns a member of one of the enums like Instruction::Add.
LLVM_ABI const DataLayout & getDataLayout() const
Get the data layout of the module this instruction belongs to.
A wrapper class for inspecting calls to intrinsic functions.
Analysis to compute lazy value information.
LLVM_ABI Result run(Function &F, FunctionAnalysisManager &FAM)
LazyValueInfoImpl(Function *F, AssumptionCache *AC, const DataLayout &DL, Function *GuardDecl)
ValueLatticeElement getValueOnEdge(Value *V, BasicBlock *FromBB, BasicBlock *ToBB, Instruction *CtxI=nullptr)
This is the query interface to determine the lattice value for the specified Value* that is true on t...
ValueLatticeElement getValueAt(Value *V, Instruction *CtxI)
This is the query interface to determine the lattice value for the specified Value* at the specified ...
ValueLatticeElement getValueInBlock(Value *V, BasicBlock *BB, Instruction *CtxI=nullptr)
This is the query interface to determine the lattice value for the specified Value* at the context in...
void threadEdge(BasicBlock *PredBB, BasicBlock *OldSucc, BasicBlock *NewSucc)
This is the update interface to inform the cache that an edge from PredBB to OldSucc has been threade...
void printLVI(Function &F, DominatorTree &DTree, raw_ostream &OS)
Printing the LazyValueInfo Analysis.
void forgetValue(Value *V)
This is part of the update interface to remove information related to this value from the cache.
void eraseBlock(BasicBlock *BB)
This is part of the update interface to inform the cache that a block has been deleted.
void clear()
Complete flush all previously computed values.
ValueLatticeElement getValueAtUse(const Use &U)
LLVM_ABI PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM)
Wrapper around LazyValueInfo.
bool runOnFunction(Function &F) override
runOnFunction - Virtual method overriden by subclasses to do the per-function processing of the pass.
void releaseMemory() override
releaseMemory() - This member can be implemented by a pass if it wants to be able to release its memo...
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - This function should be overriden by passes that need analysis information to do t...
LazyValueInfoWrapperPass()
This pass computes, caches, and vends lazy value constraint information.
LLVM_ABI void eraseBlock(BasicBlock *BB)
Inform the analysis cache that we have erased a block.
LLVM_ABI ConstantRange getConstantRangeAtUse(const Use &U, bool UndefAllowed)
Return the ConstantRange constraint that is known to hold for the value at a specific use-site.
LLVM_ABI Constant * getConstantOnEdge(Value *V, BasicBlock *FromBB, BasicBlock *ToBB, Instruction *CtxI=nullptr)
Determine whether the specified value is known to be a constant on the specified edge.
LLVM_ABI void threadEdge(BasicBlock *PredBB, BasicBlock *OldSucc, BasicBlock *NewSucc)
Inform the analysis cache that we have threaded an edge from PredBB to OldSucc to be from PredBB to N...
LLVM_ABI void releaseMemory()
LLVM_ABI Constant * getConstant(Value *V, Instruction *CtxI)
Determine whether the specified value is known to be a constant at the specified instruction.
LLVM_ABI void printLVI(Function &F, DominatorTree &DTree, raw_ostream &OS)
Print the \LazyValueInfo Analysis.
LLVM_ABI Constant * getPredicateAt(CmpInst::Predicate Pred, Value *V, Constant *C, Instruction *CtxI, bool UseBlockValue)
Determine whether the specified value comparison with a constant is known to be true or false at the ...
LLVM_ABI void forgetValue(Value *V)
Remove information related to this value from the cache.
LLVM_ABI ConstantRange getConstantRange(Value *V, Instruction *CtxI, bool UndefAllowed)
Return the ConstantRange constraint that is known to hold for the specified value at the specified in...
LLVM_ABI void clear()
Complete flush all previously computed values.
LLVM_ABI ConstantRange getConstantRangeOnEdge(Value *V, BasicBlock *FromBB, BasicBlock *ToBB, Instruction *CtxI=nullptr)
Return the ConstantRage constraint that is known to hold for the specified value on the specified edg...
LLVM_ABI ~LazyValueInfo()
LLVM_ABI bool invalidate(Function &F, const PreservedAnalyses &PA, FunctionAnalysisManager::Invalidator &Inv)
Handle invalidation events in the new pass manager.
LLVM_ABI Constant * getPredicateOnEdge(CmpInst::Predicate Pred, Value *V, Constant *C, BasicBlock *FromBB, BasicBlock *ToBB, Instruction *CtxI=nullptr)
Determine whether the specified value comparison with a constant is known to be true or false on the ...
An instruction for reading from memory.
This is the common base class for memset/memcpy/memmove.
This class wraps the llvm.memcpy/memmove intrinsics.
BasicBlock * getIncomingBlock(unsigned i) const
Return incoming basic block number i.
Value * getIncomingValue(unsigned i) const
Return incoming value number x.
unsigned getNumIncomingValues() const
Return the number of incoming edges.
AnalysisType & getAnalysis() const
getAnalysis<AnalysisType>() - This function is used by subclasses to get to the analysis information ...
A set of analyses that are preserved following a run of a transformation pass.
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
PreservedAnalysisChecker getChecker() const
Build a checker for this PreservedAnalyses and the specified analysis type.
This class represents the LLVM 'select' instruction.
Implements a dense probed hash-table based set with some number of buckets stored inline.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
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.
This class represents a truncation of integer types.
unsigned getNoWrapKind() const
Returns the no-wrap kind of the operation.
bool hasNoUnsignedWrap() const
Test whether this operation is known to never undergo unsigned overflow, aka the nuw property.
The instances of the Type class are immutable: once they are created, they are never changed.
LLVM_ABI unsigned getIntegerBitWidth() const
bool isIntOrIntVectorTy() const
Return true if this is an integer type or a vector of integer types.
LLVM_ABI unsigned getPointerAddressSpace() const
Get the address space of this pointer or pointer vector type.
bool isSized() const
Return true if it makes sense to take the size of this type.
LLVM_ABI unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
static LLVM_ABI IntegerType * getInt1Ty(LLVMContext &C)
A Use represents the edge between a Value definition and its users.
Value * getOperand(unsigned i) const
This class represents lattice values for constants.
static ValueLatticeElement getRange(ConstantRange CR, bool MayIncludeUndef=false)
bool isOverdefined() const
static ValueLatticeElement getNot(Constant *C)
ConstantRange asConstantRange(unsigned BW, bool UndefAllowed=false) const
bool isNotConstant() const
std::optional< APInt > asConstantInteger() const
const ConstantRange & getConstantRange(bool UndefAllowed=true) const
Returns the constant range for this value.
bool isConstantRange(bool UndefAllowed=true) const
Returns true if this value is a constant range.
static ValueLatticeElement get(Constant *C)
Constant * getNotConstant() const
LLVM_ABI ValueLatticeElement intersect(const ValueLatticeElement &Other) const
Combine two sets of facts about the same value into a single set of facts.
Constant * getConstant() const
bool mergeIn(const ValueLatticeElement &RHS, MergeOptions Opts=MergeOptions())
Updates this object to approximate both this object and RHS.
static ValueLatticeElement getOverdefined()
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
LLVMContext & getContext() const
All values hold a context through their type.
LLVM_ABI const Value * stripInBoundsOffsets(function_ref< void(const Value *)> Func=[](const Value *) {}) const
Strip off pointer casts and inbounds GEPs.
LLVM_ABI void printAsOperand(raw_ostream &O, bool PrintType=true, const Module *M=nullptr) const
Print the name of this Value out to the specified raw_ostream.
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Represents an op.with.overflow intrinsic.
std::pair< iterator, bool > insert(const ValueT &V)
bool erase(const ValueT &V)
iterator find_as(const LookupKeyT &Val)
Alternative version of find() which allows a different, and possibly less expensive,...
An efficient, type-erasing, non-owning reference to a callable.
const ParentTy * getParent() const
self_iterator getIterator()
This class implements an extremely fast bulk output stream that can only output to a stream.
#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.
@ BasicBlock
Various leaf nodes.
LLVM_ABI Function * getDeclarationIfExists(const Module *M, ID id)
Look up the Function declaration of the intrinsic id in the Module M and return it if it exists.
BinaryOp_match< SrcTy, SpecificConstantMatch, TargetOpcode::G_XOR, true > m_Not(const SrcTy &&Src)
Matches a register not-ed by a G_XOR.
match_combine_or< Ty... > m_CombineOr(const Ty &...Ps)
Combine pattern matchers matching any of Ps patterns.
BinaryOp_match< LHS, RHS, Instruction::And > m_And(const LHS &L, const RHS &R)
PtrToIntSameSize_match< OpTy > m_PtrToIntSameSize(const DataLayout &DL, const OpTy &Op)
BinaryOp_match< LHS, RHS, Instruction::AShr > m_AShr(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::URem > m_URem(const LHS &L, const RHS &R)
ap_match< APInt > m_APInt(const APInt *&Res)
Match a ConstantInt or splatted ConstantVector, binding the specified pointer to the contained APInt.
BinaryOp_match< LHS, RHS, Instruction::And, true > m_c_And(const LHS &L, const RHS &R)
Matches an And with LHS and RHS in either order.
CastInst_match< OpTy, TruncInst > m_Trunc(const OpTy &Op)
Matches Trunc.
bool match(Val *V, const Pattern &P)
specificval_ty m_Specific(const Value *V)
Match if we have a specific specified value.
auto m_Value()
Match an arbitrary value and ignore it.
auto m_Ctpop(const Opnd0 &Op0)
auto m_LogicalOr()
Matches L || R where L and R are arbitrary values.
OverflowingBinaryOp_match< LHS, RHS, Instruction::Mul, OverflowingBinaryOperator::NoUnsignedWrap > m_NUWMul(const LHS &L, const RHS &R)
match_combine_or< BinaryOp_match< LHS, RHS, Instruction::Add >, DisjointOr_match< LHS, RHS > > m_AddLike(const LHS &L, const RHS &R)
Match either "add" or "or disjoint".
auto m_Intrinsic(const Ts &...Ops)
Match intrinsic calls like this: m_Intrinsic<Intrinsic::fabs>(m_Value(X))
auto m_LogicalAnd()
Matches L && R where L and R are arbitrary values.
BinaryOp_match< LHS, RHS, Instruction::Or, true > m_c_Or(const LHS &L, const RHS &R)
Matches an Or with LHS and RHS in either order.
BinaryOp_match< LHS, RHS, Instruction::Sub > m_Sub(const LHS &L, const RHS &R)
@ User
could "use" a pointer
friend class Instruction
Iterator for Instructions in a `BasicBlock.
unsigned getOpcode(const VPValue *V)
Return the instruction opcode for the recipe defining V or 0 for unsupported recipes and VPValues not...
This is an optimization pass for GlobalISel generic memory operations.
BundleAttr getBundleAttrFromOBU(OperandBundleUse OBU)
@ Known
Known to have no common set bits.
auto pred_end(const MachineBasicBlock *BB)
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
auto successors(const MachineBasicBlock *BB)
static ConstantRange getRange(Value *Op, SCCPSolver &Solver, const SmallPtrSetImpl< Value * > &InsertedValues)
Helper for getting ranges from Solver.
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
LLVM_ABI bool assumeBundleImpliesNonNull(const Value *Val, const Function *Context, OperandBundleUse OBU)
LLVM_ABI bool isGuaranteedNotToBeUndef(const Value *V, AssumptionCache *AC=nullptr, const Instruction *CtxI=nullptr, const DominatorTree *DT=nullptr, unsigned Depth=0)
Returns true if V cannot be undef, but may be poison.
LLVM_ABI ConstantRange getConstantRangeFromMetadata(const MDNode &RangeMD)
Parse out a conservative ConstantRange from !range metadata.
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
LLVM_ABI Value * simplifyCastInst(unsigned CastOpc, Value *Op, Type *Ty, const SimplifyQuery &Q)
Given operands for a CastInst, fold the result or return null.
LLVM_ABI FunctionPass * createLazyValueInfoPass()
createLazyValueInfoPass - This creates an instance of the LazyValueInfo pass.
LLVM_ABI Constant * ConstantFoldCompareInstOperands(unsigned Predicate, Constant *LHS, Constant *RHS, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr, const Function *CtxF=nullptr)
Attempt to constant fold a compare instruction (icmp/fcmp) with the specified operands.
LLVM_ABI bool isValidAssumeForContext(const Instruction *I, const Instruction *CtxI, const DominatorTree *DT=nullptr, bool AllowEphemerals=false)
Return true if it is valid to use the assumptions provided by an assume intrinsic,...
const AnalysisOptions & getAnalysisOptions(const LLVMContext &C)
auto dyn_cast_or_null(const Y &Val)
constexpr unsigned MaxAnalysisRecursionDepth
@ SPF_ABS
Floating point maxnum.
@ SPF_NABS
Absolute value.
@ SPF_UMIN
Signed minimum.
@ SPF_UMAX
Signed maximum.
@ SPF_SMAX
Unsigned minimum.
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
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.
LLVM_ABI Constant * ConstantFoldCastOperand(unsigned Opcode, Constant *C, Type *DestTy, const DataLayout &DL)
Attempt to constant fold a cast with the specified operand.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
LLVM_ABI const Value * getUnderlyingObject(const Value *V, unsigned MaxLookup=MaxLookupSearchDepth, bool MustPreserveProvenance=false)
This method strips off any GEP address adjustments, pointer casts or llvm.threadlocal....
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 Value * simplifyExtractValueInst(Value *Agg, ArrayRef< unsigned > Idxs, const SimplifyQuery &Q)
Given operands for an ExtractValueInst, fold the result or return null.
LLVM_ABI bool isNotCrossLaneOperation(const Instruction *I)
Return true if the instruction doesn't potentially cross vector lanes.
LLVM_ABI bool isKnownNonZero(const Value *V, const SimplifyQuery &Q, unsigned Depth=0)
Return true if the given value is known to be non-zero when defined.
LLVM_ABI Value * simplifyBinOp(unsigned Opcode, Value *LHS, Value *RHS, const SimplifyQuery &Q)
Given operands for a BinaryOperator, fold the result or return null.
DWARFExpression::Operation Op
bool isSafeToSpeculativelyExecuteWithVariableReplaced(const Instruction *I, bool IgnoreUBImplyingAttrs=true)
Don't use information from its non-constant operands.
PredIterator< BasicBlock, Value::user_iterator > pred_iterator
static bool hasSingleValue(const ValueLatticeElement &Val)
constexpr unsigned BitWidth
auto pred_begin(const MachineBasicBlock *BB)
LLVM_ABI AssumeRangeInfo getAssumeRangeInfo(OperandBundleUse)
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
auto predecessors(const MachineBasicBlock *BB)
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
LLVM_ABI SelectPatternResult matchSelectPattern(Value *V, Value *&LHS, Value *&RHS, Instruction::CastOps *CastOp=nullptr)
Pattern match integer [SU]MIN, [SU]MAX and ABS idioms, returning the kind and providing the out param...
A special type used by analysis passes to provide an address that identifies that particular analysis...
SelectPatternFlavor Flavor
static bool isMinOrMax(SelectPatternFlavor SPF)
When implementing this min/max pattern as fcmp; select, does the fcmp have to be ordered?