LLVM 23.0.0git
LazyValueInfo.cpp
Go to the documentation of this file.
1//===- LazyValueInfo.cpp - Value constraint analysis ------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file defines the interface for lazy computation of value constraint
10// information.
11//
12//===----------------------------------------------------------------------===//
13
15#include "llvm/ADT/DenseSet.h"
16#include "llvm/ADT/STLExtras.h"
26#include "llvm/IR/CFG.h"
28#include "llvm/IR/Constants.h"
29#include "llvm/IR/DataLayout.h"
30#include "llvm/IR/Dominators.h"
31#include "llvm/IR/InstrTypes.h"
34#include "llvm/IR/Intrinsics.h"
35#include "llvm/IR/LLVMContext.h"
36#include "llvm/IR/Module.h"
38#include "llvm/IR/ValueHandle.h"
40#include "llvm/Support/Debug.h"
44#include <optional>
45using namespace llvm;
46using namespace PatternMatch;
47
48#define DEBUG_TYPE "lazy-value-info"
49
50// This is the number of worklist items we will process to try to discover an
51// answer for a given value.
52static const unsigned MaxProcessedPerValue = 500;
53
57 "Lazy Value Information Analysis", false, true)
61 "Lazy Value Information Analysis", false, true)
62
63static cl::opt<bool> PerPredRanges(
64 "lvi-per-pred-ranges", cl::Hidden, cl::init(false),
65 cl::desc("Enable tracking of ranges for a value in a block for"
66 "each block predecessor (default = false)"));
67
68namespace llvm {
72} // namespace llvm
73
74AnalysisKey LazyValueAnalysis::Key;
75
76/// Returns true if this lattice value represents at most one possible value.
77/// This is as precise as any lattice value can get while still representing
78/// reachable code.
79static bool hasSingleValue(const ValueLatticeElement &Val) {
80 if (Val.isConstantRange() &&
82 // Integer constants are single element ranges
83 return true;
84 if (Val.isConstant())
85 // Non integer constants
86 return true;
87 return false;
88}
89
90//===----------------------------------------------------------------------===//
91// LazyValueInfoCache Decl
92//===----------------------------------------------------------------------===//
93
94namespace {
95 /// A callback value handle updates the cache when values are erased.
96 class LazyValueInfoCache;
97 struct LVIValueHandle final : public CallbackVH {
98 LazyValueInfoCache *Parent;
99
100 LVIValueHandle(Value *V, LazyValueInfoCache *P = nullptr)
101 : CallbackVH(V), Parent(P) { }
102
103 void deleted() override;
104 void allUsesReplacedWith(Value *V) override {
105 deleted();
106 }
107 };
108} // end anonymous namespace
109
110namespace {
111using NonNullPointerSet = SmallDenseSet<AssertingVH<Value>, 2>;
112using BBLatticeElementMap =
114using PredecessorValueLatticeMap =
115 SmallDenseMap<AssertingVH<Value>, BBLatticeElementMap, 2>;
116
117/// This is the cache kept by LazyValueInfo which
118/// maintains information about queries across the clients' queries.
119class LazyValueInfoCache {
120 /// This is all of the cached information for one basic block. It contains
121 /// the per-value lattice elements, as well as a separate set for
122 /// overdefined values to reduce memory usage. Additionally pointers
123 /// dereferenced in the block are cached for nullability queries.
124 struct BlockCacheEntry {
125 SmallDenseMap<AssertingVH<Value>, ValueLatticeElement, 4> LatticeElements;
126 SmallDenseSet<AssertingVH<Value>, 4> OverDefined;
127 // std::nullopt indicates that the nonnull pointers for this basic block
128 // block have not been computed yet.
129 std::optional<NonNullPointerSet> NonNullPointers;
130 // This is an extension of the above LatticeElements, caching, for each
131 // Value, a ValueLatticeElement, for each predecessor of the BB tracked by
132 // this entry.
133 std::optional<PredecessorValueLatticeMap> PredecessorLatticeElements;
134 };
135
136 /// Cached information per basic block, indexed by block number.
138 /// Set of value handles used to erase values from the cache on deletion.
139 DenseSet<LVIValueHandle, DenseMapInfo<Value *>> ValueHandles;
140 /// Block number epoch on construction.
141 unsigned BlockNumberEpoch;
142
143 const BlockCacheEntry *getBlockEntry(BasicBlock *BB) const {
144 assert(BlockNumberEpoch == BB->getParent()->getBlockNumberEpoch());
145 if (BB->getNumber() < BlockCache.size())
146 return BlockCache[BB->getNumber()].get();
147 return nullptr;
148 }
149
150 BlockCacheEntry *getOrCreateBlockEntry(BasicBlock *BB) {
151 assert(BlockNumberEpoch == BB->getParent()->getBlockNumberEpoch());
152 unsigned Number = BB->getNumber();
153 if (Number >= BlockCache.size())
154 BlockCache.resize(BB->getParent()->getMaxBlockNumber());
155
156 if (BlockCacheEntry *Entry = BlockCache[Number].get())
157 return Entry;
158
159 BlockCache[Number] = std::make_unique<BlockCacheEntry>();
160 if (PerPredRanges)
161 BlockCache[Number]->PredecessorLatticeElements =
162 std::make_optional<PredecessorValueLatticeMap>();
163
164 return BlockCache[Number].get();
165 }
166
167 void addValueHandle(Value *Val) {
168 auto HandleIt = ValueHandles.find_as(Val);
169 if (HandleIt == ValueHandles.end())
170 ValueHandles.insert({Val, this});
171 }
172
173public:
174 LazyValueInfoCache(const Function *F)
175 : BlockNumberEpoch(F->getBlockNumberEpoch()) {}
176
177 void insertResult(Value *Val, BasicBlock *BB,
178 const ValueLatticeElement &Result) {
179 BlockCacheEntry *Entry = getOrCreateBlockEntry(BB);
180
181 // Insert over-defined values into their own cache to reduce memory
182 // overhead.
183 if (Result.isOverdefined())
184 Entry->OverDefined.insert(Val);
185 else
186 Entry->LatticeElements.insert({Val, Result});
187
188 addValueHandle(Val);
189 }
190
191 void insertPredecessorResults(Value *Val, BasicBlock *BB,
192 BBLatticeElementMap &PredLatticeElements) {
193 BlockCacheEntry *Entry = getOrCreateBlockEntry(BB);
194
195 Entry->PredecessorLatticeElements->insert({Val, PredLatticeElements});
196
197 addValueHandle(Val);
198 }
199
200 std::optional<BBLatticeElementMap>
201 getCachedPredecessorInfo(Value *V, BasicBlock *BB) const {
202 const BlockCacheEntry *Entry = getBlockEntry(BB);
203 if (!Entry)
204 return std::nullopt;
205
206 auto LatticeIt = Entry->PredecessorLatticeElements->find_as(V);
207 if (LatticeIt == Entry->PredecessorLatticeElements->end())
208 return std::nullopt;
209
210 return LatticeIt->second;
211 }
212
213 std::optional<ValueLatticeElement> getCachedValueInfo(Value *V,
214 BasicBlock *BB) const {
215 const BlockCacheEntry *Entry = getBlockEntry(BB);
216 if (!Entry)
217 return std::nullopt;
218
219 if (Entry->OverDefined.count(V))
221
222 auto LatticeIt = Entry->LatticeElements.find_as(V);
223 if (LatticeIt == Entry->LatticeElements.end())
224 return std::nullopt;
225
226 return LatticeIt->second;
227 }
228
229 bool
230 isNonNullAtEndOfBlock(Value *V, BasicBlock *BB,
231 function_ref<NonNullPointerSet(BasicBlock *)> InitFn) {
232 BlockCacheEntry *Entry = getOrCreateBlockEntry(BB);
233 if (!Entry->NonNullPointers) {
234 Entry->NonNullPointers = InitFn(BB);
235 for (Value *V : *Entry->NonNullPointers)
236 addValueHandle(V);
237 }
238
239 return Entry->NonNullPointers->count(V);
240 }
241
242 /// clear - Empty the cache.
243 void clear() {
244 BlockCache.clear();
245 ValueHandles.clear();
246 }
247
248 /// Inform the cache that a given value has been deleted.
249 void eraseValue(Value *V);
250
251 /// This is part of the update interface to inform the cache
252 /// that a block has been deleted.
253 void eraseBlock(BasicBlock *BB);
254
255 /// Updates the cache to remove any influence an overdefined value in
256 /// OldSucc might have (unless also overdefined in NewSucc). This just
257 /// flushes elements from the cache and does not add any.
258 void threadEdgeImpl(BasicBlock *OldSucc, BasicBlock *NewSucc);
259};
260} // namespace
261
262void LazyValueInfoCache::eraseValue(Value *V) {
263 for (auto &Elem : BlockCache) {
264 if (!Elem)
265 continue;
266
267 Elem->LatticeElements.erase(V);
268 Elem->OverDefined.erase(V);
269 if (Elem->NonNullPointers)
270 Elem->NonNullPointers->erase(V);
271 if (PerPredRanges)
272 Elem->PredecessorLatticeElements->erase(V);
273 }
274
275 auto HandleIt = ValueHandles.find_as(V);
276 if (HandleIt != ValueHandles.end())
277 ValueHandles.erase(HandleIt);
278}
279
280void LVIValueHandle::deleted() {
281 // This erasure deallocates *this, so it MUST happen after we're done
282 // using any and all members of *this.
283 Parent->eraseValue(*this);
284}
285
286void LazyValueInfoCache::eraseBlock(BasicBlock *BB) {
287 assert(BlockNumberEpoch == BB->getParent()->getBlockNumberEpoch());
288 // Clear all when a BB is removed.
289 if (PerPredRanges)
290 for (auto &Elem : BlockCache)
291 if (Elem)
292 Elem->PredecessorLatticeElements->clear();
293 if (BB->getNumber() < BlockCache.size())
294 BlockCache[BB->getNumber()].reset();
295}
296
297void LazyValueInfoCache::threadEdgeImpl(BasicBlock *OldSucc,
298 BasicBlock *NewSucc) {
299 // When an edge in the graph has been threaded, values that we could not
300 // determine a value for before (i.e. were marked overdefined) may be
301 // possible to solve now. We do NOT try to proactively update these values.
302 // Instead, we clear their entries from the cache, and allow lazy updating to
303 // recompute them when needed.
304
305 // The updating process is fairly simple: we need to drop cached info
306 // for all values that were marked overdefined in OldSucc, and for those same
307 // values in any successor of OldSucc (except NewSucc) in which they were
308 // also marked overdefined.
309 std::vector<BasicBlock*> worklist;
310 worklist.push_back(OldSucc);
311
312 const BlockCacheEntry *Entry = getBlockEntry(OldSucc);
313 if (!Entry || Entry->OverDefined.empty())
314 return; // Nothing to process here.
315 SmallVector<Value *, 4> ValsToClear(Entry->OverDefined.begin(),
316 Entry->OverDefined.end());
317
318 // Use a worklist to perform a depth-first search of OldSucc's successors.
319 // NOTE: We do not need a visited list since any blocks we have already
320 // visited will have had their overdefined markers cleared already, and we
321 // thus won't loop to their successors.
322 while (!worklist.empty()) {
323 BasicBlock *ToUpdate = worklist.back();
324 worklist.pop_back();
325
326 // Skip blocks only accessible through NewSucc.
327 if (ToUpdate == NewSucc) continue;
328
329 // If a value was marked overdefined in OldSucc, and is here too...
330 BlockCacheEntry *WorklistEntry =
331 ToUpdate->getNumber() < BlockCache.size()
332 ? BlockCache[ToUpdate->getNumber()].get()
333 : nullptr;
334 if (!WorklistEntry || WorklistEntry->OverDefined.empty())
335 continue;
336 auto &ValueSet = WorklistEntry->OverDefined;
337
338 bool changed = false;
339 for (Value *V : ValsToClear) {
340 if (!ValueSet.erase(V))
341 continue;
342
343 // If we removed anything, then we potentially need to update
344 // blocks successors too.
345 changed = true;
346 }
347
348 if (!changed) continue;
349
350 llvm::append_range(worklist, successors(ToUpdate));
351 }
352}
353
354namespace llvm {
355namespace {
356/// An assembly annotator class to print LazyValueCache information in
357/// comments.
358class LazyValueInfoAnnotatedWriter : public AssemblyAnnotationWriter {
359 LazyValueInfoImpl *LVIImpl;
360 // While analyzing which blocks we can solve values for, we need the dominator
361 // information.
362 DominatorTree &DT;
363
364public:
365 LazyValueInfoAnnotatedWriter(LazyValueInfoImpl *L, DominatorTree &DTree)
366 : LVIImpl(L), DT(DTree) {}
367
368 void emitBasicBlockStartAnnot(const BasicBlock *BB,
369 formatted_raw_ostream &OS) override;
370
371 void emitInstructionAnnot(const Instruction *I,
372 formatted_raw_ostream &OS) override;
373};
374} // namespace
375// The actual implementation of the lazy analysis and update.
377
378 /// Cached results from previous queries
379 LazyValueInfoCache TheCache;
380
381 /// This stack holds the state of the value solver during a query.
382 /// It basically emulates the callstack of the naive
383 /// recursive value lookup process.
385
386 /// Keeps track of which block-value pairs are in BlockValueStack.
388
389 /// Push BV onto BlockValueStack unless it's already in there.
390 /// Returns true on success.
391 bool pushBlockValue(const std::pair<BasicBlock *, Value *> &BV) {
392 if (!BlockValueSet.insert(BV).second)
393 return false; // It's already in the stack.
394
395 LLVM_DEBUG(dbgs() << "PUSH: " << *BV.second << " in "
396 << BV.first->getName() << "\n");
397 BlockValueStack.push_back(BV);
398 return true;
399 }
400
401 AssumptionCache *AC; ///< A pointer to the cache of @llvm.assume calls.
402 const DataLayout &DL; ///< A mandatory DataLayout
403
404 /// Declaration of the llvm.experimental.guard() intrinsic,
405 /// if it exists in the module.
406 Function *GuardDecl;
407
408 std::optional<ValueLatticeElement> getBlockValue(Value *Val, BasicBlock *BB,
409 Instruction *CxtI);
410 std::optional<ValueLatticeElement> getEdgeValue(Value *V, BasicBlock *F,
411 BasicBlock *T,
412 Instruction *CxtI = nullptr);
413
414 // These methods process one work item and may add more. A false value
415 // returned means that the work item was not completely processed and must
416 // be revisited after going through the new items.
417 bool solveBlockValue(Value *Val, BasicBlock *BB);
418 std::optional<ValueLatticeElement> solveBlockValueImpl(Value *Val,
419 BasicBlock *BB);
420 std::optional<ValueLatticeElement> solveBlockValueNonLocal(Value *Val,
421 BasicBlock *BB);
422 std::optional<ValueLatticeElement> solveBlockValuePHINode(PHINode *PN,
423 BasicBlock *BB);
424 std::optional<ValueLatticeElement> solveBlockValueSelect(SelectInst *S,
425 BasicBlock *BB);
426 std::optional<ConstantRange> getRangeFor(Value *V, Instruction *CxtI,
427 BasicBlock *BB);
428 std::optional<ValueLatticeElement> solveBlockValueBinaryOpImpl(
430 std::function<ConstantRange(const ConstantRange &, const ConstantRange &)>
431 OpFn);
432 std::optional<ValueLatticeElement>
433 solveBlockValueBinaryOp(BinaryOperator *BBI, BasicBlock *BB);
434 std::optional<ValueLatticeElement> solveBlockValueCast(CastInst *CI,
435 BasicBlock *BB);
436 std::optional<ValueLatticeElement>
437 solveBlockValueOverflowIntrinsic(WithOverflowInst *WO, BasicBlock *BB);
438 std::optional<ValueLatticeElement> solveBlockValueIntrinsic(IntrinsicInst *II,
439 BasicBlock *BB);
440 std::optional<ValueLatticeElement>
441 solveBlockValueInsertElement(InsertElementInst *IEI, BasicBlock *BB);
442 std::optional<ValueLatticeElement>
443 solveBlockValueExtractValue(ExtractValueInst *EVI, BasicBlock *BB);
444 bool isNonNullAtEndOfBlock(Value *Val, BasicBlock *BB);
445 void intersectAssumeOrGuardBlockValueConstantRange(Value *Val,
447 Instruction *BBI);
448
449 void solve();
450
451 // For the following methods, if UseBlockValue is true, the function may
452 // push additional values to the worklist and return nullopt. If
453 // UseBlockValue is false, it will never return nullopt.
454
455 std::optional<ValueLatticeElement>
456 getValueFromSimpleICmpCondition(CmpInst::Predicate Pred, Value *RHS,
457 const APInt &Offset, Instruction *CxtI,
458 bool UseBlockValue);
459
460 std::optional<ValueLatticeElement>
461 getValueFromICmpCondition(Value *Val, ICmpInst *ICI, bool isTrueDest,
462 bool UseBlockValue);
463 ValueLatticeElement getValueFromTrunc(Value *Val, TruncInst *Trunc,
464 bool IsTrueDest);
465
466 std::optional<ValueLatticeElement>
467 getValueFromCondition(Value *Val, Value *Cond, bool IsTrueDest,
468 bool UseBlockValue, unsigned Depth = 0);
469
470 std::optional<ValueLatticeElement> getEdgeValueLocal(Value *Val,
471 BasicBlock *BBFrom,
472 BasicBlock *BBTo,
473 bool UseBlockValue);
474
475public:
476 /// This is the query interface to determine the lattice value for the
477 /// specified Value* at the context instruction (if specified) or at the
478 /// start of the block.
480 Instruction *CxtI = nullptr);
481
482 /// This is the query interface to determine the lattice value for the
483 /// specified Value* at the specified instruction using only information
484 /// from assumes/guards and range metadata. Unlike getValueInBlock(), no
485 /// recursive query is performed.
487
488 /// This is the query interface to determine the lattice
489 /// value for the specified Value* that is true on the specified edge.
491 BasicBlock *ToBB,
492 Instruction *CxtI = nullptr);
493
495
496 /// Complete flush all previously computed values
497 void clear() {
498 TheCache.clear();
499 }
500
501 /// Printing the LazyValueInfo Analysis.
503 LazyValueInfoAnnotatedWriter Writer(this, DTree);
504 F.print(OS, &Writer);
505 }
506
507 /// This is part of the update interface to remove information related to this
508 /// value from the cache.
509 void forgetValue(Value *V) { TheCache.eraseValue(V); }
510
511 /// This is part of the update interface to inform the cache
512 /// that a block has been deleted.
514 TheCache.eraseBlock(BB);
515 }
516
517 /// This is the update interface to inform the cache that an edge from
518 /// PredBB to OldSucc has been threaded to be from PredBB to NewSucc.
519 void threadEdge(BasicBlock *PredBB,BasicBlock *OldSucc,BasicBlock *NewSucc);
520
522 Function *GuardDecl)
523 : TheCache(F), AC(AC), DL(DL), GuardDecl(GuardDecl) {}
524};
525} // namespace llvm
526
527void LazyValueInfoImpl::solve() {
529 BlockValueStack;
530
531 unsigned processedCount = 0;
532 while (!BlockValueStack.empty()) {
533 processedCount++;
534 // Abort if we have to process too many values to get a result for this one.
535 // Because of the design of the overdefined cache currently being per-block
536 // to avoid naming-related issues (IE it wants to try to give different
537 // results for the same name in different blocks), overdefined results don't
538 // get cached globally, which in turn means we will often try to rediscover
539 // the same overdefined result again and again. Once something like
540 // PredicateInfo is used in LVI or CVP, we should be able to make the
541 // overdefined cache global, and remove this throttle.
542 if (processedCount > MaxProcessedPerValue) {
544 dbgs() << "Giving up on stack because we are getting too deep\n");
545 // Fill in the original values
546 while (!StartingStack.empty()) {
547 std::pair<BasicBlock *, Value *> &e = StartingStack.back();
548 TheCache.insertResult(e.second, e.first,
550 StartingStack.pop_back();
551 }
552 BlockValueSet.clear();
553 BlockValueStack.clear();
554 return;
555 }
556 std::pair<BasicBlock *, Value *> e = BlockValueStack.back();
557 assert(BlockValueSet.count(e) && "Stack value should be in BlockValueSet!");
558 unsigned StackSize = BlockValueStack.size();
559 (void) StackSize;
560
561 if (solveBlockValue(e.second, e.first)) {
562 // The work item was completely processed.
563 assert(BlockValueStack.size() == StackSize &&
564 BlockValueStack.back() == e && "Nothing should have been pushed!");
565#ifndef NDEBUG
566 std::optional<ValueLatticeElement> BBLV =
567 TheCache.getCachedValueInfo(e.second, e.first);
568 assert(BBLV && "Result should be in cache!");
570 dbgs() << "POP " << *e.second << " in " << e.first->getName() << " = "
571 << *BBLV << "\n");
572#endif
573
574 BlockValueStack.pop_back();
575 BlockValueSet.erase(e);
576 } else {
577 // More work needs to be done before revisiting.
578 assert(BlockValueStack.size() == StackSize + 1 &&
579 "Exactly one element should have been pushed!");
580 }
581 }
582}
583
584std::optional<ValueLatticeElement>
585LazyValueInfoImpl::getBlockValue(Value *Val, BasicBlock *BB,
586 Instruction *CxtI) {
587 // If already a constant, there is nothing to compute.
588 if (Constant *VC = dyn_cast<Constant>(Val))
589 return ValueLatticeElement::get(VC);
590
591 if (std::optional<ValueLatticeElement> OptLatticeVal =
592 TheCache.getCachedValueInfo(Val, BB)) {
593 intersectAssumeOrGuardBlockValueConstantRange(Val, *OptLatticeVal, CxtI);
594 return OptLatticeVal;
595 }
596
597 // We have hit a cycle, assume overdefined.
598 if (!pushBlockValue({ BB, Val }))
600
601 // Yet to be resolved.
602 return std::nullopt;
603}
604
606 switch (BBI->getOpcode()) {
607 default:
608 break;
609 case Instruction::Call:
610 case Instruction::Invoke:
611 if (std::optional<ConstantRange> Range = cast<CallBase>(BBI)->getRange())
613 [[fallthrough]];
614 case Instruction::Load:
615 if (MDNode *Ranges = BBI->getMetadata(LLVMContext::MD_range))
616 if (isa<IntegerType>(BBI->getType())) {
619 }
620 break;
621 };
622 // Nothing known - will be intersected with other facts
624}
625
626bool LazyValueInfoImpl::solveBlockValue(Value *Val, BasicBlock *BB) {
627 assert(!isa<Constant>(Val) && "Value should not be constant");
628 assert(!TheCache.getCachedValueInfo(Val, BB) &&
629 "Value should not be in cache");
630
631 // Hold off inserting this value into the Cache in case we have to return
632 // false and come back later.
633 std::optional<ValueLatticeElement> Res = solveBlockValueImpl(Val, BB);
634 if (!Res)
635 // Work pushed, will revisit
636 return false;
637
638 TheCache.insertResult(Val, BB, *Res);
639 return true;
640}
641
642std::optional<ValueLatticeElement>
643LazyValueInfoImpl::solveBlockValueImpl(Value *Val, BasicBlock *BB) {
645 if (!BBI || BBI->getParent() != BB)
646 return solveBlockValueNonLocal(Val, BB);
647
648 if (PHINode *PN = dyn_cast<PHINode>(BBI))
649 return solveBlockValuePHINode(PN, BB);
650
651 if (auto *SI = dyn_cast<SelectInst>(BBI))
652 return solveBlockValueSelect(SI, BB);
653
654 // If this value is a nonnull pointer, record it's range and bailout. Note
655 // that for all other pointer typed values, we terminate the search at the
656 // definition. We could easily extend this to look through geps, bitcasts,
657 // and the like to prove non-nullness, but it's not clear that's worth it
658 // compile time wise. The context-insensitive value walk done inside
659 // isKnownNonZero gets most of the profitable cases at much less expense.
660 // This does mean that we have a sensitivity to where the defining
661 // instruction is placed, even if it could legally be hoisted much higher.
662 // That is unfortunate.
664 if (PT && isKnownNonZero(BBI, DL))
666
667 if (BBI->getType()->isIntOrIntVectorTy()) {
668 if (auto *CI = dyn_cast<CastInst>(BBI))
669 return solveBlockValueCast(CI, BB);
670
671 if (BinaryOperator *BO = dyn_cast<BinaryOperator>(BBI))
672 return solveBlockValueBinaryOp(BO, BB);
673
674 if (auto *IEI = dyn_cast<InsertElementInst>(BBI))
675 return solveBlockValueInsertElement(IEI, BB);
676
677 if (auto *EVI = dyn_cast<ExtractValueInst>(BBI))
678 return solveBlockValueExtractValue(EVI, BB);
679
680 if (auto *II = dyn_cast<IntrinsicInst>(BBI))
681 return solveBlockValueIntrinsic(II, BB);
682 }
683
684 LLVM_DEBUG(dbgs() << " compute BB '" << BB->getName()
685 << "' - unknown inst def found.\n");
686 return getFromRangeMetadata(BBI);
687}
688
689static void AddNonNullPointer(Value *Ptr, NonNullPointerSet &PtrSet,
690 bool IsDereferenced = true) {
691 // TODO: Use NullPointerIsDefined instead.
692 if (Ptr->getType()->getPointerAddressSpace() == 0)
693 PtrSet.insert(IsDereferenced ? getUnderlyingObject(Ptr)
694 : Ptr->stripInBoundsOffsets());
695}
696
698 Instruction *I, NonNullPointerSet &PtrSet) {
699 if (LoadInst *L = dyn_cast<LoadInst>(I)) {
700 AddNonNullPointer(L->getPointerOperand(), PtrSet);
701 } else if (StoreInst *S = dyn_cast<StoreInst>(I)) {
702 AddNonNullPointer(S->getPointerOperand(), PtrSet);
703 } else if (MemIntrinsic *MI = dyn_cast<MemIntrinsic>(I)) {
704 if (MI->isVolatile()) return;
705
706 // FIXME: check whether it has a valuerange that excludes zero?
707 ConstantInt *Len = dyn_cast<ConstantInt>(MI->getLength());
708 if (!Len || Len->isZero()) return;
709
710 AddNonNullPointer(MI->getRawDest(), PtrSet);
712 AddNonNullPointer(MTI->getRawSource(), PtrSet);
713 } else if (auto *CB = dyn_cast<CallBase>(I)) {
714 for (auto &U : CB->args()) {
715 if (U->getType()->isPointerTy() &&
716 CB->paramHasNonNullAttr(CB->getArgOperandNo(&U),
717 /*AllowUndefOrPoison=*/false))
718 AddNonNullPointer(U.get(), PtrSet, /*IsDereferenced=*/false);
719 }
720 }
721}
722
723bool LazyValueInfoImpl::isNonNullAtEndOfBlock(Value *Val, BasicBlock *BB) {
726 return false;
727
728 Val = Val->stripInBoundsOffsets();
729 return TheCache.isNonNullAtEndOfBlock(Val, BB, [](BasicBlock *BB) {
730 NonNullPointerSet NonNullPointers;
731 for (Instruction &I : *BB)
732 AddNonNullPointersByInstruction(&I, NonNullPointers);
733 return NonNullPointers;
734 });
735}
736
737std::optional<ValueLatticeElement>
738LazyValueInfoImpl::solveBlockValueNonLocal(Value *Val, BasicBlock *BB) {
739 ValueLatticeElement Result; // Start Undefined.
740
741 // If this is the entry block, we must be asking about an argument.
742 if (BB->isEntryBlock()) {
743 assert(isa<Argument>(Val) && "Unknown live-in to the entry block");
744 if (std::optional<ConstantRange> Range = cast<Argument>(Val)->getRange())
747 }
748
749 // Loop over all of our predecessors, merging what we know from them into
750 // result. If we encounter an unexplored predecessor, we eagerly explore it
751 // in a depth first manner. In practice, this has the effect of discovering
752 // paths we can't analyze eagerly without spending compile times analyzing
753 // other paths. This heuristic benefits from the fact that predecessors are
754 // frequently arranged such that dominating ones come first and we quickly
755 // find a path to function entry. TODO: We should consider explicitly
756 // canonicalizing to make this true rather than relying on this happy
757 // accident.
758 std::optional<BBLatticeElementMap> PredLatticeElements;
759 if (PerPredRanges)
760 PredLatticeElements = std::make_optional<BBLatticeElementMap>();
761 for (BasicBlock *Pred : predecessors(BB)) {
762 // Skip self loops.
763 if (Pred == BB)
764 continue;
765 std::optional<ValueLatticeElement> EdgeResult = getEdgeValue(Val, Pred, BB);
766 if (!EdgeResult)
767 // Explore that input, then return here
768 return std::nullopt;
769
770 Result.mergeIn(*EdgeResult);
771
772 // If we hit overdefined, exit early. The BlockVals entry is already set
773 // to overdefined.
774 if (Result.isOverdefined()) {
775 LLVM_DEBUG(dbgs() << " compute BB '" << BB->getName()
776 << "' - overdefined because of pred '"
777 << Pred->getName() << "' (non local).\n");
778 return Result;
779 }
780 if (PerPredRanges)
781 PredLatticeElements->insert({Pred, *EdgeResult});
782 }
783
784 if (PerPredRanges)
785 TheCache.insertPredecessorResults(Val, BB, *PredLatticeElements);
786
787 // Return the merged value, which is more precise than 'overdefined'.
788 assert(!Result.isOverdefined());
789 return Result;
790}
791
792std::optional<ValueLatticeElement>
793LazyValueInfoImpl::solveBlockValuePHINode(PHINode *PN, BasicBlock *BB) {
794 ValueLatticeElement Result; // Start Undefined.
795
796 // Loop over all of our predecessors, merging what we know from them into
797 // result. See the comment about the chosen traversal order in
798 // solveBlockValueNonLocal; the same reasoning applies here.
799 std::optional<BBLatticeElementMap> PredLatticeElements;
800 if (PerPredRanges)
801 PredLatticeElements = std::make_optional<BBLatticeElementMap>();
802 for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i) {
803 BasicBlock *PhiBB = PN->getIncomingBlock(i);
804 Value *PhiVal = PN->getIncomingValue(i);
805 // Note that we can provide PN as the context value to getEdgeValue, even
806 // though the results will be cached, because PN is the value being used as
807 // the cache key in the caller.
808 std::optional<ValueLatticeElement> EdgeResult =
809 getEdgeValue(PhiVal, PhiBB, BB, PN);
810 if (!EdgeResult)
811 // Explore that input, then return here
812 return std::nullopt;
813
814 Result.mergeIn(*EdgeResult);
815
816 // If we hit overdefined, exit early. The BlockVals entry is already set
817 // to overdefined.
818 if (Result.isOverdefined()) {
819 LLVM_DEBUG(dbgs() << " compute BB '" << BB->getName()
820 << "' - overdefined because of pred (local).\n");
821
822 return Result;
823 }
824
825 if (PerPredRanges)
826 PredLatticeElements->insert({PhiBB, *EdgeResult});
827 }
828
829 if (PerPredRanges)
830 TheCache.insertPredecessorResults(PN, BB, *PredLatticeElements);
831
832 // Return the merged value, which is more precise than 'overdefined'.
833 assert(!Result.isOverdefined() && "Possible PHI in entry block?");
834 return Result;
835}
836
837// If we can determine a constraint on the value given conditions assumed by
838// the program, intersect those constraints with BBLV
839void LazyValueInfoImpl::intersectAssumeOrGuardBlockValueConstantRange(
840 Value *Val, ValueLatticeElement &BBLV, Instruction *BBI) {
841 BBI = BBI ? BBI : dyn_cast<Instruction>(Val);
842 if (!BBI)
843 return;
844
845 BasicBlock *BB = BBI->getParent();
846 for (auto &AssumeVH : AC->assumptionsFor(Val)) {
847 if (!AssumeVH)
848 continue;
849
850 // Only check assumes in the block of the context instruction. Other
851 // assumes will have already been taken into account when the value was
852 // propagated from predecessor blocks.
853 auto *I = cast<AssumeInst>(AssumeVH);
854
855 if (I->getParent() != BB || !isValidAssumeForContext(I, BBI))
856 continue;
857
858 if (AssumeVH.Index != AssumptionCache::ExprResultIdx) {
860 I->getOperandBundleAt(AssumeVH.Index)))
863 } else {
864 BBLV = BBLV.intersect(*getValueFromCondition(Val, I->getArgOperand(0),
865 /*IsTrueDest*/ true,
866 /*UseBlockValue*/ false));
867 }
868 }
869
870 // If guards are not used in the module, don't spend time looking for them
871 if (GuardDecl && !GuardDecl->use_empty() &&
872 BBI->getIterator() != BB->begin()) {
873 for (Instruction &I :
874 make_range(std::next(BBI->getIterator().getReverse()), BB->rend())) {
875 Value *Cond = nullptr;
877 BBLV = BBLV.intersect(*getValueFromCondition(Val, Cond,
878 /*IsTrueDest*/ true,
879 /*UseBlockValue*/ false));
880 }
881 }
882
883 if (BBLV.isOverdefined()) {
884 // Check whether we're checking at the terminator, and the pointer has
885 // been dereferenced in this block.
887 if (PTy && BB->getTerminator() == BBI &&
888 isNonNullAtEndOfBlock(Val, BB))
890 }
891}
892
893std::optional<ValueLatticeElement>
894LazyValueInfoImpl::solveBlockValueSelect(SelectInst *SI, BasicBlock *BB) {
895 // Recurse on our inputs if needed
896 std::optional<ValueLatticeElement> OptTrueVal =
897 getBlockValue(SI->getTrueValue(), BB, SI);
898 if (!OptTrueVal)
899 return std::nullopt;
900 ValueLatticeElement &TrueVal = *OptTrueVal;
901
902 std::optional<ValueLatticeElement> OptFalseVal =
903 getBlockValue(SI->getFalseValue(), BB, SI);
904 if (!OptFalseVal)
905 return std::nullopt;
906 ValueLatticeElement &FalseVal = *OptFalseVal;
907
908 if (TrueVal.isConstantRange() || FalseVal.isConstantRange()) {
909 const ConstantRange &TrueCR = TrueVal.asConstantRange(SI->getType());
910 const ConstantRange &FalseCR = FalseVal.asConstantRange(SI->getType());
911 Value *LHS = nullptr;
912 Value *RHS = nullptr;
913 SelectPatternResult SPR = matchSelectPattern(SI, LHS, RHS);
914 // Is this a min specifically of our two inputs? (Avoid the risk of
915 // ValueTracking getting smarter looking back past our immediate inputs.)
917 ((LHS == SI->getTrueValue() && RHS == SI->getFalseValue()) ||
918 (RHS == SI->getTrueValue() && LHS == SI->getFalseValue()))) {
919 ConstantRange ResultCR = [&]() {
920 switch (SPR.Flavor) {
921 default:
922 llvm_unreachable("unexpected minmax type!");
923 case SPF_SMIN: /// Signed minimum
924 return TrueCR.smin(FalseCR);
925 case SPF_UMIN: /// Unsigned minimum
926 return TrueCR.umin(FalseCR);
927 case SPF_SMAX: /// Signed maximum
928 return TrueCR.smax(FalseCR);
929 case SPF_UMAX: /// Unsigned maximum
930 return TrueCR.umax(FalseCR);
931 };
932 }();
934 ResultCR, TrueVal.isConstantRangeIncludingUndef() ||
935 FalseVal.isConstantRangeIncludingUndef());
936 }
937
938 if (SPR.Flavor == SPF_ABS) {
939 if (LHS == SI->getTrueValue())
941 TrueCR.abs(), TrueVal.isConstantRangeIncludingUndef());
942 if (LHS == SI->getFalseValue())
944 FalseCR.abs(), FalseVal.isConstantRangeIncludingUndef());
945 }
946
947 if (SPR.Flavor == SPF_NABS) {
948 ConstantRange Zero(APInt::getZero(TrueCR.getBitWidth()));
949 if (LHS == SI->getTrueValue())
951 Zero.sub(TrueCR.abs()), FalseVal.isConstantRangeIncludingUndef());
952 if (LHS == SI->getFalseValue())
954 Zero.sub(FalseCR.abs()), FalseVal.isConstantRangeIncludingUndef());
955 }
956 }
957
958 // Can we constrain the facts about the true and false values by using the
959 // condition itself? This shows up with idioms like e.g. select(a > 5, a, 5).
960 // TODO: We could potentially refine an overdefined true value above.
961 Value *Cond = SI->getCondition();
962 // If the value is undef, a different value may be chosen in
963 // the select condition.
965 TrueVal =
966 TrueVal.intersect(*getValueFromCondition(SI->getTrueValue(), Cond,
967 /*IsTrueDest*/ true,
968 /*UseBlockValue*/ false));
969 FalseVal =
970 FalseVal.intersect(*getValueFromCondition(SI->getFalseValue(), Cond,
971 /*IsTrueDest*/ false,
972 /*UseBlockValue*/ false));
973 }
974
975 TrueVal.mergeIn(FalseVal);
976 return TrueVal;
977}
978
979std::optional<ConstantRange>
980LazyValueInfoImpl::getRangeFor(Value *V, Instruction *CxtI, BasicBlock *BB) {
981 std::optional<ValueLatticeElement> OptVal = getBlockValue(V, BB, CxtI);
982 if (!OptVal)
983 return std::nullopt;
984 return OptVal->asConstantRange(V->getType());
985}
986
987std::optional<ValueLatticeElement>
988LazyValueInfoImpl::solveBlockValueCast(CastInst *CI, BasicBlock *BB) {
989 // Filter out casts we don't know how to reason about before attempting to
990 // recurse on our operand. This can cut a long search short if we know we're
991 // not going to be able to get any useful information anways.
992 switch (CI->getOpcode()) {
993 case Instruction::Trunc:
994 case Instruction::SExt:
995 case Instruction::ZExt:
996 break;
997 default:
998 // Unhandled instructions are overdefined.
999 LLVM_DEBUG(dbgs() << " compute BB '" << BB->getName()
1000 << "' - overdefined (unknown cast).\n");
1002 }
1003
1004 // Figure out the range of the LHS. If that fails, we still apply the
1005 // transfer rule on the full set since we may be able to locally infer
1006 // interesting facts.
1007 std::optional<ConstantRange> LHSRes = getRangeFor(CI->getOperand(0), CI, BB);
1008 if (!LHSRes)
1009 // More work to do before applying this transfer rule.
1010 return std::nullopt;
1011 const ConstantRange &LHSRange = *LHSRes;
1012
1013 const unsigned ResultBitWidth = CI->getType()->getScalarSizeInBits();
1014
1015 // NOTE: We're currently limited by the set of operations that ConstantRange
1016 // can evaluate symbolically. Enhancing that set will allows us to analyze
1017 // more definitions.
1018 ConstantRange Res = ConstantRange::getEmpty(ResultBitWidth);
1019 if (auto *Trunc = dyn_cast<TruncInst>(CI))
1020 Res = LHSRange.truncate(ResultBitWidth, Trunc->getNoWrapKind());
1021 else
1022 Res = LHSRange.castOp(CI->getOpcode(), ResultBitWidth);
1023
1025}
1026
1027std::optional<ValueLatticeElement>
1028LazyValueInfoImpl::solveBlockValueBinaryOpImpl(
1029 Instruction *I, BasicBlock *BB,
1030 std::function<ConstantRange(const ConstantRange &, const ConstantRange &)>
1031 OpFn) {
1032 Value *LHS = I->getOperand(0);
1033 Value *RHS = I->getOperand(1);
1034
1035 auto ThreadBinOpOverSelect =
1036 [&](Value *X, const ConstantRange &CRX, SelectInst *Y,
1037 bool XIsLHS) -> std::optional<ValueLatticeElement> {
1038 Value *Cond = Y->getCondition();
1039 // Only handle selects with constant values.
1040 Constant *TrueC = dyn_cast<Constant>(Y->getTrueValue());
1041 if (!TrueC)
1042 return std::nullopt;
1043 Constant *FalseC = dyn_cast<Constant>(Y->getFalseValue());
1044 if (!FalseC)
1045 return std::nullopt;
1047 return std::nullopt;
1048
1049 ConstantRange TrueX =
1050 CRX.intersectWith(getValueFromCondition(X, Cond, /*CondIsTrue=*/true,
1051 /*UseBlockValue=*/false)
1052 ->asConstantRange(X->getType()));
1053 ConstantRange FalseX =
1054 CRX.intersectWith(getValueFromCondition(X, Cond, /*CondIsTrue=*/false,
1055 /*UseBlockValue=*/false)
1056 ->asConstantRange(X->getType()));
1057 ConstantRange TrueY = TrueC->toConstantRange();
1058 ConstantRange FalseY = FalseC->toConstantRange();
1059
1060 if (XIsLHS)
1062 OpFn(TrueX, TrueY).unionWith(OpFn(FalseX, FalseY)));
1064 OpFn(TrueY, TrueX).unionWith(OpFn(FalseY, FalseX)));
1065 };
1066
1067 // Figure out the ranges of the operands. If that fails, use a
1068 // conservative range, but apply the transfer rule anyways. This
1069 // lets us pick up facts from expressions like "and i32 (call i32
1070 // @foo()), 32"
1071 std::optional<ConstantRange> LHSRes = getRangeFor(LHS, I, BB);
1072 if (!LHSRes)
1073 return std::nullopt;
1074
1075 // Try to thread binop over rhs select
1076 if (auto *SI = dyn_cast<SelectInst>(RHS)) {
1077 if (auto Res = ThreadBinOpOverSelect(LHS, *LHSRes, SI, /*XIsLHS=*/true))
1078 return *Res;
1079 }
1080
1081 std::optional<ConstantRange> RHSRes = getRangeFor(RHS, I, BB);
1082 if (!RHSRes)
1083 return std::nullopt;
1084
1085 // Try to thread binop over lhs select
1086 if (auto *SI = dyn_cast<SelectInst>(LHS)) {
1087 if (auto Res = ThreadBinOpOverSelect(RHS, *RHSRes, SI, /*XIsLHS=*/false))
1088 return *Res;
1089 }
1090
1091 const ConstantRange &LHSRange = *LHSRes;
1092 const ConstantRange &RHSRange = *RHSRes;
1093
1094 std::optional<ValueLatticeElement> MergedResult =
1095 ValueLatticeElement::getRange(OpFn(LHSRange, RHSRange));
1096
1097 if (!PerPredRanges)
1098 return MergedResult;
1099
1100 std::optional<BBLatticeElementMap> PredLHS =
1101 TheCache.getCachedPredecessorInfo(LHS, BB);
1102 if (!PredLHS)
1103 return MergedResult;
1104 std::optional<BBLatticeElementMap> PredRHS =
1105 TheCache.getCachedPredecessorInfo(RHS, BB);
1106 if (!PredRHS)
1107 return MergedResult;
1108
1109 const BBLatticeElementMap &LHSPredMap = *PredLHS;
1110 const BBLatticeElementMap &RHSPredMap = *PredRHS;
1111
1112 BBLatticeElementMap PredLatticeElements;
1113 ValueLatticeElement OverallPredResult;
1114 for (auto *Pred : predecessors(BB)) {
1115 auto LHSIt = LHSPredMap.find_as(Pred);
1116 if (LHSIt == LHSPredMap.end())
1117 return MergedResult;
1118 const ValueLatticeElement &LHSFromPred = LHSIt->second;
1119 std::optional<ConstantRange> LHSFromPredRes =
1120 LHSFromPred.asConstantRange(LHS->getType());
1121 if (!LHSFromPredRes)
1122 return MergedResult;
1123
1124 auto RHSIt = RHSPredMap.find_as(Pred);
1125 if (RHSIt == RHSPredMap.end())
1126 return MergedResult;
1127 const ValueLatticeElement &RHSFromPred = RHSIt->second;
1128 std::optional<ConstantRange> RHSFromPredRes =
1129 RHSFromPred.asConstantRange(RHS->getType());
1130 if (!RHSFromPredRes)
1131 return MergedResult;
1132
1133 const ConstantRange &LHSFromPredRange = *LHSFromPredRes;
1134 const ConstantRange &RHSFromPredRange = *RHSFromPredRes;
1135 std::optional<ValueLatticeElement> PredResult =
1136 ValueLatticeElement::getRange(OpFn(LHSFromPredRange, RHSFromPredRange));
1137 if (!PredResult)
1138 return MergedResult;
1139 if (PredResult->isOverdefined()) {
1140 LLVM_DEBUG(
1141 dbgs() << " pred BB '" << Pred->getName() << "' for BB '"
1142 << BB->getName()
1143 << "' overdefined. Discarding all predecessor intervals.\n");
1144 return MergedResult;
1145 }
1146 PredLatticeElements.insert({Pred, *PredResult});
1147 OverallPredResult.mergeIn(*PredResult);
1148 }
1149
1150 // If this point is reached, all predecessors for both LHS and RHS have
1151 // constant ranges previously computed. Can cache result and use the
1152 // OverallPredResult;
1153 TheCache.insertPredecessorResults(I, BB, PredLatticeElements);
1154
1155 LLVM_DEBUG(dbgs() << " Using predecessor intervals, evaluated " << *I
1156 << " to: " << OverallPredResult << ".\n");
1157
1158 if (!MergedResult)
1159 return OverallPredResult;
1160
1161 LLVM_DEBUG(dbgs() << " Intersecting intervals for " << *I << ": "
1162 << OverallPredResult << " and " << MergedResult << ".\n");
1163 return MergedResult->intersect(OverallPredResult);
1164}
1165
1166std::optional<ValueLatticeElement>
1167LazyValueInfoImpl::solveBlockValueBinaryOp(BinaryOperator *BO, BasicBlock *BB) {
1168 assert(BO->getOperand(0)->getType()->isSized() &&
1169 "all operands to binary operators are sized");
1170 if (auto *OBO = dyn_cast<OverflowingBinaryOperator>(BO)) {
1171 unsigned NoWrapKind = OBO->getNoWrapKind();
1172 return solveBlockValueBinaryOpImpl(
1173 BO, BB,
1174 [BO, NoWrapKind](const ConstantRange &CR1, const ConstantRange &CR2) {
1175 return CR1.overflowingBinaryOp(BO->getOpcode(), CR2, NoWrapKind);
1176 });
1177 }
1178
1179 return solveBlockValueBinaryOpImpl(
1180 BO, BB, [BO](const ConstantRange &CR1, const ConstantRange &CR2) {
1181 return CR1.binaryOp(BO->getOpcode(), CR2);
1182 });
1183}
1184
1185std::optional<ValueLatticeElement>
1186LazyValueInfoImpl::solveBlockValueOverflowIntrinsic(WithOverflowInst *WO,
1187 BasicBlock *BB) {
1188 return solveBlockValueBinaryOpImpl(
1189 WO, BB, [WO](const ConstantRange &CR1, const ConstantRange &CR2) {
1190 return CR1.binaryOp(WO->getBinaryOp(), CR2);
1191 });
1192}
1193
1194std::optional<ValueLatticeElement>
1195LazyValueInfoImpl::solveBlockValueIntrinsic(IntrinsicInst *II, BasicBlock *BB) {
1196 ValueLatticeElement MetadataVal = getFromRangeMetadata(II);
1197 if (!ConstantRange::isIntrinsicSupported(II->getIntrinsicID())) {
1198 LLVM_DEBUG(dbgs() << " compute BB '" << BB->getName()
1199 << "' - unknown intrinsic.\n");
1200 return MetadataVal;
1201 }
1202
1204 for (Value *Op : II->args()) {
1205 std::optional<ConstantRange> Range = getRangeFor(Op, II, BB);
1206 if (!Range)
1207 return std::nullopt;
1208 OpRanges.push_back(*Range);
1209 }
1210
1212 ConstantRange::intrinsic(II->getIntrinsicID(), OpRanges))
1213 .intersect(MetadataVal);
1214}
1215
1216std::optional<ValueLatticeElement>
1217LazyValueInfoImpl::solveBlockValueInsertElement(InsertElementInst *IEI,
1218 BasicBlock *BB) {
1219 std::optional<ValueLatticeElement> OptEltVal =
1220 getBlockValue(IEI->getOperand(1), BB, IEI);
1221 if (!OptEltVal)
1222 return std::nullopt;
1223 ValueLatticeElement &Res = *OptEltVal;
1224
1225 std::optional<ValueLatticeElement> OptVecVal =
1226 getBlockValue(IEI->getOperand(0), BB, IEI);
1227 if (!OptVecVal)
1228 return std::nullopt;
1229
1230 // Bail out if the inserted element is a constant expression. Unlike other
1231 // ValueLattice types, these are not considered an implicit splat when a
1232 // vector type is used.
1233 // We could call ConstantFoldInsertElementInstruction here to handle these.
1234 if (OptEltVal->isConstant())
1236
1237 Res.mergeIn(*OptVecVal);
1238 return Res;
1239}
1240
1241std::optional<ValueLatticeElement>
1242LazyValueInfoImpl::solveBlockValueExtractValue(ExtractValueInst *EVI,
1243 BasicBlock *BB) {
1244 if (auto *WO = dyn_cast<WithOverflowInst>(EVI->getAggregateOperand()))
1245 if (EVI->getNumIndices() == 1 && *EVI->idx_begin() == 0)
1246 return solveBlockValueOverflowIntrinsic(WO, BB);
1247
1248 // Handle extractvalue of insertvalue to allow further simplification
1249 // based on replaced with.overflow intrinsics.
1251 EVI->getAggregateOperand(), EVI->getIndices(),
1252 EVI->getDataLayout()))
1253 return getBlockValue(V, BB, EVI);
1254
1255 LLVM_DEBUG(dbgs() << " compute BB '" << BB->getName()
1256 << "' - overdefined (unknown extractvalue).\n");
1258}
1259
1261 ICmpInst::Predicate Pred) {
1262 if (LHS == Val)
1263 return true;
1264
1265 // Handle range checking idiom produced by InstCombine. We will subtract the
1266 // offset from the allowed range for RHS in this case.
1267 const APInt *C;
1268 if (match(LHS, m_AddLike(m_Specific(Val), m_APInt(C)))) {
1269 Offset = *C;
1270 return true;
1271 }
1272
1273 // Handle the symmetric case. This appears in saturation patterns like
1274 // (x == 16) ? 16 : (x + 1).
1275 if (match(Val, m_AddLike(m_Specific(LHS), m_APInt(C)))) {
1276 Offset = -*C;
1277 return true;
1278 }
1279
1280 // If (x | y) < C, then (x < C) && (y < C).
1281 if (match(LHS, m_c_Or(m_Specific(Val), m_Value())) &&
1282 (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_ULE))
1283 return true;
1284
1285 // If (x & y) > C, then (x > C) && (y > C).
1286 if (match(LHS, m_c_And(m_Specific(Val), m_Value())) &&
1287 (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_UGE))
1288 return true;
1289
1290 return false;
1291}
1292
1293/// Get value range for a "(Val + Offset) Pred RHS" condition.
1294std::optional<ValueLatticeElement>
1295LazyValueInfoImpl::getValueFromSimpleICmpCondition(CmpInst::Predicate Pred,
1296 Value *RHS,
1297 const APInt &Offset,
1298 Instruction *CxtI,
1299 bool UseBlockValue) {
1300 ConstantRange RHSRange(RHS->getType()->getScalarSizeInBits(),
1301 /*isFullSet=*/true);
1302 if (auto *C = dyn_cast<Constant>(RHS)) {
1303 RHSRange = C->toConstantRange();
1304 } else if (UseBlockValue) {
1305 std::optional<ValueLatticeElement> R =
1306 getBlockValue(RHS, CxtI->getParent(), CxtI);
1307 if (!R)
1308 return std::nullopt;
1309 RHSRange = R->asConstantRange(RHS->getType());
1310 }
1311
1312 ConstantRange TrueValues =
1314 return ValueLatticeElement::getRange(TrueValues.subtract(Offset));
1315}
1316
1317static std::optional<ConstantRange>
1319 function_ref<std::optional<ConstantRange>(const APInt &)> Fn) {
1320 bool Invert = false;
1321 if (Pred == ICmpInst::ICMP_SGT || Pred == ICmpInst::ICMP_SGE) {
1322 Pred = ICmpInst::getInversePredicate(Pred);
1323 Invert = true;
1324 }
1325 if (Pred == ICmpInst::ICMP_SLE) {
1326 Pred = ICmpInst::ICMP_SLT;
1327 if (RHS.isMaxSignedValue())
1328 return std::nullopt; // Could also return full/empty here, if we wanted.
1329 ++RHS;
1330 }
1331 assert(Pred == ICmpInst::ICMP_SLT && "Must be signed predicate");
1332 if (auto CR = Fn(RHS))
1333 return Invert ? CR->inverse() : CR;
1334 return std::nullopt;
1335}
1336
1337/// Get value range for a "ctpop(Val) Pred RHS" condition.
1339 Value *RHS) {
1340 unsigned BitWidth = RHS->getType()->getScalarSizeInBits();
1341
1342 auto *RHSConst = dyn_cast<ConstantInt>(RHS);
1343 if (!RHSConst)
1345
1346 ConstantRange ResValRange =
1347 ConstantRange::makeExactICmpRegion(Pred, RHSConst->getValue());
1348
1349 unsigned ResMin = ResValRange.getUnsignedMin().getLimitedValue(BitWidth);
1350 unsigned ResMax = ResValRange.getUnsignedMax().getLimitedValue(BitWidth);
1351
1352 APInt ValMin = APInt::getLowBitsSet(BitWidth, ResMin);
1353 APInt ValMax = APInt::getHighBitsSet(BitWidth, ResMax);
1355 ConstantRange::getNonEmpty(std::move(ValMin), ValMax + 1));
1356}
1357
1358std::optional<ValueLatticeElement> LazyValueInfoImpl::getValueFromICmpCondition(
1359 Value *Val, ICmpInst *ICI, bool isTrueDest, bool UseBlockValue) {
1360 Value *LHS = ICI->getOperand(0);
1361 Value *RHS = ICI->getOperand(1);
1362
1363 // Get the predicate that must hold along the considered edge.
1364 CmpInst::Predicate EdgePred =
1365 isTrueDest ? ICI->getPredicate() : ICI->getInversePredicate();
1366
1367 if (isa<Constant>(RHS)) {
1368 if (ICI->isEquality() && LHS == Val) {
1369 if (EdgePred == ICmpInst::ICMP_EQ)
1371 else if (!isa<UndefValue>(RHS))
1373 }
1374 }
1375
1376 Type *Ty = Val->getType();
1377 if (!Ty->isIntOrIntVectorTy())
1379
1380 unsigned BitWidth = Ty->getScalarSizeInBits();
1381 APInt Offset(BitWidth, 0);
1382 if (matchICmpOperand(Offset, LHS, Val, EdgePred))
1383 return getValueFromSimpleICmpCondition(EdgePred, RHS, Offset, ICI,
1384 UseBlockValue);
1385
1386 CmpInst::Predicate SwappedPred = CmpInst::getSwappedPredicate(EdgePred);
1387 if (matchICmpOperand(Offset, RHS, Val, SwappedPred))
1388 return getValueFromSimpleICmpCondition(SwappedPred, LHS, Offset, ICI,
1389 UseBlockValue);
1390
1391 if (match(LHS, m_Ctpop(m_Specific(Val))))
1392 return getValueFromICmpCtpop(EdgePred, RHS);
1393
1394 const APInt *Mask, *C;
1395 if (match(LHS, m_And(m_Specific(Val), m_APInt(Mask))) &&
1396 match(RHS, m_APInt(C))) {
1397 // If (Val & Mask) == C then all the masked bits are known and we can
1398 // compute a value range based on that.
1399 if (EdgePred == ICmpInst::ICMP_EQ) {
1400 KnownBits Known;
1401 Known.Zero = ~*C & *Mask;
1402 Known.One = *C & *Mask;
1404 ConstantRange::fromKnownBits(Known, /*IsSigned*/ false));
1405 }
1406
1407 if (EdgePred == ICmpInst::ICMP_NE)
1410 }
1411
1412 // If (X urem Modulus) >= C, then X >= C.
1413 // If trunc X >= C, then X >= C.
1414 // TODO: An upper bound could be computed as well.
1416 m_Trunc(m_Specific(Val)))) &&
1417 match(RHS, m_APInt(C))) {
1418 // Use the icmp region so we don't have to deal with different predicates.
1419 ConstantRange CR = ConstantRange::makeExactICmpRegion(EdgePred, *C);
1420 if (!CR.isEmptySet())
1422 CR.getUnsignedMin().zext(BitWidth), APInt(BitWidth, 0)));
1423 }
1424
1425 // Recognize:
1426 // icmp slt (ashr X, ShAmtC), C --> icmp slt X, C << ShAmtC
1427 // Preconditions: (C << ShAmtC) >> ShAmtC == C
1428 const APInt *ShAmtC;
1429 if (CmpInst::isSigned(EdgePred) &&
1430 match(LHS, m_AShr(m_Specific(Val), m_APInt(ShAmtC))) &&
1431 match(RHS, m_APInt(C))) {
1432 auto CR = getRangeViaSLT(
1433 EdgePred, *C, [&](const APInt &RHS) -> std::optional<ConstantRange> {
1434 APInt New = RHS << *ShAmtC;
1435 if ((New.ashr(*ShAmtC)) != RHS)
1436 return std::nullopt;
1438 APInt::getSignedMinValue(New.getBitWidth()), New);
1439 });
1440 if (CR)
1442 }
1443
1444 // a - b or ptrtoint(a) - ptrtoint(b) ==/!= 0 if a ==/!= b
1445 Value *X, *Y;
1446 if (ICI->isEquality() && match(Val, m_Sub(m_Value(X), m_Value(Y)))) {
1447 // Peek through ptrtoints
1450 if ((X == LHS && Y == RHS) || (X == RHS && Y == LHS)) {
1451 Constant *NullVal = Constant::getNullValue(Val->getType());
1452 if (EdgePred == ICmpInst::ICMP_EQ)
1453 return ValueLatticeElement::get(NullVal);
1454 return ValueLatticeElement::getNot(NullVal);
1455 }
1456 }
1457
1459}
1460
1461ValueLatticeElement LazyValueInfoImpl::getValueFromTrunc(Value *Val,
1462 TruncInst *Trunc,
1463 bool IsTrueDest) {
1464 assert(Trunc->getType()->isIntOrIntVectorTy(1));
1465
1466 if (Trunc->getOperand(0) != Val)
1468
1469 Type *Ty = Val->getType();
1470
1471 if (Trunc->hasNoUnsignedWrap()) {
1472 if (IsTrueDest)
1473 return ValueLatticeElement::get(ConstantInt::get(Ty, 1));
1475 }
1476
1477 if (IsTrueDest)
1480}
1481
1482// Handle conditions of the form
1483// extractvalue(op.with.overflow(%x, C), 1).
1485 Value *Val, WithOverflowInst *WO, bool IsTrueDest) {
1486 // TODO: This only works with a constant RHS for now. We could also compute
1487 // the range of the RHS, but this doesn't fit into the current structure of
1488 // the edge value calculation.
1489 const APInt *C;
1490 if (WO->getLHS() != Val || !match(WO->getRHS(), m_APInt(C)))
1492
1493 // Calculate the possible values of %x for which no overflow occurs.
1495 WO->getBinaryOp(), *C, WO->getNoWrapKind());
1496
1497 // If overflow is false, %x is constrained to NWR. If overflow is true, %x is
1498 // constrained to it's inverse (all values that might cause overflow).
1499 if (IsTrueDest)
1500 NWR = NWR.inverse();
1502}
1503
1504std::optional<ValueLatticeElement>
1505LazyValueInfoImpl::getValueFromCondition(Value *Val, Value *Cond,
1506 bool IsTrueDest, bool UseBlockValue,
1507 unsigned Depth) {
1508 if (ICmpInst *ICI = dyn_cast<ICmpInst>(Cond))
1509 return getValueFromICmpCondition(Val, ICI, IsTrueDest, UseBlockValue);
1510
1511 if (auto *Trunc = dyn_cast<TruncInst>(Cond))
1512 return getValueFromTrunc(Val, Trunc, IsTrueDest);
1513
1514 if (auto *EVI = dyn_cast<ExtractValueInst>(Cond))
1515 if (auto *WO = dyn_cast<WithOverflowInst>(EVI->getAggregateOperand()))
1516 if (EVI->getNumIndices() == 1 && *EVI->idx_begin() == 1)
1517 return getValueFromOverflowCondition(Val, WO, IsTrueDest);
1518
1521
1522 Value *N;
1523 if (match(Cond, m_Not(m_Value(N))))
1524 return getValueFromCondition(Val, N, !IsTrueDest, UseBlockValue, Depth);
1525
1526 Value *L, *R;
1527 bool IsAnd;
1528 if (match(Cond, m_LogicalAnd(m_Value(L), m_Value(R))))
1529 IsAnd = true;
1530 else if (match(Cond, m_LogicalOr(m_Value(L), m_Value(R))))
1531 IsAnd = false;
1532 else
1534
1535 std::optional<ValueLatticeElement> LV =
1536 getValueFromCondition(Val, L, IsTrueDest, UseBlockValue, Depth);
1537 if (!LV)
1538 return std::nullopt;
1539 std::optional<ValueLatticeElement> RV =
1540 getValueFromCondition(Val, R, IsTrueDest, UseBlockValue, Depth);
1541 if (!RV)
1542 return std::nullopt;
1543
1544 // if (L && R) -> intersect L and R
1545 // if (!(L || R)) -> intersect !L and !R
1546 // if (L || R) -> union L and R
1547 // if (!(L && R)) -> union !L and !R
1548 if (IsTrueDest ^ IsAnd) {
1549 LV->mergeIn(*RV);
1550 return *LV;
1551 }
1552
1553 return LV->intersect(*RV);
1554}
1555
1556// Return true if Usr has Op as an operand, otherwise false.
1557static bool usesOperand(User *Usr, Value *Op) {
1558 return is_contained(Usr->operands(), Op);
1559}
1560
1561// Return true if the instruction type of Val is supported by
1562// constantFoldUser(). Currently CastInst, BinaryOperator and FreezeInst only.
1563// Call this before calling constantFoldUser() to find out if it's even worth
1564// attempting to call it.
1565static bool isOperationFoldable(User *Usr) {
1566 return isa<CastInst>(Usr) || isa<BinaryOperator>(Usr) || isa<FreezeInst>(Usr);
1567}
1568
1569// Check if Usr can be simplified to an integer constant when the value of one
1570// of its operands Op is an integer constant OpConstVal. If so, return it as an
1571// lattice value range with a single element or otherwise return an overdefined
1572// lattice value.
1574 const APInt &OpConstVal,
1575 const DataLayout &DL) {
1576 assert(isOperationFoldable(Usr) && "Precondition");
1577 Constant* OpConst = Constant::getIntegerValue(Op->getType(), OpConstVal);
1578 // Check if Usr can be simplified to a constant.
1579 if (auto *CI = dyn_cast<CastInst>(Usr)) {
1580 assert(CI->getOperand(0) == Op && "Operand 0 isn't Op");
1581 if (auto *C = dyn_cast_or_null<ConstantInt>(
1582 simplifyCastInst(CI->getOpcode(), OpConst,
1583 CI->getDestTy(), DL))) {
1584 return ValueLatticeElement::getRange(ConstantRange(C->getValue()));
1585 }
1586 } else if (auto *BO = dyn_cast<BinaryOperator>(Usr)) {
1587 bool Op0Match = BO->getOperand(0) == Op;
1588 bool Op1Match = BO->getOperand(1) == Op;
1589 assert((Op0Match || Op1Match) &&
1590 "Operand 0 nor Operand 1 isn't a match");
1591 Value *LHS = Op0Match ? OpConst : BO->getOperand(0);
1592 Value *RHS = Op1Match ? OpConst : BO->getOperand(1);
1593 if (auto *C = dyn_cast_or_null<ConstantInt>(
1594 simplifyBinOp(BO->getOpcode(), LHS, RHS, DL))) {
1595 return ValueLatticeElement::getRange(ConstantRange(C->getValue()));
1596 }
1597 } else if (isa<FreezeInst>(Usr)) {
1598 assert(cast<FreezeInst>(Usr)->getOperand(0) == Op && "Operand 0 isn't Op");
1599 return ValueLatticeElement::getRange(ConstantRange(OpConstVal));
1600 }
1602}
1603
1604/// Compute the value of Val on the edge BBFrom -> BBTo.
1605std::optional<ValueLatticeElement>
1606LazyValueInfoImpl::getEdgeValueLocal(Value *Val, BasicBlock *BBFrom,
1607 BasicBlock *BBTo, bool UseBlockValue) {
1608 // TODO: Handle more complex conditionals. If (v == 0 || v2 < 1) is false, we
1609 // know that v != 0.
1610 if (CondBrInst *BI = dyn_cast<CondBrInst>(BBFrom->getTerminator())) {
1611 // If this is a conditional branch and only one successor goes to BBTo, then
1612 // we may be able to infer something from the condition.
1613 if (BI->getSuccessor(0) != BI->getSuccessor(1)) {
1614 bool isTrueDest = BI->getSuccessor(0) == BBTo;
1615 assert(BI->getSuccessor(!isTrueDest) == BBTo &&
1616 "BBTo isn't a successor of BBFrom");
1617 Value *Condition = BI->getCondition();
1618
1619 // If V is the condition of the branch itself, then we know exactly what
1620 // it is.
1621 // NB: The condition on a `br` can't be a vector type.
1622 if (Condition == Val)
1623 return ValueLatticeElement::get(ConstantInt::get(
1624 Type::getInt1Ty(Val->getContext()), isTrueDest));
1625
1626 // If the condition of the branch is an equality comparison, we may be
1627 // able to infer the value.
1628 std::optional<ValueLatticeElement> Result =
1629 getValueFromCondition(Val, Condition, isTrueDest, UseBlockValue);
1630 if (!Result)
1631 return std::nullopt;
1632
1633 if (!Result->isOverdefined())
1634 return Result;
1635
1636 if (User *Usr = dyn_cast<User>(Val)) {
1637 assert(Result->isOverdefined() && "Result isn't overdefined");
1638 // Check with isOperationFoldable() first to avoid linearly iterating
1639 // over the operands unnecessarily which can be expensive for
1640 // instructions with many operands.
1641 if (isa<IntegerType>(Usr->getType()) && isOperationFoldable(Usr)) {
1642 const DataLayout &DL = BBTo->getDataLayout();
1643 if (usesOperand(Usr, Condition)) {
1644 // If Val has Condition as an operand and Val can be folded into a
1645 // constant with either Condition == true or Condition == false,
1646 // propagate the constant.
1647 // eg.
1648 // ; %Val is true on the edge to %then.
1649 // %Val = and i1 %Condition, true.
1650 // br %Condition, label %then, label %else
1651 APInt ConditionVal(1, isTrueDest ? 1 : 0);
1652 Result = constantFoldUser(Usr, Condition, ConditionVal, DL);
1653 } else if (isa<TruncInst, ZExtInst, SExtInst>(Usr)) {
1654 ValueLatticeElement OpLatticeVal =
1655 *getValueFromCondition(Usr->getOperand(0), Condition,
1656 isTrueDest, /*UseBlockValue*/ false);
1657
1658 if (OpLatticeVal.isConstantRange()) {
1659 const unsigned ResultBitWidth =
1660 Usr->getType()->getScalarSizeInBits();
1661 if (auto *Trunc = dyn_cast<TruncInst>(Usr))
1663 OpLatticeVal.getConstantRange().truncate(
1664 ResultBitWidth, Trunc->getNoWrapKind()));
1665
1667 OpLatticeVal.getConstantRange().castOp(
1668 cast<CastInst>(Usr)->getOpcode(), ResultBitWidth));
1669 }
1670 if (OpLatticeVal.isConstant()) {
1671 Constant *C = OpLatticeVal.getConstant();
1672 if (auto *CastC = ConstantFoldCastOperand(
1673 cast<CastInst>(Usr)->getOpcode(), C, Usr->getType(), DL))
1674 return ValueLatticeElement::get(CastC);
1675 }
1677 } else {
1678 // If one of Val's operand has an inferred value, we may be able to
1679 // infer the value of Val.
1680 // eg.
1681 // ; %Val is 94 on the edge to %then.
1682 // %Val = add i8 %Op, 1
1683 // %Condition = icmp eq i8 %Op, 93
1684 // br i1 %Condition, label %then, label %else
1685 for (unsigned i = 0; i < Usr->getNumOperands(); ++i) {
1686 Value *Op = Usr->getOperand(i);
1687 ValueLatticeElement OpLatticeVal = *getValueFromCondition(
1688 Op, Condition, isTrueDest, /*UseBlockValue*/ false);
1689 if (std::optional<APInt> OpConst =
1690 OpLatticeVal.asConstantInteger()) {
1691 Result = constantFoldUser(Usr, Op, *OpConst, DL);
1692 break;
1693 }
1694 }
1695 }
1696 }
1697 }
1698 if (!Result->isOverdefined())
1699 return Result;
1700 }
1701 }
1702
1703 // If the edge was formed by a switch on the value, then we may know exactly
1704 // what it is.
1705 if (SwitchInst *SI = dyn_cast<SwitchInst>(BBFrom->getTerminator())) {
1706 Value *Condition = SI->getCondition();
1707 if (!isa<IntegerType>(Val->getType()))
1709 bool ValUsesConditionAndMayBeFoldable = false;
1710 if (Condition != Val) {
1711 // Check if Val has Condition as an operand.
1712 if (User *Usr = dyn_cast<User>(Val))
1713 ValUsesConditionAndMayBeFoldable = isOperationFoldable(Usr) &&
1714 usesOperand(Usr, Condition);
1715 if (!ValUsesConditionAndMayBeFoldable)
1717 }
1718 assert((Condition == Val || ValUsesConditionAndMayBeFoldable) &&
1719 "Condition != Val nor Val doesn't use Condition");
1720
1721 bool DefaultCase = SI->getDefaultDest() == BBTo;
1722 unsigned BitWidth = Val->getType()->getIntegerBitWidth();
1723 ConstantRange EdgesVals(BitWidth, DefaultCase/*isFullSet*/);
1724
1725 for (auto Case : SI->cases()) {
1726 APInt CaseValue = Case.getCaseValue()->getValue();
1727 ConstantRange EdgeVal(CaseValue);
1728 if (ValUsesConditionAndMayBeFoldable) {
1729 User *Usr = cast<User>(Val);
1730 const DataLayout &DL = BBTo->getDataLayout();
1731 ValueLatticeElement EdgeLatticeVal =
1732 constantFoldUser(Usr, Condition, CaseValue, DL);
1733 if (EdgeLatticeVal.isOverdefined())
1735 EdgeVal = EdgeLatticeVal.getConstantRange();
1736 }
1737 if (DefaultCase) {
1738 // It is possible that the default destination is the destination of
1739 // some cases. We cannot perform difference for those cases.
1740 // We know Condition != CaseValue in BBTo. In some cases we can use
1741 // this to infer Val == f(Condition) is != f(CaseValue). For now, we
1742 // only do this when f is identity (i.e. Val == Condition), but we
1743 // should be able to do this for any injective f.
1744 if (Case.getCaseSuccessor() != BBTo && Condition == Val)
1745 EdgesVals = EdgesVals.difference(EdgeVal);
1746 } else if (Case.getCaseSuccessor() == BBTo)
1747 EdgesVals = EdgesVals.unionWith(EdgeVal);
1748 }
1749 return ValueLatticeElement::getRange(std::move(EdgesVals));
1750 }
1752}
1753
1754/// Compute the value of Val on the edge BBFrom -> BBTo or the value at
1755/// the basic block if the edge does not constrain Val.
1756std::optional<ValueLatticeElement>
1757LazyValueInfoImpl::getEdgeValue(Value *Val, BasicBlock *BBFrom,
1758 BasicBlock *BBTo, Instruction *CxtI) {
1759 // If already a constant, there is nothing to compute.
1760 if (Constant *VC = dyn_cast<Constant>(Val))
1761 return ValueLatticeElement::get(VC);
1762
1763 std::optional<ValueLatticeElement> LocalResult =
1764 getEdgeValueLocal(Val, BBFrom, BBTo, /*UseBlockValue*/ true);
1765 if (!LocalResult)
1766 return std::nullopt;
1767
1768 if (hasSingleValue(*LocalResult))
1769 // Can't get any more precise here
1770 return LocalResult;
1771
1772 std::optional<ValueLatticeElement> OptInBlock =
1773 getBlockValue(Val, BBFrom, BBFrom->getTerminator());
1774 if (!OptInBlock)
1775 return std::nullopt;
1776 ValueLatticeElement &InBlock = *OptInBlock;
1777
1778 // We can use the context instruction (generically the ultimate instruction
1779 // the calling pass is trying to simplify) here, even though the result of
1780 // this function is generally cached when called from the solve* functions
1781 // (and that cached result might be used with queries using a different
1782 // context instruction), because when this function is called from the solve*
1783 // functions, the context instruction is not provided. When called from
1784 // LazyValueInfoImpl::getValueOnEdge, the context instruction is provided,
1785 // but then the result is not cached.
1786 intersectAssumeOrGuardBlockValueConstantRange(Val, InBlock, CxtI);
1787
1788 return LocalResult->intersect(InBlock);
1789}
1790
1792 Instruction *CxtI) {
1793 LLVM_DEBUG(dbgs() << "LVI Getting block end value " << *V << " at '"
1794 << BB->getName() << "'\n");
1795
1796 assert(BlockValueStack.empty() && BlockValueSet.empty());
1797 std::optional<ValueLatticeElement> OptResult = getBlockValue(V, BB, CxtI);
1798 if (!OptResult) {
1799 solve();
1800 OptResult = getBlockValue(V, BB, CxtI);
1801 assert(OptResult && "Value not available after solving");
1802 }
1803
1804 LLVM_DEBUG(dbgs() << " Result = " << *OptResult << "\n");
1805 return *OptResult;
1806}
1807
1809 LLVM_DEBUG(dbgs() << "LVI Getting value " << *V << " at '" << CxtI->getName()
1810 << "'\n");
1811
1812 if (auto *C = dyn_cast<Constant>(V))
1814
1816 if (auto *I = dyn_cast<Instruction>(V))
1817 Result = getFromRangeMetadata(I);
1818 intersectAssumeOrGuardBlockValueConstantRange(V, Result, CxtI);
1819
1820 LLVM_DEBUG(dbgs() << " Result = " << Result << "\n");
1821 return Result;
1822}
1823
1825getValueOnEdge(Value *V, BasicBlock *FromBB, BasicBlock *ToBB,
1826 Instruction *CxtI) {
1827 LLVM_DEBUG(dbgs() << "LVI Getting edge value " << *V << " from '"
1828 << FromBB->getName() << "' to '" << ToBB->getName()
1829 << "'\n");
1830
1831 std::optional<ValueLatticeElement> Result =
1832 getEdgeValue(V, FromBB, ToBB, CxtI);
1833 while (!Result) {
1834 // As the worklist only explicitly tracks block values (but not edge values)
1835 // we may have to call solve() multiple times, as the edge value calculation
1836 // may request additional block values.
1837 solve();
1838 Result = getEdgeValue(V, FromBB, ToBB, CxtI);
1839 }
1840
1841 LLVM_DEBUG(dbgs() << " Result = " << *Result << "\n");
1842 return *Result;
1843}
1844
1846 Value *V = U.get();
1847 auto *CxtI = cast<Instruction>(U.getUser());
1848 ValueLatticeElement VL = getValueInBlock(V, CxtI->getParent(), CxtI);
1849
1850 // Check whether the only (possibly transitive) use of the value is in a
1851 // position where V can be constrained by a select or branch condition.
1852 const Use *CurrU = &U;
1853 // TODO: Increase limit?
1854 const unsigned MaxUsesToInspect = 3;
1855 for (unsigned I = 0; I < MaxUsesToInspect; ++I) {
1856 std::optional<ValueLatticeElement> CondVal;
1857 auto *CurrI = cast<Instruction>(CurrU->getUser());
1858 if (auto *SI = dyn_cast<SelectInst>(CurrI)) {
1859 // If the value is undef, a different value may be chosen in
1860 // the select condition and at use.
1861 if (!isGuaranteedNotToBeUndef(SI->getCondition(), AC))
1862 break;
1863 if (CurrU->getOperandNo() == 1)
1864 CondVal =
1865 *getValueFromCondition(V, SI->getCondition(), /*IsTrueDest*/ true,
1866 /*UseBlockValue*/ false);
1867 else if (CurrU->getOperandNo() == 2)
1868 CondVal =
1869 *getValueFromCondition(V, SI->getCondition(), /*IsTrueDest*/ false,
1870 /*UseBlockValue*/ false);
1871 } else if (auto *PHI = dyn_cast<PHINode>(CurrI)) {
1872 // TODO: Use non-local query?
1873 CondVal = *getEdgeValueLocal(V, PHI->getIncomingBlock(*CurrU),
1874 PHI->getParent(), /*UseBlockValue*/ false);
1875 }
1876 if (CondVal)
1877 VL = VL.intersect(*CondVal);
1878
1879 // Only follow one-use chain, to allow direct intersection of conditions.
1880 // If there are multiple uses, we would have to intersect with the union of
1881 // all conditions at different uses.
1882 // Stop walking if we hit a non-speculatable instruction. Even if the
1883 // result is only used under a specific condition, executing the
1884 // instruction itself may cause side effects or UB already.
1885 // This also disallows looking through phi nodes: If the phi node is part
1886 // of a cycle, we might end up reasoning about values from different cycle
1887 // iterations (PR60629).
1888 if (!CurrI->hasOneUse() ||
1890 CurrI, /*IgnoreUBImplyingAttrs=*/false))
1891 break;
1892 CurrU = &*CurrI->use_begin();
1893 }
1894 return VL;
1895}
1896
1898 BasicBlock *NewSucc) {
1899 TheCache.threadEdgeImpl(OldSucc, NewSucc);
1900}
1901
1902//===----------------------------------------------------------------------===//
1903// LazyValueInfo Impl
1904//===----------------------------------------------------------------------===//
1905
1907 Info.F = &F;
1908 Info.AC = &getAnalysis<AssumptionCacheTracker>().getAssumptionCache(F);
1909
1910 if (auto *Impl = Info.getImpl())
1911 Impl->clear();
1912
1913 // Fully lazy.
1914 return false;
1915}
1916
1922
1924
1925/// This lazily constructs the LazyValueInfoImpl.
1926LazyValueInfoImpl &LazyValueInfo::getOrCreateImpl() {
1927 if (!PImpl) {
1928 const DataLayout &DL = F->getDataLayout();
1930 F->getParent(), Intrinsic::experimental_guard);
1931 PImpl = new LazyValueInfoImpl(F, AC, DL, GuardDecl);
1932 }
1933 return *PImpl;
1934}
1935
1936LazyValueInfoImpl *LazyValueInfo::getImpl() { return PImpl; }
1937
1939
1941 // If the cache was allocated, free it.
1942 if (auto *Impl = getImpl()) {
1943 delete &*Impl;
1944 PImpl = nullptr;
1945 }
1946}
1947
1949 FunctionAnalysisManager::Invalidator &Inv) {
1950 // We need to invalidate if we have either failed to preserve this analyses
1951 // result directly or if any of its dependencies have been invalidated.
1952 auto PAC = PA.getChecker<LazyValueAnalysis>();
1953 if (!(PAC.preserved() || PAC.preservedSet<AllAnalysesOn<Function>>()))
1954 return true;
1955
1956 return false;
1957}
1958
1959void LazyValueInfoWrapperPass::releaseMemory() { Info.releaseMemory(); }
1960
1963 auto &AC = FAM.getResult<AssumptionAnalysis>(F);
1964
1965 return LazyValueInfo(&F, &AC);
1966}
1967
1968/// Returns true if we can statically tell that this value will never be a
1969/// "useful" constant. In practice, this means we've got something like an
1970/// alloca or a malloc call for which a comparison against a constant can
1971/// only be guarding dead code. Note that we are potentially giving up some
1972/// precision in dead code (a constant result) in favour of avoiding a
1973/// expensive search for a easily answered common query.
1974static bool isKnownNonConstant(Value *V) {
1975 V = V->stripPointerCasts();
1976 // The return val of alloc cannot be a Constant.
1977 if (isa<AllocaInst>(V))
1978 return true;
1979 return false;
1980}
1981
1983 // Bail out early if V is known not to be a Constant.
1984 if (isKnownNonConstant(V))
1985 return nullptr;
1986
1987 BasicBlock *BB = CxtI->getParent();
1988 ValueLatticeElement Result = getOrCreateImpl().getValueInBlock(V, BB, CxtI);
1989
1990 if (Result.isConstant())
1991 return Result.getConstant();
1992 if (Result.isConstantRange()) {
1993 const ConstantRange &CR = Result.getConstantRange();
1994 if (const APInt *SingleVal = CR.getSingleElement())
1995 return ConstantInt::get(V->getType(), *SingleVal);
1996 }
1997 return nullptr;
1998}
1999
2001 bool UndefAllowed) {
2002 BasicBlock *BB = CxtI->getParent();
2003 ValueLatticeElement Result = getOrCreateImpl().getValueInBlock(V, BB, CxtI);
2004 return Result.asConstantRange(V->getType(), UndefAllowed);
2005}
2006
2008 bool UndefAllowed) {
2009 ValueLatticeElement Result = getOrCreateImpl().getValueAtUse(U);
2010 return Result.asConstantRange(U->getType(), UndefAllowed);
2011}
2012
2013/// Determine whether the specified value is known to be a
2014/// constant on the specified edge. Return null if not.
2016 BasicBlock *ToBB,
2017 Instruction *CxtI) {
2018 ValueLatticeElement Result =
2019 getOrCreateImpl().getValueOnEdge(V, FromBB, ToBB, CxtI);
2020
2021 if (Result.isConstant())
2022 return Result.getConstant();
2023 if (Result.isConstantRange()) {
2024 const ConstantRange &CR = Result.getConstantRange();
2025 if (const APInt *SingleVal = CR.getSingleElement())
2026 return ConstantInt::get(V->getType(), *SingleVal);
2027 }
2028 return nullptr;
2029}
2030
2032 BasicBlock *FromBB,
2033 BasicBlock *ToBB,
2034 Instruction *CxtI) {
2035 ValueLatticeElement Result =
2036 getOrCreateImpl().getValueOnEdge(V, FromBB, ToBB, CxtI);
2037 // TODO: Should undef be allowed here?
2038 return Result.asConstantRange(V->getType(), /*UndefAllowed*/ true);
2039}
2040
2042 const ValueLatticeElement &Val,
2043 const DataLayout &DL) {
2044 // If we know the value is a constant, evaluate the conditional.
2045 if (Val.isConstant())
2046 return ConstantFoldCompareInstOperands(Pred, Val.getConstant(), C, DL);
2047
2048 Type *ResTy = CmpInst::makeCmpResultType(C->getType());
2049 if (Val.isConstantRange()) {
2050 const ConstantRange &CR = Val.getConstantRange();
2051 ConstantRange RHS = C->toConstantRange();
2052 if (CR.icmp(Pred, RHS))
2053 return ConstantInt::getTrue(ResTy);
2054 if (CR.icmp(CmpInst::getInversePredicate(Pred), RHS))
2055 return ConstantInt::getFalse(ResTy);
2056 return nullptr;
2057 }
2058
2059 if (Val.isNotConstant()) {
2060 // If this is an equality comparison, we can try to fold it knowing that
2061 // "V != C1".
2062 if (Pred == ICmpInst::ICMP_EQ) {
2063 // !C1 == C -> false iff C1 == C.
2066 if (Res && Res->isNullValue())
2067 return ConstantInt::getFalse(ResTy);
2068 } else if (Pred == ICmpInst::ICMP_NE) {
2069 // !C1 != C -> true iff C1 == C.
2072 if (Res && Res->isNullValue())
2073 return ConstantInt::getTrue(ResTy);
2074 }
2075 return nullptr;
2076 }
2077
2078 return nullptr;
2079}
2080
2081/// Determine whether the specified value comparison with a constant is known to
2082/// be true or false on the specified CFG edge. Pred is a CmpInst predicate.
2084 Constant *C, BasicBlock *FromBB,
2085 BasicBlock *ToBB,
2086 Instruction *CxtI) {
2087 ValueLatticeElement Result =
2088 getOrCreateImpl().getValueOnEdge(V, FromBB, ToBB, CxtI);
2089
2090 return getPredicateResult(Pred, C, Result, FromBB->getDataLayout());
2091}
2092
2094 Constant *C, Instruction *CxtI,
2095 bool UseBlockValue) {
2096 // Is or is not NonNull are common predicates being queried. If
2097 // isKnownNonZero can tell us the result of the predicate, we can
2098 // return it quickly. But this is only a fastpath, and falling
2099 // through would still be correct.
2100 const DataLayout &DL = CxtI->getDataLayout();
2101 // NOTE: This check is meant to determine whether a pointer is semantically a
2102 // null pointer, not just whether its value equals ConstantPointerNull. If the
2103 // semantics of ConstantPointerNull change in the future, this should be
2104 // updated to use a semantic check (e.g. isKnownNonNull).
2105 if (V->getType()->isPointerTy() && C->isNullValue() &&
2106 isKnownNonZero(V->stripPointerCastsSameRepresentation(), DL)) {
2107 Type *ResTy = CmpInst::makeCmpResultType(C->getType());
2108 if (Pred == ICmpInst::ICMP_EQ)
2109 return ConstantInt::getFalse(ResTy);
2110 else if (Pred == ICmpInst::ICMP_NE)
2111 return ConstantInt::getTrue(ResTy);
2112 }
2113
2114 auto &Impl = getOrCreateImpl();
2115 ValueLatticeElement Result =
2116 UseBlockValue ? Impl.getValueInBlock(V, CxtI->getParent(), CxtI)
2117 : Impl.getValueAt(V, CxtI);
2118 Constant *Ret = getPredicateResult(Pred, C, Result, DL);
2119 if (Ret)
2120 return Ret;
2121
2122 // Note: The following bit of code is somewhat distinct from the rest of LVI;
2123 // LVI as a whole tries to compute a lattice value which is conservatively
2124 // correct at a given location. In this case, we have a predicate which we
2125 // weren't able to prove about the merged result, and we're pushing that
2126 // predicate back along each incoming edge to see if we can prove it
2127 // separately for each input. As a motivating example, consider:
2128 // bb1:
2129 // %v1 = ... ; constantrange<1, 5>
2130 // br label %merge
2131 // bb2:
2132 // %v2 = ... ; constantrange<10, 20>
2133 // br label %merge
2134 // merge:
2135 // %phi = phi [%v1, %v2] ; constantrange<1,20>
2136 // %pred = icmp eq i32 %phi, 8
2137 // We can't tell from the lattice value for '%phi' that '%pred' is false
2138 // along each path, but by checking the predicate over each input separately,
2139 // we can.
2140 // We limit the search to one step backwards from the current BB and value.
2141 // We could consider extending this to search further backwards through the
2142 // CFG and/or value graph, but there are non-obvious compile time vs quality
2143 // tradeoffs.
2144 BasicBlock *BB = CxtI->getParent();
2145
2146 // Function entry or an unreachable block. Bail to avoid confusing
2147 // analysis below.
2148 pred_iterator PI = pred_begin(BB), PE = pred_end(BB);
2149 if (PI == PE)
2150 return nullptr;
2151
2152 // If V is a PHI node in the same block as the context, we need to ask
2153 // questions about the predicate as applied to the incoming value along
2154 // each edge. This is useful for eliminating cases where the predicate is
2155 // known along all incoming edges.
2156 if (auto *PHI = dyn_cast<PHINode>(V))
2157 if (PHI->getParent() == BB) {
2158 Constant *Baseline = nullptr;
2159 for (unsigned i = 0, e = PHI->getNumIncomingValues(); i < e; i++) {
2160 Value *Incoming = PHI->getIncomingValue(i);
2161 BasicBlock *PredBB = PHI->getIncomingBlock(i);
2162 // Note that PredBB may be BB itself.
2163 Constant *Result =
2164 getPredicateOnEdge(Pred, Incoming, C, PredBB, BB, CxtI);
2165
2166 // Keep going as long as we've seen a consistent known result for
2167 // all inputs.
2168 Baseline = (i == 0) ? Result /* First iteration */
2169 : (Baseline == Result ? Baseline
2170 : nullptr); /* All others */
2171 if (!Baseline)
2172 break;
2173 }
2174 if (Baseline)
2175 return Baseline;
2176 }
2177
2178 // For a comparison where the V is outside this block, it's possible
2179 // that we've branched on it before. Look to see if the value is known
2180 // on all incoming edges.
2181 if (!isa<Instruction>(V) || cast<Instruction>(V)->getParent() != BB) {
2182 // For predecessor edge, determine if the comparison is true or false
2183 // on that edge. If they're all true or all false, we can conclude
2184 // the value of the comparison in this block.
2185 Constant *Baseline = getPredicateOnEdge(Pred, V, C, *PI, BB, CxtI);
2186 if (Baseline) {
2187 // Check that all remaining incoming values match the first one.
2188 while (++PI != PE) {
2189 Constant *Ret = getPredicateOnEdge(Pred, V, C, *PI, BB, CxtI);
2190 if (Ret != Baseline)
2191 break;
2192 }
2193 // If we terminated early, then one of the values didn't match.
2194 if (PI == PE) {
2195 return Baseline;
2196 }
2197 }
2198 }
2199
2200 return nullptr;
2201}
2202
2204 Value *RHS, Instruction *CxtI,
2205 bool UseBlockValue) {
2206 if (auto *C = dyn_cast<Constant>(RHS))
2207 return getPredicateAt(Pred, LHS, C, CxtI, UseBlockValue);
2208 if (auto *C = dyn_cast<Constant>(LHS))
2209 return getPredicateAt(CmpInst::getSwappedPredicate(Pred), RHS, C, CxtI,
2210 UseBlockValue);
2211
2212 // Got two non-Constant values. Try to determine the comparison results based
2213 // on the block values of the two operands, e.g. because they have
2214 // non-overlapping ranges.
2215 if (UseBlockValue) {
2217 getOrCreateImpl().getValueInBlock(LHS, CxtI->getParent(), CxtI);
2218 if (L.isOverdefined())
2219 return nullptr;
2220
2222 getOrCreateImpl().getValueInBlock(RHS, CxtI->getParent(), CxtI);
2223 Type *Ty = CmpInst::makeCmpResultType(LHS->getType());
2224 return L.getCompare(Pred, Ty, R, CxtI->getDataLayout());
2225 }
2226 return nullptr;
2227}
2228
2230 BasicBlock *NewSucc) {
2231 if (auto *Impl = getImpl())
2232 Impl->threadEdge(PredBB, OldSucc, NewSucc);
2233}
2234
2236 if (auto *Impl = getImpl())
2237 Impl->forgetValue(V);
2238}
2239
2241 if (auto *Impl = getImpl())
2242 Impl->eraseBlock(BB);
2243}
2244
2246 if (auto *Impl = getImpl())
2247 Impl->clear();
2248}
2249
2251 if (auto *Impl = getImpl())
2252 Impl->printLVI(F, DTree, OS);
2253}
2254
2255// Print the LVI for the function arguments at the start of each basic block.
2256void LazyValueInfoAnnotatedWriter::emitBasicBlockStartAnnot(
2257 const BasicBlock *BB, formatted_raw_ostream &OS) {
2258 // Find if there are latticevalues defined for arguments of the function.
2259 auto *F = BB->getParent();
2260 for (const auto &Arg : F->args()) {
2261 ValueLatticeElement Result = LVIImpl->getValueInBlock(
2262 const_cast<Argument *>(&Arg), const_cast<BasicBlock *>(BB));
2263 if (Result.isUnknown())
2264 continue;
2265 OS << "; LatticeVal for: '" << Arg << "' is: " << Result << "\n";
2266 }
2267}
2268
2269// This function prints the LVI analysis for the instruction I at the beginning
2270// of various basic blocks. It relies on calculated values that are stored in
2271// the LazyValueInfoCache, and in the absence of cached values, recalculate the
2272// LazyValueInfo for `I`, and print that info.
2273void LazyValueInfoAnnotatedWriter::emitInstructionAnnot(
2274 const Instruction *I, formatted_raw_ostream &OS) {
2275
2276 auto *ParentBB = I->getParent();
2277 SmallPtrSet<const BasicBlock*, 16> BlocksContainingLVI;
2278 // We can generate (solve) LVI values only for blocks that are dominated by
2279 // the I's parent. However, to avoid generating LVI for all dominating blocks,
2280 // that contain redundant/uninteresting information, we print LVI for
2281 // blocks that may use this LVI information (such as immediate successor
2282 // blocks, and blocks that contain uses of `I`).
2283 auto printResult = [&](const BasicBlock *BB) {
2284 if (!BlocksContainingLVI.insert(BB).second)
2285 return;
2286 ValueLatticeElement Result = LVIImpl->getValueInBlock(
2287 const_cast<Instruction *>(I), const_cast<BasicBlock *>(BB));
2288 OS << "; LatticeVal for: '" << *I << "' in BB: '";
2289 BB->printAsOperand(OS, false);
2290 OS << "' is: " << Result << "\n";
2291 };
2292
2293 printResult(ParentBB);
2294 // Print the LVI analysis results for the immediate successor blocks, that
2295 // are dominated by `ParentBB`.
2296 for (const auto *BBSucc : successors(ParentBB))
2297 if (DT.dominates(ParentBB, BBSucc))
2298 printResult(BBSucc);
2299
2300 // Print LVI in blocks where `I` is used.
2301 for (const auto *U : I->users())
2302 if (auto *UseI = dyn_cast<Instruction>(U))
2303 if (!isa<PHINode>(UseI) || DT.dominates(ParentBB, UseI->getParent()))
2304 printResult(UseI->getParent());
2305
2306}
2307
2310 OS << "LVI for function '" << F.getName() << "':\n";
2311 auto &LVI = AM.getResult<LazyValueAnalysis>(F);
2312 auto &DTree = AM.getResult<DominatorTreeAnalysis>(F);
2313 LVI.printLVI(F, DTree, OS);
2314 return PreservedAnalyses::all();
2315}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
Rewrite undef for PHI
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static const Function * getParent(const Value *V)
#define X(NUM, ENUM, NAME)
Definition ELF.h:853
This file contains the declarations for the subclasses of Constant, which represent the different fla...
This file defines the DenseSet and SmallDenseSet classes.
IRTranslator LLVM IR MI
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 Value * getOpcode(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
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)
lazy value Lazy Value Information static true cl::opt< bool > PerPredRanges("lvi-per-pred-ranges", cl::Hidden, cl::init(false), cl::desc("Enable tracking of ranges for a value in a block for" "each block predecessor (default = false)"))
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)
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
#define T
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
uint64_t IntrinsicInst * II
#define P(N)
FunctionAnalysisManager FAM
#define INITIALIZE_PASS_DEPENDENCY(depName)
Definition PassSupport.h:42
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
Definition PassSupport.h:44
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
Definition PassSupport.h:39
const SmallVectorImpl< MachineOperand > & Cond
This file contains some templates that are useful if you are working with the STL at all.
static bool InBlock(const Value *V, const BasicBlock *BB)
#define LLVM_DEBUG(...)
Definition Debug.h:119
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
Value * RHS
Value * LHS
Class for arbitrary precision integers.
Definition APInt.h:78
LLVM_ABI APInt zext(unsigned width) const
Zero extend to a new width.
Definition APInt.cpp:1055
static APInt getSignedMinValue(unsigned numBits)
Gets minimum signed value of APInt for a specific bit width.
Definition APInt.h:220
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.
Definition APInt.h:476
static APInt getLowBitsSet(unsigned numBits, unsigned loBitsSet)
Constructs an APInt value that has the bottom loBitsSet bits set.
Definition APInt.h:307
static APInt getHighBitsSet(unsigned numBits, unsigned hiBitsSet)
Constructs an APInt value that has the top hiBitsSet bits set.
Definition APInt.h:297
static APInt getZero(unsigned numBits)
Get the '0' value for the specified bit-width.
Definition APInt.h:201
This templated class represents "all analyses that operate over <aparticular IR unit>" (e....
Definition Analysis.h:50
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.
Definition Argument.h:32
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.
Definition BasicBlock.h:62
unsigned getNumber() const
Definition BasicBlock.h:95
iterator begin()
Instruction iterator methods.
Definition BasicBlock.h:461
const Function * getParent() const
Return the enclosing method, or null if none.
Definition BasicBlock.h:213
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.
reverse_iterator rend()
Definition BasicBlock.h:479
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction; assumes that the block is well-formed.
Definition BasicBlock.h:237
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
Definition InstrTypes.h:409
Value handle with callbacks on RAUW and destruction.
This is the base class for all instructions that perform data casts.
Definition InstrTypes.h:512
Instruction::CastOps getOpcode() const
Return the opcode of this CastInst.
Definition InstrTypes.h:674
Type * getDestTy() const
Return the destination type, as a convenience.
Definition InstrTypes.h:681
static Type * makeCmpResultType(Type *opnd_type)
Create a result type for fcmp/icmp.
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
Definition InstrTypes.h:740
@ ICMP_SLT
signed less than
Definition InstrTypes.h:769
@ ICMP_SLE
signed less or equal
Definition InstrTypes.h:770
@ ICMP_UGE
unsigned greater or equal
Definition InstrTypes.h:764
@ ICMP_UGT
unsigned greater than
Definition InstrTypes.h:763
@ ICMP_SGT
signed greater than
Definition InstrTypes.h:767
@ ICMP_ULT
unsigned less than
Definition InstrTypes.h:765
@ ICMP_NE
not equal
Definition InstrTypes.h:762
@ ICMP_SGE
signed greater or equal
Definition InstrTypes.h:768
@ ICMP_ULE
unsigned less or equal
Definition InstrTypes.h:766
bool isSigned() const
Definition InstrTypes.h:993
Predicate getSwappedPredicate() const
For example, EQ->EQ, SLE->SGE, ULT->UGT, OEQ->OEQ, ULE->UGE, OLT->OGT, etc.
Definition InstrTypes.h:890
Predicate getInversePredicate() const
For example, EQ -> NE, UGT -> ULE, SLT -> SGE, OEQ -> UNE, UGT -> OLE, OLT -> UGE,...
Definition InstrTypes.h:852
Predicate getPredicate() const
Return the predicate for this instruction.
Definition InstrTypes.h:828
This is the shared class of boolean and integer constants.
Definition Constants.h:87
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 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.
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...
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.
Definition Constant.h:43
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.
Definition Constant.h:64
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.
Definition DataLayout.h:64
Implements a dense probed hash-table based set.
Definition DenseSet.h:289
Analysis pass which computes a DominatorTree.
Definition Dominators.h:270
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
Definition Dominators.h:151
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.
This instruction extracts a struct member or array element value from an aggregate value.
ArrayRef< unsigned > getIndices() const
unsigned getNumIndices() const
idx_iterator idx_begin() const
FunctionPass class - This class is used to implement most global optimizations.
Definition Pass.h:314
FunctionPass(char &pid)
Definition Pass.h:316
unsigned getMaxBlockNumber() const
Return a value larger than the largest block number.
Definition Function.h:828
unsigned getBlockNumberEpoch() const
Return the "epoch" of current block numbers.
Definition Function.h:842
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 *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.
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)
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...
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 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...
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 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 ...
LLVM_ABI void releaseMemory()
LLVM_ABI 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.
LLVM_ABI 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...
LLVM_ABI Constant * getConstant(Value *V, Instruction *CxtI)
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 void forgetValue(Value *V)
Remove information related to this value from the cache.
LLVM_ABI void clear()
Complete flush all previously computed values.
LLVM_ABI 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 ...
LLVM_ABI bool invalidate(Function &F, const PreservedAnalyses &PA, FunctionAnalysisManager::Invalidator &Inv)
Handle invalidation events in the new pass manager.
An instruction for reading from memory.
Metadata node.
Definition Metadata.h:1069
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.
Definition Analysis.h:112
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
Definition Analysis.h:118
PreservedAnalysisChecker getChecker() const
Build a checker for this PreservedAnalyses and the specified analysis type.
Definition Analysis.h:275
This class represents the LLVM 'select' instruction.
Implements a dense probed hash-table based set with some number of buckets stored inline.
Definition DenseSet.h:301
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
void resize(size_type N)
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.
Definition Type.h:46
LLVM_ABI unsigned getIntegerBitWidth() const
bool isIntOrIntVectorTy() const
Return true if this is an integer type or a vector of integer types.
Definition Type.h:263
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.
Definition Type.h:326
LLVM_ABI unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
Definition Type.cpp:232
static LLVM_ABI IntegerType * getInt1Ty(LLVMContext &C)
Definition Type.cpp:306
A Use represents the edge between a Value definition and its users.
Definition Use.h:35
op_range operands()
Definition User.h:267
Value * getOperand(unsigned i) const
Definition User.h:207
This class represents lattice values for constants.
static ValueLatticeElement getRange(ConstantRange CR, bool MayIncludeUndef=false)
static ValueLatticeElement getNot(Constant *C)
ConstantRange asConstantRange(unsigned BW, bool UndefAllowed=false) 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.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:255
LLVMContext & getContext() const
All values hold a context through their type.
Definition Value.h:258
LLVM_ABI const Value * stripInBoundsOffsets(function_ref< void(const Value *)> Func=[](const Value *) {}) const
Strip off pointer casts and inbounds GEPs.
Definition Value.cpp:824
use_iterator use_begin()
Definition Value.h:364
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.
Definition Value.cpp:319
Represents an op.with.overflow intrinsic.
std::pair< iterator, bool > insert(const ValueT &V)
Definition DenseSet.h:212
iterator find_as(const LookupKeyT &Val)
Alternative version of find() which allows a different, and possibly less expensive,...
Definition DenseSet.h:200
bool erase(const ValueT &V)
Definition DenseSet.h:100
formatted_raw_ostream - A raw_ostream that wraps another one and keeps track of line and column posit...
An efficient, type-erasing, non-owning reference to a callable.
const ParentTy * getParent() const
Definition ilist_node.h:34
self_iterator getIterator()
Definition ilist_node.h:123
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition raw_ostream.h:53
#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.
@ Entry
Definition COFF.h:862
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
@ BasicBlock
Various leaf nodes.
Definition ISDOpcodes.h:81
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.
IntrinsicID_match m_Intrinsic()
Match intrinsic calls like this: m_Intrinsic<Intrinsic::fabs>(m_Value(X))
auto m_Value()
Match an arbitrary value and ignore it.
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".
m_Intrinsic_Ty< Opnd0 >::Ty m_Ctpop(const Opnd0 &Op0)
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)
This namespace contains all of the command line option processing machinery.
Definition MCSchedule.h:35
constexpr double e
@ User
could "use" a pointer
friend class Instruction
Iterator for Instructions in a `BasicBlock.
Definition BasicBlock.h:73
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:558
FunctionAddr VTableAddr Value
Definition InstrProf.h:137
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)
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
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.
Definition STLExtras.h:2207
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 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.
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.
auto dyn_cast_or_null(const Y &Val)
Definition Casting.h:753
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 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.
Definition Debug.cpp:209
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...
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...
Definition Casting.h:547
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.
PredIterator< BasicBlock, Value::user_iterator > pred_iterator
Definition CFG.h:93
static bool hasSingleValue(const ValueLatticeElement &Val)
constexpr unsigned BitWidth
auto pred_begin(const MachineBasicBlock *BB)
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
auto predecessors(const MachineBasicBlock *BB)
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition STLExtras.h:1946
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
LLVM_ABI const Value * getUnderlyingObject(const Value *V, unsigned MaxLookup=MaxLookupSearchDepth)
This method strips off any GEP address adjustments, pointer casts or llvm.threadlocal....
#define N
A special type used by analysis passes to provide an address that identifies that particular analysis...
Definition Analysis.h:29
SelectPatternFlavor Flavor
static bool isMinOrMax(SelectPatternFlavor SPF)
When implementing this min/max pattern as fcmp; select, does the fcmp have to be ordered?