LLVM 23.0.0git
Loads.cpp
Go to the documentation of this file.
1//===- Loads.cpp - Local load analysis ------------------------------------===//
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 simple local analyses for load instructions.
10//
11//===----------------------------------------------------------------------===//
12
13#include "llvm/Analysis/Loads.h"
23#include "llvm/IR/DataLayout.h"
26#include "llvm/IR/Operator.h"
27
28using namespace llvm;
29
30static bool isAligned(const Value *Base, Align Alignment,
31 const DataLayout &DL) {
32 return Base->getPointerAlignment(DL) >= Alignment;
33}
34
36 const Value *Ptr, Align Alignment, const SimplifyQuery &SQ, bool IgnoreFree,
37 function_ref<bool(const RetainedKnowledge &RK)> CheckSize) {
38 if (!SQ.CxtI)
39 return false;
40 /// Look through assumes to see if both dereferencability and alignment can
41 /// be proven by an assume if needed.
42 RetainedKnowledge AlignRK;
43 RetainedKnowledge DerefRK;
44 bool PtrCanBeFreed = Ptr->canBeFreed() && !IgnoreFree;
45 bool IsAligned = Ptr->getPointerAlignment(SQ.DL) >= Alignment;
47 Ptr, {Attribute::Dereferenceable, Attribute::Alignment}, *SQ.AC,
48 [&](RetainedKnowledge RK, Instruction *Assume, auto) {
49 if (!isValidAssumeForContext(Assume, SQ.CxtI, SQ.DT))
50 return false;
51 if (RK.AttrKind == Attribute::Alignment)
52 AlignRK = std::max(AlignRK, RK);
53
54 // Dereferenceable information from assumptions is only valid if the
55 // value cannot be freed between the assumption and use.
56 if ((!PtrCanBeFreed || willNotFreeBetween(Assume, SQ.CxtI)) &&
57 RK.AttrKind == Attribute::Dereferenceable)
58 DerefRK = std::max(DerefRK, RK);
59 IsAligned |= AlignRK && AlignRK.ArgValue >= Alignment.value();
60 if (IsAligned && DerefRK && CheckSize(DerefRK))
61 return true; // We have found what we needed so we stop looking
62 return false; // Other assumes may have better information. so
63 // keep looking
64 });
65}
66
67/// Test if V is always a pointer to allocated and suitably aligned memory for
68/// a simple load or store.
70 const Value *V, Align Alignment, const APInt &Size, const SimplifyQuery &SQ,
71 bool IgnoreFree, SmallPtrSetImpl<const Value *> &Visited,
72 unsigned MaxDepth) {
73 assert(V->getType()->isPointerTy() && "Base must be pointer");
74
75 // Recursion limit.
76 if (MaxDepth-- == 0)
77 return false;
78
79 // Already visited? Bail out, we've likely hit unreachable code.
80 if (!Visited.insert(V).second)
81 return false;
82
83 // Note that it is not safe to speculate into a malloc'd region because
84 // malloc may return null.
85
86 // For GEPs, determine if the indexing lands within the allocated object.
87 if (const GEPOperator *GEP = dyn_cast<GEPOperator>(V)) {
88 const Value *Base = GEP->getPointerOperand();
89
90 APInt Offset(SQ.DL.getIndexTypeSizeInBits(GEP->getType()), 0);
91 if (!GEP->accumulateConstantOffset(SQ.DL, Offset) || Offset.isNegative() ||
92 !Offset.urem(APInt(Offset.getBitWidth(), Alignment.value()))
93 .isMinValue())
94 return false;
95
96 // If the base pointer is dereferenceable for Offset+Size bytes, then the
97 // GEP (== Base + Offset) is dereferenceable for Size bytes. If the base
98 // pointer is aligned to Align bytes, and the Offset is divisible by Align
99 // then the GEP (== Base + Offset == k_0 * Align + k_1 * Align) is also
100 // aligned to Align bytes.
101
102 // Offset and Size may have different bit widths if we have visited an
103 // addrspacecast, so we can't do arithmetic directly on the APInt values.
105 Base, Alignment, Offset + Size.sextOrTrunc(Offset.getBitWidth()), SQ,
106 IgnoreFree, Visited, MaxDepth);
107 }
108
109 // bitcast instructions are no-ops as far as dereferenceability is concerned.
110 if (const BitCastOperator *BC = dyn_cast<BitCastOperator>(V)) {
111 if (BC->getSrcTy()->isPointerTy())
112 return isDereferenceableAndAlignedPointer(BC->getOperand(0), Alignment,
113 Size, SQ, IgnoreFree, Visited,
114 MaxDepth);
115 }
116
117 // Recurse into both hands of select.
118 if (const SelectInst *Sel = dyn_cast<SelectInst>(V)) {
119 return isDereferenceableAndAlignedPointer(Sel->getTrueValue(), Alignment,
120 Size, SQ, IgnoreFree, Visited,
121 MaxDepth) &&
122 isDereferenceableAndAlignedPointer(Sel->getFalseValue(), Alignment,
123 Size, SQ, IgnoreFree, Visited,
124 MaxDepth);
125 }
126
127 auto IsKnownDeref = [&]() {
128 bool CheckForNonNull, CheckForFreed;
129 if (!Size.ule(V->getPointerDereferenceableBytes(SQ.DL, CheckForNonNull,
130 CheckForFreed)))
131 return false;
132 if (CheckForNonNull && !isKnownNonZero(V, SQ))
133 return false;
134
135 auto *I = dyn_cast<Instruction>(V);
136 if (CheckForFreed && !IgnoreFree) {
137 const Instruction *DefI;
138 if (I) {
139 // We don't want to consider frees by the instruction producing the
140 // pointer, so skip it if we can.
141 if (auto *II = dyn_cast<InvokeInst>(V)) {
142 DefI = &II->getNormalDest()->front();
143 } else if (!I->isTerminator()) {
144 DefI = I->getNextNode();
145 } else {
146 DefI = I;
147 }
148 } else {
149 // For arguments, check frees from the start of the entry block.
150 DefI = &cast<Argument>(V)->getParent()->getEntryBlock().front();
151 }
152
153 if (!SQ.CxtI || !willNotFreeBetween(DefI, SQ.CxtI))
154 return false;
155 }
156
157 // When using something like !dereferenceable on a load, the
158 // dereferenceability may only be valid on a specific control-flow path.
159 // If the instruction doesn't dominate the context instruction, we're
160 // asking about dereferenceability under the assumption that the
161 // instruction has been speculated to the point of the context instruction,
162 // in which case we don't know if the dereferenceability info still holds.
163 // We don't bother handling allocas here, as they aren't speculatable
164 // anyway.
165 if (I && !isa<AllocaInst>(I))
166 return SQ.CxtI && isValidAssumeForContext(I, SQ.CxtI, SQ.DT);
167 return true;
168 };
169 if (IsKnownDeref()) {
170 // As we recursed through GEPs to get here, we've incrementally checked
171 // that each step advanced by a multiple of the alignment. If our base is
172 // properly aligned, then the original offset accessed must also be.
173 return isAligned(V, Alignment, SQ.DL);
174 }
175
176 /// TODO refactor this function to be able to search independently for
177 /// Dereferencability and Alignment requirements.
178
179
180 if (const auto *Call = dyn_cast<CallBase>(V)) {
182 Call, /*MustPreserveOffset=*/true))
183 return isDereferenceableAndAlignedPointer(RP, Alignment, Size, SQ,
184 IgnoreFree, Visited, MaxDepth);
185
186 // If we have a call we can't recurse through, check to see if this is an
187 // allocation function for which we can establish an minimum object size.
188 // Such a minimum object size is analogous to a deref_or_null attribute in
189 // that we still need to prove the result non-null at point of use.
190 // NOTE: We can only use the object size as a base fact as we a) need to
191 // prove alignment too, and b) don't want the compile time impact of a
192 // separate recursive walk.
193 ObjectSizeOpts Opts;
194 // TODO: It may be okay to round to align, but that would imply that
195 // accessing slightly out of bounds was legal, and we're currently
196 // inconsistent about that. For the moment, be conservative.
197 Opts.RoundToAlign = false;
198 Opts.NullIsUnknownSize = true;
199 uint64_t ObjSize;
200 if (getObjectSize(V, ObjSize, SQ.DL, SQ.TLI, Opts)) {
201 APInt KnownDerefBytes(Size.getBitWidth(), ObjSize);
202 if (KnownDerefBytes.getBoolValue() && KnownDerefBytes.uge(Size) &&
203 isKnownNonZero(V, SQ) && !V->canBeFreed()) {
204 // As we recursed through GEPs to get here, we've incrementally
205 // checked that each step advanced by a multiple of the alignment. If
206 // our base is properly aligned, then the original offset accessed
207 // must also be.
208 return isAligned(V, Alignment, SQ.DL);
209 }
210 }
211 }
212
213 // For gc.relocate, look through relocations
214 if (const GCRelocateInst *RelocateInst = dyn_cast<GCRelocateInst>(V))
215 return isDereferenceableAndAlignedPointer(RelocateInst->getDerivedPtr(),
216 Alignment, Size, SQ, IgnoreFree,
217 Visited, MaxDepth);
218
221 ASC->getOperand(0), Alignment, Size, SQ, IgnoreFree, Visited, MaxDepth);
222
223 return SQ.AC &&
225 V, Alignment, SQ, IgnoreFree, [Size](const RetainedKnowledge &RK) {
226 return RK.ArgValue >= Size.getZExtValue();
227 });
228}
229
231 const APInt &Size,
232 const SimplifyQuery &SQ,
233 bool IgnoreFree) {
234 // Note: At the moment, Size can be zero. This ends up being interpreted as
235 // a query of whether [Base, V] is dereferenceable and V is aligned (since
236 // that's what the implementation happened to do). It's unclear if this is
237 // the desired semantic, but at least SelectionDAG does exercise this case.
238
240 return ::isDereferenceableAndAlignedPointer(V, Alignment, Size, SQ,
241 IgnoreFree, Visited,
242 /*MaxDepth=*/16);
243}
244
246 Align Alignment,
247 const SimplifyQuery &SQ,
248 bool IgnoreFree) {
249 // For unsized types or scalable vectors we don't know exactly how many bytes
250 // are dereferenced, so bail out.
251 if (!Ty->isSized() || Ty->isScalableTy())
252 return false;
253
254 // When dereferenceability information is provided by a dereferenceable
255 // attribute, we know exactly how many bytes are dereferenceable. If we can
256 // determine the exact offset to the attributed variable, we can use that
257 // information here.
258
259 APInt AccessSize(SQ.DL.getPointerTypeSizeInBits(V->getType()),
260 SQ.DL.getTypeStoreSize(Ty));
261 return isDereferenceableAndAlignedPointer(V, Alignment, AccessSize, SQ,
262 IgnoreFree);
263}
264
266 const SimplifyQuery &SQ, bool IgnoreFree) {
267 return isDereferenceableAndAlignedPointer(V, Ty, Align(1), SQ, IgnoreFree);
268}
269
270/// Test if A and B will obviously have the same value.
271///
272/// This includes recognizing that %t0 and %t1 will have the same
273/// value in code like this:
274/// \code
275/// %t0 = getelementptr \@a, 0, 3
276/// store i32 0, i32* %t0
277/// %t1 = getelementptr \@a, 0, 3
278/// %t2 = load i32* %t1
279/// \endcode
280///
281static bool AreEquivalentAddressValues(const Value *A, const Value *B) {
282 // Test if the values are trivially equivalent.
283 if (A == B)
284 return true;
285
286 // Test if the values come from identical arithmetic instructions.
287 // Use isIdenticalToWhenDefined instead of isIdenticalTo because
288 // this function is only used when one address use dominates the
289 // other, which means that they'll always either have the same
290 // value or one of them will have an undefined value.
292 if (const Instruction *BI = dyn_cast<Instruction>(B))
293 if (cast<Instruction>(A)->isIdenticalToWhenDefined(BI))
294 return true;
295
296 // Otherwise they may not be equivalent.
297 return false;
298}
299
301 LoadInst *LI, Loop *L, ScalarEvolution &SE, DominatorTree &DT,
303 auto &DL = LI->getDataLayout();
304 Value *Ptr = LI->getPointerOperand();
305 const SCEV *PtrSCEV = SE.getSCEV(Ptr);
306 APInt EltSize(DL.getIndexTypeSizeInBits(Ptr->getType()),
307 DL.getTypeStoreSize(LI->getType()).getFixedValue());
308
309 // If given a uniform (i.e. non-varying) address, see if we can prove the
310 // access is safe within the loop w/o needing predication.
311 if (L->isLoopInvariant(Ptr))
313 Ptr, LI->getAlign(), EltSize,
314 SimplifyQuery(DL, &DT, AC, &*L->getHeader()->getFirstNonPHIIt()));
315
316 const SCEV *EltSizeSCEV = SE.getConstant(EltSize);
317 return isDereferenceableAndAlignedInLoop(PtrSCEV, LI->getAlign(), EltSizeSCEV,
318 L, SE, DT, AC, Predicates);
319}
320
322 const SCEV *PtrSCEV, Align Alignment, const SCEV *EltSizeSCEV, Loop *L,
325 auto *AddRec = dyn_cast<SCEVAddRecExpr>(PtrSCEV);
326
327 // Check to see if we have a repeating access pattern and it's possible
328 // to prove all accesses are well aligned.
329 if (!AddRec || AddRec->getLoop() != L || !AddRec->isAffine())
330 return false;
331
332 auto *Step = dyn_cast<SCEVConstant>(AddRec->getStepRecurrence(SE));
333 if (!Step)
334 return false;
335
336 const APInt &EltSize = cast<SCEVConstant>(EltSizeSCEV)->getAPInt();
337 // For the moment, restrict ourselves to the case where the access size is a
338 // multiple of the requested alignment and the base is aligned.
339 // TODO: generalize if a case found which warrants
340 if (EltSize.urem(Alignment.value()) != 0)
341 return false;
342
343 // TODO: Handle overlapping accesses.
344 if (EltSize.ugt(Step->getAPInt().abs()))
345 return false;
346
347 const SCEV *MaxBECount =
348 Predicates ? SE.getPredicatedSymbolicMaxBackedgeTakenCount(L, *Predicates)
350 const SCEV *BECount = Predicates
351 ? SE.getPredicatedBackedgeTakenCount(L, *Predicates)
352 : SE.getBackedgeTakenCount(L);
353 if (isa<SCEVCouldNotCompute>(MaxBECount))
354 return false;
355 std::optional<ScalarEvolution::LoopGuards> LoopGuards;
356
357 auto &DL = L->getHeader()->getDataLayout();
358 const auto &[AccessStart, AccessEnd] =
359 getStartAndEndForAccess(L, PtrSCEV, EltSizeSCEV, BECount, MaxBECount, &SE,
360 nullptr, &DT, AC, LoopGuards);
361 if (isa<SCEVCouldNotCompute>(AccessStart) ||
362 isa<SCEVCouldNotCompute>(AccessEnd))
363 return false;
364
365 // Try to get the access size.
366 const SCEV *PtrDiff = SE.getMinusSCEV(AccessEnd, AccessStart);
367 if (isa<SCEVCouldNotCompute>(PtrDiff))
368 return false;
369
370 if (!LoopGuards)
371 LoopGuards.emplace(
372 ScalarEvolution::LoopGuards::collect(AddRec->getLoop(), SE));
373
374 APInt MaxPtrDiff =
375 SE.getUnsignedRangeMax(SE.applyLoopGuards(PtrDiff, *LoopGuards));
376
377 Value *Base = nullptr;
378 APInt AccessSize;
379 const SCEV *AccessSizeSCEV = nullptr;
380 if (const SCEVUnknown *NewBase = dyn_cast<SCEVUnknown>(AccessStart)) {
381 Base = NewBase->getValue();
382 AccessSize = std::move(MaxPtrDiff);
383 AccessSizeSCEV = PtrDiff;
384 } else if (auto *MinAdd = dyn_cast<SCEVAddExpr>(AccessStart)) {
385 if (MinAdd->getNumOperands() != 2)
386 return false;
387
388 const auto *Offset = dyn_cast<SCEVConstant>(MinAdd->getOperand(0));
389 const auto *NewBase = dyn_cast<SCEVUnknown>(MinAdd->getOperand(1));
390 if (!Offset || !NewBase)
391 return false;
392
393 // The following code below assumes the offset is unsigned, but GEP
394 // offsets are treated as signed so we can end up with a signed value
395 // here too. For example, suppose the initial PHI value is (i8 255),
396 // the offset will be treated as (i8 -1) and sign-extended to (i64 -1).
397 if (Offset->getAPInt().isNegative())
398 return false;
399
400 // For the moment, restrict ourselves to the case where the offset is a
401 // multiple of the requested alignment and the base is aligned.
402 // TODO: generalize if a case found which warrants
403 if (Offset->getAPInt().urem(Alignment.value()) != 0)
404 return false;
405
406 bool Overflow = false;
407 AccessSize = MaxPtrDiff.uadd_ov(Offset->getAPInt(), Overflow);
408 if (Overflow)
409 return false;
410 AccessSizeSCEV = SE.getAddExpr(PtrDiff, Offset);
411 Base = NewBase->getValue();
412 } else
413 return false;
414
415 Instruction *CtxI = &*L->getHeader()->getFirstNonPHIIt();
416 if (BasicBlock *LoopPred = L->getLoopPredecessor()) {
417 if (isa<UncondBrInst, CondBrInst>(LoopPred->getTerminator()))
418 CtxI = LoopPred->getTerminator();
419 }
420 SimplifyQuery SQ(DL, &DT, AC, CtxI);
422 Base, Alignment, SQ, /*IgnoreFree=*/false,
423 [&SE, AccessSizeSCEV, &LoopGuards](const RetainedKnowledge &RK) {
424 return SE.isKnownPredicate(
426 SE.applyLoopGuards(AccessSizeSCEV, *LoopGuards),
427 SE.applyLoopGuards(SE.getSCEV(RK.IRArgValue), *LoopGuards));
428 }) ||
429 isDereferenceableAndAlignedPointer(Base, Alignment, AccessSize, SQ);
430}
431
433 const Function &F = *CtxI.getFunction();
434 // Speculative load may create a race that did not exist in the source.
435 return F.hasFnAttribute(Attribute::SanitizeThread) ||
436 // Speculative load may load data from dirty regions.
437 F.hasFnAttribute(Attribute::SanitizeAddress) ||
438 F.hasFnAttribute(Attribute::SanitizeHWAddress);
439}
440
444
446 const DataLayout &DL,
447 Instruction *ScanFrom,
448 AssumptionCache *AC,
449 const DominatorTree *DT,
450 const TargetLibraryInfo *TLI) {
452 V, Alignment, Size, SimplifyQuery(DL, TLI, DT, AC, ScanFrom))) {
453 // With sanitizers `Dereferenceable` is not always enough for unconditional
454 // load.
455 if (!ScanFrom || !suppressSpeculativeLoadForSanitizers(*ScanFrom))
456 return true;
457 }
458
459 if (!ScanFrom)
460 return false;
461
462 if (Size.getBitWidth() > 64)
463 return false;
464 const TypeSize LoadSize = TypeSize::getFixed(Size.getZExtValue());
465
466 // Otherwise, be a little bit aggressive by scanning the local block where we
467 // want to check to see if the pointer is already being loaded or stored
468 // from/to. If so, the previous load or store would have already trapped,
469 // so there is no harm doing an extra load (also, CSE will later eliminate
470 // the load entirely).
471 BasicBlock::iterator BBI = ScanFrom->getIterator(),
472 E = ScanFrom->getParent()->begin();
473
474 // We can at least always strip pointer casts even though we can't use the
475 // base here.
476 V = V->stripPointerCasts();
477
478 while (BBI != E) {
479 --BBI;
480
481 // If we see a free or a call which may write to memory (i.e. which might do
482 // a free) the pointer could be marked invalid.
483 if (isa<CallInst>(BBI) && BBI->mayWriteToMemory() &&
485 return false;
486
487 Value *AccessedPtr;
488 Type *AccessedTy;
489 Align AccessedAlign;
490 if (LoadInst *LI = dyn_cast<LoadInst>(BBI)) {
491 // Ignore volatile loads. The execution of a volatile load cannot
492 // be used to prove an address is backed by regular memory; it can,
493 // for example, point to an MMIO register.
494 if (LI->isVolatile())
495 continue;
496 AccessedPtr = LI->getPointerOperand();
497 AccessedTy = LI->getType();
498 AccessedAlign = LI->getAlign();
499 } else if (StoreInst *SI = dyn_cast<StoreInst>(BBI)) {
500 // Ignore volatile stores (see comment for loads).
501 if (SI->isVolatile())
502 continue;
503 AccessedPtr = SI->getPointerOperand();
504 AccessedTy = SI->getValueOperand()->getType();
505 AccessedAlign = SI->getAlign();
506 } else
507 continue;
508
509 if (AccessedAlign < Alignment)
510 continue;
511
512 // Handle trivial cases.
513 if (AccessedPtr == V &&
514 TypeSize::isKnownLE(LoadSize, DL.getTypeStoreSize(AccessedTy)))
515 return true;
516
517 if (AreEquivalentAddressValues(AccessedPtr->stripPointerCasts(), V) &&
518 TypeSize::isKnownLE(LoadSize, DL.getTypeStoreSize(AccessedTy)))
519 return true;
520 }
521 return false;
522}
523
525 const DataLayout &DL,
526 Instruction *ScanFrom,
527 AssumptionCache *AC,
528 const DominatorTree *DT,
529 const TargetLibraryInfo *TLI) {
530 TypeSize TySize = DL.getTypeStoreSize(Ty);
531 if (TySize.isScalable())
532 return false;
533 APInt Size(DL.getIndexTypeSizeInBits(V->getType()), TySize.getFixedValue());
534 return isSafeToLoadUnconditionally(V, Alignment, Size, DL, ScanFrom, AC, DT,
535 TLI);
536}
537
538/// DefMaxInstsToScan - the default number of maximum instructions
539/// to scan in the block, used by FindAvailableLoadedValue().
540/// FindAvailableLoadedValue() was introduced in r60148, to improve jump
541/// threading in part by eliminating partially redundant loads.
542/// At that point, the value of MaxInstsToScan was already set to '6'
543/// without documented explanation.
545llvm::DefMaxInstsToScan("available-load-scan-limit", cl::init(6), cl::Hidden,
546 cl::desc("Use this to specify the default maximum number of instructions "
547 "to scan backward from a given instruction, when searching for "
548 "available loaded value"));
549
551 BasicBlock::iterator &ScanFrom,
552 unsigned MaxInstsToScan,
553 BatchAAResults *AA, bool *IsLoad,
554 unsigned *NumScanedInst) {
555 // Don't CSE load that is volatile or anything stronger than unordered.
556 if (!Load->isUnordered())
557 return nullptr;
558
560 return findAvailablePtrLoadStore(Loc, Load->getType(), Load->isAtomic(),
561 ScanBB, ScanFrom, MaxInstsToScan, AA, IsLoad,
562 NumScanedInst);
563}
564
565// Check if the load and the store have the same base, constant offsets and
566// non-overlapping access ranges.
567static bool areNonOverlapSameBaseLoadAndStore(const Value *LoadPtr,
568 Type *LoadTy,
569 const Value *StorePtr,
570 Type *StoreTy,
571 const DataLayout &DL) {
572 APInt LoadOffset(DL.getIndexTypeSizeInBits(LoadPtr->getType()), 0);
573 APInt StoreOffset(DL.getIndexTypeSizeInBits(StorePtr->getType()), 0);
574 if (LoadOffset.getBitWidth() != StoreOffset.getBitWidth())
575 return false;
576 const Value *LoadBase = LoadPtr->stripAndAccumulateConstantOffsets(
577 DL, LoadOffset, /* AllowNonInbounds */ false);
578 const Value *StoreBase = StorePtr->stripAndAccumulateConstantOffsets(
579 DL, StoreOffset, /* AllowNonInbounds */ false);
580 if (LoadBase != StoreBase)
581 return false;
582 auto LoadAccessSize = LocationSize::precise(DL.getTypeStoreSize(LoadTy));
583 auto StoreAccessSize = LocationSize::precise(DL.getTypeStoreSize(StoreTy));
584 ConstantRange LoadRange(LoadOffset,
585 LoadOffset + LoadAccessSize.toRaw());
586 ConstantRange StoreRange(StoreOffset,
587 StoreOffset + StoreAccessSize.toRaw());
588 return LoadRange.intersectWith(StoreRange).isEmptySet();
589}
590
592 Type *AccessTy, bool AtLeastAtomic,
593 const DataLayout &DL, bool *IsLoadCSE) {
594 // If this is a load of Ptr, the loaded value is available.
595 // (This is true even if the load is volatile or atomic, although
596 // those cases are unlikely.)
597 if (LoadInst *LI = dyn_cast<LoadInst>(Inst)) {
598 // We can value forward from an atomic to a non-atomic, but not the
599 // other way around.
600 if (LI->isAtomic() < AtLeastAtomic)
601 return nullptr;
602
603 Value *LoadPtr = LI->getPointerOperand()->stripPointerCasts();
604 if (!AreEquivalentAddressValues(LoadPtr, Ptr))
605 return nullptr;
606
607 if (CastInst::isBitOrNoopPointerCastable(LI->getType(), AccessTy, DL)) {
608 if (IsLoadCSE)
609 *IsLoadCSE = true;
610 return LI;
611 }
612 }
613
614 // If this is a store through Ptr, the value is available!
615 // (This is true even if the store is volatile or atomic, although
616 // those cases are unlikely.)
617 if (StoreInst *SI = dyn_cast<StoreInst>(Inst)) {
618 // We can value forward from an atomic to a non-atomic, but not the
619 // other way around.
620 if (SI->isAtomic() < AtLeastAtomic)
621 return nullptr;
622
623 Value *StorePtr = SI->getPointerOperand()->stripPointerCasts();
624 if (!AreEquivalentAddressValues(StorePtr, Ptr))
625 return nullptr;
626
627 if (IsLoadCSE)
628 *IsLoadCSE = false;
629
630 Value *Val = SI->getValueOperand();
631 if (CastInst::isBitOrNoopPointerCastable(Val->getType(), AccessTy, DL))
632 return Val;
633
634 TypeSize StoreSize = DL.getTypeSizeInBits(Val->getType());
635 TypeSize LoadSize = DL.getTypeSizeInBits(AccessTy);
636 if (TypeSize::isKnownLE(LoadSize, StoreSize))
637 if (auto *C = dyn_cast<Constant>(Val))
638 return ConstantFoldLoadFromConst(C, AccessTy, DL);
639 }
640
641 if (auto *MSI = dyn_cast<MemSetInst>(Inst)) {
642 // Don't forward from (non-atomic) memset to atomic load.
643 if (AtLeastAtomic)
644 return nullptr;
645
646 // Only handle constant memsets.
647 auto *Val = dyn_cast<ConstantInt>(MSI->getValue());
648 auto *Len = dyn_cast<ConstantInt>(MSI->getLength());
649 if (!Val || !Len)
650 return nullptr;
651
652 // Handle offsets.
653 int64_t StoreOffset = 0, LoadOffset = 0;
654 const Value *StoreBase =
655 GetPointerBaseWithConstantOffset(MSI->getDest(), StoreOffset, DL);
656 const Value *LoadBase =
657 GetPointerBaseWithConstantOffset(Ptr, LoadOffset, DL);
658 if (StoreBase != LoadBase || LoadOffset < StoreOffset)
659 return nullptr;
660
661 if (IsLoadCSE)
662 *IsLoadCSE = false;
663
664 TypeSize LoadTypeSize = DL.getTypeSizeInBits(AccessTy);
665 if (LoadTypeSize.isScalable())
666 return nullptr;
667
668 // Make sure the read bytes are contained in the memset.
669 uint64_t LoadSize = LoadTypeSize.getFixedValue();
670 if ((Len->getValue() * 8).ult(LoadSize + (LoadOffset - StoreOffset) * 8))
671 return nullptr;
672
673 APInt Splat = LoadSize >= 8 ? APInt::getSplat(LoadSize, Val->getValue())
674 : Val->getValue().trunc(LoadSize);
675 ConstantInt *SplatC = ConstantInt::get(MSI->getContext(), Splat);
676 if (CastInst::isBitOrNoopPointerCastable(SplatC->getType(), AccessTy, DL))
677 return SplatC;
678
679 return nullptr;
680 }
681
682 return nullptr;
683}
684
686 const MemoryLocation &Loc, Type *AccessTy, bool AtLeastAtomic,
687 BasicBlock *ScanBB, BasicBlock::iterator &ScanFrom, unsigned MaxInstsToScan,
688 BatchAAResults *AA, bool *IsLoadCSE, unsigned *NumScanedInst) {
689 if (MaxInstsToScan == 0)
690 MaxInstsToScan = ~0U;
691
692 const DataLayout &DL = ScanBB->getDataLayout();
693 const Value *StrippedPtr = Loc.Ptr->stripPointerCasts();
694
695 while (ScanFrom != ScanBB->begin()) {
696 // We must ignore debug info directives when counting (otherwise they
697 // would affect codegen).
698 Instruction *Inst = &*--ScanFrom;
699 if (Inst->isDebugOrPseudoInst())
700 continue;
701
702 // Restore ScanFrom to expected value in case next test succeeds
703 ScanFrom++;
704
705 if (NumScanedInst)
706 ++(*NumScanedInst);
707
708 // Don't scan huge blocks.
709 if (MaxInstsToScan-- == 0)
710 return nullptr;
711
712 --ScanFrom;
713
714 if (Value *Available = getAvailableLoadStore(Inst, StrippedPtr, AccessTy,
715 AtLeastAtomic, DL, IsLoadCSE))
716 return Available;
717
718 // Try to get the store size for the type.
719 if (StoreInst *SI = dyn_cast<StoreInst>(Inst)) {
720 Value *StorePtr = SI->getPointerOperand()->stripPointerCasts();
721
722 // If both StrippedPtr and StorePtr reach all the way to an alloca or
723 // global and they are different, ignore the store. This is a trivial form
724 // of alias analysis that is important for reg2mem'd code.
725 if ((isa<AllocaInst>(StrippedPtr) || isa<GlobalVariable>(StrippedPtr)) &&
726 (isa<AllocaInst>(StorePtr) || isa<GlobalVariable>(StorePtr)) &&
727 StrippedPtr != StorePtr)
728 continue;
729
730 if (!AA) {
731 // When AA isn't available, but if the load and the store have the same
732 // base, constant offsets and non-overlapping access ranges, ignore the
733 // store. This is a simple form of alias analysis that is used by the
734 // inliner. FIXME: use BasicAA if possible.
736 Loc.Ptr, AccessTy, SI->getPointerOperand(),
737 SI->getValueOperand()->getType(), DL))
738 continue;
739 } else {
740 // If we have alias analysis and it says the store won't modify the
741 // loaded value, ignore the store.
742 if (!isModSet(AA->getModRefInfo(SI, Loc)))
743 continue;
744 }
745
746 // Otherwise the store that may or may not alias the pointer, bail out.
747 ++ScanFrom;
748 return nullptr;
749 }
750
751 // If this is some other instruction that may clobber Ptr, bail out.
752 if (Inst->mayWriteToMemory()) {
753 // If alias analysis claims that it really won't modify the load,
754 // ignore it.
755 if (AA && !isModSet(AA->getModRefInfo(Inst, Loc)))
756 continue;
757
758 // May modify the pointer, bail out.
759 ++ScanFrom;
760 return nullptr;
761 }
762 }
763
764 // Got to the start of the block, we didn't find it, but are done for this
765 // block.
766 return nullptr;
767}
768
770 bool *IsLoadCSE,
771 unsigned MaxInstsToScan) {
772 const DataLayout &DL = Load->getDataLayout();
773 Value *StrippedPtr = Load->getPointerOperand()->stripPointerCasts();
774 BasicBlock *ScanBB = Load->getParent();
775 Type *AccessTy = Load->getType();
776 bool AtLeastAtomic = Load->isAtomic();
777
778 if (!Load->isUnordered())
779 return nullptr;
780
781 // Try to find an available value first, and delay expensive alias analysis
782 // queries until later.
783 Value *Available = nullptr;
784 SmallVector<Instruction *> MustNotAliasInsts;
785 for (Instruction &Inst : make_range(++Load->getReverseIterator(),
786 ScanBB->rend())) {
787 if (Inst.isDebugOrPseudoInst())
788 continue;
789
790 if (MaxInstsToScan-- == 0)
791 return nullptr;
792
793 Available = getAvailableLoadStore(&Inst, StrippedPtr, AccessTy,
794 AtLeastAtomic, DL, IsLoadCSE);
795 if (Available)
796 break;
797
798 if (Inst.mayWriteToMemory())
799 MustNotAliasInsts.push_back(&Inst);
800 }
801
802 // If we found an available value, ensure that the instructions in between
803 // did not modify the memory location.
804 if (Available) {
806 for (Instruction *Inst : MustNotAliasInsts)
807 if (isModSet(AA.getModRefInfo(Inst, Loc)))
808 return nullptr;
809 }
810
811 return Available;
812}
813
814// Returns true if a use is either in an ICmp/PtrToInt or a Phi/Select that only
815// feeds into them.
816static bool isPointerUseReplacable(const Use &U, bool HasNonAddressBits) {
817 unsigned Limit = 40;
818 SmallVector<const User *> Worklist({U.getUser()});
820
821 while (!Worklist.empty() && --Limit) {
822 auto *User = Worklist.pop_back_val();
823 if (!Visited.insert(User).second)
824 continue;
826 continue;
827 // FIXME: The PtrToIntInst case here is not strictly correct, as it
828 // changes which provenance is exposed.
829 if (!HasNonAddressBits && isa<PtrToIntInst>(User))
830 continue;
832 Worklist.append(User->user_begin(), User->user_end());
833 else
834 return false;
835 }
836
837 return Limit != 0;
838}
839
840static bool isPointerAlwaysReplaceable(const Value *From, const Value *To,
841 const DataLayout &DL) {
842 // This is not strictly correct, but we do it for now to retain important
843 // optimizations.
845 return true;
846 // Conversely, replacing null in the default address space with destination
847 // pointer is always valid.
848 if (isa<ConstantPointerNull>(From) &&
849 From->getType()->getPointerAddressSpace() == 0)
850 return true;
851 if (isa<Constant>(To) && To->getType()->isPointerTy() &&
853 return true;
854 return getUnderlyingObjectAggressive(From) ==
856}
857
859 const DataLayout &DL) {
860 Type *Ty = To->getType();
861 assert(U->getType() == Ty && "values must have matching types");
862 // Not a pointer, just return true.
863 if (!Ty->isPtrOrPtrVectorTy())
864 return true;
865
866 // Do not perform replacements in lifetime intrinsic arguments.
867 if (isa<LifetimeIntrinsic>(U.getUser()))
868 return false;
869
870 if (isPointerAlwaysReplaceable(&*U, To, DL))
871 return true;
872
873 bool HasNonAddressBits =
874 DL.getAddressSizeInBits(Ty) != DL.getPointerTypeSizeInBits(Ty);
875 return isPointerUseReplacable(U, HasNonAddressBits);
876}
877
878bool llvm::canReplacePointersIfEqual(const Value *From, const Value *To,
879 const DataLayout &DL) {
880 assert(From->getType() == To->getType() && "values must have matching types");
881 // Not a pointer, just return true.
882 if (!From->getType()->isPtrOrPtrVectorTy())
883 return true;
884
885 return isPointerAlwaysReplaceable(From, To, DL);
886}
887
890 SmallVectorImpl<LoadInst *> &NonDereferenceableAndAlignedLoads,
892 for (BasicBlock *BB : L->blocks()) {
893 for (Instruction &I : *BB) {
894 if (auto *LI = dyn_cast<LoadInst>(&I)) {
895 if (!isDereferenceableAndAlignedInLoop(LI, L, *SE, *DT, AC, Predicates))
896 NonDereferenceableAndAlignedLoads.push_back(LI);
897 } else if (I.mayReadFromMemory() || I.mayWriteToMemory() ||
898 I.mayThrow()) {
899 return false;
900 }
901 }
902 }
903 return true;
904}
905
907 Value *Ptr) {
908 assert(Ptr->getType()->isPointerTy() && "Must be called with pointer arg");
909
910 unsigned BitWidth = DL.getIndexTypeSizeInBits(Ptr->getType());
911 LinearExpression Expr(Ptr, BitWidth);
912
913 while (true) {
914 auto *GEP = dyn_cast<GEPOperator>(Expr.BasePtr);
915 if (!GEP || GEP->getSourceElementType()->isScalableTy())
916 return Expr;
917
918 Value *VarIndex = nullptr;
919 for (Value *Index : GEP->indices()) {
920 if (isa<ConstantInt>(Index))
921 continue;
922 // Only allow a single variable index. We do not bother to handle the
923 // case of the same variable index appearing multiple times.
924 if (Expr.Index || VarIndex)
925 return Expr;
926 VarIndex = Index;
927 }
928
929 // Don't return non-canonical indexes.
930 if (VarIndex && !VarIndex->getType()->isIntegerTy(BitWidth))
931 return Expr;
932
933 // We have verified that we can fully handle this GEP, so we can update Expr
934 // members past this point.
935 Expr.BasePtr = GEP->getPointerOperand();
936 Expr.Flags = Expr.Flags.intersectForOffsetAdd(GEP->getNoWrapFlags());
938 GTI != GTE; ++GTI) {
939 Value *Index = GTI.getOperand();
940 if (auto *ConstOffset = dyn_cast<ConstantInt>(Index)) {
941 if (ConstOffset->isZero())
942 continue;
943 if (StructType *STy = GTI.getStructTypeOrNull()) {
944 unsigned ElementIdx = ConstOffset->getZExtValue();
945 const StructLayout *SL = DL.getStructLayout(STy);
946 Expr.Offset += SL->getElementOffset(ElementIdx);
947 continue;
948 }
949 // Truncate if type size exceeds index space.
950 APInt IndexedSize(BitWidth, GTI.getSequentialElementStride(DL),
951 /*isSigned=*/false,
952 /*implcitTrunc=*/true);
953 Expr.Offset += ConstOffset->getValue() * IndexedSize;
954 continue;
955 }
956
957 // FIXME: Also look through a mul/shl in the index.
958 assert(Expr.Index == nullptr && "Shouldn't have index yet");
959 Expr.Index = Index;
960 // Truncate if type size exceeds index space.
961 Expr.Scale = APInt(BitWidth, GTI.getSequentialElementStride(DL),
962 /*isSigned=*/false, /*implicitTrunc=*/true);
963 }
964 }
965
966 return Expr;
967}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
@ Available
We know the block is fully available. This is a fixpoint.
Definition GVN.cpp:947
Hexagon Common GEP
static bool AreEquivalentAddressValues(const Value *A, const Value *B)
Test if A and B will obviously have the same value.
Definition Loads.cpp:281
static bool isPointerAlwaysReplaceable(const Value *From, const Value *To, const DataLayout &DL)
Definition Loads.cpp:840
static bool isDereferenceableAndAlignedPointerViaAssumption(const Value *Ptr, Align Alignment, const SimplifyQuery &SQ, bool IgnoreFree, function_ref< bool(const RetainedKnowledge &RK)> CheckSize)
Definition Loads.cpp:35
static bool isPointerUseReplacable(const Use &U, bool HasNonAddressBits)
Definition Loads.cpp:816
static bool areNonOverlapSameBaseLoadAndStore(const Value *LoadPtr, Type *LoadTy, const Value *StorePtr, Type *StoreTy, const DataLayout &DL)
Definition Loads.cpp:567
static Value * getAvailableLoadStore(Instruction *Inst, const Value *Ptr, Type *AccessTy, bool AtLeastAtomic, const DataLayout &DL, bool *IsLoadCSE)
Definition Loads.cpp:591
static bool suppressSpeculativeLoadForSanitizers(const Instruction &CtxI)
Definition Loads.cpp:432
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
This file provides utility analysis objects describing memory locations.
uint64_t IntrinsicInst * II
Class for arbitrary precision integers.
Definition APInt.h:78
bool ugt(const APInt &RHS) const
Unsigned greater than comparison.
Definition APInt.h:1189
LLVM_ABI APInt urem(const APInt &RHS) const
Unsigned remainder operation.
Definition APInt.cpp:1709
unsigned getBitWidth() const
Return the number of bits in the APInt.
Definition APInt.h:1511
LLVM_ABI APInt uadd_ov(const APInt &RHS, bool &Overflow) const
Definition APInt.cpp:1987
static LLVM_ABI APInt getSplat(unsigned NewLen, const APInt &V)
Return a value containing V broadcasted over NewLen bits.
Definition APInt.cpp:652
bool getBoolValue() const
Convert APInt to a boolean value.
Definition APInt.h:472
bool uge(const APInt &RHS) const
Unsigned greater or equal comparison.
Definition APInt.h:1228
A cache of @llvm.assume calls within a function.
LLVM Basic Block Representation.
Definition BasicBlock.h:62
iterator begin()
Instruction iterator methods.
Definition BasicBlock.h:461
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
InstListType::iterator iterator
Instruction iterators...
Definition BasicBlock.h:170
This class is a wrapper over an AAResults, and it is intended to be used only when there are no IR ch...
static LLVM_ABI bool isBitOrNoopPointerCastable(Type *SrcTy, Type *DestTy, const DataLayout &DL)
Check whether a bitcast, inttoptr, or ptrtoint cast between these types is valid and a no-op.
@ ICMP_ULE
unsigned less or equal
Definition InstrTypes.h:766
This is the shared class of boolean and integer constants.
Definition Constants.h:87
This class represents a range of values.
LLVM_ABI bool isEmptySet() const
Return true if this set contains no members.
LLVM_ABI ConstantRange intersectWith(const ConstantRange &CR, PreferredRangeType Type=Smallest) const
Return the range that results from the intersection of this range with another range.
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
LLVM_ABI unsigned getIndexTypeSizeInBits(Type *Ty) const
The size in bits of the index used in GEP calculation for this type.
LLVM_ABI unsigned getPointerTypeSizeInBits(Type *) const
The pointer representation size in bits for this type.
TypeSize getTypeStoreSize(Type *Ty) const
Returns the maximum number of bytes that may be overwritten by storing the specified type.
Definition DataLayout.h:579
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
Definition Dominators.h:151
Represents calls to the gc.relocate intrinsic.
GEPNoWrapFlags intersectForOffsetAdd(GEPNoWrapFlags Other) const
Given (gep (gep p, x), y), determine the nowrap flags for (gep p, x+y).
LLVM_ABI bool isDebugOrPseudoInst() const LLVM_READONLY
Return true if the instruction is a DbgInfoIntrinsic or PseudoProbeInst.
LLVM_ABI bool mayWriteToMemory() const LLVM_READONLY
Return true if this instruction may modify memory.
LLVM_ABI const Function * getFunction() const
Return the function this instruction belongs to.
LLVM_ABI const DataLayout & getDataLayout() const
Get the data layout of the module this instruction belongs to.
An instruction for reading from memory.
Value * getPointerOperand()
bool isUnordered() const
Align getAlign() const
Return the alignment of the access that is being performed.
static LocationSize precise(uint64_t Value)
Represents a single loop in the control flow graph.
Definition LoopInfo.h:40
Representation for a specific memory location.
static LLVM_ABI MemoryLocation get(const LoadInst *LI)
Return a location with information about the memory reference by the given instruction.
This means that we are dealing with an entirely unknown SCEV value, and only represent it as its LLVM...
This class represents an analyzed expression in the program.
static LLVM_ABI LoopGuards collect(const Loop *L, ScalarEvolution &SE)
Collect rewrite map for loop guards for loop L, together with flags indicating if NUW and NSW can be ...
The main scalar evolution driver.
LLVM_ABI const SCEV * getBackedgeTakenCount(const Loop *L, ExitCountKind Kind=Exact)
If the specified loop has a predictable backedge-taken count, return it, otherwise return a SCEVCould...
LLVM_ABI const SCEV * getConstant(ConstantInt *V)
LLVM_ABI const SCEV * getPredicatedBackedgeTakenCount(const Loop *L, SmallVectorImpl< const SCEVPredicate * > &Predicates)
Similar to getBackedgeTakenCount, except it will add a set of SCEV predicates to Predicates that are ...
LLVM_ABI const SCEV * getSCEV(Value *V)
Return a SCEV expression for the full generality of the specified expression.
LLVM_ABI const SCEV * getMinusSCEV(SCEVUse LHS, SCEVUse RHS, SCEV::NoWrapFlags Flags=SCEV::FlagAnyWrap, unsigned Depth=0)
Return LHS-RHS.
APInt getUnsignedRangeMax(const SCEV *S)
Determine the max of the unsigned range for a particular SCEV.
LLVM_ABI const SCEV * getAddExpr(SmallVectorImpl< SCEVUse > &Ops, SCEV::NoWrapFlags Flags=SCEV::FlagAnyWrap, unsigned Depth=0)
Get a canonical add expression, or something simpler if possible.
LLVM_ABI bool isKnownPredicate(CmpPredicate Pred, SCEVUse LHS, SCEVUse RHS)
Test if the given expression is known to satisfy the condition described by Pred, LHS,...
LLVM_ABI const SCEV * applyLoopGuards(const SCEV *Expr, const Loop *L)
Try to apply information from loop guards for L to Expr.
LLVM_ABI const SCEV * getPredicatedSymbolicMaxBackedgeTakenCount(const Loop *L, SmallVectorImpl< const SCEVPredicate * > &Predicates)
Similar to getSymbolicMaxBackedgeTakenCount, except it will add a set of SCEV predicates to Predicate...
const SCEV * getSymbolicMaxBackedgeTakenCount(const Loop *L)
When successful, this returns a SCEV that is greater than or equal to (i.e.
This class represents the LLVM 'select' instruction.
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
iterator insert(iterator I, T &&Elt)
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.
Used to lazily calculate structure layout information for a target machine, based on the DataLayout s...
Definition DataLayout.h:743
TypeSize getElementOffset(unsigned Idx) const
Definition DataLayout.h:774
Class to represent struct types.
Provides information about what library functions are available for the current target.
static constexpr TypeSize getFixed(ScalarTy ExactSize)
Definition TypeSize.h:343
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
bool isPointerTy() const
True if this is an instance of PointerType.
Definition Type.h:282
LLVM_ABI unsigned getPointerAddressSpace() const
Get the address space of this pointer or pointer vector type.
static LLVM_ABI IntegerType * getInt8Ty(LLVMContext &C)
Definition Type.cpp:307
bool isPtrOrPtrVectorTy() const
Return true if this is a pointer type or a vector of pointer types.
Definition Type.h:285
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
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:255
user_iterator user_begin()
Definition Value.h:402
LLVMContext & getContext() const
All values hold a context through their type.
Definition Value.h:258
LLVM_ABI Align getPointerAlignment(const DataLayout &DL) const
Returns an alignment of the pointer value.
Definition Value.cpp:980
LLVM_ABI bool canBeFreed() const
Return true if the memory object referred to by V can by freed in the scope for which the SSA value d...
Definition Value.cpp:827
LLVM_ABI const Value * stripAndAccumulateConstantOffsets(const DataLayout &DL, APInt &Offset, bool AllowNonInbounds, bool AllowInvariantGroup=false, function_ref< bool(Value &Value, APInt &Offset)> ExternalAnalysis=nullptr, bool LookThroughIntToPtr=false) const
Accumulate the constant offset this value has compared to a base pointer.
LLVM_ABI const Value * stripPointerCasts() const
Strip off pointer casts, all-zero GEPs and address space casts.
Definition Value.cpp:712
user_iterator user_end()
Definition Value.h:410
constexpr ScalarTy getFixedValue() const
Definition TypeSize.h:200
static constexpr bool isKnownLE(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
Definition TypeSize.h:230
constexpr bool isScalable() const
Returns whether the quantity is scaled by a runtime quantity (vscale).
Definition TypeSize.h:168
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
CallInst * Call
Abstract Attribute helper functions.
Definition Attributor.h:165
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
initializer< Ty > init(const Ty &Val)
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI std::pair< const SCEV *, const SCEV * > getStartAndEndForAccess(const Loop *Lp, const SCEV *PtrExpr, Type *AccessTy, const SCEV *BTC, const SCEV *MaxBTC, ScalarEvolution *SE, DenseMap< std::pair< const SCEV *, const SCEV * >, std::pair< const SCEV *, const SCEV * > > *PointerBounds, DominatorTree *DT, AssumptionCache *AC, std::optional< ScalarEvolution::LoopGuards > &LoopGuards)
Calculate Start and End points of memory access using exact backedge taken count BTC if computable or...
LLVM_ABI bool willNotFreeBetween(const Instruction *Assume, const Instruction *CtxI)
Returns true, if no instruction between Assume and CtxI may free (including through synchronization).
@ Offset
Definition DWP.cpp:558
LLVM_ABI RetainedKnowledge getKnowledgeForValue(const Value *V, ArrayRef< Attribute::AttrKind > AttrKinds, AssumptionCache &AC, function_ref< bool(RetainedKnowledge, Instruction *, const CallBase::BundleOpInfo *)> Filter=[](auto...) { return true;})
Return a valid Knowledge associated to the Value V if its Attribute kind is in AttrKinds and it match...
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,...
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
bool isAligned(Align Lhs, uint64_t SizeInBytes)
Checks that SizeInBytes is a multiple of the alignment.
Definition Alignment.h:134
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
Value * GetPointerBaseWithConstantOffset(Value *Ptr, int64_t &Offset, const DataLayout &DL, bool AllowNonInbounds=true)
Analyze the specified pointer to see if it can be expressed as a base pointer plus a constant offset.
LLVM_ABI Value * findAvailablePtrLoadStore(const MemoryLocation &Loc, Type *AccessTy, bool AtLeastAtomic, BasicBlock *ScanBB, BasicBlock::iterator &ScanFrom, unsigned MaxInstsToScan, BatchAAResults *AA, bool *IsLoadCSE, unsigned *NumScanedInst)
Scan backwards to see if we have the value of the given pointer available locally within a small numb...
Definition Loads.cpp:685
LLVM_ABI bool mustSuppressSpeculation(const LoadInst &LI)
Return true if speculation of the given load must be suppressed to avoid ordering or interfering with...
Definition Loads.cpp:441
gep_type_iterator gep_type_end(const User *GEP)
LLVM_ABI Value * FindAvailableLoadedValue(LoadInst *Load, BasicBlock *ScanBB, BasicBlock::iterator &ScanFrom, unsigned MaxInstsToScan=DefMaxInstsToScan, BatchAAResults *AA=nullptr, bool *IsLoadCSE=nullptr, unsigned *NumScanedInst=nullptr)
Scan backwards to see if we have the value of the given load available locally within a small number ...
Definition Loads.cpp:550
LLVM_ABI const Value * getArgumentAliasingToReturnedPointer(const CallBase *Call, bool MustPreserveOffset)
This function returns call pointer argument that is considered the same by aliasing rules.
LLVM_ABI bool getObjectSize(const Value *Ptr, uint64_t &Size, const DataLayout &DL, const TargetLibraryInfo *TLI, ObjectSizeOpts Opts={})
Compute the size of the object pointed by Ptr.
LLVM_ABI bool canReplacePointersInUseIfEqual(const Use &U, const Value *To, const DataLayout &DL)
Definition Loads.cpp:858
LLVM_ABI bool canReplacePointersIfEqual(const Value *From, const Value *To, const DataLayout &DL)
Returns true if a pointer value From can be replaced with another pointer value \To if they are deeme...
Definition Loads.cpp:878
bool isModSet(const ModRefInfo MRI)
Definition ModRef.h:49
LLVM_ABI LinearExpression decomposeLinearExpression(const DataLayout &DL, Value *Ptr)
Decompose a pointer into a linear expression.
Definition Loads.cpp:906
LLVM_ABI bool isSafeToLoadUnconditionally(Value *V, Align Alignment, const APInt &Size, const DataLayout &DL, Instruction *ScanFrom, AssumptionCache *AC=nullptr, const DominatorTree *DT=nullptr, const TargetLibraryInfo *TLI=nullptr)
Return true if we know that executing a load from this value cannot trap.
Definition Loads.cpp:445
generic_gep_type_iterator<> gep_type_iterator
LLVM_ABI Constant * ConstantFoldLoadFromConst(Constant *C, Type *Ty, const APInt &Offset, const DataLayout &DL)
Extract value of C at the given Offset reinterpreted as Ty.
LLVM_ABI cl::opt< unsigned > DefMaxInstsToScan
The default number of maximum instructions to scan in the block, used by FindAvailableLoadedValue().
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 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 const Value * getUnderlyingObjectAggressive(const Value *V)
Like getUnderlyingObject(), but will try harder to find a single underlying object.
LLVM_ABI bool isDereferenceableAndAlignedPointer(const Value *V, Type *Ty, Align Alignment, const SimplifyQuery &Q, bool IgnoreFree=false)
Returns true if V is always a dereferenceable pointer with alignment greater or equal than requested.
Definition Loads.cpp:245
constexpr unsigned BitWidth
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
LLVM_ABI bool isReadOnlyLoop(Loop *L, ScalarEvolution *SE, DominatorTree *DT, AssumptionCache *AC, SmallVectorImpl< LoadInst * > &NonDereferenceableAndAlignedLoads, SmallVectorImpl< const SCEVPredicate * > *Predicates=nullptr)
Returns true if the loop contains read-only memory accesses and doesn't throw.
Definition Loads.cpp:888
gep_type_iterator gep_type_begin(const User *GEP)
LLVM_ABI bool isDereferenceablePointer(const Value *V, Type *Ty, const SimplifyQuery &Q, bool IgnoreFree=false)
Return true if this is always a dereferenceable pointer.
Definition Loads.cpp:265
LLVM_ABI bool isDereferenceableAndAlignedInLoop(LoadInst *LI, Loop *L, ScalarEvolution &SE, DominatorTree &DT, AssumptionCache *AC=nullptr, SmallVectorImpl< const SCEVPredicate * > *Predicates=nullptr)
Return true if we can prove that the given load (which is assumed to be within the specified loop) wo...
Definition Loads.cpp:300
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
constexpr uint64_t value() const
This is a hole in the type system and should not be abused.
Definition Alignment.h:77
Linear expression BasePtr + Index * Scale + Offset.
Definition Loads.h:213
GEPNoWrapFlags Flags
Definition Loads.h:218
Various options to control the behavior of getObjectSize.
bool NullIsUnknownSize
If this is true, null pointers in address space 0 will be treated as though they can't be evaluated.
bool RoundToAlign
Whether to round the result up to the alignment of allocas, byval arguments, and global variables.
Represent one information held inside an operand bundle of an llvm.assume.
Attribute::AttrKind AttrKind
const DataLayout & DL
const Instruction * CxtI
const DominatorTree * DT
AssumptionCache * AC
const TargetLibraryInfo * TLI