LLVM 20.0.0git
AliasAnalysis.cpp
Go to the documentation of this file.
1//==- AliasAnalysis.cpp - Generic Alias Analysis Interface Implementation --==//
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 implements the generic AliasAnalysis interface which is used as the
10// common interface used by all clients and implementations of alias analysis.
11//
12// This file also implements the default version of the AliasAnalysis interface
13// that is to be used when no other implementation is specified. This does some
14// simple tests that detect obvious cases: two different global pointers cannot
15// alias, a global cannot alias a malloc, two different mallocs cannot alias,
16// etc.
17//
18// This alias analysis implementation really isn't very good for anything, but
19// it is very fast, and makes a nice clean default implementation. Because it
20// handles lots of little corner cases, other, more complex, alias analysis
21// implementations may choose to rely on this pass to resolve these simple and
22// easy cases.
23//
24//===----------------------------------------------------------------------===//
25
27#include "llvm/ADT/Statistic.h"
37#include "llvm/IR/Argument.h"
38#include "llvm/IR/Attributes.h"
39#include "llvm/IR/BasicBlock.h"
40#include "llvm/IR/Instruction.h"
42#include "llvm/IR/Type.h"
43#include "llvm/IR/Value.h"
45#include "llvm/Pass.h"
49#include <cassert>
50#include <functional>
51#include <iterator>
52
53#define DEBUG_TYPE "aa"
54
55using namespace llvm;
56
57STATISTIC(NumNoAlias, "Number of NoAlias results");
58STATISTIC(NumMayAlias, "Number of MayAlias results");
59STATISTIC(NumMustAlias, "Number of MustAlias results");
60
61namespace llvm {
62/// Allow disabling BasicAA from the AA results. This is particularly useful
63/// when testing to isolate a single AA implementation.
64cl::opt<bool> DisableBasicAA("disable-basic-aa", cl::Hidden, cl::init(false));
65} // namespace llvm
66
67#ifndef NDEBUG
68/// Print a trace of alias analysis queries and their results.
69static cl::opt<bool> EnableAATrace("aa-trace", cl::Hidden, cl::init(false));
70#else
71static const bool EnableAATrace = false;
72#endif
73
74AAResults::AAResults(const TargetLibraryInfo &TLI) : TLI(TLI) {}
75
77 : TLI(Arg.TLI), AAs(std::move(Arg.AAs)), AADeps(std::move(Arg.AADeps)) {}
78
80
83 // AAResults preserves the AAManager by default, due to the stateless nature
84 // of AliasAnalysis. There is no need to check whether it has been preserved
85 // explicitly. Check if any module dependency was invalidated and caused the
86 // AAManager to be invalidated. Invalidate ourselves in that case.
87 auto PAC = PA.getChecker<AAManager>();
88 if (!PAC.preservedWhenStateless())
89 return true;
90
91 // Check if any of the function dependencies were invalidated, and invalidate
92 // ourselves in that case.
93 for (AnalysisKey *ID : AADeps)
94 if (Inv.invalidate(ID, F, PA))
95 return true;
96
97 // Everything we depend on is still fine, so are we. Nothing to invalidate.
98 return false;
99}
100
101//===----------------------------------------------------------------------===//
102// Default chaining methods
103//===----------------------------------------------------------------------===//
104
106 const MemoryLocation &LocB) {
107 SimpleAAQueryInfo AAQIP(*this);
108 return alias(LocA, LocB, AAQIP, nullptr);
109}
110
112 const MemoryLocation &LocB, AAQueryInfo &AAQI,
113 const Instruction *CtxI) {
115
116 if (EnableAATrace) {
117 for (unsigned I = 0; I < AAQI.Depth; ++I)
118 dbgs() << " ";
119 dbgs() << "Start " << *LocA.Ptr << " @ " << LocA.Size << ", "
120 << *LocB.Ptr << " @ " << LocB.Size << "\n";
121 }
122
123 AAQI.Depth++;
124 for (const auto &AA : AAs) {
125 Result = AA->alias(LocA, LocB, AAQI, CtxI);
126 if (Result != AliasResult::MayAlias)
127 break;
128 }
129 AAQI.Depth--;
130
131 if (EnableAATrace) {
132 for (unsigned I = 0; I < AAQI.Depth; ++I)
133 dbgs() << " ";
134 dbgs() << "End " << *LocA.Ptr << " @ " << LocA.Size << ", "
135 << *LocB.Ptr << " @ " << LocB.Size << " = " << Result << "\n";
136 }
137
138 if (AAQI.Depth == 0) {
139 if (Result == AliasResult::NoAlias)
140 ++NumNoAlias;
141 else if (Result == AliasResult::MustAlias)
142 ++NumMustAlias;
143 else
144 ++NumMayAlias;
145 }
146 return Result;
147}
148
150 bool IgnoreLocals) {
151 SimpleAAQueryInfo AAQIP(*this);
152 return getModRefInfoMask(Loc, AAQIP, IgnoreLocals);
153}
154
156 AAQueryInfo &AAQI, bool IgnoreLocals) {
158
159 for (const auto &AA : AAs) {
160 Result &= AA->getModRefInfoMask(Loc, AAQI, IgnoreLocals);
161
162 // Early-exit the moment we reach the bottom of the lattice.
163 if (isNoModRef(Result))
165 }
166
167 return Result;
168}
169
170ModRefInfo AAResults::getArgModRefInfo(const CallBase *Call, unsigned ArgIdx) {
172
173 for (const auto &AA : AAs) {
174 Result &= AA->getArgModRefInfo(Call, ArgIdx);
175
176 // Early-exit the moment we reach the bottom of the lattice.
177 if (isNoModRef(Result))
179 }
180
181 return Result;
182}
183
185 const CallBase *Call2) {
186 SimpleAAQueryInfo AAQIP(*this);
187 return getModRefInfo(I, Call2, AAQIP);
188}
189
191 AAQueryInfo &AAQI) {
192 // We may have two calls.
193 if (const auto *Call1 = dyn_cast<CallBase>(I)) {
194 // Check if the two calls modify the same memory.
195 return getModRefInfo(Call1, Call2, AAQI);
196 }
197 // If this is a fence, just return ModRef.
198 if (I->isFenceLike())
199 return ModRefInfo::ModRef;
200 // Otherwise, check if the call modifies or references the
201 // location this memory access defines. The best we can say
202 // is that if the call references what this instruction
203 // defines, it must be clobbered by this location.
204 const MemoryLocation DefLoc = MemoryLocation::get(I);
205 ModRefInfo MR = getModRefInfo(Call2, DefLoc, AAQI);
206 if (isModOrRefSet(MR))
207 return ModRefInfo::ModRef;
209}
210
212 const MemoryLocation &Loc,
213 AAQueryInfo &AAQI) {
215
216 for (const auto &AA : AAs) {
217 Result &= AA->getModRefInfo(Call, Loc, AAQI);
218
219 // Early-exit the moment we reach the bottom of the lattice.
220 if (isNoModRef(Result))
222 }
223
224 // Try to refine the mod-ref info further using other API entry points to the
225 // aggregate set of AA results.
226
227 // We can completely ignore inaccessible memory here, because MemoryLocations
228 // can only reference accessible memory.
229 auto ME = getMemoryEffects(Call, AAQI)
231 if (ME.doesNotAccessMemory())
233
234 ModRefInfo ArgMR = ME.getModRef(IRMemLocation::ArgMem);
235 ModRefInfo OtherMR = ME.getWithoutLoc(IRMemLocation::ArgMem).getModRef();
236 if ((ArgMR | OtherMR) != OtherMR) {
237 // Refine the modref info for argument memory. We only bother to do this
238 // if ArgMR is not a subset of OtherMR, otherwise this won't have an impact
239 // on the final result.
240 ModRefInfo AllArgsMask = ModRefInfo::NoModRef;
241 for (const auto &I : llvm::enumerate(Call->args())) {
242 const Value *Arg = I.value();
243 if (!Arg->getType()->isPointerTy())
244 continue;
245 unsigned ArgIdx = I.index();
246 MemoryLocation ArgLoc = MemoryLocation::getForArgument(Call, ArgIdx, TLI);
247 AliasResult ArgAlias = alias(ArgLoc, Loc, AAQI, Call);
248 if (ArgAlias != AliasResult::NoAlias)
249 AllArgsMask |= getArgModRefInfo(Call, ArgIdx);
250 }
251 ArgMR &= AllArgsMask;
252 }
253
254 Result &= ArgMR | OtherMR;
255
256 // Apply the ModRef mask. This ensures that if Loc is a constant memory
257 // location, we take into account the fact that the call definitely could not
258 // modify the memory location.
259 if (!isNoModRef(Result))
260 Result &= getModRefInfoMask(Loc);
261
262 return Result;
263}
264
266 const CallBase *Call2, AAQueryInfo &AAQI) {
268
269 for (const auto &AA : AAs) {
270 Result &= AA->getModRefInfo(Call1, Call2, AAQI);
271
272 // Early-exit the moment we reach the bottom of the lattice.
273 if (isNoModRef(Result))
275 }
276
277 // Try to refine the mod-ref info further using other API entry points to the
278 // aggregate set of AA results.
279
280 // If Call1 or Call2 are readnone, they don't interact.
281 auto Call1B = getMemoryEffects(Call1, AAQI);
282 if (Call1B.doesNotAccessMemory())
284
285 auto Call2B = getMemoryEffects(Call2, AAQI);
286 if (Call2B.doesNotAccessMemory())
288
289 // If they both only read from memory, there is no dependence.
290 if (Call1B.onlyReadsMemory() && Call2B.onlyReadsMemory())
292
293 // If Call1 only reads memory, the only dependence on Call2 can be
294 // from Call1 reading memory written by Call2.
295 if (Call1B.onlyReadsMemory())
296 Result &= ModRefInfo::Ref;
297 else if (Call1B.onlyWritesMemory())
298 Result &= ModRefInfo::Mod;
299
300 // If Call2 only access memory through arguments, accumulate the mod/ref
301 // information from Call1's references to the memory referenced by
302 // Call2's arguments.
303 if (Call2B.onlyAccessesArgPointees()) {
304 if (!Call2B.doesAccessArgPointees())
307 for (auto I = Call2->arg_begin(), E = Call2->arg_end(); I != E; ++I) {
308 const Value *Arg = *I;
309 if (!Arg->getType()->isPointerTy())
310 continue;
311 unsigned Call2ArgIdx = std::distance(Call2->arg_begin(), I);
312 auto Call2ArgLoc =
313 MemoryLocation::getForArgument(Call2, Call2ArgIdx, TLI);
314
315 // ArgModRefC2 indicates what Call2 might do to Call2ArgLoc, and the
316 // dependence of Call1 on that location is the inverse:
317 // - If Call2 modifies location, dependence exists if Call1 reads or
318 // writes.
319 // - If Call2 only reads location, dependence exists if Call1 writes.
320 ModRefInfo ArgModRefC2 = getArgModRefInfo(Call2, Call2ArgIdx);
322 if (isModSet(ArgModRefC2))
323 ArgMask = ModRefInfo::ModRef;
324 else if (isRefSet(ArgModRefC2))
325 ArgMask = ModRefInfo::Mod;
326
327 // ModRefC1 indicates what Call1 might do to Call2ArgLoc, and we use
328 // above ArgMask to update dependence info.
329 ArgMask &= getModRefInfo(Call1, Call2ArgLoc, AAQI);
330
331 R = (R | ArgMask) & Result;
332 if (R == Result)
333 break;
334 }
335
336 return R;
337 }
338
339 // If Call1 only accesses memory through arguments, check if Call2 references
340 // any of the memory referenced by Call1's arguments. If not, return NoModRef.
341 if (Call1B.onlyAccessesArgPointees()) {
342 if (!Call1B.doesAccessArgPointees())
345 for (auto I = Call1->arg_begin(), E = Call1->arg_end(); I != E; ++I) {
346 const Value *Arg = *I;
347 if (!Arg->getType()->isPointerTy())
348 continue;
349 unsigned Call1ArgIdx = std::distance(Call1->arg_begin(), I);
350 auto Call1ArgLoc =
351 MemoryLocation::getForArgument(Call1, Call1ArgIdx, TLI);
352
353 // ArgModRefC1 indicates what Call1 might do to Call1ArgLoc; if Call1
354 // might Mod Call1ArgLoc, then we care about either a Mod or a Ref by
355 // Call2. If Call1 might Ref, then we care only about a Mod by Call2.
356 ModRefInfo ArgModRefC1 = getArgModRefInfo(Call1, Call1ArgIdx);
357 ModRefInfo ModRefC2 = getModRefInfo(Call2, Call1ArgLoc, AAQI);
358 if ((isModSet(ArgModRefC1) && isModOrRefSet(ModRefC2)) ||
359 (isRefSet(ArgModRefC1) && isModSet(ModRefC2)))
360 R = (R | ArgModRefC1) & Result;
361
362 if (R == Result)
363 break;
364 }
365
366 return R;
367 }
368
369 return Result;
370}
371
373 AAQueryInfo &AAQI) {
375
376 for (const auto &AA : AAs) {
377 Result &= AA->getMemoryEffects(Call, AAQI);
378
379 // Early-exit the moment we reach the bottom of the lattice.
380 if (Result.doesNotAccessMemory())
381 return Result;
382 }
383
384 return Result;
385}
386
388 SimpleAAQueryInfo AAQI(*this);
389 return getMemoryEffects(Call, AAQI);
390}
391
394
395 for (const auto &AA : AAs) {
396 Result &= AA->getMemoryEffects(F);
397
398 // Early-exit the moment we reach the bottom of the lattice.
399 if (Result.doesNotAccessMemory())
400 return Result;
401 }
402
403 return Result;
404}
405
407 switch (AR) {
409 OS << "NoAlias";
410 break;
412 OS << "MustAlias";
413 break;
415 OS << "MayAlias";
416 break;
418 OS << "PartialAlias";
419 if (AR.hasOffset())
420 OS << " (off " << AR.getOffset() << ")";
421 break;
422 }
423 return OS;
424}
425
426//===----------------------------------------------------------------------===//
427// Helper method implementation
428//===----------------------------------------------------------------------===//
429
431 const MemoryLocation &Loc,
432 AAQueryInfo &AAQI) {
433 // Be conservative in the face of atomic.
434 if (isStrongerThan(L->getOrdering(), AtomicOrdering::Unordered))
435 return ModRefInfo::ModRef;
436
437 // If the load address doesn't alias the given address, it doesn't read
438 // or write the specified memory.
439 if (Loc.Ptr) {
440 AliasResult AR = alias(MemoryLocation::get(L), Loc, AAQI, L);
441 if (AR == AliasResult::NoAlias)
443 }
444 // Otherwise, a load just reads.
445 return ModRefInfo::Ref;
446}
447
449 const MemoryLocation &Loc,
450 AAQueryInfo &AAQI) {
451 // Be conservative in the face of atomic.
453 return ModRefInfo::ModRef;
454
455 if (Loc.Ptr) {
456 AliasResult AR = alias(MemoryLocation::get(S), Loc, AAQI, S);
457 // If the store address cannot alias the pointer in question, then the
458 // specified memory cannot be modified by the store.
459 if (AR == AliasResult::NoAlias)
461
462 // Examine the ModRef mask. If Mod isn't present, then return NoModRef.
463 // This ensures that if Loc is a constant memory location, we take into
464 // account the fact that the store definitely could not modify the memory
465 // location.
466 if (!isModSet(getModRefInfoMask(Loc)))
468 }
469
470 // Otherwise, a store just writes.
471 return ModRefInfo::Mod;
472}
473
475 const MemoryLocation &Loc,
476 AAQueryInfo &AAQI) {
477 // All we know about a fence instruction is what we get from the ModRef
478 // mask: if Loc is a constant memory location, the fence definitely could
479 // not modify it.
480 if (Loc.Ptr)
481 return getModRefInfoMask(Loc);
482 return ModRefInfo::ModRef;
483}
484
486 const MemoryLocation &Loc,
487 AAQueryInfo &AAQI) {
488 if (Loc.Ptr) {
489 AliasResult AR = alias(MemoryLocation::get(V), Loc, AAQI, V);
490 // If the va_arg address cannot alias the pointer in question, then the
491 // specified memory cannot be accessed by the va_arg.
492 if (AR == AliasResult::NoAlias)
494
495 // If the pointer is a pointer to invariant memory, then it could not have
496 // been modified by this va_arg.
497 return getModRefInfoMask(Loc, AAQI);
498 }
499
500 // Otherwise, a va_arg reads and writes.
501 return ModRefInfo::ModRef;
502}
503
505 const MemoryLocation &Loc,
506 AAQueryInfo &AAQI) {
507 if (Loc.Ptr) {
508 // If the pointer is a pointer to invariant memory,
509 // then it could not have been modified by this catchpad.
510 return getModRefInfoMask(Loc, AAQI);
511 }
512
513 // Otherwise, a catchpad reads and writes.
514 return ModRefInfo::ModRef;
515}
516
518 const MemoryLocation &Loc,
519 AAQueryInfo &AAQI) {
520 if (Loc.Ptr) {
521 // If the pointer is a pointer to invariant memory,
522 // then it could not have been modified by this catchpad.
523 return getModRefInfoMask(Loc, AAQI);
524 }
525
526 // Otherwise, a catchret reads and writes.
527 return ModRefInfo::ModRef;
528}
529
531 const MemoryLocation &Loc,
532 AAQueryInfo &AAQI) {
533 // Acquire/Release cmpxchg has properties that matter for arbitrary addresses.
535 return ModRefInfo::ModRef;
536
537 if (Loc.Ptr) {
538 AliasResult AR = alias(MemoryLocation::get(CX), Loc, AAQI, CX);
539 // If the cmpxchg address does not alias the location, it does not access
540 // it.
541 if (AR == AliasResult::NoAlias)
543 }
544
545 return ModRefInfo::ModRef;
546}
547
549 const MemoryLocation &Loc,
550 AAQueryInfo &AAQI) {
551 // Acquire/Release atomicrmw has properties that matter for arbitrary addresses.
553 return ModRefInfo::ModRef;
554
555 if (Loc.Ptr) {
556 AliasResult AR = alias(MemoryLocation::get(RMW), Loc, AAQI, RMW);
557 // If the atomicrmw address does not alias the location, it does not access
558 // it.
559 if (AR == AliasResult::NoAlias)
561 }
562
563 return ModRefInfo::ModRef;
564}
565
567 const std::optional<MemoryLocation> &OptLoc,
568 AAQueryInfo &AAQIP) {
569 if (OptLoc == std::nullopt) {
570 if (const auto *Call = dyn_cast<CallBase>(I))
571 return getMemoryEffects(Call, AAQIP).getModRef();
572 }
573
574 const MemoryLocation &Loc = OptLoc.value_or(MemoryLocation());
575
576 switch (I->getOpcode()) {
577 case Instruction::VAArg:
578 return getModRefInfo((const VAArgInst *)I, Loc, AAQIP);
579 case Instruction::Load:
580 return getModRefInfo((const LoadInst *)I, Loc, AAQIP);
581 case Instruction::Store:
582 return getModRefInfo((const StoreInst *)I, Loc, AAQIP);
583 case Instruction::Fence:
584 return getModRefInfo((const FenceInst *)I, Loc, AAQIP);
585 case Instruction::AtomicCmpXchg:
586 return getModRefInfo((const AtomicCmpXchgInst *)I, Loc, AAQIP);
587 case Instruction::AtomicRMW:
588 return getModRefInfo((const AtomicRMWInst *)I, Loc, AAQIP);
589 case Instruction::Call:
590 case Instruction::CallBr:
591 case Instruction::Invoke:
592 return getModRefInfo((const CallBase *)I, Loc, AAQIP);
593 case Instruction::CatchPad:
594 return getModRefInfo((const CatchPadInst *)I, Loc, AAQIP);
595 case Instruction::CatchRet:
596 return getModRefInfo((const CatchReturnInst *)I, Loc, AAQIP);
597 default:
598 assert(!I->mayReadOrWriteMemory() &&
599 "Unhandled memory access instruction!");
601 }
602}
603
604/// Return information about whether a particular call site modifies
605/// or reads the specified memory location \p MemLoc before instruction \p I
606/// in a BasicBlock.
607/// FIXME: this is really just shoring-up a deficiency in alias analysis.
608/// BasicAA isn't willing to spend linear time determining whether an alloca
609/// was captured before or after this particular call, while we are. However,
610/// with a smarter AA in place, this test is just wasting compile time.
612 const MemoryLocation &MemLoc,
613 DominatorTree *DT,
614 AAQueryInfo &AAQI) {
615 if (!DT)
616 return ModRefInfo::ModRef;
617
618 const Value *Object = getUnderlyingObject(MemLoc.Ptr);
619 if (!isIdentifiedFunctionLocal(Object))
620 return ModRefInfo::ModRef;
621
622 const auto *Call = dyn_cast<CallBase>(I);
623 if (!Call || Call == Object)
624 return ModRefInfo::ModRef;
625
626 if (PointerMayBeCapturedBefore(Object, /* ReturnCaptures */ true,
627 /* StoreCaptures */ true, I, DT,
628 /* include Object */ true))
629 return ModRefInfo::ModRef;
630
631 unsigned ArgNo = 0;
633 // Set flag only if no May found and all operands processed.
634 for (auto CI = Call->data_operands_begin(), CE = Call->data_operands_end();
635 CI != CE; ++CI, ++ArgNo) {
636 // Only look at the no-capture or byval pointer arguments. If this
637 // pointer were passed to arguments that were neither of these, then it
638 // couldn't be no-capture.
639 if (!(*CI)->getType()->isPointerTy() ||
640 (!Call->doesNotCapture(ArgNo) && ArgNo < Call->arg_size() &&
641 !Call->isByValArgument(ArgNo)))
642 continue;
643
644 AliasResult AR =
646 MemoryLocation::getBeforeOrAfter(Object), AAQI, Call);
647 // If this is a no-capture pointer argument, see if we can tell that it
648 // is impossible to alias the pointer we're checking. If not, we have to
649 // assume that the call could touch the pointer, even though it doesn't
650 // escape.
651 if (AR == AliasResult::NoAlias)
652 continue;
653 if (Call->doesNotAccessMemory(ArgNo))
654 continue;
655 if (Call->onlyReadsMemory(ArgNo)) {
656 R = ModRefInfo::Ref;
657 continue;
658 }
659 return ModRefInfo::ModRef;
660 }
661 return R;
662}
663
664/// canBasicBlockModify - Return true if it is possible for execution of the
665/// specified basic block to modify the location Loc.
666///
668 const MemoryLocation &Loc) {
669 return canInstructionRangeModRef(BB.front(), BB.back(), Loc, ModRefInfo::Mod);
670}
671
672/// canInstructionRangeModRef - Return true if it is possible for the
673/// execution of the specified instructions to mod\ref (according to the
674/// mode) the location Loc. The instructions to consider are all
675/// of the instructions in the range of [I1,I2] INCLUSIVE.
676/// I1 and I2 must be in the same basic block.
678 const Instruction &I2,
679 const MemoryLocation &Loc,
680 const ModRefInfo Mode) {
681 assert(I1.getParent() == I2.getParent() &&
682 "Instructions not in same basic block!");
683 BasicBlock::const_iterator I = I1.getIterator();
685 ++E; // Convert from inclusive to exclusive range.
686
687 for (; I != E; ++I) // Check every instruction in range
688 if (isModOrRefSet(getModRefInfo(&*I, Loc) & Mode))
689 return true;
690 return false;
691}
692
693// Provide a definition for the root virtual destructor.
695
696// Provide a definition for the static object used to identify passes.
697AnalysisKey AAManager::Key;
698
701}
702
704 : ImmutablePass(ID), CB(std::move(CB)) {
706}
707
709
710INITIALIZE_PASS(ExternalAAWrapperPass, "external-aa", "External Alias Analysis",
711 false, true)
712
715 return new ExternalAAWrapperPass(std::move(Callback));
716}
717
720}
721
723
725 "Function Alias Analysis Results", false, true)
734
735/// Run the wrapper pass to rebuild an aggregation over known AA passes.
736///
737/// This is the legacy pass manager's interface to the new-style AA results
738/// aggregation object. Because this is somewhat shoe-horned into the legacy
739/// pass manager, we hard code all the specific alias analyses available into
740/// it. While the particular set enabled is configured via commandline flags,
741/// adding a new alias analysis to LLVM will require adding support for it to
742/// this list.
744 // NB! This *must* be reset before adding new AA results to the new
745 // AAResults object because in the legacy pass manager, each instance
746 // of these will refer to the *same* immutable analyses, registering and
747 // unregistering themselves with them. We need to carefully tear down the
748 // previous object first, in this case replacing it with an empty one, before
749 // registering new results.
750 AAR.reset(
751 new AAResults(getAnalysis<TargetLibraryInfoWrapperPass>().getTLI(F)));
752
753 // BasicAA is always available for function analyses. Also, we add it first
754 // so that it can trump TBAA results when it proves MustAlias.
755 // FIXME: TBAA should have an explicit mode to support this and then we
756 // should reconsider the ordering here.
757 if (!DisableBasicAA)
758 AAR->addAAResult(getAnalysis<BasicAAWrapperPass>().getResult());
759
760 // Populate the results with the currently available AAs.
761 if (auto *WrapperPass = getAnalysisIfAvailable<ScopedNoAliasAAWrapperPass>())
762 AAR->addAAResult(WrapperPass->getResult());
763 if (auto *WrapperPass = getAnalysisIfAvailable<TypeBasedAAWrapperPass>())
764 AAR->addAAResult(WrapperPass->getResult());
765 if (auto *WrapperPass = getAnalysisIfAvailable<GlobalsAAWrapperPass>())
766 AAR->addAAResult(WrapperPass->getResult());
767 if (auto *WrapperPass = getAnalysisIfAvailable<SCEVAAWrapperPass>())
768 AAR->addAAResult(WrapperPass->getResult());
769
770 // If available, run an external AA providing callback over the results as
771 // well.
772 if (auto *WrapperPass = getAnalysisIfAvailable<ExternalAAWrapperPass>())
773 if (WrapperPass->CB)
774 WrapperPass->CB(*this, F, *AAR);
775
776 // Analyses don't mutate the IR, so return false.
777 return false;
778}
779
781 AU.setPreservesAll();
784
785 // We also need to mark all the alias analysis passes we will potentially
786 // probe in runOnFunction as used here to ensure the legacy pass manager
787 // preserves them. This hard coding of lists of alias analyses is specific to
788 // the legacy pass manager.
794}
795
798 for (auto &Getter : ResultGetters)
799 (*Getter)(F, AM, R);
800 return R;
801}
802
804 if (const auto *Call = dyn_cast<CallBase>(V))
805 return Call->hasRetAttr(Attribute::NoAlias);
806 return false;
807}
808
809static bool isNoAliasOrByValArgument(const Value *V) {
810 if (const Argument *A = dyn_cast<Argument>(V))
811 return A->hasNoAliasAttr() || A->hasByValAttr();
812 return false;
813}
814
816 if (isa<AllocaInst>(V))
817 return true;
818 if (isa<GlobalValue>(V) && !isa<GlobalAlias>(V))
819 return true;
820 if (isNoAliasCall(V))
821 return true;
823 return true;
824 return false;
825}
826
828 return isa<AllocaInst>(V) || isNoAliasCall(V) || isNoAliasOrByValArgument(V);
829}
830
832 // TODO: We can handle other cases here
833 // 1) For GC languages, arguments to functions are often required to be
834 // base pointers.
835 // 2) Result of allocation routines are often base pointers. Leverage TLI.
836 return (isa<AllocaInst>(V) || isa<GlobalVariable>(V));
837}
838
840 if (auto *CB = dyn_cast<CallBase>(V))
842 true);
843
844 // The load case works because isNonEscapingLocalObject considers all
845 // stores to be escapes (it passes true for the StoreCaptures argument
846 // to PointerMayBeCaptured).
847 if (isa<LoadInst>(V))
848 return true;
849
850 // The inttoptr case works because isNonEscapingLocalObject considers all
851 // means of converting or equating a pointer to an int (ptrtoint, ptr store
852 // which could be followed by an integer load, ptr<->int compare) as
853 // escaping, and objects located at well-known addresses via platform-specific
854 // means cannot be considered non-escaping local objects.
855 if (isa<IntToPtrInst>(V))
856 return true;
857
858 // Same for inttoptr constant expressions.
859 if (auto *CE = dyn_cast<ConstantExpr>(V))
860 if (CE->getOpcode() == Instruction::IntToPtr)
861 return true;
862
863 return false;
864}
865
867 bool &RequiresNoCaptureBeforeUnwind) {
868 RequiresNoCaptureBeforeUnwind = false;
869
870 // Alloca goes out of scope on unwind.
871 if (isa<AllocaInst>(Object))
872 return true;
873
874 // Byval goes out of scope on unwind.
875 if (auto *A = dyn_cast<Argument>(Object))
876 return A->hasByValAttr() || A->hasAttribute(Attribute::DeadOnUnwind);
877
878 // A noalias return is not accessible from any other code. If the pointer
879 // does not escape prior to the unwind, then the caller cannot access the
880 // memory either.
881 if (isNoAliasCall(Object)) {
882 RequiresNoCaptureBeforeUnwind = true;
883 return true;
884 }
885
886 return false;
887}
888
889// We don't consider globals as writable: While the physical memory is writable,
890// we may not have provenance to perform the write.
891bool llvm::isWritableObject(const Value *Object,
892 bool &ExplicitlyDereferenceableOnly) {
893 ExplicitlyDereferenceableOnly = false;
894
895 // TODO: Alloca might not be writable after its lifetime ends.
896 // See https://github.com/llvm/llvm-project/issues/51838.
897 if (isa<AllocaInst>(Object))
898 return true;
899
900 if (auto *A = dyn_cast<Argument>(Object)) {
901 // Also require noalias, otherwise writability at function entry cannot be
902 // generalized to writability at other program points, even if the pointer
903 // does not escape.
904 if (A->hasAttribute(Attribute::Writable) && A->hasNoAliasAttr()) {
905 ExplicitlyDereferenceableOnly = true;
906 return true;
907 }
908
909 return A->hasByValAttr();
910 }
911
912 // TODO: Noalias shouldn't imply writability, this should check for an
913 // allocator function instead.
914 return isNoAliasCall(Object);
915}
static cl::opt< bool > EnableAATrace("aa-trace", cl::Hidden, cl::init(false))
Print a trace of alias analysis queries and their results.
static bool isNoAliasOrByValArgument(const Value *V)
Function Alias Analysis Results
Atomic ordering constants.
This file contains the simple types necessary to represent the attributes associated with functions a...
basic Basic Alias true
This is the interface for LLVM's primary stateless and local alias analysis.
block Block Frequency Analysis
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static bool runOnFunction(Function &F, bool PostInlining)
This is the interface for a simple mod/ref and alias analysis over globals.
#define F(x, y, z)
Definition: MD5.cpp:55
#define I(x, y, z)
Definition: MD5.cpp:58
This file provides utility analysis objects describing memory locations.
#define INITIALIZE_PASS_DEPENDENCY(depName)
Definition: PassSupport.h:55
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
Definition: PassSupport.h:57
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
Definition: PassSupport.h:52
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
Definition: PassSupport.h:38
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
raw_pwrite_stream & OS
This is the interface for a SCEV-based alias analysis.
This is the interface for a metadata-based scoped no-alias analysis.
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:166
This is the interface for a metadata-based TBAA.
A manager for alias analyses.
Result run(Function &F, FunctionAnalysisManager &AM)
This class stores info we want to provide to or retain within an alias query.
unsigned Depth
Query depth used to distinguish recursive queries.
A wrapper pass to provide the legacy pass manager access to a suitably prepared AAResults object.
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - This function should be overriden by passes that need analysis information to do t...
ModRefInfo getModRefInfo(const Instruction *I, const std::optional< MemoryLocation > &OptLoc)
Check whether or not an instruction may read or write the optionally specified memory location.
AliasResult alias(const MemoryLocation &LocA, const MemoryLocation &LocB)
The main low level interface to the alias analysis implementation.
ModRefInfo getModRefInfoMask(const MemoryLocation &Loc, bool IgnoreLocals=false)
Returns a bitmask that should be unconditionally applied to the ModRef info of a memory location.
ModRefInfo callCapturesBefore(const Instruction *I, const MemoryLocation &MemLoc, DominatorTree *DT)
Return information about whether a particular call site modifies or reads the specified memory locati...
AAResults(const TargetLibraryInfo &TLI)
MemoryEffects getMemoryEffects(const CallBase *Call)
Return the behavior of the given call site.
bool invalidate(Function &F, const PreservedAnalyses &PA, FunctionAnalysisManager::Invalidator &Inv)
Handle invalidation events in the new pass manager.
ModRefInfo getArgModRefInfo(const CallBase *Call, unsigned ArgIdx)
Get the ModRef info associated with a pointer argument of a call.
bool canInstructionRangeModRef(const Instruction &I1, const Instruction &I2, const MemoryLocation &Loc, const ModRefInfo Mode)
Check if it is possible for the execution of the specified instructions to mod(according to the mode)...
bool canBasicBlockModify(const BasicBlock &BB, const MemoryLocation &Loc)
Check if it is possible for execution of the specified basic block to modify the location Loc.
The possible results of an alias query.
Definition: AliasAnalysis.h:77
@ MayAlias
The two locations may or may not alias.
Definition: AliasAnalysis.h:98
@ NoAlias
The two locations do not alias at all.
Definition: AliasAnalysis.h:95
@ PartialAlias
The two locations alias, but only due to a partial overlap.
@ MustAlias
The two locations precisely alias each other.
constexpr int32_t getOffset() const
constexpr bool hasOffset() const
API to communicate dependencies between analyses during invalidation.
Definition: PassManager.h:292
bool invalidate(IRUnitT &IR, const PreservedAnalyses &PA)
Trigger the invalidation of some other analysis pass if not already handled and return whether it was...
Definition: PassManager.h:310
A container for analyses that lazily runs them and caches their results.
Definition: PassManager.h:253
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
Definition: PassManager.h:410
Represent the analysis usage information of a pass.
AnalysisUsage & addUsedIfAvailable()
Add the specified Pass class to the set of analyses used by this 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:31
An instruction that atomically checks whether a specified value is in a memory location,...
Definition: Instructions.h:501
AtomicOrdering getSuccessOrdering() const
Returns the success ordering constraint of this cmpxchg instruction.
Definition: Instructions.h:582
an instruction that atomically reads a memory location, combines it with another value,...
Definition: Instructions.h:704
AtomicOrdering getOrdering() const
Returns the ordering constraint of this rmw instruction.
Definition: Instructions.h:847
Legacy wrapper pass to provide the BasicAAResult object.
LLVM Basic Block Representation.
Definition: BasicBlock.h:61
InstListType::const_iterator const_iterator
Definition: BasicBlock.h:178
const Instruction & front() const
Definition: BasicBlock.h:471
const Instruction & back() const
Definition: BasicBlock.h:473
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
Definition: InstrTypes.h:1120
User::op_iterator arg_begin()
Return the iterator pointing to the beginning of the argument list.
Definition: InstrTypes.h:1269
User::op_iterator arg_end()
Return the iterator pointing to the end of the argument list.
Definition: InstrTypes.h:1275
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
Definition: Dominators.h:162
An instruction for ordering other memory operations.
Definition: Instructions.h:424
FunctionPass class - This class is used to implement most global optimizations.
Definition: Pass.h:310
Legacy wrapper pass to provide the GlobalsAAResult object.
ImmutablePass class - This class is used to provide information that does not need to be run.
Definition: Pass.h:281
An instruction for reading from memory.
Definition: Instructions.h:176
MemoryEffectsBase getWithoutLoc(Location Loc) const
Get new MemoryEffectsBase with NoModRef on the given Loc.
Definition: ModRef.h:177
ModRefInfo getModRef(Location Loc) const
Get ModRefInfo for the given Location.
Definition: ModRef.h:165
static MemoryEffectsBase unknown()
Create MemoryEffectsBase that can read and write any memory.
Definition: ModRef.h:112
Representation for a specific memory location.
static MemoryLocation get(const LoadInst *LI)
Return a location with information about the memory reference by the given instruction.
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 MemoryLocation getForArgument(const CallBase *Call, unsigned ArgIdx, const TargetLibraryInfo *TLI)
Return a location representing a particular argument of a call.
static PassRegistry * getPassRegistry()
getPassRegistry - Access the global registry object, which is automatically initialized at applicatio...
A set of analyses that are preserved following a run of a transformation pass.
Definition: Analysis.h:111
PreservedAnalysisChecker getChecker() const
Build a checker for this PreservedAnalyses and the specified analysis type.
Definition: Analysis.h:264
Legacy wrapper pass to provide the SCEVAAResult object.
Legacy wrapper pass to provide the ScopedNoAliasAAResult object.
AAQueryInfo that uses SimpleCaptureAnalysis.
An instruction for storing to memory.
Definition: Instructions.h:292
AtomicOrdering getOrdering() const
Returns the ordering constraint of this store instruction.
Definition: Instructions.h:342
Analysis pass providing the TargetLibraryInfo.
Provides information about what library functions are available for the current target.
Legacy wrapper pass to provide the TypeBasedAAResult object.
bool isPointerTy() const
True if this is an instance of PointerType.
Definition: Type.h:264
This class represents the va_arg llvm instruction, which returns an argument of the specified type gi...
LLVM Value Representation.
Definition: Value.h:74
Type * getType() const
All values are typed, get the type of this value.
Definition: Value.h:255
const ParentTy * getParent() const
Definition: ilist_node.h:32
self_iterator getIterator()
Definition: ilist_node.h:132
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition: raw_ostream.h:52
initializer< Ty > init(const Ty &Val)
Definition: CommandLine.h:443
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
cl::opt< bool > DisableBasicAA("disable-basic-aa", cl::Hidden, cl::init(false))
Allow disabling BasicAA from the AA results.
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:2448
bool isStrongerThanMonotonic(AtomicOrdering AO)
bool isBaseOfObject(const Value *V)
Return true if we know V to the base address of the corresponding memory object.
bool PointerMayBeCapturedBefore(const Value *V, bool ReturnCaptures, bool StoreCaptures, const Instruction *I, const DominatorTree *DT, bool IncludeI=false, unsigned MaxUsesToExplore=0, const LoopInfo *LI=nullptr)
PointerMayBeCapturedBefore - Return true if this pointer value may be captured by the enclosing funct...
const Value * getUnderlyingObject(const Value *V, unsigned MaxLookup=6)
This method strips off any GEP address adjustments, pointer casts or llvm.threadlocal....
bool isNoAliasCall(const Value *V)
Return true if this pointer is returned by a noalias function.
void initializeAAResultsWrapperPassPass(PassRegistry &)
bool isIntrinsicReturningPointerAliasingArgumentWithoutCapturing(const CallBase *Call, bool MustPreserveNullness)
{launder,strip}.invariant.group returns pointer that aliases its argument, and it only captures point...
bool isModSet(const ModRefInfo MRI)
Definition: ModRef.h:48
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition: Debug.cpp:163
bool isModOrRefSet(const ModRefInfo MRI)
Definition: ModRef.h:42
bool isNotVisibleOnUnwind(const Value *Object, bool &RequiresNoCaptureBeforeUnwind)
Return true if Object memory is not visible after an unwind, in the sense that program semantics cann...
ModRefInfo
Flags indicating whether a memory access modifies or references memory.
Definition: ModRef.h:27
@ Ref
The access may reference the value stored in memory.
@ ModRef
The access may reference and may modify the value stored in memory.
@ Mod
The access may modify the value stored in memory.
@ NoModRef
The access neither references nor modifies the value stored in memory.
@ ArgMem
Access to memory via argument pointers.
@ InaccessibleMem
Memory that is inaccessible via LLVM IR.
raw_ostream & operator<<(raw_ostream &OS, const APFixedPoint &FX)
Definition: APFixedPoint.h:303
bool isIdentifiedFunctionLocal(const Value *V)
Return true if V is umabigously identified at the function-level.
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
Definition: STLExtras.h:1873
bool isEscapeSource(const Value *V)
Returns true if the pointer is one which would have been considered an escape by isNonEscapingLocalOb...
ImmutablePass * createExternalAAWrapperPass(std::function< void(Pass &, Function &, AAResults &)> Callback)
A wrapper pass around a callback which can be used to populate the AAResults in the AAResultsWrapperP...
void initializeExternalAAWrapperPassPass(PassRegistry &)
bool isNoModRef(const ModRefInfo MRI)
Definition: ModRef.h:39
bool isIdentifiedObject(const Value *V)
Return true if this pointer refers to a distinct and identifiable object.
bool isStrongerThan(AtomicOrdering AO, AtomicOrdering Other)
Returns true if ao is stronger than other as defined by the AtomicOrdering lattice,...
bool isRefSet(const ModRefInfo MRI)
Definition: ModRef.h:51
bool isWritableObject(const Value *Object, bool &ExplicitlyDereferenceableOnly)
Return true if the Object is writable, in the sense that any location based on this pointer that can ...
Implement std::hash so that hash_code can be used in STL containers.
Definition: BitVector.h:858
A special type used by analysis passes to provide an address that identifies that particular analysis...
Definition: Analysis.h:28
A wrapper pass for external alias analyses.
std::function< void(Pass &, Function &, AAResults &)> CallbackT