LLVM 22.0.0git
BasicAliasAnalysis.cpp
Go to the documentation of this file.
1//===- BasicAliasAnalysis.cpp - Stateless Alias Analysis Impl -------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file defines the primary stateless implementation of the
10// Alias Analysis interface that implements identities (two different
11// globals cannot alias, etc), but does no stateful analysis.
12//
13//===----------------------------------------------------------------------===//
14
16#include "llvm/ADT/APInt.h"
17#include "llvm/ADT/ScopeExit.h"
20#include "llvm/ADT/Statistic.h"
23#include "llvm/Analysis/CFG.h"
29#include "llvm/IR/Argument.h"
30#include "llvm/IR/Attributes.h"
31#include "llvm/IR/Constant.h"
33#include "llvm/IR/Constants.h"
34#include "llvm/IR/DataLayout.h"
36#include "llvm/IR/Dominators.h"
37#include "llvm/IR/Function.h"
39#include "llvm/IR/GlobalAlias.h"
41#include "llvm/IR/InstrTypes.h"
42#include "llvm/IR/Instruction.h"
45#include "llvm/IR/Intrinsics.h"
46#include "llvm/IR/Operator.h"
48#include "llvm/IR/Type.h"
49#include "llvm/IR/User.h"
50#include "llvm/IR/Value.h"
52#include "llvm/Pass.h"
58#include <cassert>
59#include <cstdint>
60#include <cstdlib>
61#include <optional>
62#include <utility>
63
64#define DEBUG_TYPE "basicaa"
65
66using namespace llvm;
67
68/// Enable analysis of recursive PHI nodes.
70 cl::init(true));
71
72static cl::opt<bool> EnableSeparateStorageAnalysis("basic-aa-separate-storage",
73 cl::Hidden, cl::init(true));
74
75/// SearchLimitReached / SearchTimes shows how often the limit of
76/// to decompose GEPs is reached. It will affect the precision
77/// of basic alias analysis.
78STATISTIC(SearchLimitReached, "Number of times the limit to "
79 "decompose GEPs is reached");
80STATISTIC(SearchTimes, "Number of times a GEP is decomposed");
81
84 // We don't care if this analysis itself is preserved, it has no state. But
85 // we need to check that the analyses it depends on have been. Note that we
86 // may be created without handles to some analyses and in that case don't
87 // depend on them.
88 if (Inv.invalidate<AssumptionAnalysis>(Fn, PA) ||
89 (DT_ && Inv.invalidate<DominatorTreeAnalysis>(Fn, PA)))
90 return true;
91
92 // Otherwise this analysis result remains valid.
93 return false;
94}
95
96//===----------------------------------------------------------------------===//
97// Useful predicates
98//===----------------------------------------------------------------------===//
99
100/// Returns the size of the object specified by V or UnknownSize if unknown.
101static std::optional<TypeSize> getObjectSize(const Value *V,
102 const DataLayout &DL,
103 const TargetLibraryInfo &TLI,
104 bool NullIsValidLoc,
105 bool RoundToAlign = false) {
106 ObjectSizeOpts Opts;
107 Opts.RoundToAlign = RoundToAlign;
108 Opts.NullIsUnknownSize = NullIsValidLoc;
109 if (std::optional<TypeSize> Size = getBaseObjectSize(V, DL, &TLI, Opts)) {
110 // FIXME: Remove this check, only exists to preserve previous behavior.
111 if (Size->isScalable())
112 return std::nullopt;
113 return Size;
114 }
115 return std::nullopt;
116}
117
118/// Returns true if we can prove that the object specified by V is smaller than
119/// Size. Bails out early unless the root object is passed as the first
120/// parameter.
122 const DataLayout &DL,
123 const TargetLibraryInfo &TLI,
124 bool NullIsValidLoc) {
125 // Note that the meanings of the "object" are slightly different in the
126 // following contexts:
127 // c1: llvm::getObjectSize()
128 // c2: llvm.objectsize() intrinsic
129 // c3: isObjectSmallerThan()
130 // c1 and c2 share the same meaning; however, the meaning of "object" in c3
131 // refers to the "entire object".
132 //
133 // Consider this example:
134 // char *p = (char*)malloc(100)
135 // char *q = p+80;
136 //
137 // In the context of c1 and c2, the "object" pointed by q refers to the
138 // stretch of memory of q[0:19]. So, getObjectSize(q) should return 20.
139 //
140 // In the context of c3, the "object" refers to the chunk of memory being
141 // allocated. So, the "object" has 100 bytes, and q points to the middle the
142 // "object". However, unless p, the root object, is passed as the first
143 // parameter, the call to isIdentifiedObject() makes isObjectSmallerThan()
144 // bail out early.
145 if (!isIdentifiedObject(V))
146 return false;
147
148 // This function needs to use the aligned object size because we allow
149 // reads a bit past the end given sufficient alignment.
150 std::optional<TypeSize> ObjectSize = getObjectSize(V, DL, TLI, NullIsValidLoc,
151 /*RoundToAlign*/ true);
152
153 return ObjectSize && TypeSize::isKnownLT(*ObjectSize, Size);
154}
155
156/// Return the minimal extent from \p V to the end of the underlying object,
157/// assuming the result is used in an aliasing query. E.g., we do use the query
158/// location size and the fact that null pointers cannot alias here.
160 const LocationSize &LocSize,
161 const DataLayout &DL,
162 bool NullIsValidLoc) {
163 // If we have dereferenceability information we know a lower bound for the
164 // extent as accesses for a lower offset would be valid. We need to exclude
165 // the "or null" part if null is a valid pointer. We can ignore frees, as an
166 // access after free would be undefined behavior.
167 bool CanBeNull, CanBeFreed;
168 uint64_t DerefBytes =
169 V.getPointerDereferenceableBytes(DL, CanBeNull, CanBeFreed);
170 DerefBytes = (CanBeNull && NullIsValidLoc) ? 0 : DerefBytes;
171 // If queried with a precise location size, we assume that location size to be
172 // accessed, thus valid.
173 if (LocSize.isPrecise())
174 DerefBytes = std::max(DerefBytes, LocSize.getValue().getKnownMinValue());
175 return TypeSize::getFixed(DerefBytes);
176}
177
178/// Returns true if we can prove that the object specified by V has size Size.
179static bool isObjectSize(const Value *V, TypeSize Size, const DataLayout &DL,
180 const TargetLibraryInfo &TLI, bool NullIsValidLoc) {
181 std::optional<TypeSize> ObjectSize =
182 getObjectSize(V, DL, TLI, NullIsValidLoc);
183 return ObjectSize && *ObjectSize == Size;
184}
185
186/// Return true if both V1 and V2 are VScale
187static bool areBothVScale(const Value *V1, const Value *V2) {
190}
191
192//===----------------------------------------------------------------------===//
193// CaptureAnalysis implementations
194//===----------------------------------------------------------------------===//
195
197
199 const Instruction *I,
200 bool OrAt) {
201 if (!isIdentifiedFunctionLocal(Object))
203
204 auto [CacheIt, Inserted] =
205 IsCapturedCache.insert({Object, CaptureComponents::Provenance});
206 if (!Inserted)
207 return CacheIt->second;
208
210 Object, /*ReturnCaptures=*/false, CaptureComponents::Provenance,
211 [](CaptureComponents CC) { return capturesFullProvenance(CC); });
212 CacheIt->second = Ret;
213 return Ret;
214}
215
216static bool isNotInCycle(const Instruction *I, const DominatorTree *DT,
217 const LoopInfo *LI) {
218 BasicBlock *BB = const_cast<BasicBlock *>(I->getParent());
220 return Succs.empty() ||
221 !isPotentiallyReachableFromMany(Succs, BB, nullptr, DT, LI);
222}
223
226 const Instruction *I, bool OrAt) {
227 if (!isIdentifiedFunctionLocal(Object))
229
230 auto Iter = EarliestEscapes.try_emplace(Object);
231 if (Iter.second) {
232 std::pair<Instruction *, CaptureComponents> EarliestCapture =
233 FindEarliestCapture(Object, *DT.getRoot()->getParent(),
234 /*ReturnCaptures=*/false, DT,
236 if (EarliestCapture.first)
237 Inst2Obj[EarliestCapture.first].push_back(Object);
238 Iter.first->second = EarliestCapture;
239 }
240
241 auto IsNotCapturedBefore = [&]() {
242 // No capturing instruction.
243 Instruction *CaptureInst = Iter.first->second.first;
244 if (!CaptureInst)
245 return true;
246
247 // No context instruction means any use is capturing.
248 if (!I)
249 return false;
250
251 if (I == CaptureInst) {
252 if (OrAt)
253 return false;
254 return isNotInCycle(I, &DT, LI);
255 }
256
257 return !isPotentiallyReachable(CaptureInst, I, nullptr, &DT, LI);
258 };
259 if (IsNotCapturedBefore())
261 return Iter.first->second.second;
262}
263
265 auto Iter = Inst2Obj.find(I);
266 if (Iter != Inst2Obj.end()) {
267 for (const Value *Obj : Iter->second)
268 EarliestEscapes.erase(Obj);
269 Inst2Obj.erase(I);
270 }
271}
272
273//===----------------------------------------------------------------------===//
274// GetElementPtr Instruction Decomposition and Analysis
275//===----------------------------------------------------------------------===//
276
277namespace {
278/// Represents zext(sext(trunc(V))).
279struct CastedValue {
280 const Value *V;
281 unsigned ZExtBits = 0;
282 unsigned SExtBits = 0;
283 unsigned TruncBits = 0;
284 /// Whether trunc(V) is non-negative.
285 bool IsNonNegative = false;
286
287 explicit CastedValue(const Value *V) : V(V) {}
288 explicit CastedValue(const Value *V, unsigned ZExtBits, unsigned SExtBits,
289 unsigned TruncBits, bool IsNonNegative)
290 : V(V), ZExtBits(ZExtBits), SExtBits(SExtBits), TruncBits(TruncBits),
291 IsNonNegative(IsNonNegative) {}
292
293 unsigned getBitWidth() const {
294 return V->getType()->getPrimitiveSizeInBits() - TruncBits + ZExtBits +
295 SExtBits;
296 }
297
298 CastedValue withValue(const Value *NewV, bool PreserveNonNeg) const {
299 return CastedValue(NewV, ZExtBits, SExtBits, TruncBits,
300 IsNonNegative && PreserveNonNeg);
301 }
302
303 /// Replace V with zext(NewV)
304 CastedValue withZExtOfValue(const Value *NewV, bool ZExtNonNegative) const {
305 unsigned ExtendBy = V->getType()->getPrimitiveSizeInBits() -
307 if (ExtendBy <= TruncBits)
308 // zext<nneg>(trunc(zext(NewV))) == zext<nneg>(trunc(NewV))
309 // The nneg can be preserved on the outer zext here.
310 return CastedValue(NewV, ZExtBits, SExtBits, TruncBits - ExtendBy,
311 IsNonNegative);
312
313 // zext(sext(zext(NewV))) == zext(zext(zext(NewV)))
314 ExtendBy -= TruncBits;
315 // zext<nneg>(zext(NewV)) == zext(NewV)
316 // zext(zext<nneg>(NewV)) == zext<nneg>(NewV)
317 // The nneg can be preserved from the inner zext here but must be dropped
318 // from the outer.
319 return CastedValue(NewV, ZExtBits + SExtBits + ExtendBy, 0, 0,
320 ZExtNonNegative);
321 }
322
323 /// Replace V with sext(NewV)
324 CastedValue withSExtOfValue(const Value *NewV) const {
325 unsigned ExtendBy = V->getType()->getPrimitiveSizeInBits() -
327 if (ExtendBy <= TruncBits)
328 // zext<nneg>(trunc(sext(NewV))) == zext<nneg>(trunc(NewV))
329 // The nneg can be preserved on the outer zext here
330 return CastedValue(NewV, ZExtBits, SExtBits, TruncBits - ExtendBy,
331 IsNonNegative);
332
333 // zext(sext(sext(NewV)))
334 ExtendBy -= TruncBits;
335 // zext<nneg>(sext(sext(NewV))) = zext<nneg>(sext(NewV))
336 // The nneg can be preserved on the outer zext here
337 return CastedValue(NewV, ZExtBits, SExtBits + ExtendBy, 0, IsNonNegative);
338 }
339
340 APInt evaluateWith(APInt N) const {
341 assert(N.getBitWidth() == V->getType()->getPrimitiveSizeInBits() &&
342 "Incompatible bit width");
343 if (TruncBits) N = N.trunc(N.getBitWidth() - TruncBits);
344 if (SExtBits) N = N.sext(N.getBitWidth() + SExtBits);
345 if (ZExtBits) N = N.zext(N.getBitWidth() + ZExtBits);
346 return N;
347 }
348
349 ConstantRange evaluateWith(ConstantRange N) const {
350 assert(N.getBitWidth() == V->getType()->getPrimitiveSizeInBits() &&
351 "Incompatible bit width");
352 if (TruncBits) N = N.truncate(N.getBitWidth() - TruncBits);
353 if (IsNonNegative && !N.isAllNonNegative())
354 N = N.intersectWith(
355 ConstantRange(APInt::getZero(N.getBitWidth()),
356 APInt::getSignedMinValue(N.getBitWidth())));
357 if (SExtBits) N = N.signExtend(N.getBitWidth() + SExtBits);
358 if (ZExtBits) N = N.zeroExtend(N.getBitWidth() + ZExtBits);
359 return N;
360 }
361
362 bool canDistributeOver(bool NUW, bool NSW) const {
363 // zext(x op<nuw> y) == zext(x) op<nuw> zext(y)
364 // sext(x op<nsw> y) == sext(x) op<nsw> sext(y)
365 // trunc(x op y) == trunc(x) op trunc(y)
366 return (!ZExtBits || NUW) && (!SExtBits || NSW);
367 }
368
369 bool hasSameCastsAs(const CastedValue &Other) const {
370 if (V->getType() != Other.V->getType())
371 return false;
372
373 if (ZExtBits == Other.ZExtBits && SExtBits == Other.SExtBits &&
374 TruncBits == Other.TruncBits)
375 return true;
376 // If either CastedValue has a nneg zext then the sext/zext bits are
377 // interchangable for that value.
378 if (IsNonNegative || Other.IsNonNegative)
379 return (ZExtBits + SExtBits == Other.ZExtBits + Other.SExtBits &&
380 TruncBits == Other.TruncBits);
381 return false;
382 }
383};
384
385/// Represents zext(sext(trunc(V))) * Scale + Offset.
386struct LinearExpression {
387 CastedValue Val;
388 APInt Scale;
390
391 /// True if all operations in this expression are NUW.
392 bool IsNUW;
393 /// True if all operations in this expression are NSW.
394 bool IsNSW;
395
396 LinearExpression(const CastedValue &Val, const APInt &Scale,
397 const APInt &Offset, bool IsNUW, bool IsNSW)
398 : Val(Val), Scale(Scale), Offset(Offset), IsNUW(IsNUW), IsNSW(IsNSW) {}
399
400 LinearExpression(const CastedValue &Val)
401 : Val(Val), IsNUW(true), IsNSW(true) {
402 unsigned BitWidth = Val.getBitWidth();
403 Scale = APInt(BitWidth, 1);
404 Offset = APInt(BitWidth, 0);
405 }
406
407 LinearExpression mul(const APInt &Other, bool MulIsNUW, bool MulIsNSW) const {
408 // The check for zero offset is necessary, because generally
409 // (X +nsw Y) *nsw Z does not imply (X *nsw Z) +nsw (Y *nsw Z).
410 bool NSW = IsNSW && (Other.isOne() || (MulIsNSW && Offset.isZero()));
411 bool NUW = IsNUW && (Other.isOne() || MulIsNUW);
412 return LinearExpression(Val, Scale * Other, Offset * Other, NUW, NSW);
413 }
414};
415}
416
417/// Analyzes the specified value as a linear expression: "A*V + B", where A and
418/// B are constant integers.
419static LinearExpression GetLinearExpression(
420 const CastedValue &Val, const DataLayout &DL, unsigned Depth,
422 // Limit our recursion depth.
423 if (Depth == 6)
424 return Val;
425
426 if (const ConstantInt *Const = dyn_cast<ConstantInt>(Val.V))
427 return LinearExpression(Val, APInt(Val.getBitWidth(), 0),
428 Val.evaluateWith(Const->getValue()), true, true);
429
430 if (const BinaryOperator *BOp = dyn_cast<BinaryOperator>(Val.V)) {
431 if (ConstantInt *RHSC = dyn_cast<ConstantInt>(BOp->getOperand(1))) {
432 APInt RHS = Val.evaluateWith(RHSC->getValue());
433 // The only non-OBO case we deal with is or, and only limited to the
434 // case where it is both nuw and nsw.
435 bool NUW = true, NSW = true;
436 if (isa<OverflowingBinaryOperator>(BOp)) {
437 NUW &= BOp->hasNoUnsignedWrap();
438 NSW &= BOp->hasNoSignedWrap();
439 }
440 if (!Val.canDistributeOver(NUW, NSW))
441 return Val;
442
443 // While we can distribute over trunc, we cannot preserve nowrap flags
444 // in that case.
445 if (Val.TruncBits)
446 NUW = NSW = false;
447
448 LinearExpression E(Val);
449 switch (BOp->getOpcode()) {
450 default:
451 // We don't understand this instruction, so we can't decompose it any
452 // further.
453 return Val;
454 case Instruction::Or:
455 // X|C == X+C if it is disjoint. Otherwise we can't analyze it.
456 if (!cast<PossiblyDisjointInst>(BOp)->isDisjoint())
457 return Val;
458
459 [[fallthrough]];
460 case Instruction::Add: {
461 E = GetLinearExpression(Val.withValue(BOp->getOperand(0), false), DL,
462 Depth + 1, AC, DT);
463 E.Offset += RHS;
464 E.IsNUW &= NUW;
465 E.IsNSW &= NSW;
466 break;
467 }
468 case Instruction::Sub: {
469 E = GetLinearExpression(Val.withValue(BOp->getOperand(0), false), DL,
470 Depth + 1, AC, DT);
471 E.Offset -= RHS;
472 E.IsNUW = false; // sub nuw x, y is not add nuw x, -y.
473 E.IsNSW &= NSW;
474 break;
475 }
476 case Instruction::Mul:
477 E = GetLinearExpression(Val.withValue(BOp->getOperand(0), false), DL,
478 Depth + 1, AC, DT)
479 .mul(RHS, NUW, NSW);
480 break;
481 case Instruction::Shl:
482 // We're trying to linearize an expression of the kind:
483 // shl i8 -128, 36
484 // where the shift count exceeds the bitwidth of the type.
485 // We can't decompose this further (the expression would return
486 // a poison value).
487 if (RHS.getLimitedValue() > Val.getBitWidth())
488 return Val;
489
490 E = GetLinearExpression(Val.withValue(BOp->getOperand(0), NSW), DL,
491 Depth + 1, AC, DT);
492 E.Offset <<= RHS.getLimitedValue();
493 E.Scale <<= RHS.getLimitedValue();
494 E.IsNUW &= NUW;
495 E.IsNSW &= NSW;
496 break;
497 }
498 return E;
499 }
500 }
501
502 if (const auto *ZExt = dyn_cast<ZExtInst>(Val.V))
503 return GetLinearExpression(
504 Val.withZExtOfValue(ZExt->getOperand(0), ZExt->hasNonNeg()), DL,
505 Depth + 1, AC, DT);
506
507 if (isa<SExtInst>(Val.V))
508 return GetLinearExpression(
509 Val.withSExtOfValue(cast<CastInst>(Val.V)->getOperand(0)),
510 DL, Depth + 1, AC, DT);
511
512 return Val;
513}
514
515namespace {
516// A linear transformation of a Value; this class represents
517// ZExt(SExt(Trunc(V, TruncBits), SExtBits), ZExtBits) * Scale.
518struct VariableGEPIndex {
519 CastedValue Val;
520 APInt Scale;
521
522 // Context instruction to use when querying information about this index.
523 const Instruction *CxtI;
524
525 /// True if all operations in this expression are NSW.
526 bool IsNSW;
527
528 /// True if the index should be subtracted rather than added. We don't simply
529 /// negate the Scale, to avoid losing the NSW flag: X - INT_MIN*1 may be
530 /// non-wrapping, while X + INT_MIN*(-1) wraps.
531 bool IsNegated;
532
533 bool hasNegatedScaleOf(const VariableGEPIndex &Other) const {
534 if (IsNegated == Other.IsNegated)
535 return Scale == -Other.Scale;
536 return Scale == Other.Scale;
537 }
538
539 void dump() const {
540 print(dbgs());
541 dbgs() << "\n";
542 }
543 void print(raw_ostream &OS) const {
544 OS << "(V=" << Val.V->getName()
545 << ", zextbits=" << Val.ZExtBits
546 << ", sextbits=" << Val.SExtBits
547 << ", truncbits=" << Val.TruncBits
548 << ", scale=" << Scale
549 << ", nsw=" << IsNSW
550 << ", negated=" << IsNegated << ")";
551 }
552};
553}
554
555// Represents the internal structure of a GEP, decomposed into a base pointer,
556// constant offsets, and variable scaled indices.
558 // Base pointer of the GEP
559 const Value *Base;
560 // Total constant offset from base.
562 // Scaled variable (non-constant) indices.
564 // Nowrap flags common to all GEP operations involved in expression.
566
567 void dump() const {
568 print(dbgs());
569 dbgs() << "\n";
570 }
571 void print(raw_ostream &OS) const {
572 OS << ", inbounds=" << (NWFlags.isInBounds() ? "1" : "0")
573 << ", nuw=" << (NWFlags.hasNoUnsignedWrap() ? "1" : "0")
574 << "(DecomposedGEP Base=" << Base->getName() << ", Offset=" << Offset
575 << ", VarIndices=[";
576 for (size_t i = 0; i < VarIndices.size(); i++) {
577 if (i != 0)
578 OS << ", ";
579 VarIndices[i].print(OS);
580 }
581 OS << "])";
582 }
583};
584
585
586/// If V is a symbolic pointer expression, decompose it into a base pointer
587/// with a constant offset and a number of scaled symbolic offsets.
588///
589/// The scaled symbolic offsets (represented by pairs of a Value* and a scale
590/// in the VarIndices vector) are Value*'s that are known to be scaled by the
591/// specified amount, but which may have other unrepresented high bits. As
592/// such, the gep cannot necessarily be reconstructed from its decomposed form.
594BasicAAResult::DecomposeGEPExpression(const Value *V, const DataLayout &DL,
596 // Limit recursion depth to limit compile time in crazy cases.
597 unsigned MaxLookup = MaxLookupSearchDepth;
598 SearchTimes++;
599 const Instruction *CxtI = dyn_cast<Instruction>(V);
600
601 unsigned IndexSize = DL.getIndexTypeSizeInBits(V->getType());
602 DecomposedGEP Decomposed;
603 Decomposed.Offset = APInt(IndexSize, 0);
604 do {
605 // See if this is a bitcast or GEP.
606 const Operator *Op = dyn_cast<Operator>(V);
607 if (!Op) {
608 // The only non-operator case we can handle are GlobalAliases.
609 if (const GlobalAlias *GA = dyn_cast<GlobalAlias>(V)) {
610 if (!GA->isInterposable()) {
611 V = GA->getAliasee();
612 continue;
613 }
614 }
615 Decomposed.Base = V;
616 return Decomposed;
617 }
618
619 if (Op->getOpcode() == Instruction::BitCast ||
620 Op->getOpcode() == Instruction::AddrSpaceCast) {
621 Value *NewV = Op->getOperand(0);
622 // Don't look through casts between address spaces with differing index
623 // widths.
624 if (DL.getIndexTypeSizeInBits(NewV->getType()) != IndexSize) {
625 Decomposed.Base = V;
626 return Decomposed;
627 }
628 V = NewV;
629 continue;
630 }
631
632 const GEPOperator *GEPOp = dyn_cast<GEPOperator>(Op);
633 if (!GEPOp) {
634 if (const auto *PHI = dyn_cast<PHINode>(V)) {
635 // Look through single-arg phi nodes created by LCSSA.
636 if (PHI->getNumIncomingValues() == 1) {
637 V = PHI->getIncomingValue(0);
638 continue;
639 }
640 } else if (const auto *Call = dyn_cast<CallBase>(V)) {
641 // CaptureTracking can know about special capturing properties of some
642 // intrinsics like launder.invariant.group, that can't be expressed with
643 // the attributes, but have properties like returning aliasing pointer.
644 // Because some analysis may assume that nocaptured pointer is not
645 // returned from some special intrinsic (because function would have to
646 // be marked with returns attribute), it is crucial to use this function
647 // because it should be in sync with CaptureTracking. Not using it may
648 // cause weird miscompilations where 2 aliasing pointers are assumed to
649 // noalias.
650 if (auto *RP = getArgumentAliasingToReturnedPointer(Call, false)) {
651 V = RP;
652 continue;
653 }
654 }
655
656 Decomposed.Base = V;
657 return Decomposed;
658 }
659
660 // Track the common nowrap flags for all GEPs we see.
661 Decomposed.NWFlags &= GEPOp->getNoWrapFlags();
662
663 assert(GEPOp->getSourceElementType()->isSized() && "GEP must be sized");
664
665 // Walk the indices of the GEP, accumulating them into BaseOff/VarIndices.
667 for (User::const_op_iterator I = GEPOp->op_begin() + 1, E = GEPOp->op_end();
668 I != E; ++I, ++GTI) {
669 const Value *Index = *I;
670 // Compute the (potentially symbolic) offset in bytes for this index.
671 if (StructType *STy = GTI.getStructTypeOrNull()) {
672 // For a struct, add the member offset.
673 unsigned FieldNo = cast<ConstantInt>(Index)->getZExtValue();
674 if (FieldNo == 0)
675 continue;
676
677 Decomposed.Offset += DL.getStructLayout(STy)->getElementOffset(FieldNo);
678 continue;
679 }
680
681 // For an array/pointer, add the element offset, explicitly scaled.
682 if (const ConstantInt *CIdx = dyn_cast<ConstantInt>(Index)) {
683 if (CIdx->isZero())
684 continue;
685
686 // Don't attempt to analyze GEPs if the scalable index is not zero.
687 TypeSize AllocTypeSize = GTI.getSequentialElementStride(DL);
688 if (AllocTypeSize.isScalable()) {
689 Decomposed.Base = V;
690 return Decomposed;
691 }
692
693 Decomposed.Offset += AllocTypeSize.getFixedValue() *
694 CIdx->getValue().sextOrTrunc(IndexSize);
695 continue;
696 }
697
698 TypeSize AllocTypeSize = GTI.getSequentialElementStride(DL);
699 if (AllocTypeSize.isScalable()) {
700 Decomposed.Base = V;
701 return Decomposed;
702 }
703
704 // If the integer type is smaller than the index size, it is implicitly
705 // sign extended or truncated to index size.
706 bool NUSW = GEPOp->hasNoUnsignedSignedWrap();
707 bool NUW = GEPOp->hasNoUnsignedWrap();
708 bool NonNeg = NUSW && NUW;
709 unsigned Width = Index->getType()->getIntegerBitWidth();
710 unsigned SExtBits = IndexSize > Width ? IndexSize - Width : 0;
711 unsigned TruncBits = IndexSize < Width ? Width - IndexSize : 0;
712 LinearExpression LE = GetLinearExpression(
713 CastedValue(Index, 0, SExtBits, TruncBits, NonNeg), DL, 0, AC, DT);
714
715 // Scale by the type size.
716 unsigned TypeSize = AllocTypeSize.getFixedValue();
717 LE = LE.mul(APInt(IndexSize, TypeSize), NUW, NUSW);
718 Decomposed.Offset += LE.Offset;
719 APInt Scale = LE.Scale;
720 if (!LE.IsNUW)
721 Decomposed.NWFlags = Decomposed.NWFlags.withoutNoUnsignedWrap();
722
723 // If we already had an occurrence of this index variable, merge this
724 // scale into it. For example, we want to handle:
725 // A[x][x] -> x*16 + x*4 -> x*20
726 // This also ensures that 'x' only appears in the index list once.
727 for (unsigned i = 0, e = Decomposed.VarIndices.size(); i != e; ++i) {
728 if ((Decomposed.VarIndices[i].Val.V == LE.Val.V ||
729 areBothVScale(Decomposed.VarIndices[i].Val.V, LE.Val.V)) &&
730 Decomposed.VarIndices[i].Val.hasSameCastsAs(LE.Val)) {
731 Scale += Decomposed.VarIndices[i].Scale;
732 // We cannot guarantee no-wrap for the merge.
733 LE.IsNSW = LE.IsNUW = false;
734 Decomposed.VarIndices.erase(Decomposed.VarIndices.begin() + i);
735 break;
736 }
737 }
738
739 if (!!Scale) {
740 VariableGEPIndex Entry = {LE.Val, Scale, CxtI, LE.IsNSW,
741 /* IsNegated */ false};
742 Decomposed.VarIndices.push_back(Entry);
743 }
744 }
745
746 // Analyze the base pointer next.
747 V = GEPOp->getOperand(0);
748 } while (--MaxLookup);
749
750 // If the chain of expressions is too deep, just return early.
751 Decomposed.Base = V;
752 SearchLimitReached++;
753 return Decomposed;
754}
755
757 AAQueryInfo &AAQI,
758 bool IgnoreLocals) {
759 assert(Visited.empty() && "Visited must be cleared after use!");
760 auto _ = make_scope_exit([&] { Visited.clear(); });
761
762 unsigned MaxLookup = 8;
764 Worklist.push_back(Loc.Ptr);
766
767 do {
768 const Value *V = getUnderlyingObject(Worklist.pop_back_val());
769 if (!Visited.insert(V).second)
770 continue;
771
772 // Ignore allocas if we were instructed to do so.
773 if (IgnoreLocals && isa<AllocaInst>(V))
774 continue;
775
776 // If the location points to memory that is known to be invariant for
777 // the life of the underlying SSA value, then we can exclude Mod from
778 // the set of valid memory effects.
779 //
780 // An argument that is marked readonly and noalias is known to be
781 // invariant while that function is executing.
782 if (const Argument *Arg = dyn_cast<Argument>(V)) {
783 if (Arg->hasNoAliasAttr() && Arg->onlyReadsMemory()) {
784 Result |= ModRefInfo::Ref;
785 continue;
786 }
787 }
788
789 // A global constant can't be mutated.
790 if (const GlobalVariable *GV = dyn_cast<GlobalVariable>(V)) {
791 // Note: this doesn't require GV to be "ODR" because it isn't legal for a
792 // global to be marked constant in some modules and non-constant in
793 // others. GV may even be a declaration, not a definition.
794 if (!GV->isConstant())
795 return ModRefInfo::ModRef;
796 continue;
797 }
798
799 // If both select values point to local memory, then so does the select.
800 if (const SelectInst *SI = dyn_cast<SelectInst>(V)) {
801 Worklist.push_back(SI->getTrueValue());
802 Worklist.push_back(SI->getFalseValue());
803 continue;
804 }
805
806 // If all values incoming to a phi node point to local memory, then so does
807 // the phi.
808 if (const PHINode *PN = dyn_cast<PHINode>(V)) {
809 // Don't bother inspecting phi nodes with many operands.
810 if (PN->getNumIncomingValues() > MaxLookup)
811 return ModRefInfo::ModRef;
812 append_range(Worklist, PN->incoming_values());
813 continue;
814 }
815
816 // Otherwise be conservative.
817 return ModRefInfo::ModRef;
818 } while (!Worklist.empty() && --MaxLookup);
819
820 // If we hit the maximum number of instructions to examine, be conservative.
821 if (!Worklist.empty())
822 return ModRefInfo::ModRef;
823
824 return Result;
825}
826
827static bool isIntrinsicCall(const CallBase *Call, Intrinsic::ID IID) {
828 const IntrinsicInst *II = dyn_cast<IntrinsicInst>(Call);
829 return II && II->getIntrinsicID() == IID;
830}
831
832/// Returns the behavior when calling the given call site.
834 AAQueryInfo &AAQI) {
835 MemoryEffects Min = Call->getAttributes().getMemoryEffects();
836
837 if (const Function *F = dyn_cast<Function>(Call->getCalledOperand())) {
838 MemoryEffects FuncME = AAQI.AAR.getMemoryEffects(F);
839 // Operand bundles on the call may also read or write memory, in addition
840 // to the behavior of the called function.
841 if (Call->hasReadingOperandBundles())
842 FuncME |= MemoryEffects::readOnly();
843 if (Call->hasClobberingOperandBundles())
844 FuncME |= MemoryEffects::writeOnly();
845 if (Call->isVolatile()) {
846 // Volatile operations also access inaccessible memory.
848 }
849 Min &= FuncME;
850 }
851
852 return Min;
853}
854
855/// Returns the behavior when calling the given function. For use when the call
856/// site is not known.
858 switch (F->getIntrinsicID()) {
859 case Intrinsic::experimental_guard:
860 case Intrinsic::experimental_deoptimize:
861 // These intrinsics can read arbitrary memory, and additionally modref
862 // inaccessible memory to model control dependence.
863 return MemoryEffects::readOnly() |
865 }
866
867 return F->getMemoryEffects();
868}
869
871 unsigned ArgIdx) {
872 if (Call->doesNotAccessMemory(ArgIdx))
874
875 if (Call->onlyWritesMemory(ArgIdx))
876 return ModRefInfo::Mod;
877
878 if (Call->onlyReadsMemory(ArgIdx))
879 return ModRefInfo::Ref;
880
881 return ModRefInfo::ModRef;
882}
883
884#ifndef NDEBUG
885static const Function *getParent(const Value *V) {
886 if (const Instruction *inst = dyn_cast<Instruction>(V)) {
887 if (!inst->getParent())
888 return nullptr;
889 return inst->getParent()->getParent();
890 }
891
892 if (const Argument *arg = dyn_cast<Argument>(V))
893 return arg->getParent();
894
895 return nullptr;
896}
897
898static bool notDifferentParent(const Value *O1, const Value *O2) {
899
900 const Function *F1 = getParent(O1);
901 const Function *F2 = getParent(O2);
902
903 return !F1 || !F2 || F1 == F2;
904}
905#endif
906
908 const MemoryLocation &LocB, AAQueryInfo &AAQI,
909 const Instruction *CtxI) {
910 assert(notDifferentParent(LocA.Ptr, LocB.Ptr) &&
911 "BasicAliasAnalysis doesn't support interprocedural queries.");
912 return aliasCheck(LocA.Ptr, LocA.Size, LocB.Ptr, LocB.Size, AAQI, CtxI);
913}
914
915/// Checks to see if the specified callsite can clobber the specified memory
916/// object.
917///
918/// Since we only look at local properties of this function, we really can't
919/// say much about this query. We do, however, use simple "address taken"
920/// analysis on local objects.
922 const MemoryLocation &Loc,
923 AAQueryInfo &AAQI) {
924 assert(notDifferentParent(Call, Loc.Ptr) &&
925 "AliasAnalysis query involving multiple functions!");
926
927 const Value *Object = getUnderlyingObject(Loc.Ptr);
928
929 // Calls marked 'tail' cannot read or write allocas from the current frame
930 // because the current frame might be destroyed by the time they run. However,
931 // a tail call may use an alloca with byval. Calling with byval copies the
932 // contents of the alloca into argument registers or stack slots, so there is
933 // no lifetime issue.
934 if (isa<AllocaInst>(Object))
935 if (const CallInst *CI = dyn_cast<CallInst>(Call))
936 if (CI->isTailCall() &&
937 !CI->getAttributes().hasAttrSomewhere(Attribute::ByVal))
939
940 // Stack restore is able to modify unescaped dynamic allocas. Assume it may
941 // modify them even though the alloca is not escaped.
942 if (auto *AI = dyn_cast<AllocaInst>(Object))
943 if (!AI->isStaticAlloca() && isIntrinsicCall(Call, Intrinsic::stackrestore))
944 return ModRefInfo::Mod;
945
946 // We can completely ignore inaccessible memory here, because MemoryLocations
947 // can only reference accessible memory.
948 auto ME = AAQI.AAR.getMemoryEffects(Call, AAQI)
950 if (ME.doesNotAccessMemory())
952
953 ModRefInfo ArgMR = ME.getModRef(IRMemLocation::ArgMem);
954 ModRefInfo OtherMR = ME.getWithoutLoc(IRMemLocation::ArgMem).getModRef();
955
956 // An identified function-local object that does not escape can only be
957 // accessed via call arguments. Reduce OtherMR (which includes accesses to
958 // escaped memory) based on that.
959 //
960 // We model calls that can return twice (setjmp) as clobbering non-escaping
961 // objects, to model any accesses that may occur prior to the second return.
962 // As an exception, ignore allocas, as setjmp is not required to preserve
963 // non-volatile stores for them.
964 if (isModOrRefSet(OtherMR) && !isa<Constant>(Object) && Call != Object &&
965 (isa<AllocaInst>(Object) || !Call->hasFnAttr(Attribute::ReturnsTwice))) {
967 AAQI.CA->getCapturesBefore(Object, Call, /*OrAt=*/false);
968 if (capturesNothing(CC))
969 OtherMR = ModRefInfo::NoModRef;
970 else if (capturesReadProvenanceOnly(CC))
971 OtherMR = ModRefInfo::Ref;
972 }
973
974 // Refine the modref info for argument memory. We only bother to do this
975 // if ArgMR is not a subset of OtherMR, otherwise this won't have an impact
976 // on the final result.
977 if ((ArgMR | OtherMR) != OtherMR) {
979 for (const Use &U : Call->data_ops()) {
980 const Value *Arg = U;
981 if (!Arg->getType()->isPointerTy())
982 continue;
983 unsigned ArgIdx = Call->getDataOperandNo(&U);
984 MemoryLocation ArgLoc =
985 Call->isArgOperand(&U)
986 ? MemoryLocation::getForArgument(Call, ArgIdx, TLI)
988 AliasResult ArgAlias = AAQI.AAR.alias(ArgLoc, Loc, AAQI, Call);
989 if (ArgAlias != AliasResult::NoAlias)
990 NewArgMR |= ArgMR & AAQI.AAR.getArgModRefInfo(Call, ArgIdx);
991
992 // Exit early if we cannot improve over the original ArgMR.
993 if (NewArgMR == ArgMR)
994 break;
995 }
996 ArgMR = NewArgMR;
997 }
998
999 ModRefInfo Result = ArgMR | OtherMR;
1000 if (!isModAndRefSet(Result))
1001 return Result;
1002
1003 // If the call is malloc/calloc like, we can assume that it doesn't
1004 // modify any IR visible value. This is only valid because we assume these
1005 // routines do not read values visible in the IR. TODO: Consider special
1006 // casing realloc and strdup routines which access only their arguments as
1007 // well. Or alternatively, replace all of this with inaccessiblememonly once
1008 // that's implemented fully.
1009 if (isMallocOrCallocLikeFn(Call, &TLI)) {
1010 // Be conservative if the accessed pointer may alias the allocation -
1011 // fallback to the generic handling below.
1012 if (AAQI.AAR.alias(MemoryLocation::getBeforeOrAfter(Call), Loc, AAQI) ==
1014 return ModRefInfo::NoModRef;
1015 }
1016
1017 // Like assumes, invariant.start intrinsics were also marked as arbitrarily
1018 // writing so that proper control dependencies are maintained but they never
1019 // mod any particular memory location visible to the IR.
1020 // *Unlike* assumes (which are now modeled as NoModRef), invariant.start
1021 // intrinsic is now modeled as reading memory. This prevents hoisting the
1022 // invariant.start intrinsic over stores. Consider:
1023 // *ptr = 40;
1024 // *ptr = 50;
1025 // invariant_start(ptr)
1026 // int val = *ptr;
1027 // print(val);
1028 //
1029 // This cannot be transformed to:
1030 //
1031 // *ptr = 40;
1032 // invariant_start(ptr)
1033 // *ptr = 50;
1034 // int val = *ptr;
1035 // print(val);
1036 //
1037 // The transformation will cause the second store to be ignored (based on
1038 // rules of invariant.start) and print 40, while the first program always
1039 // prints 50.
1040 if (isIntrinsicCall(Call, Intrinsic::invariant_start))
1041 return ModRefInfo::Ref;
1042
1043 // Be conservative.
1044 return ModRefInfo::ModRef;
1045}
1046
1048 const CallBase *Call2,
1049 AAQueryInfo &AAQI) {
1050 // Guard intrinsics are marked as arbitrarily writing so that proper control
1051 // dependencies are maintained but they never mods any particular memory
1052 // location.
1053 //
1054 // *Unlike* assumes, guard intrinsics are modeled as reading memory since the
1055 // heap state at the point the guard is issued needs to be consistent in case
1056 // the guard invokes the "deopt" continuation.
1057
1058 // NB! This function is *not* commutative, so we special case two
1059 // possibilities for guard intrinsics.
1060
1061 if (isIntrinsicCall(Call1, Intrinsic::experimental_guard))
1062 return isModSet(getMemoryEffects(Call2, AAQI).getModRef())
1065
1066 if (isIntrinsicCall(Call2, Intrinsic::experimental_guard))
1067 return isModSet(getMemoryEffects(Call1, AAQI).getModRef())
1070
1071 // Be conservative.
1072 return ModRefInfo::ModRef;
1073}
1074
1075/// Provides a bunch of ad-hoc rules to disambiguate a GEP instruction against
1076/// another pointer.
1077///
1078/// We know that V1 is a GEP, but we don't know anything about V2.
1079/// UnderlyingV1 is getUnderlyingObject(GEP1), UnderlyingV2 is the same for
1080/// V2.
1081AliasResult BasicAAResult::aliasGEP(
1082 const GEPOperator *GEP1, LocationSize V1Size,
1083 const Value *V2, LocationSize V2Size,
1084 const Value *UnderlyingV1, const Value *UnderlyingV2, AAQueryInfo &AAQI) {
1085 auto BaseObjectsAlias = [&]() {
1086 AliasResult BaseAlias =
1087 AAQI.AAR.alias(MemoryLocation::getBeforeOrAfter(UnderlyingV1),
1088 MemoryLocation::getBeforeOrAfter(UnderlyingV2), AAQI);
1089 return BaseAlias == AliasResult::NoAlias ? AliasResult::NoAlias
1091 };
1092
1093 if (!V1Size.hasValue() && !V2Size.hasValue()) {
1094 // TODO: This limitation exists for compile-time reasons. Relax it if we
1095 // can avoid exponential pathological cases.
1096 if (!isa<GEPOperator>(V2))
1097 return AliasResult::MayAlias;
1098
1099 // If both accesses have unknown size, we can only check whether the base
1100 // objects don't alias.
1101 return BaseObjectsAlias();
1102 }
1103
1104 DominatorTree *DT = getDT(AAQI);
1105 DecomposedGEP DecompGEP1 = DecomposeGEPExpression(GEP1, DL, &AC, DT);
1106 DecomposedGEP DecompGEP2 = DecomposeGEPExpression(V2, DL, &AC, DT);
1107
1108 // Bail if we were not able to decompose anything.
1109 if (DecompGEP1.Base == GEP1 && DecompGEP2.Base == V2)
1110 return AliasResult::MayAlias;
1111
1112 // Fall back to base objects if pointers have different index widths.
1113 if (DecompGEP1.Offset.getBitWidth() != DecompGEP2.Offset.getBitWidth())
1114 return BaseObjectsAlias();
1115
1116 // Swap GEP1 and GEP2 if GEP2 has more variable indices.
1117 if (DecompGEP1.VarIndices.size() < DecompGEP2.VarIndices.size()) {
1118 std::swap(DecompGEP1, DecompGEP2);
1119 std::swap(V1Size, V2Size);
1120 std::swap(UnderlyingV1, UnderlyingV2);
1121 }
1122
1123 // Subtract the GEP2 pointer from the GEP1 pointer to find out their
1124 // symbolic difference.
1125 subtractDecomposedGEPs(DecompGEP1, DecompGEP2, AAQI);
1126
1127 // If an inbounds GEP would have to start from an out of bounds address
1128 // for the two to alias, then we can assume noalias.
1129 // TODO: Remove !isScalable() once BasicAA fully support scalable location
1130 // size
1131
1132 if (DecompGEP1.NWFlags.isInBounds() && DecompGEP1.VarIndices.empty() &&
1133 V2Size.hasValue() && !V2Size.isScalable() &&
1134 DecompGEP1.Offset.sge(V2Size.getValue()) &&
1135 isBaseOfObject(DecompGEP2.Base))
1136 return AliasResult::NoAlias;
1137
1138 // Symmetric case to above.
1139 if (DecompGEP2.NWFlags.isInBounds() && DecompGEP1.VarIndices.empty() &&
1140 V1Size.hasValue() && !V1Size.isScalable() &&
1141 DecompGEP1.Offset.sle(-V1Size.getValue()) &&
1142 isBaseOfObject(DecompGEP1.Base))
1143 return AliasResult::NoAlias;
1144
1145 // For GEPs with identical offsets, we can preserve the size and AAInfo
1146 // when performing the alias check on the underlying objects.
1147 if (DecompGEP1.Offset == 0 && DecompGEP1.VarIndices.empty())
1148 return AAQI.AAR.alias(MemoryLocation(DecompGEP1.Base, V1Size),
1149 MemoryLocation(DecompGEP2.Base, V2Size), AAQI);
1150
1151 // Do the base pointers alias?
1152 AliasResult BaseAlias =
1153 AAQI.AAR.alias(MemoryLocation::getBeforeOrAfter(DecompGEP1.Base),
1154 MemoryLocation::getBeforeOrAfter(DecompGEP2.Base), AAQI);
1155
1156 // If we get a No or May, then return it immediately, no amount of analysis
1157 // will improve this situation.
1158 if (BaseAlias != AliasResult::MustAlias) {
1159 assert(BaseAlias == AliasResult::NoAlias ||
1160 BaseAlias == AliasResult::MayAlias);
1161 return BaseAlias;
1162 }
1163
1164 // If there is a constant difference between the pointers, but the difference
1165 // is less than the size of the associated memory object, then we know
1166 // that the objects are partially overlapping. If the difference is
1167 // greater, we know they do not overlap.
1168 if (DecompGEP1.VarIndices.empty()) {
1169 APInt &Off = DecompGEP1.Offset;
1170
1171 // Initialize for Off >= 0 (V2 <= GEP1) case.
1172 LocationSize VLeftSize = V2Size;
1173 LocationSize VRightSize = V1Size;
1174 const bool Swapped = Off.isNegative();
1175
1176 if (Swapped) {
1177 // Swap if we have the situation where:
1178 // + +
1179 // | BaseOffset |
1180 // ---------------->|
1181 // |-->V1Size |-------> V2Size
1182 // GEP1 V2
1183 std::swap(VLeftSize, VRightSize);
1184 Off = -Off;
1185 }
1186
1187 if (!VLeftSize.hasValue())
1188 return AliasResult::MayAlias;
1189
1190 const TypeSize LSize = VLeftSize.getValue();
1191 if (!LSize.isScalable()) {
1192 if (Off.ult(LSize)) {
1193 // Conservatively drop processing if a phi was visited and/or offset is
1194 // too big.
1196 if (VRightSize.hasValue() && !VRightSize.isScalable() &&
1197 Off.ule(INT32_MAX) && (Off + VRightSize.getValue()).ule(LSize)) {
1198 // Memory referenced by right pointer is nested. Save the offset in
1199 // cache. Note that originally offset estimated as GEP1-V2, but
1200 // AliasResult contains the shift that represents GEP1+Offset=V2.
1201 AR.setOffset(-Off.getSExtValue());
1202 AR.swap(Swapped);
1203 }
1204 return AR;
1205 }
1206 return AliasResult::NoAlias;
1207 } else {
1208 // We can use the getVScaleRange to prove that Off >= (CR.upper * LSize).
1209 ConstantRange CR = getVScaleRange(&F, Off.getBitWidth());
1210 bool Overflow;
1211 APInt UpperRange = CR.getUnsignedMax().umul_ov(
1212 APInt(Off.getBitWidth(), LSize.getKnownMinValue()), Overflow);
1213 if (!Overflow && Off.uge(UpperRange))
1214 return AliasResult::NoAlias;
1215 }
1216 }
1217
1218 // VScale Alias Analysis - Given one scalable offset between accesses and a
1219 // scalable typesize, we can divide each side by vscale, treating both values
1220 // as a constant. We prove that Offset/vscale >= TypeSize/vscale.
1221 if (DecompGEP1.VarIndices.size() == 1 &&
1222 DecompGEP1.VarIndices[0].Val.TruncBits == 0 &&
1223 DecompGEP1.Offset.isZero() &&
1224 PatternMatch::match(DecompGEP1.VarIndices[0].Val.V,
1226 const VariableGEPIndex &ScalableVar = DecompGEP1.VarIndices[0];
1227 APInt Scale =
1228 ScalableVar.IsNegated ? -ScalableVar.Scale : ScalableVar.Scale;
1229 LocationSize VLeftSize = Scale.isNegative() ? V1Size : V2Size;
1230
1231 // Check if the offset is known to not overflow, if it does then attempt to
1232 // prove it with the known values of vscale_range.
1233 bool Overflows = !DecompGEP1.VarIndices[0].IsNSW;
1234 if (Overflows) {
1235 ConstantRange CR = getVScaleRange(&F, Scale.getBitWidth());
1236 (void)CR.getSignedMax().smul_ov(Scale, Overflows);
1237 }
1238
1239 if (!Overflows) {
1240 // Note that we do not check that the typesize is scalable, as vscale >= 1
1241 // so noalias still holds so long as the dependency distance is at least
1242 // as big as the typesize.
1243 if (VLeftSize.hasValue() &&
1244 Scale.abs().uge(VLeftSize.getValue().getKnownMinValue()))
1245 return AliasResult::NoAlias;
1246 }
1247 }
1248
1249 // If the difference between pointers is Offset +<nuw> Indices then we know
1250 // that the addition does not wrap the pointer index type (add nuw) and the
1251 // constant Offset is a lower bound on the distance between the pointers. We
1252 // can then prove NoAlias via Offset u>= VLeftSize.
1253 // + + +
1254 // | BaseOffset | +<nuw> Indices |
1255 // ---------------->|-------------------->|
1256 // |-->V2Size | |-------> V1Size
1257 // LHS RHS
1258 if (!DecompGEP1.VarIndices.empty() &&
1259 DecompGEP1.NWFlags.hasNoUnsignedWrap() && V2Size.hasValue() &&
1260 !V2Size.isScalable() && DecompGEP1.Offset.uge(V2Size.getValue()))
1261 return AliasResult::NoAlias;
1262
1263 // Bail on analysing scalable LocationSize
1264 if (V1Size.isScalable() || V2Size.isScalable())
1265 return AliasResult::MayAlias;
1266
1267 // We need to know both access sizes for all the following heuristics. Don't
1268 // try to reason about sizes larger than the index space.
1269 unsigned BW = DecompGEP1.Offset.getBitWidth();
1270 if (!V1Size.hasValue() || !V2Size.hasValue() ||
1271 !isUIntN(BW, V1Size.getValue()) || !isUIntN(BW, V2Size.getValue()))
1272 return AliasResult::MayAlias;
1273
1274 APInt GCD;
1275 ConstantRange OffsetRange = ConstantRange(DecompGEP1.Offset);
1276 for (unsigned i = 0, e = DecompGEP1.VarIndices.size(); i != e; ++i) {
1277 const VariableGEPIndex &Index = DecompGEP1.VarIndices[i];
1278 const APInt &Scale = Index.Scale;
1279 APInt ScaleForGCD = Scale;
1280 if (!Index.IsNSW)
1281 ScaleForGCD =
1283
1284 if (i == 0)
1285 GCD = ScaleForGCD.abs();
1286 else
1287 GCD = APIntOps::GreatestCommonDivisor(GCD, ScaleForGCD.abs());
1288
1289 ConstantRange CR = computeConstantRange(Index.Val.V, /* ForSigned */ false,
1290 true, &AC, Index.CxtI);
1291 KnownBits Known = computeKnownBits(Index.Val.V, DL, &AC, Index.CxtI, DT);
1292 CR = CR.intersectWith(
1293 ConstantRange::fromKnownBits(Known, /* Signed */ true),
1295 CR = Index.Val.evaluateWith(CR).sextOrTrunc(OffsetRange.getBitWidth());
1296
1297 assert(OffsetRange.getBitWidth() == Scale.getBitWidth() &&
1298 "Bit widths are normalized to MaxIndexSize");
1299 if (Index.IsNSW)
1300 CR = CR.smul_sat(ConstantRange(Scale));
1301 else
1302 CR = CR.smul_fast(ConstantRange(Scale));
1303
1304 if (Index.IsNegated)
1305 OffsetRange = OffsetRange.sub(CR);
1306 else
1307 OffsetRange = OffsetRange.add(CR);
1308 }
1309
1310 // We now have accesses at two offsets from the same base:
1311 // 1. (...)*GCD + DecompGEP1.Offset with size V1Size
1312 // 2. 0 with size V2Size
1313 // Using arithmetic modulo GCD, the accesses are at
1314 // [ModOffset..ModOffset+V1Size) and [0..V2Size). If the first access fits
1315 // into the range [V2Size..GCD), then we know they cannot overlap.
1316 APInt ModOffset = DecompGEP1.Offset.srem(GCD);
1317 if (ModOffset.isNegative())
1318 ModOffset += GCD; // We want mod, not rem.
1319 if (ModOffset.uge(V2Size.getValue()) &&
1320 (GCD - ModOffset).uge(V1Size.getValue()))
1321 return AliasResult::NoAlias;
1322
1323 // Compute ranges of potentially accessed bytes for both accesses. If the
1324 // interseciton is empty, there can be no overlap.
1325 ConstantRange Range1 = OffsetRange.add(
1326 ConstantRange(APInt(BW, 0), APInt(BW, V1Size.getValue())));
1327 ConstantRange Range2 =
1328 ConstantRange(APInt(BW, 0), APInt(BW, V2Size.getValue()));
1329 if (Range1.intersectWith(Range2).isEmptySet())
1330 return AliasResult::NoAlias;
1331
1332 // Check if abs(V*Scale) >= abs(Scale) holds in the presence of
1333 // potentially wrapping math.
1334 auto MultiplyByScaleNoWrap = [](const VariableGEPIndex &Var) {
1335 if (Var.IsNSW)
1336 return true;
1337
1338 int ValOrigBW = Var.Val.V->getType()->getPrimitiveSizeInBits();
1339 // If Scale is small enough so that abs(V*Scale) >= abs(Scale) holds.
1340 // The max value of abs(V) is 2^ValOrigBW - 1. Multiplying with a
1341 // constant smaller than 2^(bitwidth(Val) - ValOrigBW) won't wrap.
1342 int MaxScaleValueBW = Var.Val.getBitWidth() - ValOrigBW;
1343 if (MaxScaleValueBW <= 0)
1344 return false;
1345 return Var.Scale.ule(
1346 APInt::getMaxValue(MaxScaleValueBW).zext(Var.Scale.getBitWidth()));
1347 };
1348
1349 // Try to determine the range of values for VarIndex such that
1350 // VarIndex <= -MinAbsVarIndex || MinAbsVarIndex <= VarIndex.
1351 std::optional<APInt> MinAbsVarIndex;
1352 if (DecompGEP1.VarIndices.size() == 1) {
1353 // VarIndex = Scale*V.
1354 const VariableGEPIndex &Var = DecompGEP1.VarIndices[0];
1355 if (Var.Val.TruncBits == 0 &&
1356 isKnownNonZero(Var.Val.V, SimplifyQuery(DL, DT, &AC, Var.CxtI))) {
1357 // Refine MinAbsVarIndex, if abs(Scale*V) >= abs(Scale) holds in the
1358 // presence of potentially wrapping math.
1359 if (MultiplyByScaleNoWrap(Var)) {
1360 // If V != 0 then abs(VarIndex) >= abs(Scale).
1361 MinAbsVarIndex = Var.Scale.abs();
1362 }
1363 }
1364 } else if (DecompGEP1.VarIndices.size() == 2) {
1365 // VarIndex = Scale*V0 + (-Scale)*V1.
1366 // If V0 != V1 then abs(VarIndex) >= abs(Scale).
1367 // Check that MayBeCrossIteration is false, to avoid reasoning about
1368 // inequality of values across loop iterations.
1369 const VariableGEPIndex &Var0 = DecompGEP1.VarIndices[0];
1370 const VariableGEPIndex &Var1 = DecompGEP1.VarIndices[1];
1371 if (Var0.hasNegatedScaleOf(Var1) && Var0.Val.TruncBits == 0 &&
1372 Var0.Val.hasSameCastsAs(Var1.Val) && !AAQI.MayBeCrossIteration &&
1373 MultiplyByScaleNoWrap(Var0) && MultiplyByScaleNoWrap(Var1) &&
1374 isKnownNonEqual(Var0.Val.V, Var1.Val.V,
1375 SimplifyQuery(DL, DT, &AC, /*CxtI=*/Var0.CxtI
1376 ? Var0.CxtI
1377 : Var1.CxtI)))
1378 MinAbsVarIndex = Var0.Scale.abs();
1379 }
1380
1381 if (MinAbsVarIndex) {
1382 // The constant offset will have added at least +/-MinAbsVarIndex to it.
1383 APInt OffsetLo = DecompGEP1.Offset - *MinAbsVarIndex;
1384 APInt OffsetHi = DecompGEP1.Offset + *MinAbsVarIndex;
1385 // We know that Offset <= OffsetLo || Offset >= OffsetHi
1386 if (OffsetLo.isNegative() && (-OffsetLo).uge(V1Size.getValue()) &&
1387 OffsetHi.isNonNegative() && OffsetHi.uge(V2Size.getValue()))
1388 return AliasResult::NoAlias;
1389 }
1390
1391 if (constantOffsetHeuristic(DecompGEP1, V1Size, V2Size, &AC, DT, AAQI))
1392 return AliasResult::NoAlias;
1393
1394 // Statically, we can see that the base objects are the same, but the
1395 // pointers have dynamic offsets which we can't resolve. And none of our
1396 // little tricks above worked.
1397 return AliasResult::MayAlias;
1398}
1399
1401 // If the results agree, take it.
1402 if (A == B)
1403 return A;
1404 // A mix of PartialAlias and MustAlias is PartialAlias.
1408 // Otherwise, we don't know anything.
1409 return AliasResult::MayAlias;
1410}
1411
1412/// Provides a bunch of ad-hoc rules to disambiguate a Select instruction
1413/// against another.
1415BasicAAResult::aliasSelect(const SelectInst *SI, LocationSize SISize,
1416 const Value *V2, LocationSize V2Size,
1417 AAQueryInfo &AAQI) {
1418 // If the values are Selects with the same condition, we can do a more precise
1419 // check: just check for aliases between the values on corresponding arms.
1420 if (const SelectInst *SI2 = dyn_cast<SelectInst>(V2))
1421 if (isValueEqualInPotentialCycles(SI->getCondition(), SI2->getCondition(),
1422 AAQI)) {
1423 AliasResult Alias =
1424 AAQI.AAR.alias(MemoryLocation(SI->getTrueValue(), SISize),
1425 MemoryLocation(SI2->getTrueValue(), V2Size), AAQI);
1426 if (Alias == AliasResult::MayAlias)
1427 return AliasResult::MayAlias;
1428 AliasResult ThisAlias =
1429 AAQI.AAR.alias(MemoryLocation(SI->getFalseValue(), SISize),
1430 MemoryLocation(SI2->getFalseValue(), V2Size), AAQI);
1431 return MergeAliasResults(ThisAlias, Alias);
1432 }
1433
1434 // If both arms of the Select node NoAlias or MustAlias V2, then returns
1435 // NoAlias / MustAlias. Otherwise, returns MayAlias.
1436 AliasResult Alias = AAQI.AAR.alias(MemoryLocation(SI->getTrueValue(), SISize),
1437 MemoryLocation(V2, V2Size), AAQI);
1438 if (Alias == AliasResult::MayAlias)
1439 return AliasResult::MayAlias;
1440
1441 AliasResult ThisAlias =
1442 AAQI.AAR.alias(MemoryLocation(SI->getFalseValue(), SISize),
1443 MemoryLocation(V2, V2Size), AAQI);
1444 return MergeAliasResults(ThisAlias, Alias);
1445}
1446
1447/// Provide a bunch of ad-hoc rules to disambiguate a PHI instruction against
1448/// another.
1449AliasResult BasicAAResult::aliasPHI(const PHINode *PN, LocationSize PNSize,
1450 const Value *V2, LocationSize V2Size,
1451 AAQueryInfo &AAQI) {
1452 if (!PN->getNumIncomingValues())
1453 return AliasResult::NoAlias;
1454 // If the values are PHIs in the same block, we can do a more precise
1455 // as well as efficient check: just check for aliases between the values
1456 // on corresponding edges. Don't do this if we are analyzing across
1457 // iterations, as we may pick a different phi entry in different iterations.
1458 if (const PHINode *PN2 = dyn_cast<PHINode>(V2))
1459 if (PN2->getParent() == PN->getParent() && !AAQI.MayBeCrossIteration) {
1460 std::optional<AliasResult> Alias;
1461 for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i) {
1462 AliasResult ThisAlias = AAQI.AAR.alias(
1463 MemoryLocation(PN->getIncomingValue(i), PNSize),
1465 PN2->getIncomingValueForBlock(PN->getIncomingBlock(i)), V2Size),
1466 AAQI);
1467 if (Alias)
1468 *Alias = MergeAliasResults(*Alias, ThisAlias);
1469 else
1470 Alias = ThisAlias;
1471 if (*Alias == AliasResult::MayAlias)
1472 break;
1473 }
1474 return *Alias;
1475 }
1476
1478 // If a phi operand recurses back to the phi, we can still determine NoAlias
1479 // if we don't alias the underlying objects of the other phi operands, as we
1480 // know that the recursive phi needs to be based on them in some way.
1481 bool isRecursive = false;
1482 auto CheckForRecPhi = [&](Value *PV) {
1484 return false;
1485 if (getUnderlyingObject(PV) == PN) {
1486 isRecursive = true;
1487 return true;
1488 }
1489 return false;
1490 };
1491
1492 SmallPtrSet<Value *, 4> UniqueSrc;
1493 Value *OnePhi = nullptr;
1494 for (Value *PV1 : PN->incoming_values()) {
1495 // Skip the phi itself being the incoming value.
1496 if (PV1 == PN)
1497 continue;
1498
1499 if (isa<PHINode>(PV1)) {
1500 if (OnePhi && OnePhi != PV1) {
1501 // To control potential compile time explosion, we choose to be
1502 // conserviate when we have more than one Phi input. It is important
1503 // that we handle the single phi case as that lets us handle LCSSA
1504 // phi nodes and (combined with the recursive phi handling) simple
1505 // pointer induction variable patterns.
1506 return AliasResult::MayAlias;
1507 }
1508 OnePhi = PV1;
1509 }
1510
1511 if (CheckForRecPhi(PV1))
1512 continue;
1513
1514 if (UniqueSrc.insert(PV1).second)
1515 V1Srcs.push_back(PV1);
1516 }
1517
1518 if (OnePhi && UniqueSrc.size() > 1)
1519 // Out of an abundance of caution, allow only the trivial lcssa and
1520 // recursive phi cases.
1521 return AliasResult::MayAlias;
1522
1523 // If V1Srcs is empty then that means that the phi has no underlying non-phi
1524 // value. This should only be possible in blocks unreachable from the entry
1525 // block, but return MayAlias just in case.
1526 if (V1Srcs.empty())
1527 return AliasResult::MayAlias;
1528
1529 // If this PHI node is recursive, indicate that the pointer may be moved
1530 // across iterations. We can only prove NoAlias if different underlying
1531 // objects are involved.
1532 if (isRecursive)
1534
1535 // In the recursive alias queries below, we may compare values from two
1536 // different loop iterations.
1537 SaveAndRestore SavedMayBeCrossIteration(AAQI.MayBeCrossIteration, true);
1538
1539 AliasResult Alias = AAQI.AAR.alias(MemoryLocation(V1Srcs[0], PNSize),
1540 MemoryLocation(V2, V2Size), AAQI);
1541
1542 // Early exit if the check of the first PHI source against V2 is MayAlias.
1543 // Other results are not possible.
1544 if (Alias == AliasResult::MayAlias)
1545 return AliasResult::MayAlias;
1546 // With recursive phis we cannot guarantee that MustAlias/PartialAlias will
1547 // remain valid to all elements and needs to conservatively return MayAlias.
1548 if (isRecursive && Alias != AliasResult::NoAlias)
1549 return AliasResult::MayAlias;
1550
1551 // If all sources of the PHI node NoAlias or MustAlias V2, then returns
1552 // NoAlias / MustAlias. Otherwise, returns MayAlias.
1553 for (unsigned i = 1, e = V1Srcs.size(); i != e; ++i) {
1554 Value *V = V1Srcs[i];
1555
1556 AliasResult ThisAlias = AAQI.AAR.alias(
1557 MemoryLocation(V, PNSize), MemoryLocation(V2, V2Size), AAQI);
1558 Alias = MergeAliasResults(ThisAlias, Alias);
1559 if (Alias == AliasResult::MayAlias)
1560 break;
1561 }
1562
1563 return Alias;
1564}
1565
1566// Return true for an Argument or extractvalue(Argument). These are all known
1567// to not alias with FunctionLocal objects and can come up from coerced function
1568// arguments.
1569static bool isArgumentOrArgumentLike(const Value *V) {
1570 if (isa<Argument>(V))
1571 return true;
1572 auto *E = dyn_cast<ExtractValueInst>(V);
1573 return E && isa<Argument>(E->getOperand(0));
1574}
1575
1576/// Provides a bunch of ad-hoc rules to disambiguate in common cases, such as
1577/// array references.
1578AliasResult BasicAAResult::aliasCheck(const Value *V1, LocationSize V1Size,
1579 const Value *V2, LocationSize V2Size,
1580 AAQueryInfo &AAQI,
1581 const Instruction *CtxI) {
1582 // If either of the memory references is empty, it doesn't matter what the
1583 // pointer values are.
1584 if (V1Size.isZero() || V2Size.isZero())
1585 return AliasResult::NoAlias;
1586
1587 // Strip off any casts if they exist.
1590
1591 // If V1 or V2 is undef, the result is NoAlias because we can always pick a
1592 // value for undef that aliases nothing in the program.
1593 if (isa<UndefValue>(V1) || isa<UndefValue>(V2))
1594 return AliasResult::NoAlias;
1595
1596 // Are we checking for alias of the same value?
1597 // Because we look 'through' phi nodes, we could look at "Value" pointers from
1598 // different iterations. We must therefore make sure that this is not the
1599 // case. The function isValueEqualInPotentialCycles ensures that this cannot
1600 // happen by looking at the visited phi nodes and making sure they cannot
1601 // reach the value.
1602 if (isValueEqualInPotentialCycles(V1, V2, AAQI))
1604
1605 // Figure out what objects these things are pointing to if we can.
1608
1609 // Null values in the default address space don't point to any object, so they
1610 // don't alias any other pointer.
1611 if (const ConstantPointerNull *CPN = dyn_cast<ConstantPointerNull>(O1))
1612 if (!NullPointerIsDefined(&F, CPN->getType()->getAddressSpace()))
1613 return AliasResult::NoAlias;
1614 if (const ConstantPointerNull *CPN = dyn_cast<ConstantPointerNull>(O2))
1615 if (!NullPointerIsDefined(&F, CPN->getType()->getAddressSpace()))
1616 return AliasResult::NoAlias;
1617
1618 if (O1 != O2) {
1619 // If V1/V2 point to two different objects, we know that we have no alias.
1621 return AliasResult::NoAlias;
1622
1623 // Function arguments can't alias with things that are known to be
1624 // unambigously identified at the function level.
1627 return AliasResult::NoAlias;
1628
1629 // If one pointer is the result of a call/invoke or load and the other is a
1630 // non-escaping local object within the same function, then we know the
1631 // object couldn't escape to a point where the call could return it.
1632 //
1633 // Note that if the pointers are in different functions, there are a
1634 // variety of complications. A call with a nocapture argument may still
1635 // temporary store the nocapture argument's value in a temporary memory
1636 // location if that memory location doesn't escape. Or it may pass a
1637 // nocapture value to other functions as long as they don't capture it.
1638 if (isEscapeSource(O1) &&
1640 O2, dyn_cast<Instruction>(O1), /*OrAt*/ true)))
1641 return AliasResult::NoAlias;
1642 if (isEscapeSource(O2) &&
1644 O1, dyn_cast<Instruction>(O2), /*OrAt*/ true)))
1645 return AliasResult::NoAlias;
1646 }
1647
1648 // If the size of one access is larger than the entire object on the other
1649 // side, then we know such behavior is undefined and can assume no alias.
1650 bool NullIsValidLocation = NullPointerIsDefined(&F);
1652 O2, getMinimalExtentFrom(*V1, V1Size, DL, NullIsValidLocation), DL,
1653 TLI, NullIsValidLocation)) ||
1655 O1, getMinimalExtentFrom(*V2, V2Size, DL, NullIsValidLocation), DL,
1656 TLI, NullIsValidLocation)))
1657 return AliasResult::NoAlias;
1658
1660 for (AssumptionCache::ResultElem &Elem : AC.assumptionsFor(O1)) {
1661 if (!Elem || Elem.Index == AssumptionCache::ExprResultIdx)
1662 continue;
1663
1664 AssumeInst *Assume = cast<AssumeInst>(Elem);
1665 OperandBundleUse OBU = Assume->getOperandBundleAt(Elem.Index);
1666 if (OBU.getTagName() == "separate_storage") {
1667 assert(OBU.Inputs.size() == 2);
1668 const Value *Hint1 = OBU.Inputs[0].get();
1669 const Value *Hint2 = OBU.Inputs[1].get();
1670 // This is often a no-op; instcombine rewrites this for us. No-op
1671 // getUnderlyingObject calls are fast, though.
1672 const Value *HintO1 = getUnderlyingObject(Hint1);
1673 const Value *HintO2 = getUnderlyingObject(Hint2);
1674
1675 DominatorTree *DT = getDT(AAQI);
1676 auto ValidAssumeForPtrContext = [&](const Value *Ptr) {
1677 if (const Instruction *PtrI = dyn_cast<Instruction>(Ptr)) {
1678 return isValidAssumeForContext(Assume, PtrI, DT,
1679 /* AllowEphemerals */ true);
1680 }
1681 if (const Argument *PtrA = dyn_cast<Argument>(Ptr)) {
1682 const Instruction *FirstI =
1683 &*PtrA->getParent()->getEntryBlock().begin();
1684 return isValidAssumeForContext(Assume, FirstI, DT,
1685 /* AllowEphemerals */ true);
1686 }
1687 return false;
1688 };
1689
1690 if ((O1 == HintO1 && O2 == HintO2) || (O1 == HintO2 && O2 == HintO1)) {
1691 // Note that we go back to V1 and V2 for the
1692 // ValidAssumeForPtrContext checks; they're dominated by O1 and O2,
1693 // so strictly more assumptions are valid for them.
1694 if ((CtxI && isValidAssumeForContext(Assume, CtxI, DT,
1695 /* AllowEphemerals */ true)) ||
1696 ValidAssumeForPtrContext(V1) || ValidAssumeForPtrContext(V2)) {
1697 return AliasResult::NoAlias;
1698 }
1699 }
1700 }
1701 }
1702 }
1703
1704 // If one the accesses may be before the accessed pointer, canonicalize this
1705 // by using unknown after-pointer sizes for both accesses. This is
1706 // equivalent, because regardless of which pointer is lower, one of them
1707 // will always came after the other, as long as the underlying objects aren't
1708 // disjoint. We do this so that the rest of BasicAA does not have to deal
1709 // with accesses before the base pointer, and to improve cache utilization by
1710 // merging equivalent states.
1711 if (V1Size.mayBeBeforePointer() || V2Size.mayBeBeforePointer()) {
1712 V1Size = LocationSize::afterPointer();
1713 V2Size = LocationSize::afterPointer();
1714 }
1715
1716 // FIXME: If this depth limit is hit, then we may cache sub-optimal results
1717 // for recursive queries. For this reason, this limit is chosen to be large
1718 // enough to be very rarely hit, while still being small enough to avoid
1719 // stack overflows.
1720 if (AAQI.Depth >= 512)
1721 return AliasResult::MayAlias;
1722
1723 // Check the cache before climbing up use-def chains. This also terminates
1724 // otherwise infinitely recursive queries. Include MayBeCrossIteration in the
1725 // cache key, because some cases where MayBeCrossIteration==false returns
1726 // MustAlias or NoAlias may become MayAlias under MayBeCrossIteration==true.
1727 AAQueryInfo::LocPair Locs({V1, V1Size, AAQI.MayBeCrossIteration},
1728 {V2, V2Size, AAQI.MayBeCrossIteration});
1729 const bool Swapped = V1 > V2;
1730 if (Swapped)
1731 std::swap(Locs.first, Locs.second);
1732 const auto &Pair = AAQI.AliasCache.try_emplace(
1734 if (!Pair.second) {
1735 auto &Entry = Pair.first->second;
1736 if (!Entry.isDefinitive()) {
1737 // Remember that we used an assumption. This may either be a direct use
1738 // of an assumption, or a use of an entry that may itself be based on an
1739 // assumption.
1740 ++AAQI.NumAssumptionUses;
1741 if (Entry.isAssumption())
1742 ++Entry.NumAssumptionUses;
1743 }
1744 // Cache contains sorted {V1,V2} pairs but we should return original order.
1745 auto Result = Entry.Result;
1746 Result.swap(Swapped);
1747 return Result;
1748 }
1749
1750 int OrigNumAssumptionUses = AAQI.NumAssumptionUses;
1751 unsigned OrigNumAssumptionBasedResults = AAQI.AssumptionBasedResults.size();
1753 aliasCheckRecursive(V1, V1Size, V2, V2Size, AAQI, O1, O2);
1754
1755 auto It = AAQI.AliasCache.find(Locs);
1756 assert(It != AAQI.AliasCache.end() && "Must be in cache");
1757 auto &Entry = It->second;
1758
1759 // Check whether a NoAlias assumption has been used, but disproven.
1760 bool AssumptionDisproven =
1761 Entry.NumAssumptionUses > 0 && Result != AliasResult::NoAlias;
1762 if (AssumptionDisproven)
1764
1765 // This is a definitive result now, when considered as a root query.
1766 AAQI.NumAssumptionUses -= Entry.NumAssumptionUses;
1767 Entry.Result = Result;
1768 // Cache contains sorted {V1,V2} pairs.
1769 Entry.Result.swap(Swapped);
1770
1771 // If the assumption has been disproven, remove any results that may have
1772 // been based on this assumption. Do this after the Entry updates above to
1773 // avoid iterator invalidation.
1774 if (AssumptionDisproven)
1775 while (AAQI.AssumptionBasedResults.size() > OrigNumAssumptionBasedResults)
1777
1778 // The result may still be based on assumptions higher up in the chain.
1779 // Remember it, so it can be purged from the cache later.
1780 if (OrigNumAssumptionUses != AAQI.NumAssumptionUses &&
1781 Result != AliasResult::MayAlias) {
1784 } else {
1785 Entry.NumAssumptionUses = AAQueryInfo::CacheEntry::Definitive;
1786 }
1787
1788 // Depth is incremented before this function is called, so Depth==1 indicates
1789 // a root query.
1790 if (AAQI.Depth == 1) {
1791 // Any remaining assumption based results must be based on proven
1792 // assumptions, so convert them to definitive results.
1793 for (const auto &Loc : AAQI.AssumptionBasedResults) {
1794 auto It = AAQI.AliasCache.find(Loc);
1795 if (It != AAQI.AliasCache.end())
1796 It->second.NumAssumptionUses = AAQueryInfo::CacheEntry::Definitive;
1797 }
1799 AAQI.NumAssumptionUses = 0;
1800 }
1801 return Result;
1802}
1803
1804AliasResult BasicAAResult::aliasCheckRecursive(
1805 const Value *V1, LocationSize V1Size,
1806 const Value *V2, LocationSize V2Size,
1807 AAQueryInfo &AAQI, const Value *O1, const Value *O2) {
1808 if (const GEPOperator *GV1 = dyn_cast<GEPOperator>(V1)) {
1809 AliasResult Result = aliasGEP(GV1, V1Size, V2, V2Size, O1, O2, AAQI);
1810 if (Result != AliasResult::MayAlias)
1811 return Result;
1812 } else if (const GEPOperator *GV2 = dyn_cast<GEPOperator>(V2)) {
1813 AliasResult Result = aliasGEP(GV2, V2Size, V1, V1Size, O2, O1, AAQI);
1814 Result.swap();
1815 if (Result != AliasResult::MayAlias)
1816 return Result;
1817 }
1818
1819 if (const PHINode *PN = dyn_cast<PHINode>(V1)) {
1820 AliasResult Result = aliasPHI(PN, V1Size, V2, V2Size, AAQI);
1821 if (Result != AliasResult::MayAlias)
1822 return Result;
1823 } else if (const PHINode *PN = dyn_cast<PHINode>(V2)) {
1824 AliasResult Result = aliasPHI(PN, V2Size, V1, V1Size, AAQI);
1825 Result.swap();
1826 if (Result != AliasResult::MayAlias)
1827 return Result;
1828 }
1829
1830 if (const SelectInst *S1 = dyn_cast<SelectInst>(V1)) {
1831 AliasResult Result = aliasSelect(S1, V1Size, V2, V2Size, AAQI);
1832 if (Result != AliasResult::MayAlias)
1833 return Result;
1834 } else if (const SelectInst *S2 = dyn_cast<SelectInst>(V2)) {
1835 AliasResult Result = aliasSelect(S2, V2Size, V1, V1Size, AAQI);
1836 Result.swap();
1837 if (Result != AliasResult::MayAlias)
1838 return Result;
1839 }
1840
1841 // If both pointers are pointing into the same object and one of them
1842 // accesses the entire object, then the accesses must overlap in some way.
1843 if (O1 == O2) {
1844 bool NullIsValidLocation = NullPointerIsDefined(&F);
1845 if (V1Size.isPrecise() && V2Size.isPrecise() &&
1846 (isObjectSize(O1, V1Size.getValue(), DL, TLI, NullIsValidLocation) ||
1847 isObjectSize(O2, V2Size.getValue(), DL, TLI, NullIsValidLocation)))
1849 }
1850
1851 return AliasResult::MayAlias;
1852}
1853
1854/// Check whether two Values can be considered equivalent.
1855///
1856/// If the values may come from different cycle iterations, this will also
1857/// check that the values are not part of cycle. We have to do this because we
1858/// are looking through phi nodes, that is we say
1859/// noalias(V, phi(VA, VB)) if noalias(V, VA) and noalias(V, VB).
1860bool BasicAAResult::isValueEqualInPotentialCycles(const Value *V,
1861 const Value *V2,
1862 const AAQueryInfo &AAQI) {
1863 if (V != V2)
1864 return false;
1865
1866 if (!AAQI.MayBeCrossIteration)
1867 return true;
1868
1869 // Non-instructions and instructions in the entry block cannot be part of
1870 // a loop.
1871 const Instruction *Inst = dyn_cast<Instruction>(V);
1872 if (!Inst || Inst->getParent()->isEntryBlock())
1873 return true;
1874
1875 return isNotInCycle(Inst, getDT(AAQI), /*LI*/ nullptr);
1876}
1877
1878/// Computes the symbolic difference between two de-composed GEPs.
1879void BasicAAResult::subtractDecomposedGEPs(DecomposedGEP &DestGEP,
1880 const DecomposedGEP &SrcGEP,
1881 const AAQueryInfo &AAQI) {
1882 // Drop nuw flag from GEP if subtraction of constant offsets overflows in an
1883 // unsigned sense.
1884 if (DestGEP.Offset.ult(SrcGEP.Offset))
1885 DestGEP.NWFlags = DestGEP.NWFlags.withoutNoUnsignedWrap();
1886
1887 DestGEP.Offset -= SrcGEP.Offset;
1888 for (const VariableGEPIndex &Src : SrcGEP.VarIndices) {
1889 // Find V in Dest. This is N^2, but pointer indices almost never have more
1890 // than a few variable indexes.
1891 bool Found = false;
1892 for (auto I : enumerate(DestGEP.VarIndices)) {
1893 VariableGEPIndex &Dest = I.value();
1894 if ((!isValueEqualInPotentialCycles(Dest.Val.V, Src.Val.V, AAQI) &&
1895 !areBothVScale(Dest.Val.V, Src.Val.V)) ||
1896 !Dest.Val.hasSameCastsAs(Src.Val))
1897 continue;
1898
1899 // Normalize IsNegated if we're going to lose the NSW flag anyway.
1900 if (Dest.IsNegated) {
1901 Dest.Scale = -Dest.Scale;
1902 Dest.IsNegated = false;
1903 Dest.IsNSW = false;
1904 }
1905
1906 // If we found it, subtract off Scale V's from the entry in Dest. If it
1907 // goes to zero, remove the entry.
1908 if (Dest.Scale != Src.Scale) {
1909 // Drop nuw flag from GEP if subtraction of V's Scale overflows in an
1910 // unsigned sense.
1911 if (Dest.Scale.ult(Src.Scale))
1912 DestGEP.NWFlags = DestGEP.NWFlags.withoutNoUnsignedWrap();
1913
1914 Dest.Scale -= Src.Scale;
1915 Dest.IsNSW = false;
1916 } else {
1917 DestGEP.VarIndices.erase(DestGEP.VarIndices.begin() + I.index());
1918 }
1919 Found = true;
1920 break;
1921 }
1922
1923 // If we didn't consume this entry, add it to the end of the Dest list.
1924 if (!Found) {
1925 VariableGEPIndex Entry = {Src.Val, Src.Scale, Src.CxtI, Src.IsNSW,
1926 /* IsNegated */ true};
1927 DestGEP.VarIndices.push_back(Entry);
1928
1929 // Drop nuw flag when we have unconsumed variable indices from SrcGEP.
1930 DestGEP.NWFlags = DestGEP.NWFlags.withoutNoUnsignedWrap();
1931 }
1932 }
1933}
1934
1935bool BasicAAResult::constantOffsetHeuristic(const DecomposedGEP &GEP,
1936 LocationSize MaybeV1Size,
1937 LocationSize MaybeV2Size,
1938 AssumptionCache *AC,
1939 DominatorTree *DT,
1940 const AAQueryInfo &AAQI) {
1941 if (GEP.VarIndices.size() != 2 || !MaybeV1Size.hasValue() ||
1942 !MaybeV2Size.hasValue())
1943 return false;
1944
1945 const uint64_t V1Size = MaybeV1Size.getValue();
1946 const uint64_t V2Size = MaybeV2Size.getValue();
1947
1948 const VariableGEPIndex &Var0 = GEP.VarIndices[0], &Var1 = GEP.VarIndices[1];
1949
1950 if (Var0.Val.TruncBits != 0 || !Var0.Val.hasSameCastsAs(Var1.Val) ||
1951 !Var0.hasNegatedScaleOf(Var1) ||
1952 Var0.Val.V->getType() != Var1.Val.V->getType())
1953 return false;
1954
1955 // We'll strip off the Extensions of Var0 and Var1 and do another round
1956 // of GetLinearExpression decomposition. In the example above, if Var0
1957 // is zext(%x + 1) we should get V1 == %x and V1Offset == 1.
1958
1959 LinearExpression E0 =
1960 GetLinearExpression(CastedValue(Var0.Val.V), DL, 0, AC, DT);
1961 LinearExpression E1 =
1962 GetLinearExpression(CastedValue(Var1.Val.V), DL, 0, AC, DT);
1963 if (E0.Scale != E1.Scale || !E0.Val.hasSameCastsAs(E1.Val) ||
1964 !isValueEqualInPotentialCycles(E0.Val.V, E1.Val.V, AAQI))
1965 return false;
1966
1967 // We have a hit - Var0 and Var1 only differ by a constant offset!
1968
1969 // If we've been sext'ed then zext'd the maximum difference between Var0 and
1970 // Var1 is possible to calculate, but we're just interested in the absolute
1971 // minimum difference between the two. The minimum distance may occur due to
1972 // wrapping; consider "add i3 %i, 5": if %i == 7 then 7 + 5 mod 8 == 4, and so
1973 // the minimum distance between %i and %i + 5 is 3.
1974 APInt MinDiff = E0.Offset - E1.Offset, Wrapped = -MinDiff;
1975 MinDiff = APIntOps::umin(MinDiff, Wrapped);
1976 APInt MinDiffBytes =
1977 MinDiff.zextOrTrunc(Var0.Scale.getBitWidth()) * Var0.Scale.abs();
1978
1979 // We can't definitely say whether GEP1 is before or after V2 due to wrapping
1980 // arithmetic (i.e. for some values of GEP1 and V2 GEP1 < V2, and for other
1981 // values GEP1 > V2). We'll therefore only declare NoAlias if both V1Size and
1982 // V2Size can fit in the MinDiffBytes gap.
1983 return MinDiffBytes.uge(V1Size + GEP.Offset.abs()) &&
1984 MinDiffBytes.uge(V2Size + GEP.Offset.abs());
1985}
1986
1987//===----------------------------------------------------------------------===//
1988// BasicAliasAnalysis Pass
1989//===----------------------------------------------------------------------===//
1990
1991AnalysisKey BasicAA::Key;
1992
1994 auto &TLI = AM.getResult<TargetLibraryAnalysis>(F);
1995 auto &AC = AM.getResult<AssumptionAnalysis>(F);
1996 auto *DT = &AM.getResult<DominatorTreeAnalysis>(F);
1997 return BasicAAResult(F.getDataLayout(), F, TLI, AC, DT);
1998}
1999
2001
2002char BasicAAWrapperPass::ID = 0;
2003
2004void BasicAAWrapperPass::anchor() {}
2005
2007 "Basic Alias Analysis (stateless AA impl)", true, true)
2012 "Basic Alias Analysis (stateless AA impl)", true, true)
2013
2015 return new BasicAAWrapperPass();
2016}
2017
2019 auto &ACT = getAnalysis<AssumptionCacheTracker>();
2020 auto &TLIWP = getAnalysis<TargetLibraryInfoWrapperPass>();
2021 auto &DTWP = getAnalysis<DominatorTreeWrapperPass>();
2022
2023 Result.reset(new BasicAAResult(F.getDataLayout(), F,
2024 TLIWP.getTLI(F), ACT.getAssumptionCache(F),
2025 &DTWP.getDomTree()));
2026
2027 return false;
2028}
2029
2031 AU.setPreservesAll();
2035}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
constexpr LLT S1
Rewrite undef for PHI
This file implements a class to represent arbitrary precision integral constant values and operations...
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static void print(raw_ostream &Out, object::Archive::Kind Kind, T Val)
This file contains the simple types necessary to represent the attributes associated with functions a...
static cl::opt< bool > EnableRecPhiAnalysis("basic-aa-recphi", cl::Hidden, cl::init(true))
Enable analysis of recursive PHI nodes.
static const Function * getParent(const Value *V)
static bool isObjectSmallerThan(const Value *V, TypeSize Size, const DataLayout &DL, const TargetLibraryInfo &TLI, bool NullIsValidLoc)
Returns true if we can prove that the object specified by V is smaller than Size.
static bool isObjectSize(const Value *V, TypeSize Size, const DataLayout &DL, const TargetLibraryInfo &TLI, bool NullIsValidLoc)
Returns true if we can prove that the object specified by V has size Size.
static cl::opt< bool > EnableSeparateStorageAnalysis("basic-aa-separate-storage", cl::Hidden, cl::init(true))
static bool isArgumentOrArgumentLike(const Value *V)
static bool notDifferentParent(const Value *O1, const Value *O2)
static LinearExpression GetLinearExpression(const CastedValue &Val, const DataLayout &DL, unsigned Depth, AssumptionCache *AC, DominatorTree *DT)
Analyzes the specified value as a linear expression: "A*V + B", where A and B are constant integers.
static bool isNotInCycle(const Instruction *I, const DominatorTree *DT, const LoopInfo *LI)
static bool areBothVScale(const Value *V1, const Value *V2)
Return true if both V1 and V2 are VScale.
static TypeSize getMinimalExtentFrom(const Value &V, const LocationSize &LocSize, const DataLayout &DL, bool NullIsValidLoc)
Return the minimal extent from V to the end of the underlying object, assuming the result is used in ...
static AliasResult MergeAliasResults(AliasResult A, AliasResult B)
static bool isIntrinsicCall(const CallBase *Call, Intrinsic::ID IID)
This is the interface for LLVM's primary stateless and local alias analysis.
block Block Frequency Analysis
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
uint64_t Size
std::optional< std::vector< StOtherPiece > > Other
Definition: ELFYAML.cpp:1328
Hexagon Common GEP
#define _
#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.
uint64_t IntrinsicInst * II
#define INITIALIZE_PASS_DEPENDENCY(depName)
Definition: PassSupport.h:42
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
Definition: PassSupport.h:44
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
Definition: PassSupport.h:39
raw_pwrite_stream & OS
This file provides utility classes that use RAII to save and restore values.
This file defines the make_scope_exit function, which executes user-defined cleanup logic at scope ex...
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
Definition: Statistic.h:167
static unsigned getBitWidth(Type *Ty, const DataLayout &DL)
Returns the bitwidth of the given scalar or pointer type.
Value * RHS
This class stores info we want to provide to or retain within an alias query.
SmallVector< AAQueryInfo::LocPair, 4 > AssumptionBasedResults
Location pairs for which an assumption based result is currently stored.
unsigned Depth
Query depth used to distinguish recursive queries.
int NumAssumptionUses
How many active NoAlias assumption uses there are.
std::pair< AACacheLoc, AACacheLoc > LocPair
AliasCacheT AliasCache
bool MayBeCrossIteration
Tracks whether the accesses may be on different cycle iterations.
CaptureAnalysis * CA
LLVM_ABI AliasResult alias(const MemoryLocation &LocA, const MemoryLocation &LocB)
The main low level interface to the alias analysis implementation.
LLVM_ABI MemoryEffects getMemoryEffects(const CallBase *Call)
Return the behavior of the given call site.
LLVM_ABI ModRefInfo getArgModRefInfo(const CallBase *Call, unsigned ArgIdx)
Get the ModRef info associated with a pointer argument of a call.
Class for arbitrary precision integers.
Definition: APInt.h:78
LLVM_ABI APInt umul_ov(const APInt &RHS, bool &Overflow) const
Definition: APInt.cpp:1971
LLVM_ABI APInt zext(unsigned width) const
Zero extend to a new width.
Definition: APInt.cpp:1012
LLVM_ABI APInt zextOrTrunc(unsigned width) const
Zero extend or truncate to width.
Definition: APInt.cpp:1033
static APInt getMaxValue(unsigned numBits)
Gets maximum unsigned value of APInt for specific bit width.
Definition: APInt.h:206
APInt abs() const
Get the absolute value.
Definition: APInt.h:1795
unsigned getBitWidth() const
Return the number of bits in the APInt.
Definition: APInt.h:1488
bool isNegative() const
Determine sign of this APInt.
Definition: APInt.h:329
unsigned countr_zero() const
Count the number of trailing zero bits.
Definition: APInt.h:1639
static APInt getSignedMinValue(unsigned numBits)
Gets minimum signed value of APInt for a specific bit width.
Definition: APInt.h:219
LLVM_ABI APInt srem(const APInt &RHS) const
Function for signed remainder operation.
Definition: APInt.cpp:1736
LLVM_ABI APInt smul_ov(const APInt &RHS, bool &Overflow) const
Definition: APInt.cpp:1960
bool isNonNegative() const
Determine if this APInt Value is non-negative (>= 0)
Definition: APInt.h:334
static APInt getZero(unsigned numBits)
Get the '0' value for the specified bit-width.
Definition: APInt.h:200
static APInt getOneBitSet(unsigned numBits, unsigned BitNo)
Return an APInt with exactly one bit set in the result.
Definition: APInt.h:239
bool uge(const APInt &RHS) const
Unsigned greater or equal comparison.
Definition: APInt.h:1221
The possible results of an alias query.
Definition: AliasAnalysis.h:78
void swap(bool DoSwap=true)
Helper for processing AliasResult for swapped memory location pairs.
@ MayAlias
The two locations may or may not alias.
Definition: AliasAnalysis.h:99
@ NoAlias
The two locations do not alias at all.
Definition: AliasAnalysis.h:96
@ PartialAlias
The two locations alias, but only due to a partial overlap.
@ MustAlias
The two locations precisely alias each other.
void setOffset(int32_t NewOffset)
API to communicate dependencies between analyses during invalidation.
Definition: PassManager.h:294
bool invalidate(IRUnitT &IR, const PreservedAnalyses &PA)
Trigger the invalidation of some other analysis pass if not already handled and return whether it was...
Definition: PassManager.h:312
A container for analyses that lazily runs them and caches their results.
Definition: PassManager.h:255
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
Definition: PassManager.h:412
Represent the analysis usage information of a pass.
void setPreservesAll()
Set by analyses that do not transform their input at all.
AnalysisUsage & addRequiredTransitive()
This class represents an incoming formal argument to a Function.
Definition: Argument.h:32
This represents the llvm.assume intrinsic.
A function analysis which provides an AssumptionCache.
An immutable pass that tracks lazily created AssumptionCache objects.
A cache of @llvm.assume calls within a function.
MutableArrayRef< ResultElem > assumptionsFor(const Value *V)
Access the list of assumptions which affect this value.
This is the AA result object for the basic, local, and stateless alias analysis.
LLVM_ABI ModRefInfo getModRefInfo(const CallBase *Call, const MemoryLocation &Loc, AAQueryInfo &AAQI)
Checks to see if the specified callsite can clobber the specified memory object.
LLVM_ABI ModRefInfo getArgModRefInfo(const CallBase *Call, unsigned ArgIdx)
Get the location associated with a pointer argument of a callsite.
LLVM_ABI MemoryEffects getMemoryEffects(const CallBase *Call, AAQueryInfo &AAQI)
Returns the behavior when calling the given call site.
LLVM_ABI ModRefInfo getModRefInfoMask(const MemoryLocation &Loc, AAQueryInfo &AAQI, bool IgnoreLocals=false)
Returns a bitmask that should be unconditionally applied to the ModRef info of a memory location.
LLVM_ABI bool invalidate(Function &Fn, const PreservedAnalyses &PA, FunctionAnalysisManager::Invalidator &Inv)
Handle invalidation events in the new pass manager.
LLVM_ABI AliasResult alias(const MemoryLocation &LocA, const MemoryLocation &LocB, AAQueryInfo &AAQI, const Instruction *CtxI)
Legacy wrapper pass to provide the BasicAAResult object.
bool runOnFunction(Function &F) override
runOnFunction - Virtual method overriden by subclasses to do the per-function processing of the pass.
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - This function should be overriden by passes that need analysis information to do t...
LLVM_ABI BasicAAResult run(Function &F, FunctionAnalysisManager &AM)
LLVM Basic Block Representation.
Definition: BasicBlock.h:62
const Function * getParent() const
Return the enclosing method, or null if none.
Definition: BasicBlock.h:213
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
Definition: InstrTypes.h:1116
This class represents a function call, abstracting a target machine's calling convention.
This is the shared class of boolean and integer constants.
Definition: Constants.h:87
A constant pointer value that points to null.
Definition: Constants.h:558
This class represents a range of values.
Definition: ConstantRange.h:47
LLVM_ABI ConstantRange add(const ConstantRange &Other) const
Return a new range representing the possible values resulting from an addition of a value in this ran...
static LLVM_ABI ConstantRange fromKnownBits(const KnownBits &Known, bool IsSigned)
Initialize a range based on a known bits constraint.
LLVM_ABI ConstantRange smul_fast(const ConstantRange &Other) const
Return range of possible values for a signed multiplication of this and Other.
LLVM_ABI bool isEmptySet() const
Return true if this set contains no members.
LLVM_ABI ConstantRange smul_sat(const ConstantRange &Other) const
Perform a signed saturating multiplication of two constant ranges.
LLVM_ABI APInt getUnsignedMax() const
Return the largest unsigned value contained in the ConstantRange.
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.
LLVM_ABI APInt getSignedMax() const
Return the largest signed value contained in the ConstantRange.
uint32_t getBitWidth() const
Get the bit width of this ConstantRange.
LLVM_ABI ConstantRange sub(const ConstantRange &Other) const
Return a new range representing the possible values resulting from a subtraction of a value in this r...
This class represents an Operation in the Expression.
A parsed version of the target data layout string in and methods for querying it.
Definition: DataLayout.h:63
iterator find(const_arg_type_t< KeyT > Val)
Definition: DenseMap.h:165
std::pair< iterator, bool > try_emplace(KeyT &&Key, Ts &&...Args)
Definition: DenseMap.h:229
bool erase(const KeyT &Val)
Definition: DenseMap.h:303
iterator end()
Definition: DenseMap.h:81
Analysis pass which computes a DominatorTree.
Definition: Dominators.h:284
NodeT * getRoot() const
Legacy analysis pass which computes a DominatorTree.
Definition: Dominators.h:322
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
Definition: Dominators.h:165
void removeInstruction(Instruction *I)
CaptureComponents getCapturesBefore(const Value *Object, const Instruction *I, bool OrAt) override
Return how Object may be captured before instruction I, considering only provenance captures.
FunctionPass class - This class is used to implement most global optimizations.
Definition: Pass.h:314
Represents flags for the getelementptr instruction/expression.
static GEPNoWrapFlags all()
bool hasNoUnsignedWrap() const
bool isInBounds() const
bool hasNoUnsignedSignedWrap() const
Definition: Operator.h:432
LLVM_ABI Type * getSourceElementType() const
Definition: Operator.cpp:70
bool hasNoUnsignedWrap() const
Definition: Operator.h:436
GEPNoWrapFlags getNoWrapFlags() const
Definition: Operator.h:425
Module * getParent()
Get the module that this global value is contained inside of...
Definition: GlobalValue.h:663
A wrapper class for inspecting calls to intrinsic functions.
Definition: IntrinsicInst.h:49
bool hasValue() const
bool mayBeBeforePointer() const
Whether accesses before the base pointer are possible.
static constexpr LocationSize beforeOrAfterPointer()
Any location before or after the base pointer (but still within the underlying object).
bool isScalable() const
TypeSize getValue() const
bool isZero() const
bool isPrecise() const
static constexpr LocationSize afterPointer()
Any location after the base pointer (but still within the underlying object).
static MemoryEffectsBase readOnly()
Create MemoryEffectsBase that can read any memory.
Definition: ModRef.h:125
MemoryEffectsBase getWithoutLoc(Location Loc) const
Get new MemoryEffectsBase with NoModRef on the given Loc.
Definition: ModRef.h:200
static MemoryEffectsBase inaccessibleMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
Create MemoryEffectsBase that can only access inaccessible memory.
Definition: ModRef.h:141
static MemoryEffectsBase writeOnly()
Create MemoryEffectsBase that can write any memory.
Definition: ModRef.h:130
Representation for a specific memory location.
LocationSize Size
The maximum size of the location, in address-units, or UnknownSize if the size is not known.
static MemoryLocation getBeforeOrAfter(const Value *Ptr, const AAMDNodes &AATags=AAMDNodes())
Return a location that may access any location before or after Ptr, while remaining within the underl...
const Value * Ptr
The address of the start of the location.
static LLVM_ABI MemoryLocation getForArgument(const CallBase *Call, unsigned ArgIdx, const TargetLibraryInfo *TLI)
Return a location representing a particular argument of a call.
This is a utility class that provides an abstraction for the common functionality between Instruction...
Definition: Operator.h:33
op_range incoming_values()
BasicBlock * getIncomingBlock(unsigned i) const
Return incoming basic block number i.
Value * getIncomingValue(unsigned i) const
Return incoming value number x.
unsigned getNumIncomingValues() const
Return the number of incoming edges.
A set of analyses that are preserved following a run of a transformation pass.
Definition: Analysis.h:112
This class represents the LLVM 'select' instruction.
CaptureComponents getCapturesBefore(const Value *Object, const Instruction *I, bool OrAt) override
Return how Object may be captured before instruction I, considering only provenance captures.
size_type size() const
Definition: SmallPtrSet.h:99
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:401
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
Definition: SmallPtrSet.h:541
bool empty() const
Definition: SmallVector.h:82
size_t size() const
Definition: SmallVector.h:79
void push_back(const T &Elt)
Definition: SmallVector.h:414
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1197
Class to represent struct types.
Definition: DerivedTypes.h:218
Analysis pass providing the TargetLibraryInfo.
Provides information about what library functions are available for the current target.
static constexpr TypeSize getFixed(ScalarTy ExactSize)
Definition: TypeSize.h:346
LLVM_ABI TypeSize getPrimitiveSizeInBits() const LLVM_READONLY
Return the basic size of this type if it is a primitive type.
bool isPointerTy() const
True if this is an instance of PointerType.
Definition: Type.h:267
bool isSized(SmallPtrSetImpl< Type * > *Visited=nullptr) const
Return true if it makes sense to take the size of this type.
Definition: Type.h:311
A Use represents the edge between a Value definition and its users.
Definition: Use.h:35
op_iterator op_begin()
Definition: User.h:284
Value * getOperand(unsigned i) const
Definition: User.h:232
op_iterator op_end()
Definition: User.h:286
LLVM Value Representation.
Definition: Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition: Value.h:256
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition: Value.cpp:322
LLVM_ABI const Value * stripPointerCastsForAliasAnalysis() const
Strip off pointer casts, all-zero GEPs, single-argument phi nodes and invariant group info.
Definition: Value.cpp:717
constexpr ScalarTy getFixedValue() const
Definition: TypeSize.h:203
static constexpr bool isKnownLT(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
Definition: TypeSize.h:219
constexpr bool isScalable() const
Returns whether the quantity is scaled by a runtime quantity (vscale).
Definition: TypeSize.h:172
constexpr ScalarTy getKnownMinValue() const
Returns the minimum value this quantity can represent.
Definition: TypeSize.h:169
TypeSize getSequentialElementStride(const DataLayout &DL) const
const ParentTy * getParent() const
Definition: ilist_node.h:34
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition: raw_ostream.h:53
const APInt & umin(const APInt &A, const APInt &B)
Determine the smaller of two APInts considered to be unsigned.
Definition: APInt.h:2258
LLVM_ABI APInt GreatestCommonDivisor(APInt A, APInt B)
Compute GCD of two unsigned APInt values.
Definition: APInt.cpp:798
@ Entry
Definition: COFF.h:862
bool match(Val *V, const Pattern &P)
Definition: PatternMatch.h:49
IntrinsicID_match m_VScale()
Matches a call to llvm.vscale().
initializer< Ty > init(const Ty &Val)
Definition: CommandLine.h:444
@ Assume
Do not drop type tests (default).
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
void dump(const SparseBitVector< ElementSize > &LHS, raw_ostream &out)
@ Offset
Definition: DWP.cpp:477
bool capturesReadProvenanceOnly(CaptureComponents CC)
Definition: ModRef.h:331
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,...
detail::scope_exit< std::decay_t< Callable > > make_scope_exit(Callable &&F)
Definition: ScopeExit.h:59
LLVM_ABI const Value * getArgumentAliasingToReturnedPointer(const CallBase *Call, bool MustPreserveNullness)
This function returns call pointer argument that is considered the same by aliasing rules.
auto enumerate(FirstRange &&First, RestRanges &&...Rest)
Given two or more input ranges, returns a new range whose values are tuples (A, B,...
Definition: STLExtras.h:2491
LLVM_ABI bool isPotentiallyReachableFromMany(SmallVectorImpl< BasicBlock * > &Worklist, const BasicBlock *StopBB, const SmallPtrSetImpl< BasicBlock * > *ExclusionSet, const DominatorTree *DT=nullptr, const LoopInfo *LI=nullptr)
Determine whether there is at least one path from a block in 'Worklist' to 'StopBB' without passing t...
Definition: CFG.cpp:240
auto successors(const MachineBasicBlock *BB)
LLVM_ABI bool isBaseOfObject(const Value *V)
Return true if we know V to the base address of the corresponding memory object.
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
Definition: STLExtras.h:2155
constexpr bool isUIntN(unsigned N, uint64_t x)
Checks if an unsigned integer fits into the given (dynamic) bit width.
Definition: MathExtras.h:252
LLVM_ABI std::pair< Instruction *, CaptureComponents > FindEarliestCapture(const Value *V, Function &F, bool ReturnCaptures, const DominatorTree &DT, CaptureComponents Mask, unsigned MaxUsesToExplore=0)
LLVM_ABI std::optional< TypeSize > getBaseObjectSize(const Value *Ptr, const DataLayout &DL, const TargetLibraryInfo *TLI, ObjectSizeOpts Opts={})
Like getObjectSize(), but only returns the size of base objects (like allocas, global variables and a...
LLVM_ABI ConstantRange computeConstantRange(const Value *V, bool ForSigned, bool UseInstrInfo=true, AssumptionCache *AC=nullptr, const Instruction *CtxI=nullptr, const DominatorTree *DT=nullptr, unsigned Depth=0)
Determine the possible constant range of an integer or vector of integer value.
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.
bool capturesFullProvenance(CaptureComponents CC)
Definition: ModRef.h:336
bool isModSet(const ModRefInfo MRI)
Definition: ModRef.h:49
LLVM_ABI void computeKnownBits(const Value *V, KnownBits &Known, const DataLayout &DL, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr, const DominatorTree *DT=nullptr, bool UseInstrInfo=true, unsigned Depth=0)
Determine which bits of V are known to be either zero or one and return them in the KnownZero/KnownOn...
LLVM_ABI bool NullPointerIsDefined(const Function *F, unsigned AS=0)
Check whether null pointer dereferencing is considered undefined behavior for a given function or an ...
Definition: Function.cpp:1172
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition: Debug.cpp:207
bool isModOrRefSet(const ModRefInfo MRI)
Definition: ModRef.h:43
constexpr unsigned MaxLookupSearchDepth
The max limit of the search depth in DecomposeGEPExpression() and getUnderlyingObject().
Definition: ValueTracking.h:51
LLVM_ABI ConstantRange getVScaleRange(const Function *F, unsigned BitWidth)
Determine the possible constant range of vscale with the given bit width, based on the vscale_range f...
LLVM_ABI FunctionPass * createBasicAAWrapperPass()
LLVM_ABI bool isMallocOrCallocLikeFn(const Value *V, const TargetLibraryInfo *TLI)
Tests if a value is a call or invoke to a library function that allocates memory similar to malloc or...
CaptureComponents
Components of the pointer that may be captured.
Definition: ModRef.h:305
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.
ModRefInfo
Flags indicating whether a memory access modifies or references memory.
Definition: ModRef.h:28
@ Ref
The access may reference the value stored in memory.
@ ModRef
The access may reference and may modify the value stored in memory.
@ Mod
The access may modify the value stored in memory.
@ NoModRef
The access neither references nor modifies the value stored in memory.
@ ArgMem
Access to memory via argument pointers.
@ InaccessibleMem
Memory that is inaccessible via LLVM IR.
LLVM_ABI bool isKnownNonEqual(const Value *V1, const Value *V2, const SimplifyQuery &SQ, unsigned Depth=0)
Return true if the given values are known to be non-equal when defined.
LLVM_ABI bool PointerMayBeCaptured(const Value *V, bool ReturnCaptures, unsigned MaxUsesToExplore=0)
PointerMayBeCaptured - Return true if this pointer value may be captured by the enclosing function (w...
bool isModAndRefSet(const ModRefInfo MRI)
Definition: ModRef.h:46
LLVM_ABI bool isIdentifiedFunctionLocal(const Value *V)
Return true if V is umabigously identified at the function-level.
constexpr unsigned BitWidth
Definition: BitmaskEnum.h:223
LLVM_ABI bool isEscapeSource(const Value *V)
Returns true if the pointer is one which would have been considered an escape by isNotCapturedBefore.
gep_type_iterator gep_type_begin(const User *GEP)
LLVM_ABI const Value * getUnderlyingObject(const Value *V, unsigned MaxLookup=MaxLookupSearchDepth)
This method strips off any GEP address adjustments, pointer casts or llvm.threadlocal....
bool capturesNothing(CaptureComponents CC)
Definition: ModRef.h:315
LLVM_ABI bool isIdentifiedObject(const Value *V)
Return true if this pointer refers to a distinct and identifiable object.
LLVM_ABI bool isPotentiallyReachable(const Instruction *From, const Instruction *To, const SmallPtrSetImpl< BasicBlock * > *ExclusionSet=nullptr, const DominatorTree *DT=nullptr, const LoopInfo *LI=nullptr)
Determine whether instruction 'To' is reachable from 'From', without passing through any blocks in Ex...
Definition: CFG.cpp:282
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition: BitVector.h:853
#define N
SmallVector< VariableGEPIndex, 4 > VarIndices
void print(raw_ostream &OS) const
static constexpr int Definitive
Cache entry is neither an assumption nor does it use a (non-definitive) assumption.
static constexpr int AssumptionBased
Cache entry is not an assumption itself, but may be using an assumption from higher up the stack.
A special type used by analysis passes to provide an address that identifies that particular analysis...
Definition: Analysis.h:29
virtual CaptureComponents getCapturesBefore(const Value *Object, const Instruction *I, bool OrAt)=0
Return how Object may be captured before instruction I, considering only provenance captures.
virtual ~CaptureAnalysis()=0
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.
A lightweight accessor for an operand bundle meant to be passed around by value.
Definition: InstrTypes.h:1011
StringRef getTagName() const
Return the tag of this operand bundle as a string.
Definition: InstrTypes.h:1030
ArrayRef< Use > Inputs
Definition: InstrTypes.h:1012
A utility class that uses RAII to save and restore the value of a variable.