LLVM 24.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
1171 return solveBlockValueBinaryOpImpl(
1172 BO, BB, [BO](const ConstantRange &CR1, const ConstantRange &CR2) {
1173 return CR1.binaryOp(*BO, CR2);
1174 });
1175}
1176
1177std::optional<ValueLatticeElement>
1178LazyValueInfoImpl::solveBlockValueOverflowIntrinsic(WithOverflowInst *WO,
1179 BasicBlock *BB) {
1180 return solveBlockValueBinaryOpImpl(
1181 WO, BB, [WO](const ConstantRange &CR1, const ConstantRange &CR2) {
1182 return CR1.binaryOp(WO->getBinaryOp(), CR2);
1183 });
1184}
1185
1186std::optional<ValueLatticeElement>
1187LazyValueInfoImpl::solveBlockValueIntrinsic(IntrinsicInst *II, BasicBlock *BB) {
1188 ValueLatticeElement MetadataVal = getFromRangeMetadata(II);
1189 if (!ConstantRange::isIntrinsicSupported(II->getIntrinsicID())) {
1190 LLVM_DEBUG(dbgs() << " compute BB '" << BB->getName()
1191 << "' - unknown intrinsic.\n");
1192 return MetadataVal;
1193 }
1194
1196 for (Value *Op : II->args()) {
1197 std::optional<ConstantRange> Range = getRangeFor(Op, II, BB);
1198 if (!Range)
1199 return std::nullopt;
1200 OpRanges.push_back(*Range);
1201 }
1202
1204 ConstantRange::intrinsic(II->getIntrinsicID(), OpRanges))
1205 .intersect(MetadataVal);
1206}
1207
1208std::optional<ValueLatticeElement>
1209LazyValueInfoImpl::solveBlockValueInsertElement(InsertElementInst *IEI,
1210 BasicBlock *BB) {
1211 std::optional<ValueLatticeElement> OptEltVal =
1212 getBlockValue(IEI->getOperand(1), BB, IEI);
1213 if (!OptEltVal)
1214 return std::nullopt;
1215 ValueLatticeElement &Res = *OptEltVal;
1216
1217 std::optional<ValueLatticeElement> OptVecVal =
1218 getBlockValue(IEI->getOperand(0), BB, IEI);
1219 if (!OptVecVal)
1220 return std::nullopt;
1221
1222 // Bail out if the inserted element is a constant expression. Unlike other
1223 // ValueLattice types, these are not considered an implicit splat when a
1224 // vector type is used.
1225 // We could call ConstantFoldInsertElementInstruction here to handle these.
1226 if (OptEltVal->isConstant())
1228
1229 Res.mergeIn(*OptVecVal);
1230 return Res;
1231}
1232
1233std::optional<ValueLatticeElement>
1234LazyValueInfoImpl::solveBlockValueExtractValue(ExtractValueInst *EVI,
1235 BasicBlock *BB) {
1236 if (auto *WO = dyn_cast<WithOverflowInst>(EVI->getAggregateOperand()))
1237 if (EVI->getNumIndices() == 1 && *EVI->idx_begin() == 0)
1238 return solveBlockValueOverflowIntrinsic(WO, BB);
1239
1240 // Handle extractvalue of insertvalue to allow further simplification
1241 // based on replaced with.overflow intrinsics.
1243 EVI->getAggregateOperand(), EVI->getIndices(),
1244 EVI->getDataLayout()))
1245 return getBlockValue(V, BB, EVI);
1246
1247 LLVM_DEBUG(dbgs() << " compute BB '" << BB->getName()
1248 << "' - overdefined (unknown extractvalue).\n");
1250}
1251
1253 ICmpInst::Predicate Pred) {
1254 if (LHS == Val)
1255 return true;
1256
1257 // Handle range checking idiom produced by InstCombine. We will subtract the
1258 // offset from the allowed range for RHS in this case.
1259 const APInt *C;
1260 if (match(LHS, m_AddLike(m_Specific(Val), m_APInt(C)))) {
1261 Offset = *C;
1262 return true;
1263 }
1264
1265 // Handle the symmetric case. This appears in saturation patterns like
1266 // (x == 16) ? 16 : (x + 1).
1267 if (match(Val, m_AddLike(m_Specific(LHS), m_APInt(C)))) {
1268 Offset = -*C;
1269 return true;
1270 }
1271
1272 // If (x | y) < C, then (x < C) && (y < C).
1273 if (match(LHS, m_c_Or(m_Specific(Val), m_Value())) &&
1274 (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_ULE))
1275 return true;
1276
1277 // If (x & y) > C, then (x > C) && (y > C).
1278 if (match(LHS, m_c_And(m_Specific(Val), m_Value())) &&
1279 (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_UGE))
1280 return true;
1281
1282 return false;
1283}
1284
1285/// Get value range for a "(Val + Offset) Pred RHS" condition.
1286std::optional<ValueLatticeElement>
1287LazyValueInfoImpl::getValueFromSimpleICmpCondition(CmpInst::Predicate Pred,
1288 Value *RHS,
1289 const APInt &Offset,
1290 Instruction *CxtI,
1291 bool UseBlockValue) {
1292 ConstantRange RHSRange(RHS->getType()->getScalarSizeInBits(),
1293 /*isFullSet=*/true);
1294 if (auto *C = dyn_cast<Constant>(RHS)) {
1295 RHSRange = C->toConstantRange();
1296 } else if (UseBlockValue) {
1297 std::optional<ValueLatticeElement> R =
1298 getBlockValue(RHS, CxtI->getParent(), CxtI);
1299 if (!R)
1300 return std::nullopt;
1301 RHSRange = R->asConstantRange(RHS->getType());
1302 }
1303
1304 ConstantRange TrueValues =
1306 return ValueLatticeElement::getRange(TrueValues.subtract(Offset));
1307}
1308
1309static std::optional<ConstantRange>
1311 function_ref<std::optional<ConstantRange>(const APInt &)> Fn) {
1312 bool Invert = false;
1313 if (Pred == ICmpInst::ICMP_SGT || Pred == ICmpInst::ICMP_SGE) {
1314 Pred = ICmpInst::getInversePredicate(Pred);
1315 Invert = true;
1316 }
1317 if (Pred == ICmpInst::ICMP_SLE) {
1318 Pred = ICmpInst::ICMP_SLT;
1319 if (RHS.isMaxSignedValue())
1320 return std::nullopt; // Could also return full/empty here, if we wanted.
1321 ++RHS;
1322 }
1323 assert(Pred == ICmpInst::ICMP_SLT && "Must be signed predicate");
1324 if (auto CR = Fn(RHS))
1325 return Invert ? CR->inverse() : CR;
1326 return std::nullopt;
1327}
1328
1329/// Get value range for a "ctpop(Val) Pred RHS" condition.
1331 Value *RHS) {
1332 unsigned BitWidth = RHS->getType()->getScalarSizeInBits();
1333
1334 auto *RHSConst = dyn_cast<ConstantInt>(RHS);
1335 if (!RHSConst)
1337
1338 ConstantRange ResValRange =
1339 ConstantRange::makeExactICmpRegion(Pred, RHSConst->getValue());
1340
1341 unsigned ResMin = ResValRange.getUnsignedMin().getLimitedValue(BitWidth);
1342 unsigned ResMax = ResValRange.getUnsignedMax().getLimitedValue(BitWidth);
1343
1344 APInt ValMin = APInt::getLowBitsSet(BitWidth, ResMin);
1345 APInt ValMax = APInt::getHighBitsSet(BitWidth, ResMax);
1347 ConstantRange::getNonEmpty(std::move(ValMin), ValMax + 1));
1348}
1349
1350/// Get the unsigned range for \p V from a `mul nuw V, V` comparison.
1351static std::optional<ConstantRange>
1353 const Value *LHS, const Value *RHS) {
1354 if (!V->getType()->isIntegerTy())
1355 return std::nullopt;
1356
1357 if (!match(LHS, m_NUWMul(m_Specific(V), m_Specific(V)))) {
1358 if (!match(RHS, m_NUWMul(m_Specific(V), m_Specific(V))))
1359 return std::nullopt;
1360
1361 Pred = CmpInst::getSwappedPredicate(Pred);
1362 RHS = LHS;
1363 }
1364
1365 ConstantRange MulCR =
1366 ConstantRange::getFull(V->getType()->getScalarSizeInBits());
1367 const APInt *C;
1368 if (match(RHS, m_APInt(C)))
1369 MulCR = ConstantRange::makeExactICmpRegion(Pred, *C);
1370
1371 ConstantRange Res = MulCR.sqrtFloor();
1372 if (Res.isFullSet())
1373 return std::nullopt;
1374 return Res;
1375}
1376
1377std::optional<ValueLatticeElement> LazyValueInfoImpl::getValueFromICmpCondition(
1378 Value *Val, ICmpInst *ICI, bool isTrueDest, bool UseBlockValue) {
1379 Value *LHS = ICI->getOperand(0);
1380 Value *RHS = ICI->getOperand(1);
1381
1382 // Get the predicate that must hold along the considered edge.
1383 CmpInst::Predicate EdgePred =
1384 isTrueDest ? ICI->getPredicate() : ICI->getInversePredicate();
1385
1386 if (isa<Constant>(RHS)) {
1387 if (ICI->isEquality() && LHS == Val) {
1388 if (EdgePred == ICmpInst::ICMP_EQ)
1390 else if (!isa<UndefValue>(RHS))
1392 }
1393 }
1394
1395 Type *Ty = Val->getType();
1396 if (!Ty->isIntOrIntVectorTy())
1398
1399 unsigned BitWidth = Ty->getScalarSizeInBits();
1400 if (auto Range = getRangeForNUWMulSquare(Val, EdgePred, LHS, RHS))
1402
1403 APInt Offset(BitWidth, 0);
1404 if (matchICmpOperand(Offset, LHS, Val, EdgePred))
1405 return getValueFromSimpleICmpCondition(EdgePred, RHS, Offset, ICI,
1406 UseBlockValue);
1407
1408 CmpInst::Predicate SwappedPred = CmpInst::getSwappedPredicate(EdgePred);
1409 if (matchICmpOperand(Offset, RHS, Val, SwappedPred))
1410 return getValueFromSimpleICmpCondition(SwappedPred, LHS, Offset, ICI,
1411 UseBlockValue);
1412
1413 if (match(LHS, m_Ctpop(m_Specific(Val))))
1414 return getValueFromICmpCtpop(EdgePred, RHS);
1415
1416 const APInt *Mask, *C;
1417 if (match(LHS, m_And(m_Specific(Val), m_APInt(Mask))) &&
1418 match(RHS, m_APInt(C))) {
1419 // If (Val & Mask) == C then all the masked bits are known and we can
1420 // compute a value range based on that.
1421 if (EdgePred == ICmpInst::ICMP_EQ) {
1422 KnownBits Known;
1423 Known.Zero = ~*C & *Mask;
1424 Known.One = *C & *Mask;
1426 ConstantRange::fromKnownBits(Known, /*IsSigned*/ false));
1427 }
1428
1429 if (EdgePred == ICmpInst::ICMP_NE)
1432 }
1433
1434 // If (X urem Modulus) >= C, then X >= C.
1435 // If trunc X >= C, then X >= C.
1436 // TODO: An upper bound could be computed as well.
1438 m_Trunc(m_Specific(Val)))) &&
1439 match(RHS, m_APInt(C))) {
1440 // Use the icmp region so we don't have to deal with different predicates.
1441 ConstantRange CR = ConstantRange::makeExactICmpRegion(EdgePred, *C);
1442 if (!CR.isEmptySet())
1444 CR.getUnsignedMin().zext(BitWidth), APInt(BitWidth, 0)));
1445 }
1446
1447 // Recognize:
1448 // icmp slt (ashr X, ShAmtC), C --> icmp slt X, C << ShAmtC
1449 // Preconditions: (C << ShAmtC) >> ShAmtC == C
1450 const APInt *ShAmtC;
1451 if (CmpInst::isSigned(EdgePred) &&
1452 match(LHS, m_AShr(m_Specific(Val), m_APInt(ShAmtC))) &&
1453 match(RHS, m_APInt(C))) {
1454 auto CR = getRangeViaSLT(
1455 EdgePred, *C, [&](const APInt &RHS) -> std::optional<ConstantRange> {
1456 APInt New = RHS << *ShAmtC;
1457 if ((New.ashr(*ShAmtC)) != RHS)
1458 return std::nullopt;
1460 APInt::getSignedMinValue(New.getBitWidth()), New);
1461 });
1462 if (CR)
1464 }
1465
1466 // a - b or ptrtoint(a) - ptrtoint(b) ==/!= 0 if a ==/!= b
1467 Value *X, *Y;
1468 if (ICI->isEquality() && match(Val, m_Sub(m_Value(X), m_Value(Y)))) {
1469 // Peek through ptrtoints
1472 if ((X == LHS && Y == RHS) || (X == RHS && Y == LHS)) {
1473 Constant *NullVal = Constant::getNullValue(Val->getType());
1474 if (EdgePred == ICmpInst::ICMP_EQ)
1475 return ValueLatticeElement::get(NullVal);
1476 return ValueLatticeElement::getNot(NullVal);
1477 }
1478 }
1479
1481}
1482
1483ValueLatticeElement LazyValueInfoImpl::getValueFromTrunc(Value *Val,
1484 TruncInst *Trunc,
1485 bool IsTrueDest) {
1486 assert(Trunc->getType()->isIntOrIntVectorTy(1));
1487
1488 if (Trunc->getOperand(0) != Val)
1490
1491 Type *Ty = Val->getType();
1492
1493 if (Trunc->hasNoUnsignedWrap()) {
1494 if (IsTrueDest)
1495 return ValueLatticeElement::get(ConstantInt::get(Ty, 1));
1497 }
1498
1499 if (IsTrueDest)
1502}
1503
1504// Handle conditions of the form
1505// extractvalue(op.with.overflow(%x, C), 1).
1507 Value *Val, WithOverflowInst *WO, bool IsTrueDest) {
1508 // TODO: This only works with a constant RHS for now. We could also compute
1509 // the range of the RHS, but this doesn't fit into the current structure of
1510 // the edge value calculation.
1511 const APInt *C;
1512 if (WO->getLHS() != Val || !match(WO->getRHS(), m_APInt(C)))
1514
1515 // Calculate the possible values of %x for which no overflow occurs.
1517 WO->getBinaryOp(), *C, WO->getNoWrapKind());
1518
1519 // If overflow is false, %x is constrained to NWR. If overflow is true, %x is
1520 // constrained to it's inverse (all values that might cause overflow).
1521 if (IsTrueDest)
1522 NWR = NWR.inverse();
1524}
1525
1526std::optional<ValueLatticeElement>
1527LazyValueInfoImpl::getValueFromCondition(Value *Val, Value *Cond,
1528 bool IsTrueDest, bool UseBlockValue,
1529 unsigned Depth) {
1530 if (ICmpInst *ICI = dyn_cast<ICmpInst>(Cond))
1531 return getValueFromICmpCondition(Val, ICI, IsTrueDest, UseBlockValue);
1532
1533 if (auto *Trunc = dyn_cast<TruncInst>(Cond))
1534 return getValueFromTrunc(Val, Trunc, IsTrueDest);
1535
1536 if (auto *EVI = dyn_cast<ExtractValueInst>(Cond))
1537 if (auto *WO = dyn_cast<WithOverflowInst>(EVI->getAggregateOperand()))
1538 if (EVI->getNumIndices() == 1 && *EVI->idx_begin() == 1)
1539 return getValueFromOverflowCondition(Val, WO, IsTrueDest);
1540
1543
1544 Value *N;
1545 if (match(Cond, m_Not(m_Value(N))))
1546 return getValueFromCondition(Val, N, !IsTrueDest, UseBlockValue, Depth);
1547
1548 Value *L, *R;
1549 bool IsAnd;
1550 if (match(Cond, m_LogicalAnd(m_Value(L), m_Value(R))))
1551 IsAnd = true;
1552 else if (match(Cond, m_LogicalOr(m_Value(L), m_Value(R))))
1553 IsAnd = false;
1554 else
1556
1557 std::optional<ValueLatticeElement> LV =
1558 getValueFromCondition(Val, L, IsTrueDest, UseBlockValue, Depth);
1559 if (!LV)
1560 return std::nullopt;
1561 std::optional<ValueLatticeElement> RV =
1562 getValueFromCondition(Val, R, IsTrueDest, UseBlockValue, Depth);
1563 if (!RV)
1564 return std::nullopt;
1565
1566 // if (L && R) -> intersect L and R
1567 // if (!(L || R)) -> intersect !L and !R
1568 // if (L || R) -> union L and R
1569 // if (!(L && R)) -> union !L and !R
1570 if (IsTrueDest ^ IsAnd) {
1571 LV->mergeIn(*RV);
1572 return *LV;
1573 }
1574
1575 return LV->intersect(*RV);
1576}
1577
1578// Return true if Usr has Op as an operand, otherwise false.
1579static bool usesOperand(User *Usr, Value *Op) {
1580 return is_contained(Usr->operands(), Op);
1581}
1582
1583// Return true if the instruction type of Val is supported by
1584// constantFoldUser(). Currently CastInst, BinaryOperator and FreezeInst only.
1585// Call this before calling constantFoldUser() to find out if it's even worth
1586// attempting to call it.
1587static bool isOperationFoldable(User *Usr) {
1588 return isa<CastInst>(Usr) || isa<BinaryOperator>(Usr) || isa<FreezeInst>(Usr);
1589}
1590
1591// Check if Usr can be simplified to an integer constant when the value of one
1592// of its operands Op is an integer constant OpConstVal. If so, return it as an
1593// lattice value range with a single element or otherwise return an overdefined
1594// lattice value.
1596 const APInt &OpConstVal,
1597 const DataLayout &DL) {
1598 assert(isOperationFoldable(Usr) && "Precondition");
1599 Constant* OpConst = Constant::getIntegerValue(Op->getType(), OpConstVal);
1600 // Check if Usr can be simplified to a constant.
1601 if (auto *CI = dyn_cast<CastInst>(Usr)) {
1602 assert(CI->getOperand(0) == Op && "Operand 0 isn't Op");
1603 if (auto *C = dyn_cast_or_null<ConstantInt>(
1604 simplifyCastInst(CI->getOpcode(), OpConst,
1605 CI->getDestTy(), DL))) {
1606 return ValueLatticeElement::getRange(ConstantRange(C->getValue()));
1607 }
1608 } else if (auto *BO = dyn_cast<BinaryOperator>(Usr)) {
1609 bool Op0Match = BO->getOperand(0) == Op;
1610 bool Op1Match = BO->getOperand(1) == Op;
1611 assert((Op0Match || Op1Match) &&
1612 "Operand 0 nor Operand 1 isn't a match");
1613 Value *LHS = Op0Match ? OpConst : BO->getOperand(0);
1614 Value *RHS = Op1Match ? OpConst : BO->getOperand(1);
1615 if (auto *C = dyn_cast_or_null<ConstantInt>(
1616 simplifyBinOp(BO->getOpcode(), LHS, RHS, DL))) {
1617 return ValueLatticeElement::getRange(ConstantRange(C->getValue()));
1618 }
1619 } else if (isa<FreezeInst>(Usr)) {
1620 assert(cast<FreezeInst>(Usr)->getOperand(0) == Op && "Operand 0 isn't Op");
1621 return ValueLatticeElement::getRange(ConstantRange(OpConstVal));
1622 }
1624}
1625
1626/// Compute the value of Val on the edge BBFrom -> BBTo.
1627std::optional<ValueLatticeElement>
1628LazyValueInfoImpl::getEdgeValueLocal(Value *Val, BasicBlock *BBFrom,
1629 BasicBlock *BBTo, bool UseBlockValue) {
1630 // TODO: Handle more complex conditionals. If (v == 0 || v2 < 1) is false, we
1631 // know that v != 0.
1632 if (CondBrInst *BI = dyn_cast<CondBrInst>(BBFrom->getTerminator())) {
1633 // If this is a conditional branch and only one successor goes to BBTo, then
1634 // we may be able to infer something from the condition.
1635 if (BI->getSuccessor(0) != BI->getSuccessor(1)) {
1636 bool isTrueDest = BI->getSuccessor(0) == BBTo;
1637 assert(BI->getSuccessor(!isTrueDest) == BBTo &&
1638 "BBTo isn't a successor of BBFrom");
1639 Value *Condition = BI->getCondition();
1640
1641 // If V is the condition of the branch itself, then we know exactly what
1642 // it is.
1643 // NB: The condition on a `br` can't be a vector type.
1644 if (Condition == Val)
1645 return ValueLatticeElement::get(ConstantInt::get(
1646 Type::getInt1Ty(Val->getContext()), isTrueDest));
1647
1648 // If the condition of the branch is an equality comparison, we may be
1649 // able to infer the value.
1650 std::optional<ValueLatticeElement> Result =
1651 getValueFromCondition(Val, Condition, isTrueDest, UseBlockValue);
1652 if (!Result)
1653 return std::nullopt;
1654
1655 if (!Result->isOverdefined())
1656 return Result;
1657
1658 if (User *Usr = dyn_cast<User>(Val)) {
1659 assert(Result->isOverdefined() && "Result isn't overdefined");
1660 // Check with isOperationFoldable() first to avoid linearly iterating
1661 // over the operands unnecessarily which can be expensive for
1662 // instructions with many operands.
1663 if (isa<IntegerType>(Usr->getType()) && isOperationFoldable(Usr)) {
1664 const DataLayout &DL = BBTo->getDataLayout();
1665 if (usesOperand(Usr, Condition)) {
1666 // If Val has Condition as an operand and Val can be folded into a
1667 // constant with either Condition == true or Condition == false,
1668 // propagate the constant.
1669 // eg.
1670 // ; %Val is true on the edge to %then.
1671 // %Val = and i1 %Condition, true.
1672 // br %Condition, label %then, label %else
1673 APInt ConditionVal(1, isTrueDest ? 1 : 0);
1674 Result = constantFoldUser(Usr, Condition, ConditionVal, DL);
1675 } else if (isa<TruncInst, ZExtInst, SExtInst>(Usr)) {
1676 ValueLatticeElement OpLatticeVal =
1677 *getValueFromCondition(Usr->getOperand(0), Condition,
1678 isTrueDest, /*UseBlockValue*/ false);
1679
1680 if (OpLatticeVal.isConstantRange()) {
1681 const unsigned ResultBitWidth =
1682 Usr->getType()->getScalarSizeInBits();
1683 if (auto *Trunc = dyn_cast<TruncInst>(Usr))
1685 OpLatticeVal.getConstantRange().truncate(
1686 ResultBitWidth, Trunc->getNoWrapKind()));
1687
1689 OpLatticeVal.getConstantRange().castOp(
1690 cast<CastInst>(Usr)->getOpcode(), ResultBitWidth));
1691 }
1692 if (OpLatticeVal.isConstant()) {
1693 Constant *C = OpLatticeVal.getConstant();
1694 if (auto *CastC = ConstantFoldCastOperand(
1695 cast<CastInst>(Usr)->getOpcode(), C, Usr->getType(), DL))
1696 return ValueLatticeElement::get(CastC);
1697 }
1699 } else {
1700 // If one of Val's operand has an inferred value, we may be able to
1701 // infer the value of Val.
1702 // eg.
1703 // ; %Val is 94 on the edge to %then.
1704 // %Val = add i8 %Op, 1
1705 // %Condition = icmp eq i8 %Op, 93
1706 // br i1 %Condition, label %then, label %else
1707 for (unsigned i = 0; i < Usr->getNumOperands(); ++i) {
1708 Value *Op = Usr->getOperand(i);
1709 ValueLatticeElement OpLatticeVal = *getValueFromCondition(
1710 Op, Condition, isTrueDest, /*UseBlockValue*/ false);
1711 if (std::optional<APInt> OpConst =
1712 OpLatticeVal.asConstantInteger()) {
1713 Result = constantFoldUser(Usr, Op, *OpConst, DL);
1714 break;
1715 }
1716 }
1717 }
1718 }
1719 }
1720 if (!Result->isOverdefined())
1721 return Result;
1722 }
1723 }
1724
1725 // If the edge was formed by a switch on the value, then we may know exactly
1726 // what it is.
1727 if (SwitchInst *SI = dyn_cast<SwitchInst>(BBFrom->getTerminator())) {
1728 Value *Condition = SI->getCondition();
1729 if (!isa<IntegerType>(Val->getType()))
1731 bool ValUsesConditionAndMayBeFoldable = false;
1732 if (Condition != Val) {
1733 // Check if Val has Condition as an operand.
1734 if (User *Usr = dyn_cast<User>(Val))
1735 ValUsesConditionAndMayBeFoldable = isOperationFoldable(Usr) &&
1736 usesOperand(Usr, Condition);
1737 if (!ValUsesConditionAndMayBeFoldable)
1739 }
1740 assert((Condition == Val || ValUsesConditionAndMayBeFoldable) &&
1741 "Condition != Val nor Val doesn't use Condition");
1742
1743 bool DefaultCase = SI->getDefaultDest() == BBTo;
1744 unsigned BitWidth = Val->getType()->getIntegerBitWidth();
1745 ConstantRange EdgesVals(BitWidth, DefaultCase/*isFullSet*/);
1746
1747 for (auto Case : SI->cases()) {
1748 APInt CaseValue = Case.getCaseValue()->getValue();
1749 ConstantRange EdgeVal(CaseValue);
1750 if (ValUsesConditionAndMayBeFoldable) {
1751 User *Usr = cast<User>(Val);
1752 const DataLayout &DL = BBTo->getDataLayout();
1753 ValueLatticeElement EdgeLatticeVal =
1754 constantFoldUser(Usr, Condition, CaseValue, DL);
1755 if (EdgeLatticeVal.isOverdefined())
1757 EdgeVal = EdgeLatticeVal.getConstantRange();
1758 }
1759 if (DefaultCase) {
1760 // It is possible that the default destination is the destination of
1761 // some cases. We cannot perform difference for those cases.
1762 // We know Condition != CaseValue in BBTo. In some cases we can use
1763 // this to infer Val == f(Condition) is != f(CaseValue). For now, we
1764 // only do this when f is identity (i.e. Val == Condition), but we
1765 // should be able to do this for any injective f.
1766 if (Case.getCaseSuccessor() != BBTo && Condition == Val)
1767 EdgesVals = EdgesVals.difference(EdgeVal);
1768 } else if (Case.getCaseSuccessor() == BBTo)
1769 EdgesVals = EdgesVals.unionWith(EdgeVal);
1770 }
1771 return ValueLatticeElement::getRange(std::move(EdgesVals));
1772 }
1774}
1775
1776/// Compute the value of Val on the edge BBFrom -> BBTo or the value at
1777/// the basic block if the edge does not constrain Val.
1778std::optional<ValueLatticeElement>
1779LazyValueInfoImpl::getEdgeValue(Value *Val, BasicBlock *BBFrom,
1780 BasicBlock *BBTo, Instruction *CxtI) {
1781 // If already a constant, there is nothing to compute.
1782 if (Constant *VC = dyn_cast<Constant>(Val))
1783 return ValueLatticeElement::get(VC);
1784
1785 std::optional<ValueLatticeElement> LocalResult =
1786 getEdgeValueLocal(Val, BBFrom, BBTo, /*UseBlockValue*/ true);
1787 if (!LocalResult)
1788 return std::nullopt;
1789
1790 if (hasSingleValue(*LocalResult))
1791 // Can't get any more precise here
1792 return LocalResult;
1793
1794 std::optional<ValueLatticeElement> OptInBlock =
1795 getBlockValue(Val, BBFrom, BBFrom->getTerminator());
1796 if (!OptInBlock)
1797 return std::nullopt;
1798 ValueLatticeElement &InBlock = *OptInBlock;
1799
1800 // We can use the context instruction (generically the ultimate instruction
1801 // the calling pass is trying to simplify) here, even though the result of
1802 // this function is generally cached when called from the solve* functions
1803 // (and that cached result might be used with queries using a different
1804 // context instruction), because when this function is called from the solve*
1805 // functions, the context instruction is not provided. When called from
1806 // LazyValueInfoImpl::getValueOnEdge, the context instruction is provided,
1807 // but then the result is not cached.
1808 intersectAssumeOrGuardBlockValueConstantRange(Val, InBlock, CxtI);
1809
1810 return LocalResult->intersect(InBlock);
1811}
1812
1814 Instruction *CxtI) {
1815 LLVM_DEBUG(dbgs() << "LVI Getting block end value " << *V << " at '"
1816 << BB->getName() << "'\n");
1817
1818 assert(BlockValueStack.empty() && BlockValueSet.empty());
1819 std::optional<ValueLatticeElement> OptResult = getBlockValue(V, BB, CxtI);
1820 if (!OptResult) {
1821 solve();
1822 OptResult = getBlockValue(V, BB, CxtI);
1823 assert(OptResult && "Value not available after solving");
1824 }
1825
1826 LLVM_DEBUG(dbgs() << " Result = " << *OptResult << "\n");
1827 return *OptResult;
1828}
1829
1831 LLVM_DEBUG(dbgs() << "LVI Getting value " << *V << " at '" << CxtI->getName()
1832 << "'\n");
1833
1834 if (auto *C = dyn_cast<Constant>(V))
1836
1838 if (auto *I = dyn_cast<Instruction>(V))
1839 Result = getFromRangeMetadata(I);
1840 intersectAssumeOrGuardBlockValueConstantRange(V, Result, CxtI);
1841
1842 LLVM_DEBUG(dbgs() << " Result = " << Result << "\n");
1843 return Result;
1844}
1845
1847getValueOnEdge(Value *V, BasicBlock *FromBB, BasicBlock *ToBB,
1848 Instruction *CxtI) {
1849 LLVM_DEBUG(dbgs() << "LVI Getting edge value " << *V << " from '"
1850 << FromBB->getName() << "' to '" << ToBB->getName()
1851 << "'\n");
1852
1853 std::optional<ValueLatticeElement> Result =
1854 getEdgeValue(V, FromBB, ToBB, CxtI);
1855 while (!Result) {
1856 // As the worklist only explicitly tracks block values (but not edge values)
1857 // we may have to call solve() multiple times, as the edge value calculation
1858 // may request additional block values.
1859 solve();
1860 Result = getEdgeValue(V, FromBB, ToBB, CxtI);
1861 }
1862
1863 LLVM_DEBUG(dbgs() << " Result = " << *Result << "\n");
1864 return *Result;
1865}
1866
1868 Value *V = U.get();
1869 auto *CxtI = cast<Instruction>(U.getUser());
1870 ValueLatticeElement VL = getValueInBlock(V, CxtI->getParent(), CxtI);
1871 BasicBlock *LastQueriedBB = CxtI->getParent();
1872
1873 // Check whether the only (possibly transitive) use of the value is in a
1874 // position where V can be constrained by a select or branch condition.
1875 const Use *CurrU = &U;
1876 // TODO: Increase limit?
1877 const unsigned MaxUsesToInspect = 3;
1878 for (unsigned I = 0; I < MaxUsesToInspect; ++I) {
1879 std::optional<ValueLatticeElement> CondVal;
1880 auto *CurrI = cast<Instruction>(CurrU->getUser());
1881
1882 // All instructions on the one-use chain between the original use and CurrI
1883 // are speculatable and have a single user each, so they could be sunk to
1884 // CurrI. This means information that holds at CurrI also holds for the
1885 // original use and can be used to refine it. Skip phis, as V may not
1886 // dominate their block.
1887 if (I != 0 && !isa<PHINode>(CurrI) && CurrI->getParent() != LastQueriedBB) {
1888 LastQueriedBB = CurrI->getParent();
1889 VL = VL.intersect(getValueInBlock(V, LastQueriedBB, CurrI));
1890 }
1891
1892 if (auto *SI = dyn_cast<SelectInst>(CurrI)) {
1893 // If the value is undef, a different value may be chosen in
1894 // the select condition and at use.
1895 if (!isGuaranteedNotToBeUndef(SI->getCondition(), AC))
1896 break;
1897 if (CurrU->getOperandNo() == 1)
1898 CondVal =
1899 *getValueFromCondition(V, SI->getCondition(), /*IsTrueDest*/ true,
1900 /*UseBlockValue*/ false);
1901 else if (CurrU->getOperandNo() == 2)
1902 CondVal =
1903 *getValueFromCondition(V, SI->getCondition(), /*IsTrueDest*/ false,
1904 /*UseBlockValue*/ false);
1905 } else if (auto *PHI = dyn_cast<PHINode>(CurrI)) {
1906 // TODO: Use non-local query?
1907 CondVal = *getEdgeValueLocal(V, PHI->getIncomingBlock(*CurrU),
1908 PHI->getParent(), /*UseBlockValue*/ false);
1909 }
1910 if (CondVal)
1911 VL = VL.intersect(*CondVal);
1912
1913 // Only follow one-use chain, to allow direct intersection of conditions.
1914 // If there are multiple uses, we would have to intersect with the union of
1915 // all conditions at different uses.
1916 // Stop walking if we hit a non-speculatable instruction. Even if the
1917 // result is only used under a specific condition, executing the
1918 // instruction itself may cause side effects or UB already.
1919 // This also disallows looking through phi nodes: If the phi node is part
1920 // of a cycle, we might end up reasoning about values from different cycle
1921 // iterations (PR60629).
1922 if (!CurrI->hasOneUse() ||
1924 CurrI, /*IgnoreUBImplyingAttrs=*/false))
1925 break;
1926 // Also stop walking at cross-lane operations, since they may rearrange
1927 // lanes so that a later select per-lane condition might no longer
1928 // correspond to the original value's lanes.
1929 if (V->getType()->isVectorTy() && !isNotCrossLaneOperation(CurrI))
1930 break;
1931 CurrU = &*CurrI->use_begin();
1932 }
1933 return VL;
1934}
1935
1937 BasicBlock *NewSucc) {
1938 TheCache.threadEdgeImpl(OldSucc, NewSucc);
1939}
1940
1941//===----------------------------------------------------------------------===//
1942// LazyValueInfo Impl
1943//===----------------------------------------------------------------------===//
1944
1946 Info.F = &F;
1947 Info.AC = &getAnalysis<AssumptionCacheTracker>().getAssumptionCache(F);
1948
1949 if (auto *Impl = Info.getImpl())
1950 Impl->clear();
1951
1952 // Fully lazy.
1953 return false;
1954}
1955
1961
1963
1964/// This lazily constructs the LazyValueInfoImpl.
1965LazyValueInfoImpl &LazyValueInfo::getOrCreateImpl() {
1966 if (!PImpl) {
1967 const DataLayout &DL = F->getDataLayout();
1969 F->getParent(), Intrinsic::experimental_guard);
1970 PImpl = new LazyValueInfoImpl(F, AC, DL, GuardDecl);
1971 }
1972 return *PImpl;
1973}
1974
1975LazyValueInfoImpl *LazyValueInfo::getImpl() { return PImpl; }
1976
1978
1980 // If the cache was allocated, free it.
1981 if (auto *Impl = getImpl()) {
1982 delete &*Impl;
1983 PImpl = nullptr;
1984 }
1985}
1986
1988 FunctionAnalysisManager::Invalidator &Inv) {
1989 // We need to invalidate if we have either failed to preserve this analyses
1990 // result directly or if any of its dependencies have been invalidated.
1991 auto PAC = PA.getChecker<LazyValueAnalysis>();
1992 if (!(PAC.preserved() || PAC.preservedSet<AllAnalysesOn<Function>>()))
1993 return true;
1994
1995 return false;
1996}
1997
1998void LazyValueInfoWrapperPass::releaseMemory() { Info.releaseMemory(); }
1999
2002 auto &AC = FAM.getResult<AssumptionAnalysis>(F);
2003
2004 return LazyValueInfo(&F, &AC);
2005}
2006
2007/// Returns true if we can statically tell that this value will never be a
2008/// "useful" constant. In practice, this means we've got something like an
2009/// alloca or a malloc call for which a comparison against a constant can
2010/// only be guarding dead code. Note that we are potentially giving up some
2011/// precision in dead code (a constant result) in favour of avoiding a
2012/// expensive search for a easily answered common query.
2013static bool isKnownNonConstant(Value *V) {
2014 V = V->stripPointerCasts();
2015 // The return val of alloc cannot be a Constant.
2016 if (isa<AllocaInst>(V))
2017 return true;
2018 return false;
2019}
2020
2022 // Bail out early if V is known not to be a Constant.
2023 if (isKnownNonConstant(V))
2024 return nullptr;
2025
2026 BasicBlock *BB = CxtI->getParent();
2027 ValueLatticeElement Result = getOrCreateImpl().getValueInBlock(V, BB, CxtI);
2028
2029 if (Result.isConstant())
2030 return Result.getConstant();
2031 if (Result.isConstantRange()) {
2032 const ConstantRange &CR = Result.getConstantRange();
2033 if (const APInt *SingleVal = CR.getSingleElement())
2034 return ConstantInt::get(V->getType(), *SingleVal);
2035 }
2036 return nullptr;
2037}
2038
2040 bool UndefAllowed) {
2041 BasicBlock *BB = CxtI->getParent();
2042 ValueLatticeElement Result = getOrCreateImpl().getValueInBlock(V, BB, CxtI);
2043 return Result.asConstantRange(V->getType(), UndefAllowed);
2044}
2045
2047 bool UndefAllowed) {
2048 ValueLatticeElement Result = getOrCreateImpl().getValueAtUse(U);
2049 return Result.asConstantRange(U->getType(), UndefAllowed);
2050}
2051
2052/// Determine whether the specified value is known to be a
2053/// constant on the specified edge. Return null if not.
2055 BasicBlock *ToBB,
2056 Instruction *CxtI) {
2057 ValueLatticeElement Result =
2058 getOrCreateImpl().getValueOnEdge(V, FromBB, ToBB, CxtI);
2059
2060 if (Result.isConstant())
2061 return Result.getConstant();
2062 if (Result.isConstantRange()) {
2063 const ConstantRange &CR = Result.getConstantRange();
2064 if (const APInt *SingleVal = CR.getSingleElement())
2065 return ConstantInt::get(V->getType(), *SingleVal);
2066 }
2067 return nullptr;
2068}
2069
2071 BasicBlock *FromBB,
2072 BasicBlock *ToBB,
2073 Instruction *CxtI) {
2074 ValueLatticeElement Result =
2075 getOrCreateImpl().getValueOnEdge(V, FromBB, ToBB, CxtI);
2076 // TODO: Should undef be allowed here?
2077 return Result.asConstantRange(V->getType(), /*UndefAllowed*/ true);
2078}
2079
2081 const ValueLatticeElement &Val,
2082 const DataLayout &DL) {
2083 // If we know the value is a constant, evaluate the conditional.
2084 if (Val.isConstant())
2085 return ConstantFoldCompareInstOperands(Pred, Val.getConstant(), C, DL);
2086
2087 Type *ResTy = CmpInst::makeCmpResultType(C->getType());
2088 if (Val.isConstantRange()) {
2089 const ConstantRange &CR = Val.getConstantRange();
2090 ConstantRange RHS = C->toConstantRange();
2091 if (CR.icmp(Pred, RHS))
2092 return ConstantInt::getTrue(ResTy);
2093 if (CR.icmp(CmpInst::getInversePredicate(Pred), RHS))
2094 return ConstantInt::getFalse(ResTy);
2095 return nullptr;
2096 }
2097
2098 if (Val.isNotConstant()) {
2099 // If this is an equality comparison, we can try to fold it knowing that
2100 // "V != C1".
2101 if (Pred == ICmpInst::ICMP_EQ) {
2102 // !C1 == C -> false iff C1 == C.
2105 if (Res && Res->isNullValue())
2106 return ConstantInt::getFalse(ResTy);
2107 } else if (Pred == ICmpInst::ICMP_NE) {
2108 // !C1 != C -> true iff C1 == C.
2111 if (Res && Res->isNullValue())
2112 return ConstantInt::getTrue(ResTy);
2113 }
2114 return nullptr;
2115 }
2116
2117 return nullptr;
2118}
2119
2120/// Determine whether the specified value comparison with a constant is known to
2121/// be true or false on the specified CFG edge. Pred is a CmpInst predicate.
2123 Constant *C, BasicBlock *FromBB,
2124 BasicBlock *ToBB,
2125 Instruction *CxtI) {
2126 ValueLatticeElement Result =
2127 getOrCreateImpl().getValueOnEdge(V, FromBB, ToBB, CxtI);
2128
2129 return getPredicateResult(Pred, C, Result, FromBB->getDataLayout());
2130}
2131
2133 Constant *C, Instruction *CxtI,
2134 bool UseBlockValue) {
2135 // Is or is not NonNull are common predicates being queried. If
2136 // isKnownNonZero can tell us the result of the predicate, we can
2137 // return it quickly. But this is only a fastpath, and falling
2138 // through would still be correct.
2139 const DataLayout &DL = CxtI->getDataLayout();
2140 // NOTE: This check is meant to determine whether a pointer is semantically a
2141 // null pointer, not just whether its value equals ConstantPointerNull. If the
2142 // semantics of ConstantPointerNull change in the future, this should be
2143 // updated to use a semantic check (e.g. isKnownNonNull).
2144 if (V->getType()->isPointerTy() && C->isNullValue() &&
2145 isKnownNonZero(V->stripPointerCastsSameRepresentation(), DL)) {
2146 Type *ResTy = CmpInst::makeCmpResultType(C->getType());
2147 if (Pred == ICmpInst::ICMP_EQ)
2148 return ConstantInt::getFalse(ResTy);
2149 else if (Pred == ICmpInst::ICMP_NE)
2150 return ConstantInt::getTrue(ResTy);
2151 }
2152
2153 auto &Impl = getOrCreateImpl();
2154 ValueLatticeElement Result =
2155 UseBlockValue ? Impl.getValueInBlock(V, CxtI->getParent(), CxtI)
2156 : Impl.getValueAt(V, CxtI);
2157 Constant *Ret = getPredicateResult(Pred, C, Result, DL);
2158 if (Ret)
2159 return Ret;
2160
2161 // Note: The following bit of code is somewhat distinct from the rest of LVI;
2162 // LVI as a whole tries to compute a lattice value which is conservatively
2163 // correct at a given location. In this case, we have a predicate which we
2164 // weren't able to prove about the merged result, and we're pushing that
2165 // predicate back along each incoming edge to see if we can prove it
2166 // separately for each input. As a motivating example, consider:
2167 // bb1:
2168 // %v1 = ... ; constantrange<1, 5>
2169 // br label %merge
2170 // bb2:
2171 // %v2 = ... ; constantrange<10, 20>
2172 // br label %merge
2173 // merge:
2174 // %phi = phi [%v1, %v2] ; constantrange<1,20>
2175 // %pred = icmp eq i32 %phi, 8
2176 // We can't tell from the lattice value for '%phi' that '%pred' is false
2177 // along each path, but by checking the predicate over each input separately,
2178 // we can.
2179 // We limit the search to one step backwards from the current BB and value.
2180 // We could consider extending this to search further backwards through the
2181 // CFG and/or value graph, but there are non-obvious compile time vs quality
2182 // tradeoffs.
2183 BasicBlock *BB = CxtI->getParent();
2184
2185 // Function entry or an unreachable block. Bail to avoid confusing
2186 // analysis below.
2187 pred_iterator PI = pred_begin(BB), PE = pred_end(BB);
2188 if (PI == PE)
2189 return nullptr;
2190
2191 // If V is a PHI node in the same block as the context, we need to ask
2192 // questions about the predicate as applied to the incoming value along
2193 // each edge. This is useful for eliminating cases where the predicate is
2194 // known along all incoming edges.
2195 if (auto *PHI = dyn_cast<PHINode>(V))
2196 if (PHI->getParent() == BB) {
2197 Constant *Baseline = nullptr;
2198 for (unsigned i = 0, e = PHI->getNumIncomingValues(); i < e; i++) {
2199 Value *Incoming = PHI->getIncomingValue(i);
2200 BasicBlock *PredBB = PHI->getIncomingBlock(i);
2201 // Note that PredBB may be BB itself.
2202 Constant *Result =
2203 getPredicateOnEdge(Pred, Incoming, C, PredBB, BB, CxtI);
2204
2205 // Keep going as long as we've seen a consistent known result for
2206 // all inputs.
2207 Baseline = (i == 0) ? Result /* First iteration */
2208 : (Baseline == Result ? Baseline
2209 : nullptr); /* All others */
2210 if (!Baseline)
2211 break;
2212 }
2213 if (Baseline)
2214 return Baseline;
2215 }
2216
2217 // For a comparison where the V is outside this block, it's possible
2218 // that we've branched on it before. Look to see if the value is known
2219 // on all incoming edges.
2220 if (!isa<Instruction>(V) || cast<Instruction>(V)->getParent() != BB) {
2221 // For predecessor edge, determine if the comparison is true or false
2222 // on that edge. If they're all true or all false, we can conclude
2223 // the value of the comparison in this block.
2224 Constant *Baseline = getPredicateOnEdge(Pred, V, C, *PI, BB, CxtI);
2225 if (Baseline) {
2226 // Check that all remaining incoming values match the first one.
2227 while (++PI != PE) {
2228 Constant *Ret = getPredicateOnEdge(Pred, V, C, *PI, BB, CxtI);
2229 if (Ret != Baseline)
2230 break;
2231 }
2232 // If we terminated early, then one of the values didn't match.
2233 if (PI == PE) {
2234 return Baseline;
2235 }
2236 }
2237 }
2238
2239 return nullptr;
2240}
2241
2243 Value *RHS, Instruction *CxtI,
2244 bool UseBlockValue) {
2245 if (auto *C = dyn_cast<Constant>(RHS))
2246 return getPredicateAt(Pred, LHS, C, CxtI, UseBlockValue);
2247 if (auto *C = dyn_cast<Constant>(LHS))
2248 return getPredicateAt(CmpInst::getSwappedPredicate(Pred), RHS, C, CxtI,
2249 UseBlockValue);
2250
2251 // Got two non-Constant values. Try to determine the comparison results based
2252 // on the block values of the two operands, e.g. because they have
2253 // non-overlapping ranges.
2254 if (UseBlockValue) {
2256 getOrCreateImpl().getValueInBlock(LHS, CxtI->getParent(), CxtI);
2257 if (L.isOverdefined())
2258 return nullptr;
2259
2261 getOrCreateImpl().getValueInBlock(RHS, CxtI->getParent(), CxtI);
2262 Type *Ty = CmpInst::makeCmpResultType(LHS->getType());
2263 return L.getCompare(Pred, Ty, R, CxtI->getDataLayout());
2264 }
2265 return nullptr;
2266}
2267
2269 BasicBlock *NewSucc) {
2270 if (auto *Impl = getImpl())
2271 Impl->threadEdge(PredBB, OldSucc, NewSucc);
2272}
2273
2275 if (auto *Impl = getImpl())
2276 Impl->forgetValue(V);
2277}
2278
2280 if (auto *Impl = getImpl())
2281 Impl->eraseBlock(BB);
2282}
2283
2285 if (auto *Impl = getImpl())
2286 Impl->clear();
2287}
2288
2290 if (auto *Impl = getImpl())
2291 Impl->printLVI(F, DTree, OS);
2292}
2293
2294// Print the LVI for the function arguments at the start of each basic block.
2295void LazyValueInfoAnnotatedWriter::emitBasicBlockStartAnnot(
2296 const BasicBlock *BB, formatted_raw_ostream &OS) {
2297 // Find if there are latticevalues defined for arguments of the function.
2298 auto *F = BB->getParent();
2299 for (const auto &Arg : F->args()) {
2300 ValueLatticeElement Result = LVIImpl->getValueInBlock(
2301 const_cast<Argument *>(&Arg), const_cast<BasicBlock *>(BB));
2302 if (Result.isUnknown())
2303 continue;
2304 OS << "; LatticeVal for: '" << Arg << "' is: " << Result << "\n";
2305 }
2306}
2307
2308// This function prints the LVI analysis for the instruction I at the beginning
2309// of various basic blocks. It relies on calculated values that are stored in
2310// the LazyValueInfoCache, and in the absence of cached values, recalculate the
2311// LazyValueInfo for `I`, and print that info.
2312void LazyValueInfoAnnotatedWriter::emitInstructionAnnot(
2313 const Instruction *I, formatted_raw_ostream &OS) {
2314
2315 auto *ParentBB = I->getParent();
2316 SmallPtrSet<const BasicBlock*, 16> BlocksContainingLVI;
2317 // We can generate (solve) LVI values only for blocks that are dominated by
2318 // the I's parent. However, to avoid generating LVI for all dominating blocks,
2319 // that contain redundant/uninteresting information, we print LVI for
2320 // blocks that may use this LVI information (such as immediate successor
2321 // blocks, and blocks that contain uses of `I`).
2322 auto printResult = [&](const BasicBlock *BB) {
2323 if (!BlocksContainingLVI.insert(BB).second)
2324 return;
2325 ValueLatticeElement Result = LVIImpl->getValueInBlock(
2326 const_cast<Instruction *>(I), const_cast<BasicBlock *>(BB));
2327 OS << "; LatticeVal for: '" << *I << "' in BB: '";
2328 BB->printAsOperand(OS, false);
2329 OS << "' is: " << Result << "\n";
2330 };
2331
2332 printResult(ParentBB);
2333 // Print the LVI analysis results for the immediate successor blocks, that
2334 // are dominated by `ParentBB`.
2335 for (const auto *BBSucc : successors(ParentBB))
2336 if (DT.dominates(ParentBB, BBSucc))
2337 printResult(BBSucc);
2338
2339 // Print LVI in blocks where `I` is used.
2340 for (const auto *U : I->users())
2341 if (auto *UseI = dyn_cast<Instruction>(U))
2342 if (!isa<PHINode>(UseI) || DT.dominates(ParentBB, UseI->getParent()))
2343 printResult(UseI->getParent());
2344
2345}
2346
2349 OS << "LVI for function '" << F.getName() << "':\n";
2350 auto &LVI = AM.getResult<LazyValueAnalysis>(F);
2351 auto &DTree = AM.getResult<DominatorTreeAnalysis>(F);
2352 LVI.printLVI(F, DTree, OS);
2353 return PreservedAnalyses::all();
2354}
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:857
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
This file defines the DenseSet and SmallDenseSet classes.
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 bool isOperationFoldable(User *Usr)
static std::optional< ConstantRange > getRangeForNUWMulSquare(const Value *V, CmpInst::Predicate Pred, const Value *LHS, const Value *RHS)
Get the unsigned range for V from a mul nuw V, V comparison.
static void AddNonNullPointer(Value *Ptr, NonNullPointerSet &PtrSet, bool IsDereferenced=true)
static void AddNonNullPointersByInstruction(Instruction *I, NonNullPointerSet &PtrSet)
static std::optional< ConstantRange > getRangeViaSLT(CmpInst::Predicate Pred, APInt RHS, function_ref< std::optional< ConstantRange >(const APInt &)> Fn)
static const unsigned MaxProcessedPerValue
static ValueLatticeElement getValueFromICmpCtpop(ICmpInst::Predicate Pred, Value *RHS)
Get value range for a "ctpop(Val) Pred RHS" condition.
static bool usesOperand(User *Usr, Value *Op)
static ValueLatticeElement constantFoldUser(User *Usr, Value *Op, const APInt &OpConstVal, const DataLayout &DL)
static ValueLatticeElement getFromRangeMetadata(Instruction *BBI)
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:1057
static APInt getSignedMinValue(unsigned numBits)
Gets minimum signed value of APInt for a specific bit width.
Definition APInt.h:216
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:472
static APInt getLowBitsSet(unsigned numBits, unsigned loBitsSet)
Constructs an APInt value that has the bottom loBitsSet bits set.
Definition APInt.h:303
static APInt getHighBitsSet(unsigned numBits, unsigned hiBitsSet)
Constructs an APInt value that has the top hiBitsSet bits set.
Definition APInt.h:293
static APInt getZero(unsigned numBits)
Get the '0' value for the specified bit-width.
Definition APInt.h:197
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:446
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:464
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 sqrtFloor() const
Calculate sqrtFloor range. See APInt::sqrtFloor().
LLVM_ABI ConstantRange castOp(Instruction::CastOps CastOp, uint32_t BitWidth) const
Return a new range representing the possible values resulting from an application of the specified ca...
LLVM_ABI ConstantRange umin(const ConstantRange &Other) const
Return a new range representing the possible values resulting from an unsigned minimum of a value in ...
LLVM_ABI APInt getUnsignedMin() const
Return the smallest unsigned value contained in the ConstantRange.
LLVM_ABI bool isFullSet() const
Return true if this set contains all of the elements possible for this data-type.
LLVM_ABI bool icmp(CmpInst::Predicate Pred, const ConstantRange &Other) const
Does the predicate Pred hold between ranges this and Other?
static LLVM_ABI ConstantRange intrinsic(Intrinsic::ID IntrinsicID, ArrayRef< ConstantRange > Ops)
Compute range of intrinsic result for the given operand ranges.
LLVM_ABI bool isEmptySet() const
Return true if this set contains no members.
LLVM_ABI ConstantRange abs(bool IntMinIsPoison=false) const
Calculate absolute value range.
static LLVM_ABI bool isIntrinsicSupported(Intrinsic::ID IntrinsicID)
Returns true if ConstantRange calculations are supported for intrinsic with IntrinsicID.
bool isSingleElement() const
Return true if this set contains exactly one member.
LLVM_ABI ConstantRange truncate(uint32_t BitWidth, unsigned NoWrapKind=0) const
Return a new range in the specified integer type, which must be strictly smaller than the current typ...
LLVM_ABI ConstantRange umax(const ConstantRange &Other) const
Return a new range representing the possible values resulting from an unsigned maximum of a value in ...
static LLVM_ABI ConstantRange makeAllowedICmpRegion(CmpInst::Predicate Pred, const ConstantRange &Other)
Produce the smallest range such that all values that may satisfy the given predicate with any value c...
static LLVM_ABI ConstantRange makeExactICmpRegion(CmpInst::Predicate Pred, const APInt &Other)
Produce the exact range such that all values in the returned range satisfy the given predicate with a...
LLVM_ABI ConstantRange inverse() const
Return a new range that is the logical not of the current set.
LLVM_ABI APInt getUnsignedMax() const
Return the largest unsigned value contained in the ConstantRange.
static LLVM_ABI ConstantRange makeMaskNotEqualRange(const APInt &Mask, const APInt &C)
Initialize a range containing all values X that satisfy (X & Mask) / != C.
static ConstantRange getNonEmpty(APInt Lower, APInt Upper)
Create non-empty constant range with the given bounds.
LLVM_ABI ConstantRange smin(const ConstantRange &Other) const
Return a new range representing the possible values resulting from a signed minimum of a value in thi...
uint32_t getBitWidth() const
Get the bit width of this ConstantRange.
LLVM_ABI ConstantRange smax(const ConstantRange &Other) const
Return a new range representing the possible values resulting from a signed maximum of a value in thi...
LLVM_ABI ConstantRange binaryOp(Instruction::BinaryOps BinOp, const ConstantRange &Other) const
Return a new range representing the possible values resulting from an application of the specified bi...
static LLVM_ABI ConstantRange makeExactNoWrapRegion(Instruction::BinaryOps BinOp, const APInt &Other, unsigned NoWrapKind)
Produce the range that contains X if and only if "X BinOp Other" does not wrap.
This is an important base class in LLVM.
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:281
Analysis pass which computes a DominatorTree.
Definition Dominators.h:241
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
Definition Dominators.h:122
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:813
unsigned getBlockNumberEpoch() const
Return the "epoch" of current block numbers.
Definition Function.h:827
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:293
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:258
LLVM_ABI unsigned getPointerAddressSpace() const
Get the address space of this pointer or pointer vector type.
bool isSized() const
Return true if it makes sense to take the size of this type.
Definition Type.h:321
LLVM_ABI unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
Definition Type.cpp:222
static LLVM_ABI IntegerType * getInt1Ty(LLVMContext &C)
Definition Type.cpp:296
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:257
LLVMContext & getContext() const
All values hold a context through their type.
Definition Value.h:260
LLVM_ABI const Value * stripInBoundsOffsets(function_ref< void(const Value *)> Func=[](const Value *) {}) const
Strip off pointer casts and inbounds GEPs.
Definition Value.cpp:828
use_iterator use_begin()
Definition Value.h:366
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:209
bool erase(const ValueT &V)
Definition DenseSet.h:97
iterator find_as(const LookupKeyT &Val)
Alternative version of find() which allows a different, and possibly less expensive,...
Definition DenseSet.h:197
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
@ 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.
auto m_Value()
Match an arbitrary value and ignore it.
auto m_Ctpop(const Opnd0 &Op0)
auto m_LogicalOr()
Matches L || R where L and R are arbitrary values.
OverflowingBinaryOp_match< LHS, RHS, Instruction::Mul, OverflowingBinaryOperator::NoUnsignedWrap > m_NUWMul(const LHS &L, const RHS &R)
match_combine_or< BinaryOp_match< LHS, RHS, Instruction::Add >, DisjointOr_match< LHS, RHS > > m_AddLike(const LHS &L, const RHS &R)
Match either "add" or "or disjoint".
auto m_Intrinsic(const Ts &...Ops)
Match intrinsic calls like this: m_Intrinsic<Intrinsic::fabs>(m_Value(X))
auto m_LogicalAnd()
Matches L && R where L and R are arbitrary values.
BinaryOp_match< LHS, RHS, Instruction::Or, true > m_c_Or(const LHS &L, const RHS &R)
Matches an Or with LHS and RHS in either order.
BinaryOp_match< LHS, RHS, Instruction::Sub > m_Sub(const LHS &L, const RHS &R)
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
unsigned getOpcode(const VPValue *V)
Return the instruction opcode for the recipe defining V or 0 for unsupported recipes and VPValues not...
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:577
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,...
@ Known
Known to have no common set bits.
auto pred_end(const MachineBasicBlock *BB)
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
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:2208
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.
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
Definition InstrProf.h:143
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 isNotCrossLaneOperation(const Instruction *I)
Return true if the instruction doesn't potentially cross vector lanes.
LLVM_ABI bool isKnownNonZero(const Value *V, const SimplifyQuery &Q, unsigned Depth=0)
Return true if the given value is known to be non-zero when defined.
LLVM_ABI Value * simplifyBinOp(unsigned Opcode, Value *LHS, Value *RHS, const SimplifyQuery &Q)
Given operands for a BinaryOperator, fold the result or return null.
DWARFExpression::Operation Op
bool isSafeToSpeculativelyExecuteWithVariableReplaced(const Instruction *I, bool IgnoreUBImplyingAttrs=true)
Don't use information from its non-constant operands.
PredIterator< BasicBlock, Value::user_iterator > pred_iterator
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:1947
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?