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