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