45using namespace PatternMatch;
47#define DEBUG_TYPE "lazy-value-info"
56 "Lazy Value Information Analysis",
false,
true)
90 class LazyValueInfoCache;
91 struct LVIValueHandle final :
public CallbackVH {
92 LazyValueInfoCache *Parent;
94 LVIValueHandle(
Value *V, LazyValueInfoCache *
P =
nullptr)
97 void deleted()
override;
98 void allUsesReplacedWith(
Value *V)
override {
109class LazyValueInfoCache {
114 struct BlockCacheEntry {
119 std::optional<NonNullPointerSet> NonNullPointers;
128 const BlockCacheEntry *getBlockEntry(
BasicBlock *BB)
const {
129 auto It = BlockCache.
find_as(BB);
130 if (It == BlockCache.
end())
132 return It->second.get();
135 BlockCacheEntry *getOrCreateBlockEntry(
BasicBlock *BB) {
136 auto It = BlockCache.
find_as(BB);
137 if (It == BlockCache.
end())
138 It = BlockCache.
insert({BB, std::make_unique<BlockCacheEntry>()}).first;
140 return It->second.get();
143 void addValueHandle(
Value *Val) {
144 auto HandleIt = ValueHandles.
find_as(Val);
145 if (HandleIt == ValueHandles.
end())
146 ValueHandles.
insert({Val,
this});
152 BlockCacheEntry *
Entry = getOrCreateBlockEntry(BB);
156 if (
Result.isOverdefined())
157 Entry->OverDefined.insert(Val);
164 std::optional<ValueLatticeElement> getCachedValueInfo(
Value *V,
166 const BlockCacheEntry *
Entry = getBlockEntry(BB);
170 if (
Entry->OverDefined.count(V))
173 auto LatticeIt =
Entry->LatticeElements.find_as(V);
174 if (LatticeIt ==
Entry->LatticeElements.end())
177 return LatticeIt->second;
183 BlockCacheEntry *
Entry = getOrCreateBlockEntry(BB);
184 if (!
Entry->NonNullPointers) {
185 Entry->NonNullPointers = InitFn(BB);
190 return Entry->NonNullPointers->count(V);
196 ValueHandles.
clear();
200 void eraseValue(
Value *V);
213void LazyValueInfoCache::eraseValue(
Value *V) {
214 for (
auto &Pair : BlockCache) {
215 Pair.second->LatticeElements.erase(V);
216 Pair.second->OverDefined.erase(V);
217 if (Pair.second->NonNullPointers)
218 Pair.second->NonNullPointers->erase(V);
221 auto HandleIt = ValueHandles.
find_as(V);
222 if (HandleIt != ValueHandles.
end())
223 ValueHandles.
erase(HandleIt);
226void LVIValueHandle::deleted() {
229 Parent->eraseValue(*
this);
232void LazyValueInfoCache::eraseBlock(
BasicBlock *BB) {
233 BlockCache.erase(BB);
236void LazyValueInfoCache::threadEdgeImpl(
BasicBlock *OldSucc,
248 std::vector<BasicBlock*> worklist;
249 worklist.push_back(OldSucc);
251 const BlockCacheEntry *
Entry = getBlockEntry(OldSucc);
252 if (!Entry ||
Entry->OverDefined.empty())
255 Entry->OverDefined.end());
261 while (!worklist.empty()) {
266 if (ToUpdate == NewSucc)
continue;
269 auto OI = BlockCache.find_as(ToUpdate);
270 if (OI == BlockCache.end() || OI->second->OverDefined.empty())
272 auto &ValueSet = OI->second->OverDefined;
274 bool changed =
false;
275 for (
Value *V : ValsToClear) {
276 if (!ValueSet.erase(V))
284 if (!changed)
continue;
302 : LVIImpl(
L), DT(DTree) {}
304 void emitBasicBlockStartAnnot(
const BasicBlock *BB,
315 LazyValueInfoCache TheCache;
327 bool pushBlockValue(
const std::pair<BasicBlock *, Value *> &BV) {
328 if (!BlockValueSet.
insert(BV).second)
332 << BV.first->getName() <<
"\n");
344 std::optional<ValueLatticeElement> getBlockValue(
Value *Val,
BasicBlock *BB,
354 std::optional<ValueLatticeElement> solveBlockValueImpl(
Value *Val,
356 std::optional<ValueLatticeElement> solveBlockValueNonLocal(
Value *Val,
358 std::optional<ValueLatticeElement> solveBlockValuePHINode(
PHINode *PN,
360 std::optional<ValueLatticeElement> solveBlockValueSelect(
SelectInst *S,
364 std::optional<ValueLatticeElement> solveBlockValueBinaryOpImpl(
368 std::optional<ValueLatticeElement>
370 std::optional<ValueLatticeElement> solveBlockValueCast(
CastInst *CI,
372 std::optional<ValueLatticeElement>
374 std::optional<ValueLatticeElement> solveBlockValueIntrinsic(
IntrinsicInst *
II,
376 std::optional<ValueLatticeElement>
378 std::optional<ValueLatticeElement>
381 void intersectAssumeOrGuardBlockValueConstantRange(
Value *Val,
391 std::optional<ValueLatticeElement>
396 std::optional<ValueLatticeElement>
397 getValueFromICmpCondition(
Value *Val,
ICmpInst *ICI,
bool isTrueDest,
402 std::optional<ValueLatticeElement>
404 bool UseBlockValue,
unsigned Depth = 0);
406 std::optional<ValueLatticeElement> getEdgeValueLocal(
Value *Val,
439 LazyValueInfoAnnotatedWriter Writer(
this, DTree);
440 F.print(
OS, &Writer);
450 TheCache.eraseBlock(BB);
459 : AC(AC),
DL(
DL), GuardDecl(GuardDecl) {}
463void LazyValueInfoImpl::solve() {
467 unsigned processedCount = 0;
468 while (!BlockValueStack.empty()) {
480 dbgs() <<
"Giving up on stack because we are getting too deep\n");
482 while (!StartingStack.
empty()) {
483 std::pair<BasicBlock *, Value *> &
e = StartingStack.
back();
484 TheCache.insertResult(
e.second,
e.first,
488 BlockValueSet.clear();
489 BlockValueStack.clear();
492 std::pair<BasicBlock *, Value *>
e = BlockValueStack.back();
493 assert(BlockValueSet.count(e) &&
"Stack value should be in BlockValueSet!");
494 unsigned StackSize = BlockValueStack.size();
497 if (solveBlockValue(
e.second,
e.first)) {
499 assert(BlockValueStack.size() == StackSize &&
500 BlockValueStack.back() == e &&
"Nothing should have been pushed!");
502 std::optional<ValueLatticeElement> BBLV =
503 TheCache.getCachedValueInfo(
e.second,
e.first);
504 assert(BBLV &&
"Result should be in cache!");
506 dbgs() <<
"POP " << *
e.second <<
" in " <<
e.first->getName() <<
" = "
510 BlockValueStack.pop_back();
511 BlockValueSet.erase(e);
514 assert(BlockValueStack.size() == StackSize + 1 &&
515 "Exactly one element should have been pushed!");
520std::optional<ValueLatticeElement>
524 if (
Constant *VC = dyn_cast<Constant>(Val))
527 if (std::optional<ValueLatticeElement> OptLatticeVal =
528 TheCache.getCachedValueInfo(Val, BB)) {
529 intersectAssumeOrGuardBlockValueConstantRange(Val, *OptLatticeVal, CxtI);
530 return OptLatticeVal;
534 if (!pushBlockValue({ BB, Val }))
545 case Instruction::Call:
546 case Instruction::Invoke:
547 if (std::optional<ConstantRange>
Range = cast<CallBase>(BBI)->
getRange())
550 case Instruction::Load:
552 if (isa<IntegerType>(BBI->
getType())) {
563 assert(!isa<Constant>(Val) &&
"Value should not be constant");
564 assert(!TheCache.getCachedValueInfo(Val, BB) &&
565 "Value should not be in cache");
569 std::optional<ValueLatticeElement> Res = solveBlockValueImpl(Val, BB);
574 TheCache.insertResult(Val, BB, *Res);
578std::optional<ValueLatticeElement>
582 return solveBlockValueNonLocal(Val, BB);
584 if (
PHINode *PN = dyn_cast<PHINode>(BBI))
585 return solveBlockValuePHINode(PN, BB);
587 if (
auto *SI = dyn_cast<SelectInst>(BBI))
588 return solveBlockValueSelect(SI, BB);
604 if (
auto *CI = dyn_cast<CastInst>(BBI))
605 return solveBlockValueCast(CI, BB);
608 return solveBlockValueBinaryOp(BO, BB);
610 if (
auto *IEI = dyn_cast<InsertElementInst>(BBI))
611 return solveBlockValueInsertElement(IEI, BB);
613 if (
auto *EVI = dyn_cast<ExtractValueInst>(BBI))
614 return solveBlockValueExtractValue(EVI, BB);
616 if (
auto *
II = dyn_cast<IntrinsicInst>(BBI))
617 return solveBlockValueIntrinsic(
II, BB);
621 <<
"' - unknown inst def found.\n");
626 bool IsDereferenced =
true) {
628 if (
Ptr->getType()->getPointerAddressSpace() == 0)
630 :
Ptr->stripInBoundsOffsets());
635 if (
LoadInst *L = dyn_cast<LoadInst>(
I)) {
637 }
else if (
StoreInst *S = dyn_cast<StoreInst>(
I)) {
640 if (
MI->isVolatile())
return;
644 if (!Len || Len->isZero())
return;
649 }
else if (
auto *CB = dyn_cast<CallBase>(
I)) {
650 for (
auto &U : CB->args()) {
651 if (U->getType()->isPointerTy() &&
652 CB->paramHasNonNullAttr(CB->getArgOperandNo(&U),
659bool LazyValueInfoImpl::isNonNullAtEndOfBlock(
Value *Val,
BasicBlock *BB) {
665 return TheCache.isNonNullAtEndOfBlock(Val, BB, [](
BasicBlock *BB) {
666 NonNullPointerSet NonNullPointers;
669 return NonNullPointers;
673std::optional<ValueLatticeElement>
674LazyValueInfoImpl::solveBlockValueNonLocal(
Value *Val,
BasicBlock *BB) {
679 assert(isa<Argument>(Val) &&
"Unknown live-in to the entry block");
680 if (std::optional<ConstantRange>
Range = cast<Argument>(Val)->
getRange())
698 std::optional<ValueLatticeElement> EdgeResult = getEdgeValue(Val, Pred, BB);
703 Result.mergeIn(*EdgeResult);
707 if (
Result.isOverdefined()) {
709 <<
"' - overdefined because of pred '"
710 << Pred->getName() <<
"' (non local).\n");
720std::optional<ValueLatticeElement>
733 std::optional<ValueLatticeElement> EdgeResult =
734 getEdgeValue(PhiVal, PhiBB, BB, PN);
739 Result.mergeIn(*EdgeResult);
743 if (
Result.isOverdefined()) {
745 <<
"' - overdefined because of pred (local).\n");
752 assert(!
Result.isOverdefined() &&
"Possible PHI in entry block?");
758void LazyValueInfoImpl::intersectAssumeOrGuardBlockValueConstantRange(
760 BBI = BBI ? BBI : dyn_cast<Instruction>(Val);
772 auto *
I = cast<CallInst>(AssumeVH);
776 BBLV = BBLV.
intersect(*getValueFromCondition(Val,
I->getArgOperand(0),
782 if (GuardDecl && !GuardDecl->
use_empty() &&
799 isNonNullAtEndOfBlock(Val, BB))
804std::optional<ValueLatticeElement>
807 std::optional<ValueLatticeElement> OptTrueVal =
808 getBlockValue(
SI->getTrueValue(), BB, SI);
813 std::optional<ValueLatticeElement> OptFalseVal =
814 getBlockValue(
SI->getFalseValue(), BB, SI);
828 ((LHS ==
SI->getTrueValue() && RHS ==
SI->getFalseValue()) ||
829 (RHS ==
SI->getTrueValue() && LHS ==
SI->getFalseValue()))) {
835 return TrueCR.
smin(FalseCR);
837 return TrueCR.
umin(FalseCR);
839 return TrueCR.
smax(FalseCR);
841 return TrueCR.
umax(FalseCR);
845 ResultCR,
TrueVal.isConstantRangeIncludingUndef() ||
846 FalseVal.isConstantRangeIncludingUndef());
850 if (LHS ==
SI->getTrueValue())
852 TrueCR.
abs(),
TrueVal.isConstantRangeIncludingUndef());
853 if (LHS ==
SI->getFalseValue())
855 FalseCR.
abs(),
FalseVal.isConstantRangeIncludingUndef());
860 if (LHS ==
SI->getTrueValue())
863 if (LHS ==
SI->getFalseValue())
877 TrueVal.intersect(*getValueFromCondition(
SI->getTrueValue(),
Cond,
881 FalseVal.intersect(*getValueFromCondition(
SI->getFalseValue(),
Cond,
891std::optional<ConstantRange>
893 std::optional<ValueLatticeElement> OptVal = getBlockValue(V, BB, CxtI);
896 return OptVal->asConstantRange(
V->getType());
899std::optional<ValueLatticeElement>
905 case Instruction::Trunc:
906 case Instruction::SExt:
907 case Instruction::ZExt:
912 <<
"' - overdefined (unknown cast).\n");
919 std::optional<ConstantRange> LHSRes = getRangeFor(CI->
getOperand(0), CI, BB);
931 if (
auto *Trunc = dyn_cast<TruncInst>(CI))
932 Res = LHSRange.
truncate(ResultBitWidth, Trunc->getNoWrapKind());
939std::optional<ValueLatticeElement>
940LazyValueInfoImpl::solveBlockValueBinaryOpImpl(
947 auto ThreadBinOpOverSelect =
949 bool XIsLHS) -> std::optional<ValueLatticeElement> {
952 Constant *TrueC = dyn_cast<Constant>(
Y->getTrueValue());
955 Constant *FalseC = dyn_cast<Constant>(
Y->getFalseValue());
964 ->asConstantRange(
X->getType()));
968 ->asConstantRange(
X->getType()));
974 OpFn(TrueX, TrueY).unionWith(OpFn(FalseX, FalseY)));
976 OpFn(TrueY, TrueX).unionWith(OpFn(FalseY, FalseX)));
983 std::optional<ConstantRange> LHSRes = getRangeFor(LHS,
I, BB);
988 if (
auto *SI = dyn_cast<SelectInst>(RHS)) {
989 if (
auto Res = ThreadBinOpOverSelect(LHS, *LHSRes, SI,
true))
993 std::optional<ConstantRange> RHSRes = getRangeFor(RHS,
I, BB);
998 if (
auto *SI = dyn_cast<SelectInst>(LHS)) {
999 if (
auto Res = ThreadBinOpOverSelect(RHS, *RHSRes, SI,
false))
1008std::optional<ValueLatticeElement>
1011 "all operands to binary operators are sized");
1012 if (
auto *OBO = dyn_cast<OverflowingBinaryOperator>(BO)) {
1013 unsigned NoWrapKind = OBO->getNoWrapKind();
1014 return solveBlockValueBinaryOpImpl(
1021 return solveBlockValueBinaryOpImpl(
1027std::optional<ValueLatticeElement>
1030 return solveBlockValueBinaryOpImpl(
1036std::optional<ValueLatticeElement>
1041 <<
"' - unknown intrinsic.\n");
1047 std::optional<ConstantRange>
Range = getRangeFor(
Op,
II, BB);
1049 return std::nullopt;
1058std::optional<ValueLatticeElement>
1061 std::optional<ValueLatticeElement> OptEltVal =
1064 return std::nullopt;
1067 std::optional<ValueLatticeElement> OptVecVal =
1070 return std::nullopt;
1076 if (OptEltVal->isConstant())
1083std::optional<ValueLatticeElement>
1088 return solveBlockValueOverflowIntrinsic(WO, BB);
1095 return getBlockValue(V, BB, EVI);
1098 <<
"' - overdefined (unknown extractvalue).\n");
1136std::optional<ValueLatticeElement>
1141 bool UseBlockValue) {
1144 if (
ConstantInt *CI = dyn_cast<ConstantInt>(RHS)) {
1146 }
else if (UseBlockValue) {
1147 std::optional<ValueLatticeElement>
R =
1148 getBlockValue(RHS, CxtI->
getParent(), CxtI);
1150 return std::nullopt;
1159static std::optional<ConstantRange>
1162 bool Invert =
false;
1169 if (
RHS.isMaxSignedValue())
1170 return std::nullopt;
1174 if (
auto CR = Fn(
RHS))
1175 return Invert ? CR->inverse() : CR;
1176 return std::nullopt;
1184 auto *RHSConst = dyn_cast<ConstantInt>(
RHS);
1200std::optional<ValueLatticeElement> LazyValueInfoImpl::getValueFromICmpCondition(
1201 Value *Val,
ICmpInst *ICI,
bool isTrueDest,
bool UseBlockValue) {
1209 if (isa<Constant>(RHS)) {
1213 else if (!isa<UndefValue>(RHS))
1225 return getValueFromSimpleICmpCondition(EdgePred, RHS,
Offset, ICI,
1230 return getValueFromSimpleICmpCondition(SwappedPred, LHS,
Offset, ICI,
1270 const APInt *ShAmtC;
1275 EdgePred, *
C, [&](
const APInt &RHS) -> std::optional<ConstantRange> {
1277 if ((
New.ashr(*ShAmtC)) != RHS)
1278 return std::nullopt;
1292 if ((
X == LHS &&
Y == RHS) || (
X == RHS &&
Y == LHS)) {
1346std::optional<ValueLatticeElement>
1348 bool IsTrueDest,
bool UseBlockValue,
1351 return getValueFromICmpCondition(Val, ICI, IsTrueDest, UseBlockValue);
1353 if (
auto *Trunc = dyn_cast<TruncInst>(
Cond))
1354 return getValueFromTrunc(Val, Trunc, IsTrueDest);
1356 if (
auto *EVI = dyn_cast<ExtractValueInst>(
Cond))
1366 return getValueFromCondition(Val,
N, !IsTrueDest, UseBlockValue,
Depth);
1377 std::optional<ValueLatticeElement> LV =
1378 getValueFromCondition(Val, L, IsTrueDest, UseBlockValue,
Depth);
1380 return std::nullopt;
1381 std::optional<ValueLatticeElement> RV =
1382 getValueFromCondition(Val, R, IsTrueDest, UseBlockValue,
Depth);
1384 return std::nullopt;
1390 if (IsTrueDest ^ IsAnd) {
1395 return LV->intersect(*RV);
1408 return isa<CastInst>(Usr) || isa<BinaryOperator>(Usr) || isa<FreezeInst>(Usr);
1416 const APInt &OpConstVal,
1421 if (
auto *CI = dyn_cast<CastInst>(Usr)) {
1423 if (
auto *
C = dyn_cast_or_null<ConstantInt>(
1428 }
else if (
auto *BO = dyn_cast<BinaryOperator>(Usr)) {
1431 assert((Op0Match || Op1Match) &&
1432 "Operand 0 nor Operand 1 isn't a match");
1435 if (
auto *
C = dyn_cast_or_null<ConstantInt>(
1439 }
else if (isa<FreezeInst>(Usr)) {
1440 assert(cast<FreezeInst>(Usr)->getOperand(0) ==
Op &&
"Operand 0 isn't Op");
1447std::optional<ValueLatticeElement>
1455 if (BI->isConditional() &&
1456 BI->getSuccessor(0) != BI->getSuccessor(1)) {
1457 bool isTrueDest = BI->getSuccessor(0) == BBTo;
1458 assert(BI->getSuccessor(!isTrueDest) == BBTo &&
1459 "BBTo isn't a successor of BBFrom");
1460 Value *Condition = BI->getCondition();
1465 if (Condition == Val)
1471 std::optional<ValueLatticeElement>
Result =
1472 getValueFromCondition(Val, Condition, isTrueDest, UseBlockValue);
1474 return std::nullopt;
1476 if (!
Result->isOverdefined())
1479 if (
User *Usr = dyn_cast<User>(Val)) {
1480 assert(
Result->isOverdefined() &&
"Result isn't overdefined");
1494 APInt ConditionVal(1, isTrueDest ? 1 : 0);
1504 for (
unsigned i = 0; i < Usr->getNumOperands(); ++i) {
1505 Value *
Op = Usr->getOperand(i);
1507 Op, Condition, isTrueDest,
false);
1508 if (std::optional<APInt> OpConst =
1517 if (!
Result->isOverdefined())
1525 Value *Condition =
SI->getCondition();
1526 if (!isa<IntegerType>(Val->
getType()))
1528 bool ValUsesConditionAndMayBeFoldable =
false;
1529 if (Condition != Val) {
1531 if (
User *Usr = dyn_cast<User>(Val))
1534 if (!ValUsesConditionAndMayBeFoldable)
1537 assert((Condition == Val || ValUsesConditionAndMayBeFoldable) &&
1538 "Condition != Val nor Val doesn't use Condition");
1540 bool DefaultCase =
SI->getDefaultDest() == BBTo;
1544 for (
auto Case :
SI->cases()) {
1545 APInt CaseValue = Case.getCaseValue()->getValue();
1547 if (ValUsesConditionAndMayBeFoldable) {
1548 User *Usr = cast<User>(Val);
1563 if (Case.getCaseSuccessor() != BBTo && Condition == Val)
1565 }
else if (Case.getCaseSuccessor() == BBTo)
1566 EdgesVals = EdgesVals.
unionWith(EdgeVal);
1575std::optional<ValueLatticeElement>
1579 if (
Constant *VC = dyn_cast<Constant>(Val))
1582 std::optional<ValueLatticeElement> LocalResult =
1583 getEdgeValueLocal(Val, BBFrom, BBTo,
true);
1585 return std::nullopt;
1591 std::optional<ValueLatticeElement> OptInBlock =
1594 return std::nullopt;
1605 intersectAssumeOrGuardBlockValueConstantRange(Val,
InBlock, CxtI);
1607 return LocalResult->intersect(
InBlock);
1612 LLVM_DEBUG(
dbgs() <<
"LVI Getting block end value " << *V <<
" at '"
1615 assert(BlockValueStack.empty() && BlockValueSet.empty());
1616 std::optional<ValueLatticeElement> OptResult = getBlockValue(V, BB, CxtI);
1619 OptResult = getBlockValue(V, BB, CxtI);
1620 assert(OptResult &&
"Value not available after solving");
1632 if (
auto *
C = dyn_cast<Constant>(V))
1636 if (
auto *
I = dyn_cast<Instruction>(V))
1638 intersectAssumeOrGuardBlockValueConstantRange(V, Result, CxtI);
1647 LLVM_DEBUG(
dbgs() <<
"LVI Getting edge value " << *V <<
" from '"
1651 std::optional<ValueLatticeElement> Result =
1652 getEdgeValue(V, FromBB, ToBB, CxtI);
1658 Result = getEdgeValue(V, FromBB, ToBB, CxtI);
1667 auto *CxtI = cast<Instruction>(U.getUser());
1672 const Use *CurrU = &U;
1674 const unsigned MaxUsesToInspect = 3;
1675 for (
unsigned I = 0;
I < MaxUsesToInspect; ++
I) {
1676 std::optional<ValueLatticeElement> CondVal;
1677 auto *CurrI = cast<Instruction>(CurrU->getUser());
1678 if (
auto *SI = dyn_cast<SelectInst>(CurrI)) {
1683 if (CurrU->getOperandNo() == 1)
1685 *getValueFromCondition(V, SI->getCondition(),
true,
1687 else if (CurrU->getOperandNo() == 2)
1689 *getValueFromCondition(V, SI->getCondition(),
false,
1691 }
else if (
auto *
PHI = dyn_cast<PHINode>(CurrI)) {
1693 CondVal = *getEdgeValueLocal(V,
PHI->getIncomingBlock(*CurrU),
1694 PHI->getParent(),
false);
1708 if (!CurrI->hasOneUse() ||
1719 TheCache.threadEdgeImpl(OldSucc, NewSucc);
1727 Info.AC = &getAnalysis<AssumptionCacheTracker>().getAssumptionCache(
F);
1729 if (
auto *Impl = Info.getImpl())
1747 assert(M &&
"getCache() called with a null Module");
1762 if (
auto *Impl = getImpl()) {
1795 V = V->stripPointerCasts();
1797 if (isa<AllocaInst>(V))
1811 if (Result.isConstant())
1812 return Result.getConstant();
1813 if (Result.isConstantRange()) {
1816 return ConstantInt::get(V->getType(), *SingleVal);
1822 bool UndefAllowed) {
1826 return Result.asConstantRange(V->getType(), UndefAllowed);
1830 bool UndefAllowed) {
1831 auto *Inst = cast<Instruction>(U.getUser());
1834 return Result.asConstantRange(U->getType(), UndefAllowed);
1846 if (Result.isConstant())
1847 return Result.getConstant();
1848 if (Result.isConstantRange()) {
1851 return ConstantInt::get(V->getType(), *SingleVal);
1864 return Result.asConstantRange(V->getType(),
true);
1922 bool UseBlockValue) {
1929 if (V->getType()->isPointerTy() &&
C->isNullValue() &&
1938 auto &Impl = getOrCreateImpl(M);
1940 UseBlockValue ? Impl.getValueInBlock(V, CxtI->
getParent(), CxtI)
1941 : Impl.getValueAt(V, CxtI);
1980 if (
auto *
PHI = dyn_cast<PHINode>(V))
1981 if (
PHI->getParent() == BB) {
1983 for (
unsigned i = 0, e =
PHI->getNumIncomingValues(); i < e; i++) {
1992 Baseline = (i == 0) ? Result
1993 : (Baseline == Result ? Baseline
2005 if (!isa<Instruction>(V) || cast<Instruction>(V)->getParent() != BB) {
2012 while (++PI != PE) {
2014 if (Ret != Baseline)
2029 bool UseBlockValue) {
2030 if (
auto *
C = dyn_cast<Constant>(
RHS))
2032 if (
auto *
C = dyn_cast<Constant>(
LHS))
2039 if (UseBlockValue) {
2043 if (L.isOverdefined())
2049 return L.getCompare(Pred, Ty, R, M->getDataLayout());
2056 if (
auto *Impl = getImpl())
2057 Impl->threadEdge(PredBB, OldSucc, NewSucc);
2061 if (
auto *Impl = getImpl())
2062 Impl->forgetValue(V);
2066 if (
auto *Impl = getImpl())
2067 Impl->eraseBlock(BB);
2071 if (
auto *Impl = getImpl())
2076 if (
auto *Impl = getImpl())
2077 Impl->printLVI(
F, DTree,
OS);
2081void LazyValueInfoAnnotatedWriter::emitBasicBlockStartAnnot(
2085 for (
const auto &Arg :
F->args()) {
2088 if (Result.isUnknown())
2090 OS <<
"; LatticeVal for: '" << Arg <<
"' is: " << Result <<
"\n";
2098void LazyValueInfoAnnotatedWriter::emitInstructionAnnot(
2101 auto *ParentBB =
I->getParent();
2108 auto printResult = [&](
const BasicBlock *BB) {
2109 if (!BlocksContainingLVI.
insert(BB).second)
2113 OS <<
"; LatticeVal for: '" << *
I <<
"' in BB: '";
2118 printResult(ParentBB);
2121 for (
const auto *BBSucc :
successors(ParentBB))
2123 printResult(BBSucc);
2126 for (
const auto *U :
I->users())
2127 if (
auto *UseI = dyn_cast<Instruction>(U))
2128 if (!isa<PHINode>(UseI) || DT.
dominates(ParentBB, UseI->getParent()))
2129 printResult(UseI->getParent());
2135 OS <<
"LVI for function '" <<
F.getName() <<
"':\n";
2138 LVI.printLVI(
F, DTree,
OS);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
block Block Frequency Analysis
This file contains the declarations for the subclasses of Constant, which represent the different fla...
Given that RA is a live value
This file defines the DenseSet and SmallDenseSet classes.
static GCMetadataPrinterRegistry::Add< ErlangGCPrinter > X("erlang", "erlang-compatible garbage collector")
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 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)
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
uint64_t IntrinsicInst * II
static GCMetadataPrinterRegistry::Add< OcamlGCMetadataPrinter > Y("ocaml", "ocaml 3.10-compatible collector")
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)
const SmallVectorImpl< MachineOperand > & Cond
static bool InBlock(const Value *V, const BasicBlock *BB)
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 <a particular IR unit>" (e....
API to communicate dependencies between analyses during invalidation.
A container for analyses that lazily runs them and caches their results.
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.
void clear()
Clear the cache of @llvm.assume intrinsics for a function.
MutableArrayRef< ResultElem > assumptionsFor(const Value *V)
Access the list of assumptions which affect this value.
LLVM Basic Block Representation.
iterator begin()
Instruction iterator methods.
LLVM_ABI bool isEntryBlock() const
Return true if this is the entry block of the containing function.
const Function * getParent() const
Return the enclosing method, or null if none.
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 if the block is well formed or null if the block is not well forme...
const Instruction & back() const
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 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
Conditional or Unconditional Branch instruction.
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 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 ConstantRange difference(const ConstantRange &CR) const
Subtract the specified range from this range (aka relative complement of the sets).
LLVM_ABI bool icmp(CmpInst::Predicate Pred, const ConstantRange &Other) const
Does the predicate Pred hold between ranges this and Other? NOTE: false does not mean that inverse pr...
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.
LLVM_ABI ConstantRange overflowingBinaryOp(Instruction::BinaryOps BinOp, const ConstantRange &Other, unsigned NoWrapKind) const
Return a new range representing the possible values resulting from an application of the specified ov...
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...
LLVM_ABI ConstantRange unionWith(const ConstantRange &CR, PreferredRangeType Type=Smallest) const
Return the range that results from the union of this range with another range.
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.
LLVM_ABI ConstantRange intersectWith(const ConstantRange &CR, PreferredRangeType Type=Smallest) const
Return the range that results from the intersection of this range with another range.
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.
static LLVM_ABI Constant * getAllOnesValue(Type *Ty)
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.
This class represents an Operation in the Expression.
A parsed version of the target data layout string in and methods for querying it.
iterator find_as(const LookupKeyT &Val)
Alternate version of find() which allows a different, and possibly less expensive,...
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
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.
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 Module * getModule() const
Return the module owning the function this instruction belongs to or nullptr it the function does not...
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.
Result run(Function &F, FunctionAnalysisManager &FAM)
ValueLatticeElement getValueOnEdge(Value *V, BasicBlock *FromBB, BasicBlock *ToBB, Instruction *CxtI=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 *CxtI)
This is the query interface to determine the lattice value for the specified Value* at the specified ...
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.
LazyValueInfoImpl(AssumptionCache *AC, const DataLayout &DL, Function *GuardDecl)
ValueLatticeElement getValueInBlock(Value *V, BasicBlock *BB, Instruction *CxtI=nullptr)
This is the query interface to determine the lattice value for the specified Value* at the context in...
ValueLatticeElement getValueAtUse(const Use &U)
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.
void eraseBlock(BasicBlock *BB)
Inform the analysis cache that we have erased a block.
ConstantRange getConstantRangeAtUse(const Use &U, bool UndefAllowed)
Return the ConstantRange constraint that is known to hold for the value at a specific use-site.
ConstantRange getConstantRange(Value *V, Instruction *CxtI, bool UndefAllowed)
Return the ConstantRange constraint that is known to hold for the specified value at the specified in...
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...
Constant * getPredicateOnEdge(CmpInst::Predicate Pred, Value *V, Constant *C, BasicBlock *FromBB, BasicBlock *ToBB, Instruction *CxtI=nullptr)
Determine whether the specified value comparison with a constant is known to be true or false on the ...
Constant * getConstantOnEdge(Value *V, BasicBlock *FromBB, BasicBlock *ToBB, Instruction *CxtI=nullptr)
Determine whether the specified value is known to be a constant on the specified edge.
ConstantRange getConstantRangeOnEdge(Value *V, BasicBlock *FromBB, BasicBlock *ToBB, Instruction *CxtI=nullptr)
Return the ConstantRage constraint that is known to hold for the specified value on the specified edg...
Constant * getConstant(Value *V, Instruction *CxtI)
Determine whether the specified value is known to be a constant at the specified instruction.
void printLVI(Function &F, DominatorTree &DTree, raw_ostream &OS)
Print the \LazyValueInfo Analysis.
void forgetValue(Value *V)
Remove information related to this value from the cache.
void clear()
Complete flush all previously computed values.
Constant * getPredicateAt(CmpInst::Predicate Pred, Value *V, Constant *C, Instruction *CxtI, bool UseBlockValue)
Determine whether the specified value comparison with a constant is known to be true or false at the ...
bool invalidate(Function &F, const PreservedAnalyses &PA, FunctionAnalysisManager::Invalidator &Inv)
Handle invalidation events in the new pass manager.
An instruction for reading from memory.
This is the common base class for memset/memcpy/memmove.
This class wraps the llvm.memcpy/memmove intrinsics.
A Module instance is used to store all the information related to an LLVM module.
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.
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.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
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.
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.
bool isIntOrIntVectorTy() const
Return true if this is an integer type or a vector of integer types.
static LLVM_ABI IntegerType * getInt1Ty(LLVMContext &C)
LLVM_ABI unsigned getPointerAddressSpace() const
Get the address space of this pointer or pointer vector type.
bool isSized(SmallPtrSetImpl< Type * > *Visited=nullptr) 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.
bool isIntegerTy() const
True if this is an instance of IntegerType.
LLVM_ABI unsigned getIntegerBitWidth() const
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)
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.
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 LLVMContext & getContext() const
All values hold a context through their type.
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)
iterator find_as(const LookupKeyT &Val)
Alternative version of find() which allows a different, and possibly less expensive,...
bool erase(const ValueT &V)
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.
@ C
The default llvm calling convention, compatible with C.
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.
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)
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_LogicalOr()
Matches L || R where L and R are arbitrary values.
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".
apint_match m_APInt(const APInt *&Res)
Match a ConstantInt or splatted ConstantVector, binding the specified pointer to the contained APInt.
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, 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)
match_combine_or< LTy, RTy > m_CombineOr(const LTy &L, const RTy &R)
Combine two pattern matchers matching L || R.
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI bool isValidAssumeForContext(const Instruction *I, const Instruction *CxtI, const DominatorTree *DT=nullptr, bool AllowEphemerals=false)
Return true if it is valid to use the assumptions provided by an assume intrinsic,...
auto pred_end(const MachineBasicBlock *BB)
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 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.
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.
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.
constexpr unsigned MaxAnalysisRecursionDepth
@ SPF_ABS
Floating point maxnum.
@ SPF_NABS
Absolute value.
@ SPF_UMIN
Signed minimum.
@ SPF_UMAX
Signed maximum.
@ SPF_SMAX
Unsigned minimum.
LLVM_ABI SelectPatternResult matchSelectPattern(Value *V, Value *&LHS, Value *&RHS, Instruction::CastOps *CastOp=nullptr, unsigned Depth=0)
Pattern match integer [SU]MIN, [SU]MAX and ABS idioms, returning the kind and providing the out param...
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 Value * simplifyExtractValueInst(Value *Agg, ArrayRef< unsigned > Idxs, const SimplifyQuery &Q)
Given operands for an ExtractValueInst, fold the result or return null.
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.
static bool hasSingleValue(const ValueLatticeElement &Val)
constexpr unsigned BitWidth
auto pred_begin(const MachineBasicBlock *BB)
auto predecessors(const MachineBasicBlock *BB)
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
LLVM_ABI const Value * getUnderlyingObject(const Value *V, unsigned MaxLookup=MaxLookupSearchDepth)
This method strips off any GEP address adjustments, pointer casts or llvm.threadlocal....
A special type used by analysis passes to provide an address that identifies that particular analysis...
Incoming for lane maks phi as machine instruction, incoming register Reg and incoming block Block are...
SelectPatternFlavor Flavor
static bool isMinOrMax(SelectPatternFlavor SPF)
When implementing this min/max pattern as fcmp; select, does the fcmp have to be ordered?