LLVM 20.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"
22#include "llvm/IR/DataLayout.h"
24#include "llvm/IR/Operator.h"
25
26using namespace llvm;
27
29
30static bool isAligned(const Value *Base, Align Alignment,
31 const DataLayout &DL) {
32 return Base->getPointerAlignment(DL) >= Alignment;
33}
34
35/// Test if V is always a pointer to allocated and suitably aligned memory for
36/// a simple load or store.
38 const Value *V, Align Alignment, const APInt &Size, const DataLayout &DL,
39 const Instruction *CtxI, AssumptionCache *AC, const DominatorTree *DT,
41 unsigned MaxDepth) {
42 assert(V->getType()->isPointerTy() && "Base must be pointer");
43
44 // Recursion limit.
45 if (MaxDepth-- == 0)
46 return false;
47
48 // Already visited? Bail out, we've likely hit unreachable code.
49 if (!Visited.insert(V).second)
50 return false;
51
52 // Note that it is not safe to speculate into a malloc'd region because
53 // malloc may return null.
54
55 // For GEPs, determine if the indexing lands within the allocated object.
56 if (const GEPOperator *GEP = dyn_cast<GEPOperator>(V)) {
57 const Value *Base = GEP->getPointerOperand();
58
59 APInt Offset(DL.getIndexTypeSizeInBits(GEP->getType()), 0);
60 if (!GEP->accumulateConstantOffset(DL, Offset) || Offset.isNegative() ||
61 !Offset.urem(APInt(Offset.getBitWidth(), Alignment.value()))
62 .isMinValue())
63 return false;
64
65 // If the base pointer is dereferenceable for Offset+Size bytes, then the
66 // GEP (== Base + Offset) is dereferenceable for Size bytes. If the base
67 // pointer is aligned to Align bytes, and the Offset is divisible by Align
68 // then the GEP (== Base + Offset == k_0 * Align + k_1 * Align) is also
69 // aligned to Align bytes.
70
71 // Offset and Size may have different bit widths if we have visited an
72 // addrspacecast, so we can't do arithmetic directly on the APInt values.
74 Base, Alignment, Offset + Size.sextOrTrunc(Offset.getBitWidth()), DL,
75 CtxI, AC, DT, TLI, Visited, MaxDepth);
76 }
77
78 // bitcast instructions are no-ops as far as dereferenceability is concerned.
79 if (const BitCastOperator *BC = dyn_cast<BitCastOperator>(V)) {
80 if (BC->getSrcTy()->isPointerTy())
82 BC->getOperand(0), Alignment, Size, DL, CtxI, AC, DT, TLI,
83 Visited, MaxDepth);
84 }
85
86 // Recurse into both hands of select.
87 if (const SelectInst *Sel = dyn_cast<SelectInst>(V)) {
88 return isDereferenceableAndAlignedPointer(Sel->getTrueValue(), Alignment,
89 Size, DL, CtxI, AC, DT, TLI,
90 Visited, MaxDepth) &&
91 isDereferenceableAndAlignedPointer(Sel->getFalseValue(), Alignment,
92 Size, DL, CtxI, AC, DT, TLI,
93 Visited, MaxDepth);
94 }
95
96 auto IsKnownDeref = [&]() {
97 bool CheckForNonNull, CheckForFreed;
98 if (!Size.ule(V->getPointerDereferenceableBytes(DL, CheckForNonNull,
99 CheckForFreed)) ||
100 CheckForFreed)
101 return false;
102 if (CheckForNonNull &&
103 !isKnownNonZero(V, SimplifyQuery(DL, DT, AC, CtxI)))
104 return false;
105 // When using something like !dereferenceable on a load, the
106 // dereferenceability may only be valid on a specific control-flow path.
107 // If the instruction doesn't dominate the context instruction, we're
108 // asking about dereferenceability under the assumption that the
109 // instruction has been speculated to the point of the context instruction,
110 // in which case we don't know if the dereferenceability info still holds.
111 // We don't bother handling allocas here, as they aren't speculatable
112 // anyway.
113 auto *I = dyn_cast<Instruction>(V);
114 if (I && !isa<AllocaInst>(I))
115 return CtxI && isValidAssumeForContext(I, CtxI, DT);
116 return true;
117 };
118 if (IsKnownDeref()) {
119 // As we recursed through GEPs to get here, we've incrementally checked
120 // that each step advanced by a multiple of the alignment. If our base is
121 // properly aligned, then the original offset accessed must also be.
122 return isAligned(V, Alignment, DL);
123 }
124
125 /// TODO refactor this function to be able to search independently for
126 /// Dereferencability and Alignment requirements.
127
128
129 if (const auto *Call = dyn_cast<CallBase>(V)) {
130 if (auto *RP = getArgumentAliasingToReturnedPointer(Call, true))
131 return isDereferenceableAndAlignedPointer(RP, Alignment, Size, DL, CtxI,
132 AC, DT, TLI, Visited, MaxDepth);
133
134 // If we have a call we can't recurse through, check to see if this is an
135 // allocation function for which we can establish an minimum object size.
136 // Such a minimum object size is analogous to a deref_or_null attribute in
137 // that we still need to prove the result non-null at point of use.
138 // NOTE: We can only use the object size as a base fact as we a) need to
139 // prove alignment too, and b) don't want the compile time impact of a
140 // separate recursive walk.
141 ObjectSizeOpts Opts;
142 // TODO: It may be okay to round to align, but that would imply that
143 // accessing slightly out of bounds was legal, and we're currently
144 // inconsistent about that. For the moment, be conservative.
145 Opts.RoundToAlign = false;
146 Opts.NullIsUnknownSize = true;
147 uint64_t ObjSize;
148 if (getObjectSize(V, ObjSize, DL, TLI, Opts)) {
149 APInt KnownDerefBytes(Size.getBitWidth(), ObjSize);
150 if (KnownDerefBytes.getBoolValue() && KnownDerefBytes.uge(Size) &&
151 isKnownNonZero(V, SimplifyQuery(DL, DT, AC, CtxI)) &&
152 !V->canBeFreed()) {
153 // As we recursed through GEPs to get here, we've incrementally
154 // checked that each step advanced by a multiple of the alignment. If
155 // our base is properly aligned, then the original offset accessed
156 // must also be.
157 return isAligned(V, Alignment, DL);
158 }
159 }
160 }
161
162 // For gc.relocate, look through relocations
163 if (const GCRelocateInst *RelocateInst = dyn_cast<GCRelocateInst>(V))
164 return isDereferenceableAndAlignedPointer(RelocateInst->getDerivedPtr(),
165 Alignment, Size, DL, CtxI, AC, DT,
166 TLI, Visited, MaxDepth);
167
168 if (const AddrSpaceCastOperator *ASC = dyn_cast<AddrSpaceCastOperator>(V))
169 return isDereferenceableAndAlignedPointer(ASC->getOperand(0), Alignment,
170 Size, DL, CtxI, AC, DT, TLI,
171 Visited, MaxDepth);
172
173 if (CtxI && (!UseDerefAtPointSemantics || !V->canBeFreed())) {
174 /// Look through assumes to see if both dereferencability and alignment can
175 /// be proven by an assume if needed.
176 RetainedKnowledge AlignRK;
177 RetainedKnowledge DerefRK;
178 bool IsAligned = V->getPointerAlignment(DL) >= Alignment;
180 V, {Attribute::Dereferenceable, Attribute::Alignment}, AC,
181 [&](RetainedKnowledge RK, Instruction *Assume, auto) {
182 if (!isValidAssumeForContext(Assume, CtxI, DT))
183 return false;
184 if (RK.AttrKind == Attribute::Alignment)
185 AlignRK = std::max(AlignRK, RK);
186 if (RK.AttrKind == Attribute::Dereferenceable)
187 DerefRK = std::max(DerefRK, RK);
188 IsAligned |= AlignRK && AlignRK.ArgValue >= Alignment.value();
189 if (IsAligned && DerefRK &&
190 DerefRK.ArgValue >= Size.getZExtValue())
191 return true; // We have found what we needed so we stop looking
192 return false; // Other assumes may have better information. so
193 // keep looking
194 }))
195 return true;
196 }
197
198 // If we don't know, assume the worst.
199 return false;
200}
201
203 const Value *V, Align Alignment, const APInt &Size, const DataLayout &DL,
204 const Instruction *CtxI, AssumptionCache *AC, const DominatorTree *DT,
205 const TargetLibraryInfo *TLI) {
206 // Note: At the moment, Size can be zero. This ends up being interpreted as
207 // a query of whether [Base, V] is dereferenceable and V is aligned (since
208 // that's what the implementation happened to do). It's unclear if this is
209 // the desired semantic, but at least SelectionDAG does exercise this case.
210
212 return ::isDereferenceableAndAlignedPointer(V, Alignment, Size, DL, CtxI, AC,
213 DT, TLI, Visited, 16);
214}
215
217 const Value *V, Type *Ty, Align Alignment, const DataLayout &DL,
218 const Instruction *CtxI, AssumptionCache *AC, const DominatorTree *DT,
219 const TargetLibraryInfo *TLI) {
220 // For unsized types or scalable vectors we don't know exactly how many bytes
221 // are dereferenced, so bail out.
222 if (!Ty->isSized() || Ty->isScalableTy())
223 return false;
224
225 // When dereferenceability information is provided by a dereferenceable
226 // attribute, we know exactly how many bytes are dereferenceable. If we can
227 // determine the exact offset to the attributed variable, we can use that
228 // information here.
229
230 APInt AccessSize(DL.getPointerTypeSizeInBits(V->getType()),
231 DL.getTypeStoreSize(Ty));
232 return isDereferenceableAndAlignedPointer(V, Alignment, AccessSize, DL, CtxI,
233 AC, DT, TLI);
234}
235
237 const DataLayout &DL,
238 const Instruction *CtxI,
239 AssumptionCache *AC,
240 const DominatorTree *DT,
241 const TargetLibraryInfo *TLI) {
242 return isDereferenceableAndAlignedPointer(V, Ty, Align(1), DL, CtxI, AC, DT,
243 TLI);
244}
245
246/// Test if A and B will obviously have the same value.
247///
248/// This includes recognizing that %t0 and %t1 will have the same
249/// value in code like this:
250/// \code
251/// %t0 = getelementptr \@a, 0, 3
252/// store i32 0, i32* %t0
253/// %t1 = getelementptr \@a, 0, 3
254/// %t2 = load i32* %t1
255/// \endcode
256///
257static bool AreEquivalentAddressValues(const Value *A, const Value *B) {
258 // Test if the values are trivially equivalent.
259 if (A == B)
260 return true;
261
262 // Test if the values come from identical arithmetic instructions.
263 // Use isIdenticalToWhenDefined instead of isIdenticalTo because
264 // this function is only used when one address use dominates the
265 // other, which means that they'll always either have the same
266 // value or one of them will have an undefined value.
267 if (isa<BinaryOperator>(A) || isa<CastInst>(A) || isa<PHINode>(A) ||
268 isa<GetElementPtrInst>(A))
269 if (const Instruction *BI = dyn_cast<Instruction>(B))
270 if (cast<Instruction>(A)->isIdenticalToWhenDefined(BI))
271 return true;
272
273 // Otherwise they may not be equivalent.
274 return false;
275}
276
278 LoadInst *LI, Loop *L, ScalarEvolution &SE, DominatorTree &DT,
280 auto &DL = LI->getDataLayout();
281 Value *Ptr = LI->getPointerOperand();
282
283 APInt EltSize(DL.getIndexTypeSizeInBits(Ptr->getType()),
284 DL.getTypeStoreSize(LI->getType()).getFixedValue());
285 const Align Alignment = LI->getAlign();
286
287 Instruction *HeaderFirstNonPHI = L->getHeader()->getFirstNonPHI();
288
289 // If given a uniform (i.e. non-varying) address, see if we can prove the
290 // access is safe within the loop w/o needing predication.
291 if (L->isLoopInvariant(Ptr))
292 return isDereferenceableAndAlignedPointer(Ptr, Alignment, EltSize, DL,
293 HeaderFirstNonPHI, AC, &DT);
294
295 // Otherwise, check to see if we have a repeating access pattern where we can
296 // prove that all accesses are well aligned and dereferenceable.
297 auto *AddRec = dyn_cast<SCEVAddRecExpr>(SE.getSCEV(Ptr));
298 if (!AddRec || AddRec->getLoop() != L || !AddRec->isAffine())
299 return false;
300 auto* Step = dyn_cast<SCEVConstant>(AddRec->getStepRecurrence(SE));
301 if (!Step)
302 return false;
303
304 auto TC = SE.getSmallConstantMaxTripCount(L, Predicates);
305 if (!TC)
306 return false;
307
308 // TODO: Handle overlapping accesses.
309 // We should be computing AccessSize as (TC - 1) * Step + EltSize.
310 if (EltSize.sgt(Step->getAPInt()))
311 return false;
312
313 // Compute the total access size for access patterns with unit stride and
314 // patterns with gaps. For patterns with unit stride, Step and EltSize are the
315 // same.
316 // For patterns with gaps (i.e. non unit stride), we are
317 // accessing EltSize bytes at every Step.
318 APInt AccessSize = TC * Step->getAPInt();
319
320 assert(SE.isLoopInvariant(AddRec->getStart(), L) &&
321 "implied by addrec definition");
322 Value *Base = nullptr;
323 if (auto *StartS = dyn_cast<SCEVUnknown>(AddRec->getStart())) {
324 Base = StartS->getValue();
325 } else if (auto *StartS = dyn_cast<SCEVAddExpr>(AddRec->getStart())) {
326 // Handle (NewBase + offset) as start value.
327 const auto *Offset = dyn_cast<SCEVConstant>(StartS->getOperand(0));
328 const auto *NewBase = dyn_cast<SCEVUnknown>(StartS->getOperand(1));
329 if (StartS->getNumOperands() == 2 && Offset && NewBase) {
330 // The following code below assumes the offset is unsigned, but GEP
331 // offsets are treated as signed so we can end up with a signed value
332 // here too. For example, suppose the initial PHI value is (i8 255),
333 // the offset will be treated as (i8 -1) and sign-extended to (i64 -1).
334 if (Offset->getAPInt().isNegative())
335 return false;
336
337 // For the moment, restrict ourselves to the case where the offset is a
338 // multiple of the requested alignment and the base is aligned.
339 // TODO: generalize if a case found which warrants
340 if (Offset->getAPInt().urem(Alignment.value()) != 0)
341 return false;
342 Base = NewBase->getValue();
343 bool Overflow = false;
344 AccessSize = AccessSize.uadd_ov(Offset->getAPInt(), Overflow);
345 if (Overflow)
346 return false;
347 }
348 }
349
350 if (!Base)
351 return false;
352
353 // For the moment, restrict ourselves to the case where the access size is a
354 // multiple of the requested alignment and the base is aligned.
355 // TODO: generalize if a case found which warrants
356 if (EltSize.urem(Alignment.value()) != 0)
357 return false;
358 return isDereferenceableAndAlignedPointer(Base, Alignment, AccessSize, DL,
359 HeaderFirstNonPHI, AC, &DT);
360}
361
363 const Function &F = *CtxI.getFunction();
364 // Speculative load may create a race that did not exist in the source.
365 return F.hasFnAttribute(Attribute::SanitizeThread) ||
366 // Speculative load may load data from dirty regions.
367 F.hasFnAttribute(Attribute::SanitizeAddress) ||
368 F.hasFnAttribute(Attribute::SanitizeHWAddress);
369}
370
373}
374
375/// Check if executing a load of this pointer value cannot trap.
376///
377/// If DT and ScanFrom are specified this method performs context-sensitive
378/// analysis and returns true if it is safe to load immediately before ScanFrom.
379///
380/// If it is not obviously safe to load from the specified pointer, we do
381/// a quick local scan of the basic block containing \c ScanFrom, to determine
382/// if the address is already accessed.
383///
384/// This uses the pointee type to determine how many bytes need to be safe to
385/// load from the pointer.
387 const DataLayout &DL,
388 Instruction *ScanFrom,
389 AssumptionCache *AC,
390 const DominatorTree *DT,
391 const TargetLibraryInfo *TLI) {
392 // If DT is not specified we can't make context-sensitive query
393 const Instruction* CtxI = DT ? ScanFrom : nullptr;
394 if (isDereferenceableAndAlignedPointer(V, Alignment, Size, DL, CtxI, AC, DT,
395 TLI)) {
396 // With sanitizers `Dereferenceable` is not always enough for unconditional
397 // load.
398 if (!ScanFrom || !suppressSpeculativeLoadForSanitizers(*ScanFrom))
399 return true;
400 }
401
402 if (!ScanFrom)
403 return false;
404
405 if (Size.getBitWidth() > 64)
406 return false;
407 const TypeSize LoadSize = TypeSize::getFixed(Size.getZExtValue());
408
409 // Otherwise, be a little bit aggressive by scanning the local block where we
410 // want to check to see if the pointer is already being loaded or stored
411 // from/to. If so, the previous load or store would have already trapped,
412 // so there is no harm doing an extra load (also, CSE will later eliminate
413 // the load entirely).
414 BasicBlock::iterator BBI = ScanFrom->getIterator(),
415 E = ScanFrom->getParent()->begin();
416
417 // We can at least always strip pointer casts even though we can't use the
418 // base here.
419 V = V->stripPointerCasts();
420
421 while (BBI != E) {
422 --BBI;
423
424 // If we see a free or a call which may write to memory (i.e. which might do
425 // a free) the pointer could be marked invalid.
426 if (isa<CallInst>(BBI) && BBI->mayWriteToMemory() &&
427 !isa<LifetimeIntrinsic>(BBI) && !isa<DbgInfoIntrinsic>(BBI))
428 return false;
429
430 Value *AccessedPtr;
431 Type *AccessedTy;
432 Align AccessedAlign;
433 if (LoadInst *LI = dyn_cast<LoadInst>(BBI)) {
434 // Ignore volatile loads. The execution of a volatile load cannot
435 // be used to prove an address is backed by regular memory; it can,
436 // for example, point to an MMIO register.
437 if (LI->isVolatile())
438 continue;
439 AccessedPtr = LI->getPointerOperand();
440 AccessedTy = LI->getType();
441 AccessedAlign = LI->getAlign();
442 } else if (StoreInst *SI = dyn_cast<StoreInst>(BBI)) {
443 // Ignore volatile stores (see comment for loads).
444 if (SI->isVolatile())
445 continue;
446 AccessedPtr = SI->getPointerOperand();
447 AccessedTy = SI->getValueOperand()->getType();
448 AccessedAlign = SI->getAlign();
449 } else
450 continue;
451
452 if (AccessedAlign < Alignment)
453 continue;
454
455 // Handle trivial cases.
456 if (AccessedPtr == V &&
457 TypeSize::isKnownLE(LoadSize, DL.getTypeStoreSize(AccessedTy)))
458 return true;
459
460 if (AreEquivalentAddressValues(AccessedPtr->stripPointerCasts(), V) &&
461 TypeSize::isKnownLE(LoadSize, DL.getTypeStoreSize(AccessedTy)))
462 return true;
463 }
464 return false;
465}
466
468 const DataLayout &DL,
469 Instruction *ScanFrom,
470 AssumptionCache *AC,
471 const DominatorTree *DT,
472 const TargetLibraryInfo *TLI) {
473 TypeSize TySize = DL.getTypeStoreSize(Ty);
474 if (TySize.isScalable())
475 return false;
476 APInt Size(DL.getIndexTypeSizeInBits(V->getType()), TySize.getFixedValue());
477 return isSafeToLoadUnconditionally(V, Alignment, Size, DL, ScanFrom, AC, DT,
478 TLI);
479}
480
481/// DefMaxInstsToScan - the default number of maximum instructions
482/// to scan in the block, used by FindAvailableLoadedValue().
483/// FindAvailableLoadedValue() was introduced in r60148, to improve jump
484/// threading in part by eliminating partially redundant loads.
485/// At that point, the value of MaxInstsToScan was already set to '6'
486/// without documented explanation.
488llvm::DefMaxInstsToScan("available-load-scan-limit", cl::init(6), cl::Hidden,
489 cl::desc("Use this to specify the default maximum number of instructions "
490 "to scan backward from a given instruction, when searching for "
491 "available loaded value"));
492
494 BasicBlock::iterator &ScanFrom,
495 unsigned MaxInstsToScan,
496 BatchAAResults *AA, bool *IsLoad,
497 unsigned *NumScanedInst) {
498 // Don't CSE load that is volatile or anything stronger than unordered.
499 if (!Load->isUnordered())
500 return nullptr;
501
503 return findAvailablePtrLoadStore(Loc, Load->getType(), Load->isAtomic(),
504 ScanBB, ScanFrom, MaxInstsToScan, AA, IsLoad,
505 NumScanedInst);
506}
507
508// Check if the load and the store have the same base, constant offsets and
509// non-overlapping access ranges.
510static bool areNonOverlapSameBaseLoadAndStore(const Value *LoadPtr,
511 Type *LoadTy,
512 const Value *StorePtr,
513 Type *StoreTy,
514 const DataLayout &DL) {
515 APInt LoadOffset(DL.getIndexTypeSizeInBits(LoadPtr->getType()), 0);
516 APInt StoreOffset(DL.getIndexTypeSizeInBits(StorePtr->getType()), 0);
517 const Value *LoadBase = LoadPtr->stripAndAccumulateConstantOffsets(
518 DL, LoadOffset, /* AllowNonInbounds */ false);
519 const Value *StoreBase = StorePtr->stripAndAccumulateConstantOffsets(
520 DL, StoreOffset, /* AllowNonInbounds */ false);
521 if (LoadBase != StoreBase)
522 return false;
523 auto LoadAccessSize = LocationSize::precise(DL.getTypeStoreSize(LoadTy));
524 auto StoreAccessSize = LocationSize::precise(DL.getTypeStoreSize(StoreTy));
525 ConstantRange LoadRange(LoadOffset,
526 LoadOffset + LoadAccessSize.toRaw());
527 ConstantRange StoreRange(StoreOffset,
528 StoreOffset + StoreAccessSize.toRaw());
529 return LoadRange.intersectWith(StoreRange).isEmptySet();
530}
531
533 Type *AccessTy, bool AtLeastAtomic,
534 const DataLayout &DL, bool *IsLoadCSE) {
535 // If this is a load of Ptr, the loaded value is available.
536 // (This is true even if the load is volatile or atomic, although
537 // those cases are unlikely.)
538 if (LoadInst *LI = dyn_cast<LoadInst>(Inst)) {
539 // We can value forward from an atomic to a non-atomic, but not the
540 // other way around.
541 if (LI->isAtomic() < AtLeastAtomic)
542 return nullptr;
543
544 Value *LoadPtr = LI->getPointerOperand()->stripPointerCasts();
545 if (!AreEquivalentAddressValues(LoadPtr, Ptr))
546 return nullptr;
547
548 if (CastInst::isBitOrNoopPointerCastable(LI->getType(), AccessTy, DL)) {
549 if (IsLoadCSE)
550 *IsLoadCSE = true;
551 return LI;
552 }
553 }
554
555 // If this is a store through Ptr, the value is available!
556 // (This is true even if the store is volatile or atomic, although
557 // those cases are unlikely.)
558 if (StoreInst *SI = dyn_cast<StoreInst>(Inst)) {
559 // We can value forward from an atomic to a non-atomic, but not the
560 // other way around.
561 if (SI->isAtomic() < AtLeastAtomic)
562 return nullptr;
563
564 Value *StorePtr = SI->getPointerOperand()->stripPointerCasts();
565 if (!AreEquivalentAddressValues(StorePtr, Ptr))
566 return nullptr;
567
568 if (IsLoadCSE)
569 *IsLoadCSE = false;
570
571 Value *Val = SI->getValueOperand();
572 if (CastInst::isBitOrNoopPointerCastable(Val->getType(), AccessTy, DL))
573 return Val;
574
575 TypeSize StoreSize = DL.getTypeSizeInBits(Val->getType());
576 TypeSize LoadSize = DL.getTypeSizeInBits(AccessTy);
577 if (TypeSize::isKnownLE(LoadSize, StoreSize))
578 if (auto *C = dyn_cast<Constant>(Val))
579 return ConstantFoldLoadFromConst(C, AccessTy, DL);
580 }
581
582 if (auto *MSI = dyn_cast<MemSetInst>(Inst)) {
583 // Don't forward from (non-atomic) memset to atomic load.
584 if (AtLeastAtomic)
585 return nullptr;
586
587 // Only handle constant memsets.
588 auto *Val = dyn_cast<ConstantInt>(MSI->getValue());
589 auto *Len = dyn_cast<ConstantInt>(MSI->getLength());
590 if (!Val || !Len)
591 return nullptr;
592
593 // TODO: Handle offsets.
594 Value *Dst = MSI->getDest();
596 return nullptr;
597
598 if (IsLoadCSE)
599 *IsLoadCSE = false;
600
601 TypeSize LoadTypeSize = DL.getTypeSizeInBits(AccessTy);
602 if (LoadTypeSize.isScalable())
603 return nullptr;
604
605 // Make sure the read bytes are contained in the memset.
606 uint64_t LoadSize = LoadTypeSize.getFixedValue();
607 if ((Len->getValue() * 8).ult(LoadSize))
608 return nullptr;
609
610 APInt Splat = LoadSize >= 8 ? APInt::getSplat(LoadSize, Val->getValue())
611 : Val->getValue().trunc(LoadSize);
612 ConstantInt *SplatC = ConstantInt::get(MSI->getContext(), Splat);
613 if (CastInst::isBitOrNoopPointerCastable(SplatC->getType(), AccessTy, DL))
614 return SplatC;
615
616 return nullptr;
617 }
618
619 return nullptr;
620}
621
623 const MemoryLocation &Loc, Type *AccessTy, bool AtLeastAtomic,
624 BasicBlock *ScanBB, BasicBlock::iterator &ScanFrom, unsigned MaxInstsToScan,
625 BatchAAResults *AA, bool *IsLoadCSE, unsigned *NumScanedInst) {
626 if (MaxInstsToScan == 0)
627 MaxInstsToScan = ~0U;
628
629 const DataLayout &DL = ScanBB->getDataLayout();
630 const Value *StrippedPtr = Loc.Ptr->stripPointerCasts();
631
632 while (ScanFrom != ScanBB->begin()) {
633 // We must ignore debug info directives when counting (otherwise they
634 // would affect codegen).
635 Instruction *Inst = &*--ScanFrom;
636 if (Inst->isDebugOrPseudoInst())
637 continue;
638
639 // Restore ScanFrom to expected value in case next test succeeds
640 ScanFrom++;
641
642 if (NumScanedInst)
643 ++(*NumScanedInst);
644
645 // Don't scan huge blocks.
646 if (MaxInstsToScan-- == 0)
647 return nullptr;
648
649 --ScanFrom;
650
651 if (Value *Available = getAvailableLoadStore(Inst, StrippedPtr, AccessTy,
652 AtLeastAtomic, DL, IsLoadCSE))
653 return Available;
654
655 // Try to get the store size for the type.
656 if (StoreInst *SI = dyn_cast<StoreInst>(Inst)) {
657 Value *StorePtr = SI->getPointerOperand()->stripPointerCasts();
658
659 // If both StrippedPtr and StorePtr reach all the way to an alloca or
660 // global and they are different, ignore the store. This is a trivial form
661 // of alias analysis that is important for reg2mem'd code.
662 if ((isa<AllocaInst>(StrippedPtr) || isa<GlobalVariable>(StrippedPtr)) &&
663 (isa<AllocaInst>(StorePtr) || isa<GlobalVariable>(StorePtr)) &&
664 StrippedPtr != StorePtr)
665 continue;
666
667 if (!AA) {
668 // When AA isn't available, but if the load and the store have the same
669 // base, constant offsets and non-overlapping access ranges, ignore the
670 // store. This is a simple form of alias analysis that is used by the
671 // inliner. FIXME: use BasicAA if possible.
673 Loc.Ptr, AccessTy, SI->getPointerOperand(),
674 SI->getValueOperand()->getType(), DL))
675 continue;
676 } else {
677 // If we have alias analysis and it says the store won't modify the
678 // loaded value, ignore the store.
679 if (!isModSet(AA->getModRefInfo(SI, Loc)))
680 continue;
681 }
682
683 // Otherwise the store that may or may not alias the pointer, bail out.
684 ++ScanFrom;
685 return nullptr;
686 }
687
688 // If this is some other instruction that may clobber Ptr, bail out.
689 if (Inst->mayWriteToMemory()) {
690 // If alias analysis claims that it really won't modify the load,
691 // ignore it.
692 if (AA && !isModSet(AA->getModRefInfo(Inst, Loc)))
693 continue;
694
695 // May modify the pointer, bail out.
696 ++ScanFrom;
697 return nullptr;
698 }
699 }
700
701 // Got to the start of the block, we didn't find it, but are done for this
702 // block.
703 return nullptr;
704}
705
707 bool *IsLoadCSE,
708 unsigned MaxInstsToScan) {
709 const DataLayout &DL = Load->getDataLayout();
710 Value *StrippedPtr = Load->getPointerOperand()->stripPointerCasts();
711 BasicBlock *ScanBB = Load->getParent();
712 Type *AccessTy = Load->getType();
713 bool AtLeastAtomic = Load->isAtomic();
714
715 if (!Load->isUnordered())
716 return nullptr;
717
718 // Try to find an available value first, and delay expensive alias analysis
719 // queries until later.
720 Value *Available = nullptr;
721 SmallVector<Instruction *> MustNotAliasInsts;
722 for (Instruction &Inst : make_range(++Load->getReverseIterator(),
723 ScanBB->rend())) {
724 if (Inst.isDebugOrPseudoInst())
725 continue;
726
727 if (MaxInstsToScan-- == 0)
728 return nullptr;
729
730 Available = getAvailableLoadStore(&Inst, StrippedPtr, AccessTy,
731 AtLeastAtomic, DL, IsLoadCSE);
732 if (Available)
733 break;
734
735 if (Inst.mayWriteToMemory())
736 MustNotAliasInsts.push_back(&Inst);
737 }
738
739 // If we found an available value, ensure that the instructions in between
740 // did not modify the memory location.
741 if (Available) {
743 for (Instruction *Inst : MustNotAliasInsts)
744 if (isModSet(AA.getModRefInfo(Inst, Loc)))
745 return nullptr;
746 }
747
748 return Available;
749}
750
751// Returns true if a use is either in an ICmp/PtrToInt or a Phi/Select that only
752// feeds into them.
753static bool isPointerUseReplacable(const Use &U) {
754 unsigned Limit = 40;
755 SmallVector<const User *> Worklist({U.getUser()});
757
758 while (!Worklist.empty() && --Limit) {
759 auto *User = Worklist.pop_back_val();
760 if (!Visited.insert(User).second)
761 continue;
762 if (isa<ICmpInst, PtrToIntInst>(User))
763 continue;
764 if (isa<PHINode, SelectInst>(User))
765 Worklist.append(User->user_begin(), User->user_end());
766 else
767 return false;
768 }
769
770 return Limit != 0;
771}
772
773// Returns true if `To` is a null pointer, constant dereferenceable pointer or
774// both pointers have the same underlying objects.
775static bool isPointerAlwaysReplaceable(const Value *From, const Value *To,
776 const DataLayout &DL) {
777 // This is not strictly correct, but we do it for now to retain important
778 // optimizations.
779 if (isa<ConstantPointerNull>(To))
780 return true;
781 if (isa<Constant>(To) &&
783 return true;
786}
787
789 const DataLayout &DL) {
790 assert(U->getType() == To->getType() && "values must have matching types");
791 // Not a pointer, just return true.
792 if (!To->getType()->isPointerTy())
793 return true;
794
795 if (isPointerAlwaysReplaceable(&*U, To, DL))
796 return true;
797 return isPointerUseReplacable(U);
798}
799
801 const DataLayout &DL) {
802 assert(From->getType() == To->getType() && "values must have matching types");
803 // Not a pointer, just return true.
804 if (!From->getType()->isPointerTy())
805 return true;
806
808}
809
813 for (BasicBlock *BB : L->blocks()) {
814 for (Instruction &I : *BB) {
815 if (auto *LI = dyn_cast<LoadInst>(&I)) {
816 if (!isDereferenceableAndAlignedInLoop(LI, L, *SE, *DT, AC, Predicates))
817 return false;
818 } else if (I.mayReadFromMemory() || I.mayWriteToMemory() || I.mayThrow())
819 return false;
820 }
821 }
822 return true;
823}
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
BlockVerifier::State From
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
uint64_t Size
@ Available
We know the block is fully available. This is a fixpoint.
Hexagon Common GEP
static bool isAligned(const Value *Base, Align Alignment, const DataLayout &DL)
Definition: Loads.cpp:30
static bool AreEquivalentAddressValues(const Value *A, const Value *B)
Test if A and B will obviously have the same value.
Definition: Loads.cpp:257
static bool isDereferenceableAndAlignedPointer(const Value *V, Align Alignment, const APInt &Size, const DataLayout &DL, const Instruction *CtxI, AssumptionCache *AC, const DominatorTree *DT, const TargetLibraryInfo *TLI, SmallPtrSetImpl< const Value * > &Visited, unsigned MaxDepth)
Test if V is always a pointer to allocated and suitably aligned memory for a simple load or store.
Definition: Loads.cpp:37
static bool isPointerAlwaysReplaceable(const Value *From, const Value *To, const DataLayout &DL)
Definition: Loads.cpp:775
cl::opt< bool > UseDerefAtPointSemantics
static bool areNonOverlapSameBaseLoadAndStore(const Value *LoadPtr, Type *LoadTy, const Value *StorePtr, Type *StoreTy, const DataLayout &DL)
Definition: Loads.cpp:510
static bool isPointerUseReplacable(const Use &U)
Definition: Loads.cpp:753
static Value * getAvailableLoadStore(Instruction *Inst, const Value *Ptr, Type *AccessTy, bool AtLeastAtomic, const DataLayout &DL, bool *IsLoadCSE)
Definition: Loads.cpp:532
static bool suppressSpeculativeLoadForSanitizers(const Instruction &CtxI)
Definition: Loads.cpp:362
#define F(x, y, z)
Definition: MD5.cpp:55
#define I(x, y, z)
Definition: MD5.cpp:58
This file provides utility analysis objects describing memory locations.
if(PassOpts->AAPipeline)
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
Class for arbitrary precision integers.
Definition: APInt.h:78
bool sgt(const APInt &RHS) const
Signed greater than comparison.
Definition: APInt.h:1201
APInt urem(const APInt &RHS) const
Unsigned remainder operation.
Definition: APInt.cpp:1640
APInt uadd_ov(const APInt &RHS, bool &Overflow) const
Definition: APInt.cpp:1909
static APInt getSplat(unsigned NewLen, const APInt &V)
Return a value containing V broadcasted over NewLen bits.
Definition: APInt.cpp:624
bool getBoolValue() const
Convert APInt to a boolean value.
Definition: APInt.h:471
bool uge(const APInt &RHS) const
Unsigned greater or equal comparison.
Definition: APInt.h:1221
A cache of @llvm.assume calls within a function.
LLVM Basic Block Representation.
Definition: BasicBlock.h:61
iterator begin()
Instruction iterator methods.
Definition: BasicBlock.h:448
const DataLayout & getDataLayout() const
Get the data layout of the module this basic block belongs to.
Definition: BasicBlock.cpp:296
reverse_iterator rend()
Definition: BasicBlock.h:466
InstListType::iterator iterator
Instruction iterators...
Definition: BasicBlock.h:177
This class is a wrapper over an AAResults, and it is intended to be used only when there are no IR ch...
ModRefInfo getModRefInfo(const Instruction *I, const std::optional< MemoryLocation > &OptLoc)
static 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.
This is the shared class of boolean and integer constants.
Definition: Constants.h:83
This class represents a range of values.
Definition: ConstantRange.h:47
bool isEmptySet() const
Return true if this set contains no members.
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:63
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
Definition: Dominators.h:162
Represents calls to the gc.relocate intrinsic.
bool isDebugOrPseudoInst() const LLVM_READONLY
Return true if the instruction is a DbgInfoIntrinsic or PseudoProbeInst.
bool mayWriteToMemory() const LLVM_READONLY
Return true if this instruction may modify memory.
const Function * getFunction() const
Return the function this instruction belongs to.
Definition: Instruction.cpp:72
const DataLayout & getDataLayout() const
Get the data layout of the module this instruction belongs to.
Definition: Instruction.cpp:76
An instruction for reading from memory.
Definition: Instructions.h:176
Value * getPointerOperand()
Definition: Instructions.h:255
bool isUnordered() const
Definition: Instructions.h:249
Align getAlign() const
Return the alignment of the access that is being performed.
Definition: Instructions.h:211
static LocationSize precise(uint64_t Value)
Represents a single loop in the control flow graph.
Definition: LoopInfo.h:39
Representation for a specific memory location.
static MemoryLocation get(const LoadInst *LI)
Return a location with information about the memory reference by the given instruction.
const Value * Ptr
The address of the start of the location.
The main scalar evolution driver.
const SCEV * getSCEV(Value *V)
Return a SCEV expression for the full generality of the specified expression.
unsigned getSmallConstantMaxTripCount(const Loop *L, SmallVectorImpl< const SCEVPredicate * > *Predicates=nullptr)
Returns the upper bound of the loop trip count as a normal unsigned value.
bool isLoopInvariant(const SCEV *S, const Loop *L)
Return true if the value of the given SCEV is unchanging in the specified loop.
This class represents the LLVM 'select' instruction.
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
Definition: SmallPtrSet.h:363
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
Definition: SmallPtrSet.h:384
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
Definition: SmallPtrSet.h:519
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
Definition: SmallVector.h:573
iterator insert(iterator I, T &&Elt)
Definition: SmallVector.h:805
void push_back(const T &Elt)
Definition: SmallVector.h:413
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1196
An instruction for storing to memory.
Definition: Instructions.h:292
Provides information about what library functions are available for the current target.
static constexpr TypeSize getFixed(ScalarTy ExactSize)
Definition: TypeSize.h:345
The instances of the Type class are immutable: once they are created, they are never changed.
Definition: Type.h:45
bool isPointerTy() const
True if this is an instance of PointerType.
Definition: Type.h:264
bool isSized(SmallPtrSetImpl< Type * > *Visited=nullptr) const
Return true if it makes sense to take the size of this type.
Definition: Type.h:310
bool isScalableTy(SmallPtrSetImpl< const Type * > &Visited) const
Return true if this is a type whose size is a known multiple of vscale.
static IntegerType * getInt8Ty(LLVMContext &C)
A Use represents the edge between a Value definition and its users.
Definition: Use.h:43
LLVM Value Representation.
Definition: Value.h:74
Type * getType() const
All values are typed, get the type of this value.
Definition: Value.h:255
user_iterator user_begin()
Definition: Value.h:397
const Value * stripAndAccumulateConstantOffsets(const DataLayout &DL, APInt &Offset, bool AllowNonInbounds, bool AllowInvariantGroup=false, function_ref< bool(Value &Value, APInt &Offset)> ExternalAnalysis=nullptr) const
Accumulate the constant offset this value has compared to a base pointer.
const Value * stripPointerCasts() const
Strip off pointer casts, all-zero GEPs and address space casts.
Definition: Value.cpp:694
user_iterator user_end()
Definition: Value.h:405
LLVMContext & getContext() const
All values hold a context through their type.
Definition: Value.cpp:1075
constexpr ScalarTy getFixedValue() const
Definition: TypeSize.h:202
constexpr bool isScalable() const
Returns whether the quantity is scaled by a runtime quantity (vscale).
Definition: TypeSize.h:171
const ParentTy * getParent() const
Definition: ilist_node.h:32
self_iterator getIterator()
Definition: ilist_node.h:132
@ C
The default llvm calling convention, compatible with C.
Definition: CallingConv.h:34
initializer< Ty > init(const Ty &Val)
Definition: CommandLine.h:443
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
@ Offset
Definition: DWP.cpp:480
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,...
const Value * getArgumentAliasingToReturnedPointer(const CallBase *Call, bool MustPreserveNullness)
This function returns call pointer argument that is considered the same by aliasing rules.
bool isDereferenceableAndAlignedPointer(const Value *V, Type *Ty, Align Alignment, const DataLayout &DL, const Instruction *CtxI=nullptr, AssumptionCache *AC=nullptr, const DominatorTree *DT=nullptr, const TargetLibraryInfo *TLI=nullptr)
Returns true if V is always a dereferenceable pointer with alignment greater or equal than requested.
Definition: Loads.cpp:216
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
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:622
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:371
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:493
bool isDereferenceableReadOnlyLoop(Loop *L, ScalarEvolution *SE, DominatorTree *DT, AssumptionCache *AC, SmallVectorImpl< const SCEVPredicate * > *Predicates=nullptr)
Return true if the loop L cannot fault on any iteration and only contains read-only memory accesses.
Definition: Loads.cpp:810
RetainedKnowledge getKnowledgeForValue(const Value *V, ArrayRef< Attribute::AttrKind > AttrKinds, AssumptionCache *AC=nullptr, 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...
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.
bool canReplacePointersInUseIfEqual(const Use &U, const Value *To, const DataLayout &DL)
Definition: Loads.cpp:788
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:800
bool isModSet(const ModRefInfo MRI)
Definition: ModRef.h:48
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:386
Constant * ConstantFoldLoadFromConst(Constant *C, Type *Ty, const APInt &Offset, const DataLayout &DL)
Extract value of C at the given Offset reinterpreted as Ty.
cl::opt< unsigned > DefMaxInstsToScan
The default number of maximum instructions to scan in the block, used by FindAvailableLoadedValue().
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.
const Value * getUnderlyingObjectAggressive(const Value *V)
Like getUnderlyingObject(), but will try harder to find a single underlying object.
bool isDereferenceablePointer(const Value *V, Type *Ty, const DataLayout &DL, const Instruction *CtxI=nullptr, AssumptionCache *AC=nullptr, const DominatorTree *DT=nullptr, const TargetLibraryInfo *TLI=nullptr)
Return true if this is always a dereferenceable pointer.
Definition: Loads.cpp:236
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:277
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition: Alignment.h:39
uint64_t value() const
This is a hole in the type system and should not be abused.
Definition: Alignment.h:85
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.