blob: 3446aef399381f1a27641748de4867299c9e4f73 [file] [log] [blame]
Eugene Zelenkoc5e4ac82017-08-11 21:30:02 +00001//==- AliasAnalysis.cpp - Generic Alias Analysis Interface Implementation --==//
Misha Brukman2b37d7c2005-04-21 21:13:18 +00002//
John Criswellb576c942003-10-20 19:43:21 +00003// The LLVM Compiler Infrastructure
4//
Chris Lattner4ee451d2007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Misha Brukman2b37d7c2005-04-21 21:13:18 +00007//
John Criswellb576c942003-10-20 19:43:21 +00008//===----------------------------------------------------------------------===//
Chris Lattner53ad0ed2002-08-22 18:25:32 +00009//
10// This file implements the generic AliasAnalysis interface which is used as the
11// common interface used by all clients and implementations of alias analysis.
12//
13// This file also implements the default version of the AliasAnalysis interface
14// that is to be used when no other implementation is specified. This does some
15// simple tests that detect obvious cases: two different global pointers cannot
16// alias, a global cannot alias a malloc, two different mallocs cannot alias,
17// etc.
18//
19// This alias analysis implementation really isn't very good for anything, but
20// it is very fast, and makes a nice clean default implementation. Because it
21// handles lots of little corner cases, other, more complex, alias analysis
22// implementations may choose to rely on this pass to resolve these simple and
23// easy cases.
24//
25//===----------------------------------------------------------------------===//
26
Chris Lattnerd501c132003-02-26 19:41:54 +000027#include "llvm/Analysis/AliasAnalysis.h"
Chandler Carruth91468332015-09-09 17:55:00 +000028#include "llvm/Analysis/BasicAliasAnalysis.h"
George Burgess IV3b5b98a2016-07-06 00:26:41 +000029#include "llvm/Analysis/CFLAndersAliasAnalysis.h"
30#include "llvm/Analysis/CFLSteensAliasAnalysis.h"
Chandler Carruth974a4452014-01-07 11:48:04 +000031#include "llvm/Analysis/CaptureTracking.h"
Chandler Carruth91468332015-09-09 17:55:00 +000032#include "llvm/Analysis/GlobalsModRef.h"
Eugene Zelenkoc5e4ac82017-08-11 21:30:02 +000033#include "llvm/Analysis/MemoryLocation.h"
Chandler Carruth91468332015-09-09 17:55:00 +000034#include "llvm/Analysis/ObjCARCAliasAnalysis.h"
35#include "llvm/Analysis/ScalarEvolutionAliasAnalysis.h"
36#include "llvm/Analysis/ScopedNoAliasAA.h"
Chandler Carruthbda13492015-01-15 02:16:27 +000037#include "llvm/Analysis/TargetLibraryInfo.h"
Chandler Carruth91468332015-09-09 17:55:00 +000038#include "llvm/Analysis/TypeBasedAliasAnalysis.h"
Chad Rosier3a884f52012-05-14 20:35:04 +000039#include "llvm/Analysis/ValueTracking.h"
Eugene Zelenkoc5e4ac82017-08-11 21:30:02 +000040#include "llvm/IR/Argument.h"
41#include "llvm/IR/Attributes.h"
Chandler Carruth0b8c9a82013-01-02 11:36:10 +000042#include "llvm/IR/BasicBlock.h"
Eugene Zelenkoc5e4ac82017-08-11 21:30:02 +000043#include "llvm/IR/Instruction.h"
Chandler Carruth0b8c9a82013-01-02 11:36:10 +000044#include "llvm/IR/Instructions.h"
Eugene Zelenkoc5e4ac82017-08-11 21:30:02 +000045#include "llvm/IR/Module.h"
Chandler Carruth0b8c9a82013-01-02 11:36:10 +000046#include "llvm/IR/Type.h"
Eugene Zelenkoc5e4ac82017-08-11 21:30:02 +000047#include "llvm/IR/Value.h"
Chandler Carruthd04a8d42012-12-03 16:50:05 +000048#include "llvm/Pass.h"
Eugene Zelenkoc5e4ac82017-08-11 21:30:02 +000049#include "llvm/Support/AtomicOrdering.h"
50#include "llvm/Support/Casting.h"
51#include "llvm/Support/CommandLine.h"
52#include <algorithm>
53#include <cassert>
54#include <functional>
55#include <iterator>
56
Chris Lattner992860c2004-03-15 04:07:29 +000057using namespace llvm;
Brian Gaeked0fde302003-11-11 22:41:34 +000058
Chandler Carruth91468332015-09-09 17:55:00 +000059/// Allow disabling BasicAA from the AA results. This is particularly useful
60/// when testing to isolate a single AA implementation.
61static cl::opt<bool> DisableBasicAA("disable-basicaa", cl::Hidden,
62 cl::init(false));
63
Chandler Carruth2b572a22016-12-27 08:44:39 +000064AAResults::AAResults(AAResults &&Arg)
65 : TLI(Arg.TLI), AAs(std::move(Arg.AAs)), AADeps(std::move(Arg.AADeps)) {
Chandler Carruth91468332015-09-09 17:55:00 +000066 for (auto &AA : AAs)
67 AA->setAAResults(this);
68}
69
Chandler Carruth91468332015-09-09 17:55:00 +000070AAResults::~AAResults() {
71// FIXME; It would be nice to at least clear out the pointers back to this
72// aggregation here, but we end up with non-nesting lifetimes in the legacy
73// pass manager that prevent this from working. In the legacy pass manager
74// we'll end up with dangling references here in some cases.
75#if 0
76 for (auto &AA : AAs)
77 AA->setAAResults(nullptr);
78#endif
79}
Chris Lattner53ad0ed2002-08-22 18:25:32 +000080
Chandler Carruth2b572a22016-12-27 08:44:39 +000081bool AAResults::invalidate(Function &F, const PreservedAnalyses &PA,
82 FunctionAnalysisManager::Invalidator &Inv) {
Chandler Carruth2b572a22016-12-27 08:44:39 +000083 // Check if the AA manager itself has been invalidated.
84 auto PAC = PA.getChecker<AAManager>();
85 if (!PAC.preserved() && !PAC.preservedSet<AllAnalysesOn<Function>>())
86 return true; // The manager needs to be blown away, clear everything.
87
88 // Check all of the dependencies registered.
89 for (AnalysisKey *ID : AADeps)
90 if (Inv.invalidate(ID, F, PA))
91 return true;
92
93 // Everything we depend on is still fine, so are we. Nothing to invalidate.
94 return false;
95}
96
Chris Lattner5a24d702004-05-23 21:15:48 +000097//===----------------------------------------------------------------------===//
98// Default chaining methods
99//===----------------------------------------------------------------------===//
100
Chandler Carruth91468332015-09-09 17:55:00 +0000101AliasResult AAResults::alias(const MemoryLocation &LocA,
102 const MemoryLocation &LocB) {
103 for (const auto &AA : AAs) {
104 auto Result = AA->alias(LocA, LocB);
105 if (Result != MayAlias)
106 return Result;
107 }
108 return MayAlias;
Chris Lattner5a24d702004-05-23 21:15:48 +0000109}
110
Chandler Carruth91468332015-09-09 17:55:00 +0000111bool AAResults::pointsToConstantMemory(const MemoryLocation &Loc,
112 bool OrLocal) {
113 for (const auto &AA : AAs)
114 if (AA->pointsToConstantMemory(Loc, OrLocal))
115 return true;
116
117 return false;
Chris Lattner5a24d702004-05-23 21:15:48 +0000118}
119
Chandler Carruth81aa7122019-01-07 05:42:51 +0000120ModRefInfo AAResults::getArgModRefInfo(const CallBase *Call, unsigned ArgIdx) {
Alina Sbirleac94e8962017-12-07 22:41:34 +0000121 ModRefInfo Result = ModRefInfo::ModRef;
Chandler Carruth91468332015-09-09 17:55:00 +0000122
123 for (const auto &AA : AAs) {
Chandler Carruth81aa7122019-01-07 05:42:51 +0000124 Result = intersectModRef(Result, AA->getArgModRefInfo(Call, ArgIdx));
Chandler Carruth91468332015-09-09 17:55:00 +0000125
126 // Early-exit the moment we reach the bottom of the lattice.
Alina Sbirleaa2d30e92017-12-05 20:12:23 +0000127 if (isNoModRef(Result))
Alina Sbirleab3ba8e92018-01-19 10:26:40 +0000128 return ModRefInfo::NoModRef;
Chandler Carruth91468332015-09-09 17:55:00 +0000129 }
130
131 return Result;
Hal Finkel8f609692014-07-17 01:28:25 +0000132}
133
Chandler Carruth81aa7122019-01-07 05:42:51 +0000134ModRefInfo AAResults::getModRefInfo(Instruction *I, const CallBase *Call2) {
Alina Sbirlea9680c052017-12-21 21:41:53 +0000135 // We may have two calls.
Chandler Carruth81aa7122019-01-07 05:42:51 +0000136 if (const auto *Call1 = dyn_cast<CallBase>(I)) {
Alina Sbirlea9680c052017-12-21 21:41:53 +0000137 // Check if the two calls modify the same memory.
Chandler Carruth81aa7122019-01-07 05:42:51 +0000138 return getModRefInfo(Call1, Call2);
David Majnemeraf8dbbc2016-07-15 17:19:24 +0000139 } else if (I->isFenceLike()) {
Alina Sbirleac94e8962017-12-07 22:41:34 +0000140 // If this is a fence, just return ModRef.
141 return ModRefInfo::ModRef;
Daniel Berlin1f13e202015-04-13 23:25:41 +0000142 } else {
143 // Otherwise, check if the call modifies or references the
144 // location this memory access defines. The best we can say
145 // is that if the call references what this instruction
146 // defines, it must be clobbered by this location.
Chandler Carruth4d7ed392015-06-17 07:18:54 +0000147 const MemoryLocation DefLoc = MemoryLocation::get(I);
Chandler Carruth81aa7122019-01-07 05:42:51 +0000148 ModRefInfo MR = getModRefInfo(Call2, DefLoc);
Alina Sbirleaa2d30e92017-12-05 20:12:23 +0000149 if (isModOrRefSet(MR))
150 return setModAndRef(MR);
Daniel Berlin1f13e202015-04-13 23:25:41 +0000151 }
Alina Sbirleac94e8962017-12-07 22:41:34 +0000152 return ModRefInfo::NoModRef;
Daniel Berlin1f13e202015-04-13 23:25:41 +0000153}
Owen Andersonab6acc62011-01-03 21:38:41 +0000154
Chandler Carruth81aa7122019-01-07 05:42:51 +0000155ModRefInfo AAResults::getModRefInfo(const CallBase *Call,
Chandler Carruth91468332015-09-09 17:55:00 +0000156 const MemoryLocation &Loc) {
Alina Sbirleac94e8962017-12-07 22:41:34 +0000157 ModRefInfo Result = ModRefInfo::ModRef;
Dan Gohman6ce9d8b2010-08-06 01:25:49 +0000158
Chandler Carruth91468332015-09-09 17:55:00 +0000159 for (const auto &AA : AAs) {
Chandler Carruth81aa7122019-01-07 05:42:51 +0000160 Result = intersectModRef(Result, AA->getModRefInfo(Call, Loc));
Dan Gohman6ce9d8b2010-08-06 01:25:49 +0000161
Chandler Carruth91468332015-09-09 17:55:00 +0000162 // Early-exit the moment we reach the bottom of the lattice.
Alina Sbirleaa2d30e92017-12-05 20:12:23 +0000163 if (isNoModRef(Result))
Alina Sbirleab3ba8e92018-01-19 10:26:40 +0000164 return ModRefInfo::NoModRef;
Dan Gohman6ce9d8b2010-08-06 01:25:49 +0000165 }
166
Chandler Carruthcf88e922016-03-02 15:56:53 +0000167 // Try to refine the mod-ref info further using other API entry points to the
168 // aggregate set of AA results.
Chandler Carruth81aa7122019-01-07 05:42:51 +0000169 auto MRB = getModRefBehavior(Call);
Andrew Kaylor665c3d92016-11-08 21:07:42 +0000170 if (MRB == FMRB_DoesNotAccessMemory ||
171 MRB == FMRB_OnlyAccessesInaccessibleMem)
Alina Sbirleac94e8962017-12-07 22:41:34 +0000172 return ModRefInfo::NoModRef;
Chandler Carruthcf88e922016-03-02 15:56:53 +0000173
174 if (onlyReadsMemory(MRB))
Alina Sbirleaa2d30e92017-12-05 20:12:23 +0000175 Result = clearMod(Result);
Nicolai Haehnleb07f5402016-07-04 08:01:29 +0000176 else if (doesNotReadMemory(MRB))
Alina Sbirleaa2d30e92017-12-05 20:12:23 +0000177 Result = clearRef(Result);
Chandler Carruthcf88e922016-03-02 15:56:53 +0000178
Andrew Kaylor665c3d92016-11-08 21:07:42 +0000179 if (onlyAccessesArgPointees(MRB) || onlyAccessesInaccessibleOrArgMem(MRB)) {
Alina Sbirlea9680c052017-12-21 21:41:53 +0000180 bool IsMustAlias = true;
Alina Sbirleac94e8962017-12-07 22:41:34 +0000181 ModRefInfo AllArgsMask = ModRefInfo::NoModRef;
Chandler Carruthcf88e922016-03-02 15:56:53 +0000182 if (doesAccessArgPointees(MRB)) {
Chandler Carruth81aa7122019-01-07 05:42:51 +0000183 for (auto AI = Call->arg_begin(), AE = Call->arg_end(); AI != AE; ++AI) {
Chandler Carruthcf88e922016-03-02 15:56:53 +0000184 const Value *Arg = *AI;
185 if (!Arg->getType()->isPointerTy())
186 continue;
Chandler Carruth81aa7122019-01-07 05:42:51 +0000187 unsigned ArgIdx = std::distance(Call->arg_begin(), AI);
188 MemoryLocation ArgLoc =
189 MemoryLocation::getForArgument(Call, ArgIdx, TLI);
Chandler Carruthcf88e922016-03-02 15:56:53 +0000190 AliasResult ArgAlias = alias(ArgLoc, Loc);
191 if (ArgAlias != NoAlias) {
Chandler Carruth81aa7122019-01-07 05:42:51 +0000192 ModRefInfo ArgMask = getArgModRefInfo(Call, ArgIdx);
Alina Sbirleaa2d30e92017-12-05 20:12:23 +0000193 AllArgsMask = unionModRef(AllArgsMask, ArgMask);
Chandler Carruthcf88e922016-03-02 15:56:53 +0000194 }
Alina Sbirlea9680c052017-12-21 21:41:53 +0000195 // Conservatively clear IsMustAlias unless only MustAlias is found.
196 IsMustAlias &= (ArgAlias == MustAlias);
Chandler Carruthcf88e922016-03-02 15:56:53 +0000197 }
198 }
Alina Sbirleac94e8962017-12-07 22:41:34 +0000199 // Return NoModRef if no alias found with any argument.
Philip Reames92802c22018-08-22 19:50:45 +0000200 if (isNoModRef(AllArgsMask))
Alina Sbirleac94e8962017-12-07 22:41:34 +0000201 return ModRefInfo::NoModRef;
Alina Sbirleaa2d30e92017-12-05 20:12:23 +0000202 // Logical & between other AA analyses and argument analysis.
203 Result = intersectModRef(Result, AllArgsMask);
Alina Sbirlea9680c052017-12-21 21:41:53 +0000204 // If only MustAlias found above, set Must bit.
205 Result = IsMustAlias ? setMust(Result) : clearMust(Result);
Chandler Carruthcf88e922016-03-02 15:56:53 +0000206 }
207
208 // If Loc is a constant memory location, the call definitely could not
209 // modify the memory location.
Alina Sbirleaa2d30e92017-12-05 20:12:23 +0000210 if (isModSet(Result) && pointsToConstantMemory(Loc, /*OrLocal*/ false))
211 Result = clearMod(Result);
Chandler Carruthcf88e922016-03-02 15:56:53 +0000212
Chandler Carruth91468332015-09-09 17:55:00 +0000213 return Result;
Dan Gohman6ce9d8b2010-08-06 01:25:49 +0000214}
215
Chandler Carruth81aa7122019-01-07 05:42:51 +0000216ModRefInfo AAResults::getModRefInfo(const CallBase *Call1,
217 const CallBase *Call2) {
Alina Sbirleac94e8962017-12-07 22:41:34 +0000218 ModRefInfo Result = ModRefInfo::ModRef;
Dan Gohman6ce9d8b2010-08-06 01:25:49 +0000219
Chandler Carruth91468332015-09-09 17:55:00 +0000220 for (const auto &AA : AAs) {
Chandler Carruth81aa7122019-01-07 05:42:51 +0000221 Result = intersectModRef(Result, AA->getModRefInfo(Call1, Call2));
Dan Gohman6ce9d8b2010-08-06 01:25:49 +0000222
Chandler Carruth91468332015-09-09 17:55:00 +0000223 // Early-exit the moment we reach the bottom of the lattice.
Alina Sbirleaa2d30e92017-12-05 20:12:23 +0000224 if (isNoModRef(Result))
Alina Sbirleab3ba8e92018-01-19 10:26:40 +0000225 return ModRefInfo::NoModRef;
Dan Gohman6ce9d8b2010-08-06 01:25:49 +0000226 }
227
Chandler Carruthcf88e922016-03-02 15:56:53 +0000228 // Try to refine the mod-ref info further using other API entry points to the
229 // aggregate set of AA results.
230
Chandler Carruth81aa7122019-01-07 05:42:51 +0000231 // If Call1 or Call2 are readnone, they don't interact.
232 auto Call1B = getModRefBehavior(Call1);
233 if (Call1B == FMRB_DoesNotAccessMemory)
Alina Sbirleac94e8962017-12-07 22:41:34 +0000234 return ModRefInfo::NoModRef;
Chandler Carruthcf88e922016-03-02 15:56:53 +0000235
Chandler Carruth81aa7122019-01-07 05:42:51 +0000236 auto Call2B = getModRefBehavior(Call2);
237 if (Call2B == FMRB_DoesNotAccessMemory)
Alina Sbirleac94e8962017-12-07 22:41:34 +0000238 return ModRefInfo::NoModRef;
Chandler Carruthcf88e922016-03-02 15:56:53 +0000239
240 // If they both only read from memory, there is no dependence.
Chandler Carruth81aa7122019-01-07 05:42:51 +0000241 if (onlyReadsMemory(Call1B) && onlyReadsMemory(Call2B))
Alina Sbirleac94e8962017-12-07 22:41:34 +0000242 return ModRefInfo::NoModRef;
Chandler Carruthcf88e922016-03-02 15:56:53 +0000243
Chandler Carruth81aa7122019-01-07 05:42:51 +0000244 // If Call1 only reads memory, the only dependence on Call2 can be
245 // from Call1 reading memory written by Call2.
246 if (onlyReadsMemory(Call1B))
Alina Sbirleaa2d30e92017-12-05 20:12:23 +0000247 Result = clearMod(Result);
Chandler Carruth81aa7122019-01-07 05:42:51 +0000248 else if (doesNotReadMemory(Call1B))
Alina Sbirleaa2d30e92017-12-05 20:12:23 +0000249 Result = clearRef(Result);
Chandler Carruthcf88e922016-03-02 15:56:53 +0000250
Chandler Carruth81aa7122019-01-07 05:42:51 +0000251 // If Call2 only access memory through arguments, accumulate the mod/ref
252 // information from Call1's references to the memory referenced by
253 // Call2's arguments.
254 if (onlyAccessesArgPointees(Call2B)) {
255 if (!doesAccessArgPointees(Call2B))
Alina Sbirleab3ba8e92018-01-19 10:26:40 +0000256 return ModRefInfo::NoModRef;
Alina Sbirleac94e8962017-12-07 22:41:34 +0000257 ModRefInfo R = ModRefInfo::NoModRef;
Alina Sbirleab3ba8e92018-01-19 10:26:40 +0000258 bool IsMustAlias = true;
Chandler Carruth81aa7122019-01-07 05:42:51 +0000259 for (auto I = Call2->arg_begin(), E = Call2->arg_end(); I != E; ++I) {
Alina Sbirleab3ba8e92018-01-19 10:26:40 +0000260 const Value *Arg = *I;
261 if (!Arg->getType()->isPointerTy())
262 continue;
Chandler Carruth81aa7122019-01-07 05:42:51 +0000263 unsigned Call2ArgIdx = std::distance(Call2->arg_begin(), I);
264 auto Call2ArgLoc =
265 MemoryLocation::getForArgument(Call2, Call2ArgIdx, TLI);
Chandler Carruthcf88e922016-03-02 15:56:53 +0000266
Chandler Carruth81aa7122019-01-07 05:42:51 +0000267 // ArgModRefC2 indicates what Call2 might do to Call2ArgLoc, and the
268 // dependence of Call1 on that location is the inverse:
269 // - If Call2 modifies location, dependence exists if Call1 reads or
270 // writes.
271 // - If Call2 only reads location, dependence exists if Call1 writes.
272 ModRefInfo ArgModRefC2 = getArgModRefInfo(Call2, Call2ArgIdx);
Alina Sbirleab3ba8e92018-01-19 10:26:40 +0000273 ModRefInfo ArgMask = ModRefInfo::NoModRef;
Chandler Carruth81aa7122019-01-07 05:42:51 +0000274 if (isModSet(ArgModRefC2))
Alina Sbirleab3ba8e92018-01-19 10:26:40 +0000275 ArgMask = ModRefInfo::ModRef;
Chandler Carruth81aa7122019-01-07 05:42:51 +0000276 else if (isRefSet(ArgModRefC2))
Alina Sbirleab3ba8e92018-01-19 10:26:40 +0000277 ArgMask = ModRefInfo::Mod;
Chandler Carruthcf88e922016-03-02 15:56:53 +0000278
Chandler Carruth81aa7122019-01-07 05:42:51 +0000279 // ModRefC1 indicates what Call1 might do to Call2ArgLoc, and we use
Alina Sbirleab3ba8e92018-01-19 10:26:40 +0000280 // above ArgMask to update dependence info.
Chandler Carruth81aa7122019-01-07 05:42:51 +0000281 ModRefInfo ModRefC1 = getModRefInfo(Call1, Call2ArgLoc);
282 ArgMask = intersectModRef(ArgMask, ModRefC1);
Chandler Carruthcf88e922016-03-02 15:56:53 +0000283
Alina Sbirleab3ba8e92018-01-19 10:26:40 +0000284 // Conservatively clear IsMustAlias unless only MustAlias is found.
Chandler Carruth81aa7122019-01-07 05:42:51 +0000285 IsMustAlias &= isMustSet(ModRefC1);
Alina Sbirlea9680c052017-12-21 21:41:53 +0000286
Alina Sbirleab3ba8e92018-01-19 10:26:40 +0000287 R = intersectModRef(unionModRef(R, ArgMask), Result);
288 if (R == Result) {
289 // On early exit, not all args were checked, cannot set Must.
290 if (I + 1 != E)
291 IsMustAlias = false;
292 break;
Chandler Carruthcf88e922016-03-02 15:56:53 +0000293 }
294 }
Alina Sbirleab3ba8e92018-01-19 10:26:40 +0000295
296 if (isNoModRef(R))
297 return ModRefInfo::NoModRef;
298
299 // If MustAlias found above, set Must bit.
300 return IsMustAlias ? setMust(R) : clearMust(R);
Chandler Carruthcf88e922016-03-02 15:56:53 +0000301 }
302
Chandler Carruth81aa7122019-01-07 05:42:51 +0000303 // If Call1 only accesses memory through arguments, check if Call2 references
304 // any of the memory referenced by Call1's arguments. If not, return NoModRef.
305 if (onlyAccessesArgPointees(Call1B)) {
306 if (!doesAccessArgPointees(Call1B))
Alina Sbirleab3ba8e92018-01-19 10:26:40 +0000307 return ModRefInfo::NoModRef;
Alina Sbirleac94e8962017-12-07 22:41:34 +0000308 ModRefInfo R = ModRefInfo::NoModRef;
Alina Sbirleab3ba8e92018-01-19 10:26:40 +0000309 bool IsMustAlias = true;
Chandler Carruth81aa7122019-01-07 05:42:51 +0000310 for (auto I = Call1->arg_begin(), E = Call1->arg_end(); I != E; ++I) {
Alina Sbirleab3ba8e92018-01-19 10:26:40 +0000311 const Value *Arg = *I;
312 if (!Arg->getType()->isPointerTy())
313 continue;
Chandler Carruth81aa7122019-01-07 05:42:51 +0000314 unsigned Call1ArgIdx = std::distance(Call1->arg_begin(), I);
315 auto Call1ArgLoc =
316 MemoryLocation::getForArgument(Call1, Call1ArgIdx, TLI);
Chandler Carruthcf88e922016-03-02 15:56:53 +0000317
Chandler Carruth81aa7122019-01-07 05:42:51 +0000318 // ArgModRefC1 indicates what Call1 might do to Call1ArgLoc; if Call1
319 // might Mod Call1ArgLoc, then we care about either a Mod or a Ref by
320 // Call2. If Call1 might Ref, then we care only about a Mod by Call2.
321 ModRefInfo ArgModRefC1 = getArgModRefInfo(Call1, Call1ArgIdx);
322 ModRefInfo ModRefC2 = getModRefInfo(Call2, Call1ArgLoc);
323 if ((isModSet(ArgModRefC1) && isModOrRefSet(ModRefC2)) ||
324 (isRefSet(ArgModRefC1) && isModSet(ModRefC2)))
325 R = intersectModRef(unionModRef(R, ArgModRefC1), Result);
Chandler Carruthcf88e922016-03-02 15:56:53 +0000326
Alina Sbirleab3ba8e92018-01-19 10:26:40 +0000327 // Conservatively clear IsMustAlias unless only MustAlias is found.
Chandler Carruth81aa7122019-01-07 05:42:51 +0000328 IsMustAlias &= isMustSet(ModRefC2);
Alina Sbirlea9680c052017-12-21 21:41:53 +0000329
Alina Sbirleab3ba8e92018-01-19 10:26:40 +0000330 if (R == Result) {
331 // On early exit, not all args were checked, cannot set Must.
332 if (I + 1 != E)
333 IsMustAlias = false;
334 break;
Chandler Carruthcf88e922016-03-02 15:56:53 +0000335 }
336 }
Alina Sbirleab3ba8e92018-01-19 10:26:40 +0000337
338 if (isNoModRef(R))
339 return ModRefInfo::NoModRef;
340
341 // If MustAlias found above, set Must bit.
342 return IsMustAlias ? setMust(R) : clearMust(R);
Chandler Carruthcf88e922016-03-02 15:56:53 +0000343 }
344
Chandler Carruth91468332015-09-09 17:55:00 +0000345 return Result;
346}
Chandler Carruthc179a412015-06-17 07:12:40 +0000347
Chandler Carruth81aa7122019-01-07 05:42:51 +0000348FunctionModRefBehavior AAResults::getModRefBehavior(const CallBase *Call) {
Chandler Carruth91468332015-09-09 17:55:00 +0000349 FunctionModRefBehavior Result = FMRB_UnknownModRefBehavior;
Hal Finkel8f609692014-07-17 01:28:25 +0000350
Chandler Carruth91468332015-09-09 17:55:00 +0000351 for (const auto &AA : AAs) {
Chandler Carruth81aa7122019-01-07 05:42:51 +0000352 Result = FunctionModRefBehavior(Result & AA->getModRefBehavior(Call));
Chandler Carruth91468332015-09-09 17:55:00 +0000353
354 // Early-exit the moment we reach the bottom of the lattice.
355 if (Result == FMRB_DoesNotAccessMemory)
356 return Result;
Dan Gohman6ce9d8b2010-08-06 01:25:49 +0000357 }
358
Chandler Carruth91468332015-09-09 17:55:00 +0000359 return Result;
Dan Gohman6ce9d8b2010-08-06 01:25:49 +0000360}
361
Chandler Carruth91468332015-09-09 17:55:00 +0000362FunctionModRefBehavior AAResults::getModRefBehavior(const Function *F) {
363 FunctionModRefBehavior Result = FMRB_UnknownModRefBehavior;
Dan Gohman6ce9d8b2010-08-06 01:25:49 +0000364
Chandler Carruth91468332015-09-09 17:55:00 +0000365 for (const auto &AA : AAs) {
366 Result = FunctionModRefBehavior(Result & AA->getModRefBehavior(F));
Dan Gohman6ce9d8b2010-08-06 01:25:49 +0000367
Chandler Carruth91468332015-09-09 17:55:00 +0000368 // Early-exit the moment we reach the bottom of the lattice.
369 if (Result == FMRB_DoesNotAccessMemory)
370 return Result;
371 }
Dan Gohman6ce9d8b2010-08-06 01:25:49 +0000372
Chandler Carruth91468332015-09-09 17:55:00 +0000373 return Result;
Chris Lattner5a24d702004-05-23 21:15:48 +0000374}
375
George Burgess IV1967f632018-06-14 19:55:53 +0000376raw_ostream &llvm::operator<<(raw_ostream &OS, AliasResult AR) {
377 switch (AR) {
378 case NoAlias:
379 OS << "NoAlias";
380 break;
381 case MustAlias:
382 OS << "MustAlias";
383 break;
384 case MayAlias:
385 OS << "MayAlias";
386 break;
387 case PartialAlias:
388 OS << "PartialAlias";
389 break;
390 }
391 return OS;
392}
393
Chris Lattner5a24d702004-05-23 21:15:48 +0000394//===----------------------------------------------------------------------===//
Chandler Carruth91468332015-09-09 17:55:00 +0000395// Helper method implementation
Chris Lattner5a24d702004-05-23 21:15:48 +0000396//===----------------------------------------------------------------------===//
397
Chandler Carruth91468332015-09-09 17:55:00 +0000398ModRefInfo AAResults::getModRefInfo(const LoadInst *L,
399 const MemoryLocation &Loc) {
Daniel Berlinf634bfb2017-04-07 01:28:36 +0000400 // Be conservative in the face of atomic.
401 if (isStrongerThan(L->getOrdering(), AtomicOrdering::Unordered))
Alina Sbirleac94e8962017-12-07 22:41:34 +0000402 return ModRefInfo::ModRef;
Dan Gohmanb9db52d2010-08-06 18:11:28 +0000403
Dan Gohman14a498a2010-08-03 17:27:43 +0000404 // If the load address doesn't alias the given address, it doesn't read
405 // or write the specified memory.
Alina Sbirlea9680c052017-12-21 21:41:53 +0000406 if (Loc.Ptr) {
407 AliasResult AR = alias(MemoryLocation::get(L), Loc);
408 if (AR == NoAlias)
409 return ModRefInfo::NoModRef;
410 if (AR == MustAlias)
411 return ModRefInfo::MustRef;
412 }
Dan Gohman14a498a2010-08-03 17:27:43 +0000413 // Otherwise, a load just reads.
Alina Sbirleac94e8962017-12-07 22:41:34 +0000414 return ModRefInfo::Ref;
Chris Lattner53ad0ed2002-08-22 18:25:32 +0000415}
416
Chandler Carruth91468332015-09-09 17:55:00 +0000417ModRefInfo AAResults::getModRefInfo(const StoreInst *S,
418 const MemoryLocation &Loc) {
Daniel Berlinf634bfb2017-04-07 01:28:36 +0000419 // Be conservative in the face of atomic.
420 if (isStrongerThan(S->getOrdering(), AtomicOrdering::Unordered))
Alina Sbirleac94e8962017-12-07 22:41:34 +0000421 return ModRefInfo::ModRef;
Dan Gohmanb9db52d2010-08-06 18:11:28 +0000422
Daniel Berlinb4f64382015-04-13 23:05:45 +0000423 if (Loc.Ptr) {
Alina Sbirlea9680c052017-12-21 21:41:53 +0000424 AliasResult AR = alias(MemoryLocation::get(S), Loc);
Daniel Berlinb4f64382015-04-13 23:05:45 +0000425 // If the store address cannot alias the pointer in question, then the
426 // specified memory cannot be modified by the store.
Alina Sbirlea9680c052017-12-21 21:41:53 +0000427 if (AR == NoAlias)
Alina Sbirleac94e8962017-12-07 22:41:34 +0000428 return ModRefInfo::NoModRef;
Chris Lattnerf4d904d2004-01-30 22:16:42 +0000429
Daniel Berlinb4f64382015-04-13 23:05:45 +0000430 // If the pointer is a pointer to constant memory, then it could not have
431 // been modified by this store.
432 if (pointsToConstantMemory(Loc))
Alina Sbirleac94e8962017-12-07 22:41:34 +0000433 return ModRefInfo::NoModRef;
Alina Sbirlea9680c052017-12-21 21:41:53 +0000434
435 // If the store address aliases the pointer as must alias, set Must.
436 if (AR == MustAlias)
437 return ModRefInfo::MustMod;
Daniel Berlinb4f64382015-04-13 23:05:45 +0000438 }
Dan Gohman14a498a2010-08-03 17:27:43 +0000439
440 // Otherwise, a store just writes.
Alina Sbirleac94e8962017-12-07 22:41:34 +0000441 return ModRefInfo::Mod;
Chris Lattner14ac8772003-02-26 19:26:51 +0000442}
443
Anna Thomasaaeaea12017-01-20 00:21:33 +0000444ModRefInfo AAResults::getModRefInfo(const FenceInst *S, const MemoryLocation &Loc) {
445 // If we know that the location is a constant memory location, the fence
446 // cannot modify this location.
447 if (Loc.Ptr && pointsToConstantMemory(Loc))
Alina Sbirleac94e8962017-12-07 22:41:34 +0000448 return ModRefInfo::Ref;
449 return ModRefInfo::ModRef;
Anna Thomasaaeaea12017-01-20 00:21:33 +0000450}
451
Chandler Carruth91468332015-09-09 17:55:00 +0000452ModRefInfo AAResults::getModRefInfo(const VAArgInst *V,
453 const MemoryLocation &Loc) {
Daniel Berlinb1e1aa02015-04-28 19:19:14 +0000454 if (Loc.Ptr) {
Alina Sbirlea9680c052017-12-21 21:41:53 +0000455 AliasResult AR = alias(MemoryLocation::get(V), Loc);
Daniel Berlinb1e1aa02015-04-28 19:19:14 +0000456 // If the va_arg address cannot alias the pointer in question, then the
457 // specified memory cannot be accessed by the va_arg.
Alina Sbirlea9680c052017-12-21 21:41:53 +0000458 if (AR == NoAlias)
Alina Sbirleac94e8962017-12-07 22:41:34 +0000459 return ModRefInfo::NoModRef;
Daniel Berlinb1e1aa02015-04-28 19:19:14 +0000460
461 // If the pointer is a pointer to constant memory, then it could not have
462 // been modified by this va_arg.
463 if (pointsToConstantMemory(Loc))
Alina Sbirleac94e8962017-12-07 22:41:34 +0000464 return ModRefInfo::NoModRef;
Alina Sbirlea9680c052017-12-21 21:41:53 +0000465
466 // If the va_arg aliases the pointer as must alias, set Must.
467 if (AR == MustAlias)
468 return ModRefInfo::MustModRef;
Daniel Berlinb1e1aa02015-04-28 19:19:14 +0000469 }
Dan Gohmane26a7b52010-08-06 18:24:38 +0000470
471 // Otherwise, a va_arg reads and writes.
Alina Sbirleac94e8962017-12-07 22:41:34 +0000472 return ModRefInfo::ModRef;
Dan Gohmane26a7b52010-08-06 18:24:38 +0000473}
474
David Majnemerbef60342015-11-17 08:15:14 +0000475ModRefInfo AAResults::getModRefInfo(const CatchPadInst *CatchPad,
476 const MemoryLocation &Loc) {
477 if (Loc.Ptr) {
478 // If the pointer is a pointer to constant memory,
479 // then it could not have been modified by this catchpad.
480 if (pointsToConstantMemory(Loc))
Alina Sbirleac94e8962017-12-07 22:41:34 +0000481 return ModRefInfo::NoModRef;
David Majnemerbef60342015-11-17 08:15:14 +0000482 }
483
484 // Otherwise, a catchpad reads and writes.
Alina Sbirleac94e8962017-12-07 22:41:34 +0000485 return ModRefInfo::ModRef;
David Majnemerbef60342015-11-17 08:15:14 +0000486}
487
488ModRefInfo AAResults::getModRefInfo(const CatchReturnInst *CatchRet,
489 const MemoryLocation &Loc) {
490 if (Loc.Ptr) {
491 // If the pointer is a pointer to constant memory,
492 // then it could not have been modified by this catchpad.
493 if (pointsToConstantMemory(Loc))
Alina Sbirleac94e8962017-12-07 22:41:34 +0000494 return ModRefInfo::NoModRef;
David Majnemerbef60342015-11-17 08:15:14 +0000495 }
496
497 // Otherwise, a catchret reads and writes.
Alina Sbirleac94e8962017-12-07 22:41:34 +0000498 return ModRefInfo::ModRef;
David Majnemerbef60342015-11-17 08:15:14 +0000499}
500
Chandler Carruth91468332015-09-09 17:55:00 +0000501ModRefInfo AAResults::getModRefInfo(const AtomicCmpXchgInst *CX,
502 const MemoryLocation &Loc) {
Eli Friedman46cb5af2011-09-26 20:15:28 +0000503 // Acquire/Release cmpxchg has properties that matter for arbitrary addresses.
JF Bastienb36d1a82016-04-06 21:19:33 +0000504 if (isStrongerThanMonotonic(CX->getSuccessOrdering()))
Alina Sbirleac94e8962017-12-07 22:41:34 +0000505 return ModRefInfo::ModRef;
Eli Friedman46cb5af2011-09-26 20:15:28 +0000506
Alina Sbirlea9680c052017-12-21 21:41:53 +0000507 if (Loc.Ptr) {
508 AliasResult AR = alias(MemoryLocation::get(CX), Loc);
509 // If the cmpxchg address does not alias the location, it does not access
510 // it.
511 if (AR == NoAlias)
512 return ModRefInfo::NoModRef;
513
514 // If the cmpxchg address aliases the pointer as must alias, set Must.
515 if (AR == MustAlias)
516 return ModRefInfo::MustModRef;
517 }
Eli Friedman46cb5af2011-09-26 20:15:28 +0000518
Alina Sbirleac94e8962017-12-07 22:41:34 +0000519 return ModRefInfo::ModRef;
Eli Friedman46cb5af2011-09-26 20:15:28 +0000520}
521
Chandler Carruth91468332015-09-09 17:55:00 +0000522ModRefInfo AAResults::getModRefInfo(const AtomicRMWInst *RMW,
523 const MemoryLocation &Loc) {
Eli Friedman46cb5af2011-09-26 20:15:28 +0000524 // Acquire/Release atomicrmw has properties that matter for arbitrary addresses.
JF Bastienb36d1a82016-04-06 21:19:33 +0000525 if (isStrongerThanMonotonic(RMW->getOrdering()))
Alina Sbirleac94e8962017-12-07 22:41:34 +0000526 return ModRefInfo::ModRef;
Eli Friedman46cb5af2011-09-26 20:15:28 +0000527
Alina Sbirlea9680c052017-12-21 21:41:53 +0000528 if (Loc.Ptr) {
529 AliasResult AR = alias(MemoryLocation::get(RMW), Loc);
530 // If the atomicrmw address does not alias the location, it does not access
531 // it.
532 if (AR == NoAlias)
533 return ModRefInfo::NoModRef;
534
535 // If the atomicrmw address aliases the pointer as must alias, set Must.
536 if (AR == MustAlias)
537 return ModRefInfo::MustModRef;
538 }
Eli Friedman46cb5af2011-09-26 20:15:28 +0000539
Alina Sbirleac94e8962017-12-07 22:41:34 +0000540 return ModRefInfo::ModRef;
Eli Friedman46cb5af2011-09-26 20:15:28 +0000541}
542
Adrian Prantl26b584c2018-05-01 15:54:18 +0000543/// Return information about whether a particular call site modifies
Bruno Cardoso Lopes8fea35a2015-07-31 14:31:35 +0000544/// or reads the specified memory location \p MemLoc before instruction \p I
Alina Sbirleaa2d30e92017-12-05 20:12:23 +0000545/// in a BasicBlock. An ordered basic block \p OBB can be used to speed up
Bruno Cardoso Lopes8fea35a2015-07-31 14:31:35 +0000546/// instruction-ordering queries inside the BasicBlock containing \p I.
547/// FIXME: this is really just shoring-up a deficiency in alias analysis.
548/// BasicAA isn't willing to spend linear time determining whether an alloca
549/// was captured before or after this particular call, while we are. However,
550/// with a smarter AA in place, this test is just wasting compile time.
Chandler Carruth91468332015-09-09 17:55:00 +0000551ModRefInfo AAResults::callCapturesBefore(const Instruction *I,
552 const MemoryLocation &MemLoc,
553 DominatorTree *DT,
554 OrderedBasicBlock *OBB) {
Mehdi Amini529919f2015-03-10 02:37:25 +0000555 if (!DT)
Alina Sbirleac94e8962017-12-07 22:41:34 +0000556 return ModRefInfo::ModRef;
Chad Rosier3a884f52012-05-14 20:35:04 +0000557
Chandler Carruth91468332015-09-09 17:55:00 +0000558 const Value *Object =
559 GetUnderlyingObject(MemLoc.Ptr, I->getModule()->getDataLayout());
Chad Rosier3a884f52012-05-14 20:35:04 +0000560 if (!isIdentifiedObject(Object) || isa<GlobalValue>(Object) ||
561 isa<Constant>(Object))
Alina Sbirleac94e8962017-12-07 22:41:34 +0000562 return ModRefInfo::ModRef;
Chad Rosier3a884f52012-05-14 20:35:04 +0000563
Chandler Carruth81aa7122019-01-07 05:42:51 +0000564 const auto *Call = dyn_cast<CallBase>(I);
565 if (!Call || Call == Object)
Alina Sbirleac94e8962017-12-07 22:41:34 +0000566 return ModRefInfo::ModRef;
Chad Rosier3a884f52012-05-14 20:35:04 +0000567
Eugene Zelenkoc5e4ac82017-08-11 21:30:02 +0000568 if (PointerMayBeCapturedBefore(Object, /* ReturnCaptures */ true,
569 /* StoreCaptures */ true, I, DT,
570 /* include Object */ true,
571 /* OrderedBasicBlock */ OBB))
Alina Sbirleac94e8962017-12-07 22:41:34 +0000572 return ModRefInfo::ModRef;
Chad Rosier3a884f52012-05-14 20:35:04 +0000573
574 unsigned ArgNo = 0;
Alina Sbirleac94e8962017-12-07 22:41:34 +0000575 ModRefInfo R = ModRefInfo::NoModRef;
Alina Sbirlea363c4c62018-04-30 20:11:13 +0000576 bool IsMustAlias = true;
Alina Sbirlea9680c052017-12-21 21:41:53 +0000577 // Set flag only if no May found and all operands processed.
Chandler Carruth81aa7122019-01-07 05:42:51 +0000578 for (auto CI = Call->data_operands_begin(), CE = Call->data_operands_end();
Chad Rosier3a884f52012-05-14 20:35:04 +0000579 CI != CE; ++CI, ++ArgNo) {
580 // Only look at the no-capture or byval pointer arguments. If this
581 // pointer were passed to arguments that were neither of these, then it
582 // couldn't be no-capture.
583 if (!(*CI)->getType()->isPointerTy() ||
Chandler Carruth81aa7122019-01-07 05:42:51 +0000584 (!Call->doesNotCapture(ArgNo) && ArgNo < Call->getNumArgOperands() &&
585 !Call->isByValArgument(ArgNo)))
Chad Rosier3a884f52012-05-14 20:35:04 +0000586 continue;
587
Alina Sbirlea9680c052017-12-21 21:41:53 +0000588 AliasResult AR = alias(MemoryLocation(*CI), MemoryLocation(Object));
Chad Rosier3a884f52012-05-14 20:35:04 +0000589 // If this is a no-capture pointer argument, see if we can tell that it
590 // is impossible to alias the pointer we're checking. If not, we have to
591 // assume that the call could touch the pointer, even though it doesn't
592 // escape.
Alina Sbirlea9680c052017-12-21 21:41:53 +0000593 if (AR != MustAlias)
Alina Sbirlea363c4c62018-04-30 20:11:13 +0000594 IsMustAlias = false;
Alina Sbirlea9680c052017-12-21 21:41:53 +0000595 if (AR == NoAlias)
Nick Lewycky37ade2b2013-07-07 10:15:16 +0000596 continue;
Chandler Carruth81aa7122019-01-07 05:42:51 +0000597 if (Call->doesNotAccessMemory(ArgNo))
Nick Lewycky37ade2b2013-07-07 10:15:16 +0000598 continue;
Chandler Carruth81aa7122019-01-07 05:42:51 +0000599 if (Call->onlyReadsMemory(ArgNo)) {
Alina Sbirleac94e8962017-12-07 22:41:34 +0000600 R = ModRefInfo::Ref;
Nick Lewycky37ade2b2013-07-07 10:15:16 +0000601 continue;
Chad Rosier3a884f52012-05-14 20:35:04 +0000602 }
Alina Sbirlea9680c052017-12-21 21:41:53 +0000603 // Not returning MustModRef since we have not seen all the arguments.
Alina Sbirleac94e8962017-12-07 22:41:34 +0000604 return ModRefInfo::ModRef;
Chad Rosier3a884f52012-05-14 20:35:04 +0000605 }
Alina Sbirlea363c4c62018-04-30 20:11:13 +0000606 return IsMustAlias ? setMust(R) : clearMust(R);
Chad Rosier3a884f52012-05-14 20:35:04 +0000607}
Eli Friedman46cb5af2011-09-26 20:15:28 +0000608
Chris Lattnerf9355f62002-08-22 22:46:39 +0000609/// canBasicBlockModify - Return true if it is possible for execution of the
Elena Demikhovsky2f6d4232014-12-15 14:09:53 +0000610/// specified basic block to modify the location Loc.
Chris Lattnerf9355f62002-08-22 22:46:39 +0000611///
Chandler Carruth91468332015-09-09 17:55:00 +0000612bool AAResults::canBasicBlockModify(const BasicBlock &BB,
613 const MemoryLocation &Loc) {
Alina Sbirleac94e8962017-12-07 22:41:34 +0000614 return canInstructionRangeModRef(BB.front(), BB.back(), Loc, ModRefInfo::Mod);
Chris Lattner53ad0ed2002-08-22 18:25:32 +0000615}
616
Elena Demikhovsky2f6d4232014-12-15 14:09:53 +0000617/// canInstructionRangeModRef - Return true if it is possible for the
618/// execution of the specified instructions to mod\ref (according to the
619/// mode) the location Loc. The instructions to consider are all
620/// of the instructions in the range of [I1,I2] INCLUSIVE.
Teresa Johnsondcc57102015-05-13 15:04:14 +0000621/// I1 and I2 must be in the same basic block.
Chandler Carruth91468332015-09-09 17:55:00 +0000622bool AAResults::canInstructionRangeModRef(const Instruction &I1,
623 const Instruction &I2,
624 const MemoryLocation &Loc,
625 const ModRefInfo Mode) {
Chris Lattner53ad0ed2002-08-22 18:25:32 +0000626 assert(I1.getParent() == I2.getParent() &&
627 "Instructions not in same basic block!");
Duncan P. N. Exon Smithd3a5adc2015-10-10 00:53:03 +0000628 BasicBlock::const_iterator I = I1.getIterator();
629 BasicBlock::const_iterator E = I2.getIterator();
Chris Lattner53ad0ed2002-08-22 18:25:32 +0000630 ++E; // Convert from inclusive to exclusive range.
631
Chris Lattner14ac8772003-02-26 19:26:51 +0000632 for (; I != E; ++I) // Check every instruction in range
Alina Sbirlea0f7d5c22017-12-06 19:56:37 +0000633 if (isModOrRefSet(intersectModRef(getModRefInfo(&*I, Loc), Mode)))
Chris Lattner53ad0ed2002-08-22 18:25:32 +0000634 return true;
Chris Lattner53ad0ed2002-08-22 18:25:32 +0000635 return false;
636}
637
Chandler Carruth91468332015-09-09 17:55:00 +0000638// Provide a definition for the root virtual destructor.
Eugene Zelenkoc5e4ac82017-08-11 21:30:02 +0000639AAResults::Concept::~Concept() = default;
Chandler Carruth91468332015-09-09 17:55:00 +0000640
NAKAMURA Takumid9b6afb2016-02-28 17:17:00 +0000641// Provide a definition for the static object used to identify passes.
Chandler Carruth33d56812016-11-23 17:53:26 +0000642AnalysisKey AAManager::Key;
NAKAMURA Takumid9b6afb2016-02-28 17:17:00 +0000643
Chandler Carruth198a6c52015-10-21 12:15:19 +0000644namespace {
Eugene Zelenkoc5e4ac82017-08-11 21:30:02 +0000645
Eugene Zelenkoc5e4ac82017-08-11 21:30:02 +0000646
647} // end anonymous namespace
Chandler Carruth198a6c52015-10-21 12:15:19 +0000648
649char ExternalAAWrapperPass::ID = 0;
Eugene Zelenkoc5e4ac82017-08-11 21:30:02 +0000650
Chandler Carruth198a6c52015-10-21 12:15:19 +0000651INITIALIZE_PASS(ExternalAAWrapperPass, "external-aa", "External Alias Analysis",
652 false, true)
653
654ImmutablePass *
655llvm::createExternalAAWrapperPass(ExternalAAWrapperPass::CallbackT Callback) {
656 return new ExternalAAWrapperPass(std::move(Callback));
657}
658
Chandler Carruth91468332015-09-09 17:55:00 +0000659AAResultsWrapperPass::AAResultsWrapperPass() : FunctionPass(ID) {
660 initializeAAResultsWrapperPassPass(*PassRegistry::getPassRegistry());
661}
662
663char AAResultsWrapperPass::ID = 0;
664
665INITIALIZE_PASS_BEGIN(AAResultsWrapperPass, "aa",
666 "Function Alias Analysis Results", false, true)
667INITIALIZE_PASS_DEPENDENCY(BasicAAWrapperPass)
George Burgess IV3b5b98a2016-07-06 00:26:41 +0000668INITIALIZE_PASS_DEPENDENCY(CFLAndersAAWrapperPass)
669INITIALIZE_PASS_DEPENDENCY(CFLSteensAAWrapperPass)
Chandler Carruth198a6c52015-10-21 12:15:19 +0000670INITIALIZE_PASS_DEPENDENCY(ExternalAAWrapperPass)
Chandler Carruth91468332015-09-09 17:55:00 +0000671INITIALIZE_PASS_DEPENDENCY(GlobalsAAWrapperPass)
672INITIALIZE_PASS_DEPENDENCY(ObjCARCAAWrapperPass)
673INITIALIZE_PASS_DEPENDENCY(SCEVAAWrapperPass)
674INITIALIZE_PASS_DEPENDENCY(ScopedNoAliasAAWrapperPass)
675INITIALIZE_PASS_DEPENDENCY(TypeBasedAAWrapperPass)
676INITIALIZE_PASS_END(AAResultsWrapperPass, "aa",
677 "Function Alias Analysis Results", false, true)
678
679FunctionPass *llvm::createAAResultsWrapperPass() {
680 return new AAResultsWrapperPass();
681}
682
683/// Run the wrapper pass to rebuild an aggregation over known AA passes.
684///
685/// This is the legacy pass manager's interface to the new-style AA results
686/// aggregation object. Because this is somewhat shoe-horned into the legacy
687/// pass manager, we hard code all the specific alias analyses available into
688/// it. While the particular set enabled is configured via commandline flags,
689/// adding a new alias analysis to LLVM will require adding support for it to
690/// this list.
691bool AAResultsWrapperPass::runOnFunction(Function &F) {
692 // NB! This *must* be reset before adding new AA results to the new
693 // AAResults object because in the legacy pass manager, each instance
694 // of these will refer to the *same* immutable analyses, registering and
695 // unregistering themselves with them. We need to carefully tear down the
696 // previous object first, in this case replacing it with an empty one, before
697 // registering new results.
Chandler Carruthcf88e922016-03-02 15:56:53 +0000698 AAR.reset(
699 new AAResults(getAnalysis<TargetLibraryInfoWrapperPass>().getTLI()));
Chandler Carruth91468332015-09-09 17:55:00 +0000700
701 // BasicAA is always available for function analyses. Also, we add it first
702 // so that it can trump TBAA results when it proves MustAlias.
703 // FIXME: TBAA should have an explicit mode to support this and then we
704 // should reconsider the ordering here.
705 if (!DisableBasicAA)
706 AAR->addAAResult(getAnalysis<BasicAAWrapperPass>().getResult());
707
708 // Populate the results with the currently available AAs.
709 if (auto *WrapperPass = getAnalysisIfAvailable<ScopedNoAliasAAWrapperPass>())
710 AAR->addAAResult(WrapperPass->getResult());
711 if (auto *WrapperPass = getAnalysisIfAvailable<TypeBasedAAWrapperPass>())
712 AAR->addAAResult(WrapperPass->getResult());
713 if (auto *WrapperPass =
714 getAnalysisIfAvailable<objcarc::ObjCARCAAWrapperPass>())
715 AAR->addAAResult(WrapperPass->getResult());
716 if (auto *WrapperPass = getAnalysisIfAvailable<GlobalsAAWrapperPass>())
717 AAR->addAAResult(WrapperPass->getResult());
718 if (auto *WrapperPass = getAnalysisIfAvailable<SCEVAAWrapperPass>())
719 AAR->addAAResult(WrapperPass->getResult());
George Burgess IV3b5b98a2016-07-06 00:26:41 +0000720 if (auto *WrapperPass = getAnalysisIfAvailable<CFLAndersAAWrapperPass>())
721 AAR->addAAResult(WrapperPass->getResult());
722 if (auto *WrapperPass = getAnalysisIfAvailable<CFLSteensAAWrapperPass>())
Chandler Carruth91468332015-09-09 17:55:00 +0000723 AAR->addAAResult(WrapperPass->getResult());
724
Chandler Carruth198a6c52015-10-21 12:15:19 +0000725 // If available, run an external AA providing callback over the results as
726 // well.
727 if (auto *WrapperPass = getAnalysisIfAvailable<ExternalAAWrapperPass>())
728 if (WrapperPass->CB)
729 WrapperPass->CB(*this, F, *AAR);
730
Chandler Carruth91468332015-09-09 17:55:00 +0000731 // Analyses don't mutate the IR, so return false.
732 return false;
733}
734
735void AAResultsWrapperPass::getAnalysisUsage(AnalysisUsage &AU) const {
736 AU.setPreservesAll();
737 AU.addRequired<BasicAAWrapperPass>();
Chandler Carruthcf88e922016-03-02 15:56:53 +0000738 AU.addRequired<TargetLibraryInfoWrapperPass>();
Chandler Carruth91468332015-09-09 17:55:00 +0000739
740 // We also need to mark all the alias analysis passes we will potentially
741 // probe in runOnFunction as used here to ensure the legacy pass manager
742 // preserves them. This hard coding of lists of alias analyses is specific to
743 // the legacy pass manager.
744 AU.addUsedIfAvailable<ScopedNoAliasAAWrapperPass>();
745 AU.addUsedIfAvailable<TypeBasedAAWrapperPass>();
746 AU.addUsedIfAvailable<objcarc::ObjCARCAAWrapperPass>();
747 AU.addUsedIfAvailable<GlobalsAAWrapperPass>();
748 AU.addUsedIfAvailable<SCEVAAWrapperPass>();
George Burgess IV3b5b98a2016-07-06 00:26:41 +0000749 AU.addUsedIfAvailable<CFLAndersAAWrapperPass>();
750 AU.addUsedIfAvailable<CFLSteensAAWrapperPass>();
Chandler Carruth91468332015-09-09 17:55:00 +0000751}
752
753AAResults llvm::createLegacyPMAAResults(Pass &P, Function &F,
754 BasicAAResult &BAR) {
Chandler Carruthcf88e922016-03-02 15:56:53 +0000755 AAResults AAR(P.getAnalysis<TargetLibraryInfoWrapperPass>().getTLI());
Chandler Carruth91468332015-09-09 17:55:00 +0000756
757 // Add in our explicitly constructed BasicAA results.
758 if (!DisableBasicAA)
759 AAR.addAAResult(BAR);
760
761 // Populate the results with the other currently available AAs.
762 if (auto *WrapperPass =
763 P.getAnalysisIfAvailable<ScopedNoAliasAAWrapperPass>())
764 AAR.addAAResult(WrapperPass->getResult());
765 if (auto *WrapperPass = P.getAnalysisIfAvailable<TypeBasedAAWrapperPass>())
766 AAR.addAAResult(WrapperPass->getResult());
767 if (auto *WrapperPass =
768 P.getAnalysisIfAvailable<objcarc::ObjCARCAAWrapperPass>())
769 AAR.addAAResult(WrapperPass->getResult());
770 if (auto *WrapperPass = P.getAnalysisIfAvailable<GlobalsAAWrapperPass>())
771 AAR.addAAResult(WrapperPass->getResult());
George Burgess IV3b5b98a2016-07-06 00:26:41 +0000772 if (auto *WrapperPass = P.getAnalysisIfAvailable<CFLAndersAAWrapperPass>())
773 AAR.addAAResult(WrapperPass->getResult());
774 if (auto *WrapperPass = P.getAnalysisIfAvailable<CFLSteensAAWrapperPass>())
Chandler Carruth91468332015-09-09 17:55:00 +0000775 AAR.addAAResult(WrapperPass->getResult());
776
777 return AAR;
778}
779
Dan Gohmana5f81bb2009-02-03 01:28:32 +0000780bool llvm::isNoAliasCall(const Value *V) {
Chandler Carruth81aa7122019-01-07 05:42:51 +0000781 if (const auto *Call = dyn_cast<CallBase>(V))
782 return Call->hasRetAttr(Attribute::NoAlias);
Dan Gohmana5f81bb2009-02-03 01:28:32 +0000783 return false;
784}
785
Sanjay Patel72a05072016-01-13 22:17:13 +0000786bool llvm::isNoAliasArgument(const Value *V) {
Michael Kuperstein9f5de6d2013-05-28 08:17:48 +0000787 if (const Argument *A = dyn_cast<Argument>(V))
788 return A->hasNoAliasAttr();
789 return false;
790}
791
Dan Gohman9e86f432010-07-07 14:27:09 +0000792bool llvm::isIdentifiedObject(const Value *V) {
Dan Gohman6be2bd52010-06-29 00:50:39 +0000793 if (isa<AllocaInst>(V))
Dan Gohman5753a4a2009-08-27 17:52:56 +0000794 return true;
795 if (isa<GlobalValue>(V) && !isa<GlobalAlias>(V))
Dan Gohmana5f81bb2009-02-03 01:28:32 +0000796 return true;
Dan Gohman9e86f432010-07-07 14:27:09 +0000797 if (isNoAliasCall(V))
798 return true;
799 if (const Argument *A = dyn_cast<Argument>(V))
800 return A->hasNoAliasAttr() || A->hasByValAttr();
Dan Gohmana5f81bb2009-02-03 01:28:32 +0000801 return false;
802}
Hal Finkel43b12592014-07-21 12:27:23 +0000803
Sanjay Patel72a05072016-01-13 22:17:13 +0000804bool llvm::isIdentifiedFunctionLocal(const Value *V) {
Hal Finkel43b12592014-07-21 12:27:23 +0000805 return isa<AllocaInst>(V) || isNoAliasCall(V) || isNoAliasArgument(V);
806}
Sanjoy Das81c2fc42016-02-09 01:21:57 +0000807
Chandler Carruthcf88e922016-03-02 15:56:53 +0000808void llvm::getAAResultsAnalysisUsage(AnalysisUsage &AU) {
Sanjoy Das81c2fc42016-02-09 01:21:57 +0000809 // This function needs to be in sync with llvm::createLegacyPMAAResults -- if
810 // more alias analyses are added to llvm::createLegacyPMAAResults, they need
811 // to be added here also.
Chandler Carruthcf88e922016-03-02 15:56:53 +0000812 AU.addRequired<TargetLibraryInfoWrapperPass>();
Sanjoy Das81c2fc42016-02-09 01:21:57 +0000813 AU.addUsedIfAvailable<ScopedNoAliasAAWrapperPass>();
814 AU.addUsedIfAvailable<TypeBasedAAWrapperPass>();
815 AU.addUsedIfAvailable<objcarc::ObjCARCAAWrapperPass>();
816 AU.addUsedIfAvailable<GlobalsAAWrapperPass>();
George Burgess IV3b5b98a2016-07-06 00:26:41 +0000817 AU.addUsedIfAvailable<CFLAndersAAWrapperPass>();
818 AU.addUsedIfAvailable<CFLSteensAAWrapperPass>();
Sanjoy Das81c2fc42016-02-09 01:21:57 +0000819}