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,
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();
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 SmallPtrSetImpl<const Value *> &Visited, unsigned MaxDepth) {
72 assert(V->getType()->isPointerTy() && "Base must be pointer");
73
74 // Recursion limit.
75 if (MaxDepth-- == 0)
76 return false;
77
78 // Already visited? Bail out, we've likely hit unreachable code.
79 if (!Visited.insert(V).second)
80 return false;
81
82 // Note that it is not safe to speculate into a malloc'd region because
83 // malloc may return null.
84
85 // For GEPs, determine if the indexing lands within the allocated object.
86 if (const GEPOperator *GEP = dyn_cast<GEPOperator>(V)) {
87 const Value *Base = GEP->getPointerOperand();
88
89 APInt Offset(SQ.DL.getIndexTypeSizeInBits(GEP->getType()), 0);
90 if (!GEP->accumulateConstantOffset(SQ.DL, Offset) || Offset.isNegative() ||
91 !Offset.urem(APInt(Offset.getBitWidth(), Alignment.value()))
92 .isMinValue())
93 return false;
94
95 // If the base pointer is dereferenceable for Offset+Size bytes, then the
96 // GEP (== Base + Offset) is dereferenceable for Size bytes. If the base
97 // pointer is aligned to Align bytes, and the Offset is divisible by Align
98 // then the GEP (== Base + Offset == k_0 * Align + k_1 * Align) is also
99 // aligned to Align bytes.
100
101 // Offset and Size may have different bit widths if we have visited an
102 // addrspacecast, so we can't do arithmetic directly on the APInt values.
104 Base, Alignment, Offset + Size.sextOrTrunc(Offset.getBitWidth()), SQ,
105 Visited, MaxDepth);
106 }
107
108 // bitcast instructions are no-ops as far as dereferenceability is concerned.
109 if (const BitCastOperator *BC = dyn_cast<BitCastOperator>(V)) {
110 if (BC->getSrcTy()->isPointerTy())
111 return isDereferenceableAndAlignedPointer(BC->getOperand(0), Alignment,
112 Size, SQ, Visited, MaxDepth);
113 }
114
115 // Recurse into both hands of select.
116 if (const SelectInst *Sel = dyn_cast<SelectInst>(V)) {
117 return isDereferenceableAndAlignedPointer(Sel->getTrueValue(), Alignment,
118 Size, SQ, Visited, MaxDepth) &&
119 isDereferenceableAndAlignedPointer(Sel->getFalseValue(), Alignment,
120 Size, SQ, Visited, MaxDepth);
121 }
122
123 auto IsKnownDeref = [&]() {
124 bool CheckForNonNull, CheckForFreed;
125 if (!Size.ule(V->getPointerDereferenceableBytes(SQ.DL, CheckForNonNull,
126 CheckForFreed)))
127 return false;
128 if (CheckForNonNull && !isKnownNonZero(V, SQ))
129 return false;
130
131 auto *I = dyn_cast<Instruction>(V);
132 if (CheckForFreed) {
133 const Instruction *DefI;
134 if (I) {
135 // We don't want to consider frees by the instruction producing the
136 // pointer, so skip it if we can.
137 if (auto *II = dyn_cast<InvokeInst>(V)) {
138 DefI = &II->getNormalDest()->front();
139 } else if (!I->isTerminator()) {
140 DefI = I->getNextNode();
141 } else {
142 DefI = I;
143 }
144 } else {
145 // For arguments, check frees from the start of the entry block.
146 DefI = &cast<Argument>(V)->getParent()->getEntryBlock().front();
147 }
148
149 if (!SQ.CxtI || !willNotFreeBetween(DefI, SQ.CxtI))
150 return false;
151 }
152
153 // When using something like !dereferenceable on a load, the
154 // dereferenceability may only be valid on a specific control-flow path.
155 // If the instruction doesn't dominate the context instruction, we're
156 // asking about dereferenceability under the assumption that the
157 // instruction has been speculated to the point of the context instruction,
158 // in which case we don't know if the dereferenceability info still holds.
159 // We don't bother handling allocas here, as they aren't speculatable
160 // anyway.
161 if (I && !isa<AllocaInst>(I))
162 return SQ.CxtI && isValidAssumeForContext(I, SQ.CxtI, SQ.DT);
163 return true;
164 };
165 if (IsKnownDeref()) {
166 // As we recursed through GEPs to get here, we've incrementally checked
167 // that each step advanced by a multiple of the alignment. If our base is
168 // properly aligned, then the original offset accessed must also be.
169 return isAligned(V, Alignment, SQ.DL);
170 }
171
172 /// TODO refactor this function to be able to search independently for
173 /// Dereferencability and Alignment requirements.
174
175
176 if (const auto *Call = dyn_cast<CallBase>(V)) {
178 Call, /*MustPreserveOffset=*/true))
179 return isDereferenceableAndAlignedPointer(RP, Alignment, Size, SQ,
180 Visited, MaxDepth);
181
182 // If we have a call we can't recurse through, check to see if this is an
183 // allocation function for which we can establish an minimum object size.
184 // Such a minimum object size is analogous to a deref_or_null attribute in
185 // that we still need to prove the result non-null at point of use.
186 // NOTE: We can only use the object size as a base fact as we a) need to
187 // prove alignment too, and b) don't want the compile time impact of a
188 // separate recursive walk.
189 ObjectSizeOpts Opts;
190 // TODO: It may be okay to round to align, but that would imply that
191 // accessing slightly out of bounds was legal, and we're currently
192 // inconsistent about that. For the moment, be conservative.
193 Opts.RoundToAlign = false;
194 Opts.NullIsUnknownSize = true;
195 uint64_t ObjSize;
196 if (getObjectSize(V, ObjSize, SQ.DL, SQ.TLI, Opts)) {
197 APInt KnownDerefBytes(Size.getBitWidth(), ObjSize);
198 if (KnownDerefBytes.getBoolValue() && KnownDerefBytes.uge(Size) &&
199 isKnownNonZero(V, SQ) && !V->canBeFreed()) {
200 // As we recursed through GEPs to get here, we've incrementally
201 // checked that each step advanced by a multiple of the alignment. If
202 // our base is properly aligned, then the original offset accessed
203 // must also be.
204 return isAligned(V, Alignment, SQ.DL);
205 }
206 }
207 }
208
209 // For gc.relocate, look through relocations
210 if (const GCRelocateInst *RelocateInst = dyn_cast<GCRelocateInst>(V))
212 RelocateInst->getDerivedPtr(), Alignment, Size, SQ, Visited, MaxDepth);
213
215 return isDereferenceableAndAlignedPointer(ASC->getOperand(0), Alignment,
216 Size, SQ, Visited, MaxDepth);
217
219 V, Alignment, SQ, [Size](const RetainedKnowledge &RK) {
220 return RK.ArgValue >= Size.getZExtValue();
221 });
222}
223
225 const APInt &Size,
226 const SimplifyQuery &SQ) {
227 // Note: At the moment, Size can be zero. This ends up being interpreted as
228 // a query of whether [Base, V] is dereferenceable and V is aligned (since
229 // that's what the implementation happened to do). It's unclear if this is
230 // the desired semantic, but at least SelectionDAG does exercise this case.
231
233 return ::isDereferenceableAndAlignedPointer(V, Alignment, Size, SQ, Visited,
234 /*MaxDepth=*/16);
235}
236
238 Align Alignment,
239 const SimplifyQuery &SQ) {
240 // For unsized types or scalable vectors we don't know exactly how many bytes
241 // are dereferenced, so bail out.
242 if (!Ty->isSized() || Ty->isScalableTy())
243 return false;
244
245 // When dereferenceability information is provided by a dereferenceable
246 // attribute, we know exactly how many bytes are dereferenceable. If we can
247 // determine the exact offset to the attributed variable, we can use that
248 // information here.
249
250 APInt AccessSize(SQ.DL.getPointerTypeSizeInBits(V->getType()),
251 SQ.DL.getTypeStoreSize(Ty));
252 return isDereferenceableAndAlignedPointer(V, Alignment, AccessSize, SQ);
253}
254
256 const SimplifyQuery &SQ) {
257 return isDereferenceableAndAlignedPointer(V, Ty, Align(1), SQ);
258}
259
260/// Test if A and B will obviously have the same value.
261///
262/// This includes recognizing that %t0 and %t1 will have the same
263/// value in code like this:
264/// \code
265/// %t0 = getelementptr \@a, 0, 3
266/// store i32 0, i32* %t0
267/// %t1 = getelementptr \@a, 0, 3
268/// %t2 = load i32* %t1
269/// \endcode
270///
271static bool AreEquivalentAddressValues(const Value *A, const Value *B) {
272 // Test if the values are trivially equivalent.
273 if (A == B)
274 return true;
275
276 // Test if the values come from identical arithmetic instructions.
277 // Use isIdenticalToWhenDefined instead of isIdenticalTo because
278 // this function is only used when one address use dominates the
279 // other, which means that they'll always either have the same
280 // value or one of them will have an undefined value.
282 if (const Instruction *BI = dyn_cast<Instruction>(B))
283 if (cast<Instruction>(A)->isIdenticalToWhenDefined(BI))
284 return true;
285
286 // Otherwise they may not be equivalent.
287 return false;
288}
289
291 LoadInst *LI, Loop *L, ScalarEvolution &SE, DominatorTree &DT,
293 auto &DL = LI->getDataLayout();
294 Value *Ptr = LI->getPointerOperand();
295 const SCEV *PtrSCEV = SE.getSCEV(Ptr);
296 APInt EltSize(DL.getIndexTypeSizeInBits(Ptr->getType()),
297 DL.getTypeStoreSize(LI->getType()).getFixedValue());
298
299 // If given a uniform (i.e. non-varying) address, see if we can prove the
300 // access is safe within the loop w/o needing predication.
301 if (L->isLoopInvariant(Ptr))
303 Ptr, LI->getAlign(), EltSize,
304 SimplifyQuery(DL, &DT, AC, &*L->getHeader()->getFirstNonPHIIt()));
305
306 const SCEV *EltSizeSCEV = SE.getConstant(EltSize);
307 return isDereferenceableAndAlignedInLoop(PtrSCEV, LI->getAlign(), EltSizeSCEV,
308 L, SE, DT, AC, Predicates);
309}
310
312 const SCEV *PtrSCEV, Align Alignment, const SCEV *EltSizeSCEV, Loop *L,
315 auto *AddRec = dyn_cast<SCEVAddRecExpr>(PtrSCEV);
316
317 // Check to see if we have a repeating access pattern and it's possible
318 // to prove all accesses are well aligned.
319 if (!AddRec || AddRec->getLoop() != L || !AddRec->isAffine())
320 return false;
321
322 auto *Step = dyn_cast<SCEVConstant>(AddRec->getStepRecurrence(SE));
323 if (!Step)
324 return false;
325
326 const APInt &EltSize = cast<SCEVConstant>(EltSizeSCEV)->getAPInt();
327 // For the moment, restrict ourselves to the case where the access size is a
328 // multiple of the requested alignment and the base is aligned.
329 // TODO: generalize if a case found which warrants
330 if (EltSize.urem(Alignment.value()) != 0)
331 return false;
332
333 // TODO: Handle overlapping accesses.
334 if (EltSize.ugt(Step->getAPInt().abs()))
335 return false;
336
337 const SCEV *MaxBECount =
338 Predicates ? SE.getPredicatedSymbolicMaxBackedgeTakenCount(L, *Predicates)
340 const SCEV *BECount = Predicates
341 ? SE.getPredicatedBackedgeTakenCount(L, *Predicates)
342 : SE.getBackedgeTakenCount(L);
343 if (isa<SCEVCouldNotCompute>(MaxBECount))
344 return false;
345 std::optional<ScalarEvolution::LoopGuards> LoopGuards;
346
347 auto &DL = L->getHeader()->getDataLayout();
348 const auto &[AccessStart, AccessEnd] =
349 getStartAndEndForAccess(L, PtrSCEV, EltSizeSCEV, BECount, MaxBECount, &SE,
350 nullptr, &DT, AC, LoopGuards);
351 if (isa<SCEVCouldNotCompute>(AccessStart) ||
352 isa<SCEVCouldNotCompute>(AccessEnd))
353 return false;
354
355 // Try to get the access size.
356 const SCEV *PtrDiff = SE.getMinusSCEV(AccessEnd, AccessStart);
357 if (isa<SCEVCouldNotCompute>(PtrDiff))
358 return false;
359
360 if (!LoopGuards)
361 LoopGuards.emplace(
362 ScalarEvolution::LoopGuards::collect(AddRec->getLoop(), SE));
363
364 APInt MaxPtrDiff =
365 SE.getUnsignedRangeMax(SE.applyLoopGuards(PtrDiff, *LoopGuards));
366
367 Value *Base = nullptr;
368 APInt AccessSize;
369 const SCEV *AccessSizeSCEV = nullptr;
370 if (const SCEVUnknown *NewBase = dyn_cast<SCEVUnknown>(AccessStart)) {
371 Base = NewBase->getValue();
372 AccessSize = std::move(MaxPtrDiff);
373 AccessSizeSCEV = PtrDiff;
374 } else if (auto *MinAdd = dyn_cast<SCEVAddExpr>(AccessStart)) {
375 if (MinAdd->getNumOperands() != 2)
376 return false;
377
378 const auto *Offset = dyn_cast<SCEVConstant>(MinAdd->getOperand(0));
379 const auto *NewBase = dyn_cast<SCEVUnknown>(MinAdd->getOperand(1));
380 if (!Offset || !NewBase)
381 return false;
382
383 // The following code below assumes the offset is unsigned, but GEP
384 // offsets are treated as signed so we can end up with a signed value
385 // here too. For example, suppose the initial PHI value is (i8 255),
386 // the offset will be treated as (i8 -1) and sign-extended to (i64 -1).
387 if (Offset->getAPInt().isNegative())
388 return false;
389
390 // For the moment, restrict ourselves to the case where the offset is a
391 // multiple of the requested alignment and the base is aligned.
392 // TODO: generalize if a case found which warrants
393 if (Offset->getAPInt().urem(Alignment.value()) != 0)
394 return false;
395
396 bool Overflow = false;
397 AccessSize = MaxPtrDiff.uadd_ov(Offset->getAPInt(), Overflow);
398 if (Overflow)
399 return false;
400 AccessSizeSCEV = SE.getAddExpr(PtrDiff, Offset);
401 Base = NewBase->getValue();
402 } else
403 return false;
404
405 Instruction *CtxI = &*L->getHeader()->getFirstNonPHIIt();
406 if (BasicBlock *LoopPred = L->getLoopPredecessor()) {
407 if (isa<UncondBrInst, CondBrInst>(LoopPred->getTerminator()))
408 CtxI = LoopPred->getTerminator();
409 }
410 SimplifyQuery SQ(DL, &DT, AC, CtxI);
412 Base, Alignment, SQ,
413 [&SE, AccessSizeSCEV, &LoopGuards](const RetainedKnowledge &RK) {
414 return SE.isKnownPredicate(
416 SE.applyLoopGuards(AccessSizeSCEV, *LoopGuards),
417 SE.applyLoopGuards(SE.getSCEV(RK.IRArgValue), *LoopGuards));
418 }) ||
419 isDereferenceableAndAlignedPointer(Base, Alignment, AccessSize, SQ);
420}
421
423 const Function &F = *CtxI.getFunction();
424 // Speculative load may create a race that did not exist in the source.
425 return F.hasFnAttribute(Attribute::SanitizeThread) ||
426 // Speculative load may load data from dirty regions.
427 F.hasFnAttribute(Attribute::SanitizeAddress) ||
428 F.hasFnAttribute(Attribute::SanitizeHWAddress);
429}
430
434
436 const DataLayout &DL,
437 Instruction *ScanFrom,
438 AssumptionCache *AC,
439 const DominatorTree *DT,
440 const TargetLibraryInfo *TLI) {
442 V, Alignment, Size, SimplifyQuery(DL, TLI, DT, AC, ScanFrom))) {
443 // With sanitizers `Dereferenceable` is not always enough for unconditional
444 // load.
445 if (!ScanFrom || !suppressSpeculativeLoadForSanitizers(*ScanFrom))
446 return true;
447 }
448
449 if (!ScanFrom)
450 return false;
451
452 if (Size.getBitWidth() > 64)
453 return false;
454 const TypeSize LoadSize = TypeSize::getFixed(Size.getZExtValue());
455
456 // Otherwise, be a little bit aggressive by scanning the local block where we
457 // want to check to see if the pointer is already being loaded or stored
458 // from/to. If so, the previous load or store would have already trapped,
459 // so there is no harm doing an extra load (also, CSE will later eliminate
460 // the load entirely).
461 BasicBlock::iterator BBI = ScanFrom->getIterator(),
462 E = ScanFrom->getParent()->begin();
463
464 // We can at least always strip pointer casts even though we can't use the
465 // base here.
466 V = V->stripPointerCasts();
467
468 while (BBI != E) {
469 --BBI;
470
471 // If we see a free or a call which may write to memory (i.e. which might do
472 // a free) the pointer could be marked invalid.
473 if (isa<CallInst>(BBI) && BBI->mayWriteToMemory() &&
475 return false;
476
477 Value *AccessedPtr;
478 Type *AccessedTy;
479 Align AccessedAlign;
480 if (LoadInst *LI = dyn_cast<LoadInst>(BBI)) {
481 // Ignore volatile loads. The execution of a volatile load cannot
482 // be used to prove an address is backed by regular memory; it can,
483 // for example, point to an MMIO register.
484 if (LI->isVolatile())
485 continue;
486 AccessedPtr = LI->getPointerOperand();
487 AccessedTy = LI->getType();
488 AccessedAlign = LI->getAlign();
489 } else if (StoreInst *SI = dyn_cast<StoreInst>(BBI)) {
490 // Ignore volatile stores (see comment for loads).
491 if (SI->isVolatile())
492 continue;
493 AccessedPtr = SI->getPointerOperand();
494 AccessedTy = SI->getValueOperand()->getType();
495 AccessedAlign = SI->getAlign();
496 } else
497 continue;
498
499 if (AccessedAlign < Alignment)
500 continue;
501
502 // Handle trivial cases.
503 if (AccessedPtr == V &&
504 TypeSize::isKnownLE(LoadSize, DL.getTypeStoreSize(AccessedTy)))
505 return true;
506
507 if (AreEquivalentAddressValues(AccessedPtr->stripPointerCasts(), V) &&
508 TypeSize::isKnownLE(LoadSize, DL.getTypeStoreSize(AccessedTy)))
509 return true;
510 }
511 return false;
512}
513
515 const DataLayout &DL,
516 Instruction *ScanFrom,
517 AssumptionCache *AC,
518 const DominatorTree *DT,
519 const TargetLibraryInfo *TLI) {
520 TypeSize TySize = DL.getTypeStoreSize(Ty);
521 if (TySize.isScalable())
522 return false;
523 APInt Size(DL.getIndexTypeSizeInBits(V->getType()), TySize.getFixedValue());
524 return isSafeToLoadUnconditionally(V, Alignment, Size, DL, ScanFrom, AC, DT,
525 TLI);
526}
527
528/// DefMaxInstsToScan - the default number of maximum instructions
529/// to scan in the block, used by FindAvailableLoadedValue().
530/// FindAvailableLoadedValue() was introduced in r60148, to improve jump
531/// threading in part by eliminating partially redundant loads.
532/// At that point, the value of MaxInstsToScan was already set to '6'
533/// without documented explanation.
535llvm::DefMaxInstsToScan("available-load-scan-limit", cl::init(6), cl::Hidden,
536 cl::desc("Use this to specify the default maximum number of instructions "
537 "to scan backward from a given instruction, when searching for "
538 "available loaded value"));
539
541 BasicBlock::iterator &ScanFrom,
542 unsigned MaxInstsToScan,
543 BatchAAResults *AA, bool *IsLoad,
544 unsigned *NumScanedInst) {
545 // Don't CSE load that is volatile or anything stronger than unordered.
546 if (!Load->isUnordered())
547 return nullptr;
548
550 return findAvailablePtrLoadStore(Loc, Load->getType(), Load->isAtomic(),
551 ScanBB, ScanFrom, MaxInstsToScan, AA, IsLoad,
552 NumScanedInst);
553}
554
555// Check if the load and the store have the same base, constant offsets and
556// non-overlapping access ranges.
557static bool areNonOverlapSameBaseLoadAndStore(const Value *LoadPtr,
558 Type *LoadTy,
559 const Value *StorePtr,
560 Type *StoreTy,
561 const DataLayout &DL) {
562 APInt LoadOffset(DL.getIndexTypeSizeInBits(LoadPtr->getType()), 0);
563 APInt StoreOffset(DL.getIndexTypeSizeInBits(StorePtr->getType()), 0);
564 if (LoadOffset.getBitWidth() != StoreOffset.getBitWidth())
565 return false;
566 const Value *LoadBase = LoadPtr->stripAndAccumulateConstantOffsets(
567 DL, LoadOffset, /* AllowNonInbounds */ false);
568 const Value *StoreBase = StorePtr->stripAndAccumulateConstantOffsets(
569 DL, StoreOffset, /* AllowNonInbounds */ false);
570 if (LoadBase != StoreBase)
571 return false;
572 auto LoadAccessSize = LocationSize::precise(DL.getTypeStoreSize(LoadTy));
573 auto StoreAccessSize = LocationSize::precise(DL.getTypeStoreSize(StoreTy));
574 ConstantRange LoadRange(LoadOffset,
575 LoadOffset + LoadAccessSize.toRaw());
576 ConstantRange StoreRange(StoreOffset,
577 StoreOffset + StoreAccessSize.toRaw());
578 return LoadRange.intersectWith(StoreRange).isEmptySet();
579}
580
582 Type *AccessTy, bool AtLeastAtomic,
583 const DataLayout &DL, bool *IsLoadCSE) {
584 // If this is a load of Ptr, the loaded value is available.
585 // (This is true even if the load is volatile or atomic, although
586 // those cases are unlikely.)
587 if (LoadInst *LI = dyn_cast<LoadInst>(Inst)) {
588 // We can value forward from an atomic to a non-atomic, but not the
589 // other way around.
590 if (LI->isAtomic() < AtLeastAtomic)
591 return nullptr;
592
593 Value *LoadPtr = LI->getPointerOperand()->stripPointerCasts();
594 if (!AreEquivalentAddressValues(LoadPtr, Ptr))
595 return nullptr;
596
597 if (CastInst::isBitOrNoopPointerCastable(LI->getType(), AccessTy, DL)) {
598 if (IsLoadCSE)
599 *IsLoadCSE = true;
600 return LI;
601 }
602 }
603
604 // If this is a store through Ptr, the value is available!
605 // (This is true even if the store is volatile or atomic, although
606 // those cases are unlikely.)
607 if (StoreInst *SI = dyn_cast<StoreInst>(Inst)) {
608 // We can value forward from an atomic to a non-atomic, but not the
609 // other way around.
610 if (SI->isAtomic() < AtLeastAtomic)
611 return nullptr;
612
613 Value *StorePtr = SI->getPointerOperand()->stripPointerCasts();
614 if (!AreEquivalentAddressValues(StorePtr, Ptr))
615 return nullptr;
616
617 if (IsLoadCSE)
618 *IsLoadCSE = false;
619
620 Value *Val = SI->getValueOperand();
621 if (CastInst::isBitOrNoopPointerCastable(Val->getType(), AccessTy, DL))
622 return Val;
623
624 TypeSize StoreSize = DL.getTypeSizeInBits(Val->getType());
625 TypeSize LoadSize = DL.getTypeSizeInBits(AccessTy);
626 if (TypeSize::isKnownLE(LoadSize, StoreSize))
627 if (auto *C = dyn_cast<Constant>(Val))
628 return ConstantFoldLoadFromConst(C, AccessTy, DL);
629 }
630
631 if (auto *MSI = dyn_cast<MemSetInst>(Inst)) {
632 // Don't forward from (non-atomic) memset to atomic load.
633 if (AtLeastAtomic)
634 return nullptr;
635
636 // Only handle constant memsets.
637 auto *Val = dyn_cast<ConstantInt>(MSI->getValue());
638 auto *Len = dyn_cast<ConstantInt>(MSI->getLength());
639 if (!Val || !Len)
640 return nullptr;
641
642 // Handle offsets.
643 int64_t StoreOffset = 0, LoadOffset = 0;
644 const Value *StoreBase =
645 GetPointerBaseWithConstantOffset(MSI->getDest(), StoreOffset, DL);
646 const Value *LoadBase =
647 GetPointerBaseWithConstantOffset(Ptr, LoadOffset, DL);
648 if (StoreBase != LoadBase || LoadOffset < StoreOffset)
649 return nullptr;
650
651 if (IsLoadCSE)
652 *IsLoadCSE = false;
653
654 TypeSize LoadTypeSize = DL.getTypeSizeInBits(AccessTy);
655 if (LoadTypeSize.isScalable())
656 return nullptr;
657
658 // Make sure the read bytes are contained in the memset.
659 uint64_t LoadSize = LoadTypeSize.getFixedValue();
660 if ((Len->getValue() * 8).ult(LoadSize + (LoadOffset - StoreOffset) * 8))
661 return nullptr;
662
663 APInt Splat = LoadSize >= 8 ? APInt::getSplat(LoadSize, Val->getValue())
664 : Val->getValue().trunc(LoadSize);
665 ConstantInt *SplatC = ConstantInt::get(MSI->getContext(), Splat);
666 if (CastInst::isBitOrNoopPointerCastable(SplatC->getType(), AccessTy, DL))
667 return SplatC;
668
669 return nullptr;
670 }
671
672 return nullptr;
673}
674
676 const MemoryLocation &Loc, Type *AccessTy, bool AtLeastAtomic,
677 BasicBlock *ScanBB, BasicBlock::iterator &ScanFrom, unsigned MaxInstsToScan,
678 BatchAAResults *AA, bool *IsLoadCSE, unsigned *NumScanedInst) {
679 if (MaxInstsToScan == 0)
680 MaxInstsToScan = ~0U;
681
682 const DataLayout &DL = ScanBB->getDataLayout();
683 const Value *StrippedPtr = Loc.Ptr->stripPointerCasts();
684
685 while (ScanFrom != ScanBB->begin()) {
686 // We must ignore debug info directives when counting (otherwise they
687 // would affect codegen).
688 Instruction *Inst = &*--ScanFrom;
689 if (Inst->isDebugOrPseudoInst())
690 continue;
691
692 // Restore ScanFrom to expected value in case next test succeeds
693 ScanFrom++;
694
695 if (NumScanedInst)
696 ++(*NumScanedInst);
697
698 // Don't scan huge blocks.
699 if (MaxInstsToScan-- == 0)
700 return nullptr;
701
702 --ScanFrom;
703
704 if (Value *Available = getAvailableLoadStore(Inst, StrippedPtr, AccessTy,
705 AtLeastAtomic, DL, IsLoadCSE))
706 return Available;
707
708 // Try to get the store size for the type.
709 if (StoreInst *SI = dyn_cast<StoreInst>(Inst)) {
710 Value *StorePtr = SI->getPointerOperand()->stripPointerCasts();
711
712 // If both StrippedPtr and StorePtr reach all the way to an alloca or
713 // global and they are different, ignore the store. This is a trivial form
714 // of alias analysis that is important for reg2mem'd code.
715 if ((isa<AllocaInst>(StrippedPtr) || isa<GlobalVariable>(StrippedPtr)) &&
716 (isa<AllocaInst>(StorePtr) || isa<GlobalVariable>(StorePtr)) &&
717 StrippedPtr != StorePtr)
718 continue;
719
720 if (!AA) {
721 // When AA isn't available, but if the load and the store have the same
722 // base, constant offsets and non-overlapping access ranges, ignore the
723 // store. This is a simple form of alias analysis that is used by the
724 // inliner. FIXME: use BasicAA if possible.
726 Loc.Ptr, AccessTy, SI->getPointerOperand(),
727 SI->getValueOperand()->getType(), DL))
728 continue;
729 } else {
730 // If we have alias analysis and it says the store won't modify the
731 // loaded value, ignore the store.
732 if (!isModSet(AA->getModRefInfo(SI, Loc)))
733 continue;
734 }
735
736 // Otherwise the store that may or may not alias the pointer, bail out.
737 ++ScanFrom;
738 return nullptr;
739 }
740
741 // If this is some other instruction that may clobber Ptr, bail out.
742 if (Inst->mayWriteToMemory()) {
743 // If alias analysis claims that it really won't modify the load,
744 // ignore it.
745 if (AA && !isModSet(AA->getModRefInfo(Inst, Loc)))
746 continue;
747
748 // May modify the pointer, bail out.
749 ++ScanFrom;
750 return nullptr;
751 }
752 }
753
754 // Got to the start of the block, we didn't find it, but are done for this
755 // block.
756 return nullptr;
757}
758
760 bool *IsLoadCSE,
761 unsigned MaxInstsToScan) {
762 const DataLayout &DL = Load->getDataLayout();
763 Value *StrippedPtr = Load->getPointerOperand()->stripPointerCasts();
764 BasicBlock *ScanBB = Load->getParent();
765 Type *AccessTy = Load->getType();
766 bool AtLeastAtomic = Load->isAtomic();
767
768 if (!Load->isUnordered())
769 return nullptr;
770
771 // Try to find an available value first, and delay expensive alias analysis
772 // queries until later.
773 Value *Available = nullptr;
774 SmallVector<Instruction *> MustNotAliasInsts;
775 for (Instruction &Inst : make_range(++Load->getReverseIterator(),
776 ScanBB->rend())) {
777 if (Inst.isDebugOrPseudoInst())
778 continue;
779
780 if (MaxInstsToScan-- == 0)
781 return nullptr;
782
783 Available = getAvailableLoadStore(&Inst, StrippedPtr, AccessTy,
784 AtLeastAtomic, DL, IsLoadCSE);
785 if (Available)
786 break;
787
788 if (Inst.mayWriteToMemory())
789 MustNotAliasInsts.push_back(&Inst);
790 }
791
792 // If we found an available value, ensure that the instructions in between
793 // did not modify the memory location.
794 if (Available) {
796 for (Instruction *Inst : MustNotAliasInsts)
797 if (isModSet(AA.getModRefInfo(Inst, Loc)))
798 return nullptr;
799 }
800
801 return Available;
802}
803
804// Returns true if a use is either in an ICmp/PtrToInt or a Phi/Select that only
805// feeds into them.
806static bool isPointerUseReplacable(const Use &U, bool HasNonAddressBits) {
807 unsigned Limit = 40;
808 SmallVector<const User *> Worklist({U.getUser()});
810
811 while (!Worklist.empty() && --Limit) {
812 auto *User = Worklist.pop_back_val();
813 if (!Visited.insert(User).second)
814 continue;
816 continue;
817 // FIXME: The PtrToIntInst case here is not strictly correct, as it
818 // changes which provenance is exposed.
819 if (!HasNonAddressBits && isa<PtrToIntInst>(User))
820 continue;
822 Worklist.append(User->user_begin(), User->user_end());
823 else
824 return false;
825 }
826
827 return Limit != 0;
828}
829
830static bool isPointerAlwaysReplaceable(const Value *From, const Value *To,
831 const DataLayout &DL) {
832 // This is not strictly correct, but we do it for now to retain important
833 // optimizations.
835 return true;
836 // Conversely, replacing null in the default address space with destination
837 // pointer is always valid.
838 if (isa<ConstantPointerNull>(From) &&
839 From->getType()->getPointerAddressSpace() == 0)
840 return true;
841 if (isa<Constant>(To) && To->getType()->isPointerTy() &&
843 return true;
844 return getUnderlyingObjectAggressive(From) ==
846}
847
849 const DataLayout &DL) {
850 Type *Ty = To->getType();
851 assert(U->getType() == Ty && "values must have matching types");
852 // Not a pointer, just return true.
853 if (!Ty->isPtrOrPtrVectorTy())
854 return true;
855
856 // Do not perform replacements in lifetime intrinsic arguments.
857 if (isa<LifetimeIntrinsic>(U.getUser()))
858 return false;
859
860 if (isPointerAlwaysReplaceable(&*U, To, DL))
861 return true;
862
863 bool HasNonAddressBits =
864 DL.getAddressSizeInBits(Ty) != DL.getPointerTypeSizeInBits(Ty);
865 return isPointerUseReplacable(U, HasNonAddressBits);
866}
867
868bool llvm::canReplacePointersIfEqual(const Value *From, const Value *To,
869 const DataLayout &DL) {
870 assert(From->getType() == To->getType() && "values must have matching types");
871 // Not a pointer, just return true.
872 if (!From->getType()->isPtrOrPtrVectorTy())
873 return true;
874
875 return isPointerAlwaysReplaceable(From, To, DL);
876}
877
880 SmallVectorImpl<LoadInst *> &NonDereferenceableAndAlignedLoads,
882 for (BasicBlock *BB : L->blocks()) {
883 for (Instruction &I : *BB) {
884 if (auto *LI = dyn_cast<LoadInst>(&I)) {
885 if (!isDereferenceableAndAlignedInLoop(LI, L, *SE, *DT, AC, Predicates))
886 NonDereferenceableAndAlignedLoads.push_back(LI);
887 } else if (I.mayReadFromMemory() || I.mayWriteToMemory() ||
888 I.mayThrow()) {
889 return false;
890 }
891 }
892 }
893 return true;
894}
895
897 Value *Ptr) {
898 assert(Ptr->getType()->isPointerTy() && "Must be called with pointer arg");
899
900 unsigned BitWidth = DL.getIndexTypeSizeInBits(Ptr->getType());
901 LinearExpression Expr(Ptr, BitWidth);
902
903 while (true) {
904 auto *GEP = dyn_cast<GEPOperator>(Expr.BasePtr);
905 if (!GEP || GEP->getSourceElementType()->isScalableTy())
906 return Expr;
907
908 Value *VarIndex = nullptr;
909 for (Value *Index : GEP->indices()) {
910 if (isa<ConstantInt>(Index))
911 continue;
912 // Only allow a single variable index. We do not bother to handle the
913 // case of the same variable index appearing multiple times.
914 if (Expr.Index || VarIndex)
915 return Expr;
916 VarIndex = Index;
917 }
918
919 // Don't return non-canonical indexes.
920 if (VarIndex && !VarIndex->getType()->isIntegerTy(BitWidth))
921 return Expr;
922
923 // We have verified that we can fully handle this GEP, so we can update Expr
924 // members past this point.
925 Expr.BasePtr = GEP->getPointerOperand();
926 Expr.Flags = Expr.Flags.intersectForOffsetAdd(GEP->getNoWrapFlags());
928 GTI != GTE; ++GTI) {
929 Value *Index = GTI.getOperand();
930 if (auto *ConstOffset = dyn_cast<ConstantInt>(Index)) {
931 if (ConstOffset->isZero())
932 continue;
933 if (StructType *STy = GTI.getStructTypeOrNull()) {
934 unsigned ElementIdx = ConstOffset->getZExtValue();
935 const StructLayout *SL = DL.getStructLayout(STy);
936 Expr.Offset += SL->getElementOffset(ElementIdx);
937 continue;
938 }
939 // Truncate if type size exceeds index space.
940 APInt IndexedSize(BitWidth, GTI.getSequentialElementStride(DL),
941 /*isSigned=*/false,
942 /*implcitTrunc=*/true);
943 Expr.Offset += ConstOffset->getValue() * IndexedSize;
944 continue;
945 }
946
947 // FIXME: Also look through a mul/shl in the index.
948 assert(Expr.Index == nullptr && "Shouldn't have index yet");
949 Expr.Index = Index;
950 // Truncate if type size exceeds index space.
951 Expr.Scale = APInt(BitWidth, GTI.getSequentialElementStride(DL),
952 /*isSigned=*/false, /*implicitTrunc=*/true);
953 }
954 }
955
956 return Expr;
957}
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:271
static bool isPointerAlwaysReplaceable(const Value *From, const Value *To, const DataLayout &DL)
Definition Loads.cpp:830
static bool isPointerUseReplacable(const Use &U, bool HasNonAddressBits)
Definition Loads.cpp:806
static bool areNonOverlapSameBaseLoadAndStore(const Value *LoadPtr, Type *LoadTy, const Value *StorePtr, Type *StoreTy, const DataLayout &DL)
Definition Loads.cpp:557
static Value * getAvailableLoadStore(Instruction *Inst, const Value *Ptr, Type *AccessTy, bool AtLeastAtomic, const DataLayout &DL, bool *IsLoadCSE)
Definition Loads.cpp:581
static bool suppressSpeculativeLoadForSanitizers(const Instruction &CtxI)
Definition Loads.cpp:422
static bool isDereferenceableAndAlignedPointerViaAssumption(const Value *Ptr, Align Alignment, const SimplifyQuery &SQ, function_ref< bool(const RetainedKnowledge &RK)> CheckSize)
Definition Loads.cpp:35
#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:972
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:675
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:431
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:540
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:848
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:868
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:896
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:435
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)
Returns true if V is always a dereferenceable pointer with alignment greater or equal than requested.
Definition Loads.cpp:237
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:878
gep_type_iterator gep_type_begin(const User *GEP)
LLVM_ABI bool isDereferenceablePointer(const Value *V, Type *Ty, const SimplifyQuery &Q)
Return true if this is always a dereferenceable pointer.
Definition Loads.cpp:255
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:290
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:207
GEPNoWrapFlags Flags
Definition Loads.h:212
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