blob: 30ce13578e5433f994fda6615c9fde4743a703ee [file] [log] [blame]
Eugene Zelenkoc5e4ac82017-08-11 21:30:02 +00001//===- CFLSteensAliasAnalysis.cpp - Unification-based Alias Analysis ------===//
Hal Finkelbf301d52014-09-02 21:43:13 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
George Burgess IV3b5b98a2016-07-06 00:26:41 +000010// This file implements a CFL-base, summary-based alias analysis algorithm. It
11// does not depend on types. The algorithm is a mixture of the one described in
12// "Demand-driven alias analysis for C" by Xin Zheng and Radu Rugina, and "Fast
13// algorithms for Dyck-CFL-reachability with applications to Alias Analysis" by
14// Zhang Q, Lyu M R, Yuan H, and Su Z. -- to summarize the papers, we build a
15// graph of the uses of a variable, where each node is a memory location, and
16// each edge is an action that happened on that memory location. The "actions"
17// can be one of Dereference, Reference, or Assign. The precision of this
18// analysis is roughly the same as that of an one level context-sensitive
19// Steensgaard's algorithm.
Hal Finkelbf301d52014-09-02 21:43:13 +000020//
21// Two variables are considered as aliasing iff you can reach one value's node
22// from the other value's node and the language formed by concatenating all of
23// the edge labels (actions) conforms to a context-free grammar.
24//
25// Because this algorithm requires a graph search on each query, we execute the
26// algorithm outlined in "Fast algorithms..." (mentioned above)
27// in order to transform the graph into sets of variables that may alias in
George Burgess IV134d2942016-01-28 00:54:01 +000028// ~nlogn time (n = number of variables), which makes queries take constant
Hal Finkelbf301d52014-09-02 21:43:13 +000029// time.
30//===----------------------------------------------------------------------===//
31
George Burgess IV134d2942016-01-28 00:54:01 +000032// N.B. AliasAnalysis as a whole is phrased as a FunctionPass at the moment, and
George Burgess IV3b5b98a2016-07-06 00:26:41 +000033// CFLSteensAA is interprocedural. This is *technically* A Bad Thing, because
George Burgess IV134d2942016-01-28 00:54:01 +000034// FunctionPasses are only allowed to inspect the Function that they're being
35// run on. Realistically, this likely isn't a problem until we allow
36// FunctionPasses to run concurrently.
37
George Burgess IV3b5b98a2016-07-06 00:26:41 +000038#include "llvm/Analysis/CFLSteensAliasAnalysis.h"
Eugene Zelenkoc5e4ac82017-08-11 21:30:02 +000039#include "AliasAnalysisSummary.h"
George Burgess IV02af2782016-07-06 00:36:12 +000040#include "CFLGraph.h"
George Burgess IVcc48e0f2016-07-06 00:47:21 +000041#include "StratifiedSets.h"
Hal Finkelbf301d52014-09-02 21:43:13 +000042#include "llvm/ADT/DenseMap.h"
Chandler Carruth1b279142015-01-14 11:23:27 +000043#include "llvm/ADT/Optional.h"
Eugene Zelenkoc5e4ac82017-08-11 21:30:02 +000044#include "llvm/ADT/SmallVector.h"
George Burgess IVdbfc82f2016-06-01 18:39:54 +000045#include "llvm/Analysis/TargetLibraryInfo.h"
Hal Finkelbf301d52014-09-02 21:43:13 +000046#include "llvm/IR/Constants.h"
47#include "llvm/IR/Function.h"
Eugene Zelenkoc5e4ac82017-08-11 21:30:02 +000048#include "llvm/IR/Type.h"
49#include "llvm/IR/Value.h"
Hal Finkelbf301d52014-09-02 21:43:13 +000050#include "llvm/Pass.h"
George Burgess IVc571d112015-02-12 03:07:07 +000051#include "llvm/Support/Debug.h"
Benjamin Kramer1bfcd1f2015-03-23 19:32:43 +000052#include "llvm/Support/raw_ostream.h"
Hal Finkelbf301d52014-09-02 21:43:13 +000053#include <algorithm>
54#include <cassert>
Eugene Zelenkoc5e4ac82017-08-11 21:30:02 +000055#include <limits>
Benjamin Kramer1bfcd1f2015-03-23 19:32:43 +000056#include <memory>
Eugene Zelenkoc5e4ac82017-08-11 21:30:02 +000057#include <utility>
Hal Finkelbf301d52014-09-02 21:43:13 +000058
59using namespace llvm;
George Burgess IV02af2782016-07-06 00:36:12 +000060using namespace llvm::cflaa;
Hal Finkelbf301d52014-09-02 21:43:13 +000061
George Burgess IV3b5b98a2016-07-06 00:26:41 +000062#define DEBUG_TYPE "cfl-steens-aa"
George Burgess IVc571d112015-02-12 03:07:07 +000063
George Burgess IV3b5b98a2016-07-06 00:26:41 +000064CFLSteensAAResult::CFLSteensAAResult(const TargetLibraryInfo &TLI)
George Burgess IVdbfc82f2016-06-01 18:39:54 +000065 : AAResultBase(), TLI(TLI) {}
George Burgess IV3b5b98a2016-07-06 00:26:41 +000066CFLSteensAAResult::CFLSteensAAResult(CFLSteensAAResult &&Arg)
George Burgess IVdbfc82f2016-06-01 18:39:54 +000067 : AAResultBase(std::move(Arg)), TLI(Arg.TLI) {}
Eugene Zelenkoc5e4ac82017-08-11 21:30:02 +000068CFLSteensAAResult::~CFLSteensAAResult() = default;
Chandler Carruth519ed7c2015-08-14 02:42:20 +000069
George Burgess IV4ac87182016-06-20 23:10:56 +000070/// Information we have about a function and would like to keep around.
George Burgess IV3b5b98a2016-07-06 00:26:41 +000071class CFLSteensAAResult::FunctionInfo {
George Burgess IV9e937062016-07-11 22:59:09 +000072 StratifiedSets<InstantiatedValue> Sets;
George Burgess IV654ec292016-07-09 02:54:42 +000073 AliasSummary Summary;
George Burgess IV7161bf82016-06-24 01:00:03 +000074
George Burgess IV4ac87182016-06-20 23:10:56 +000075public:
76 FunctionInfo(Function &Fn, const SmallVectorImpl<Value *> &RetVals,
George Burgess IV9e937062016-07-11 22:59:09 +000077 StratifiedSets<InstantiatedValue> S);
George Burgess IV4ac87182016-06-20 23:10:56 +000078
George Burgess IV9e937062016-07-11 22:59:09 +000079 const StratifiedSets<InstantiatedValue> &getStratifiedSets() const {
80 return Sets;
81 }
Eugene Zelenkoc5e4ac82017-08-11 21:30:02 +000082
George Burgess IV654ec292016-07-09 02:54:42 +000083 const AliasSummary &getAliasSummary() const { return Summary; }
Chandler Carruth519ed7c2015-08-14 02:42:20 +000084};
85
Hal Finkelb38c0b82014-09-02 23:50:01 +000086const StratifiedIndex StratifiedLink::SetSentinel =
George Burgess IV25468372015-03-15 00:52:21 +000087 std::numeric_limits<StratifiedIndex>::max();
Hal Finkelb38c0b82014-09-02 23:50:01 +000088
Hal Finkelbf301d52014-09-02 21:43:13 +000089//===----------------------------------------------------------------------===//
90// Function declarations that require types defined in the namespace above
91//===----------------------------------------------------------------------===//
92
George Burgess IVea896952016-04-13 23:27:37 +000093/// Determines whether it would be pointless to add the given Value to our sets.
George Burgess IVd8bd7ce2015-03-10 02:58:15 +000094static bool canSkipAddingToSets(Value *Val) {
95 // Constants can share instances, which may falsely unify multiple
96 // sets, e.g. in
97 // store i32* null, i32** %ptr1
98 // store i32* null, i32** %ptr2
99 // clearly ptr1 and ptr2 should not be unified into the same set, so
100 // we should filter out the (potentially shared) instance to
101 // i32* null.
102 if (isa<Constant>(Val)) {
George Burgess IVd8bd7ce2015-03-10 02:58:15 +0000103 // TODO: Because all of these things are constant, we can determine whether
104 // the data is *actually* mutable at graph building time. This will probably
105 // come for free/cheap with offset awareness.
Duncan P. N. Exon Smithd7773c02016-04-05 21:10:45 +0000106 bool CanStoreMutableData = isa<GlobalValue>(Val) ||
107 isa<ConstantExpr>(Val) ||
108 isa<ConstantAggregate>(Val);
George Burgess IVd8bd7ce2015-03-10 02:58:15 +0000109 return !CanStoreMutableData;
110 }
111
112 return false;
Hal Finkelbf301d52014-09-02 21:43:13 +0000113}
114
George Burgess IV3b5b98a2016-07-06 00:26:41 +0000115CFLSteensAAResult::FunctionInfo::FunctionInfo(
116 Function &Fn, const SmallVectorImpl<Value *> &RetVals,
George Burgess IV9e937062016-07-11 22:59:09 +0000117 StratifiedSets<InstantiatedValue> S)
George Burgess IV4ac87182016-06-20 23:10:56 +0000118 : Sets(std::move(S)) {
George Burgess IV39639d92016-06-23 18:55:23 +0000119 // Historically, an arbitrary upper-bound of 50 args was selected. We may want
120 // to remove this if it doesn't really matter in practice.
121 if (Fn.arg_size() > MaxSupportedArgsInSummary)
122 return;
George Burgess IV4ac87182016-06-20 23:10:56 +0000123
George Burgess IV39639d92016-06-23 18:55:23 +0000124 DenseMap<StratifiedIndex, InterfaceValue> InterfaceMap;
George Burgess IV4ac87182016-06-20 23:10:56 +0000125
George Burgess IV39639d92016-06-23 18:55:23 +0000126 // Our intention here is to record all InterfaceValues that share the same
127 // StratifiedIndex in RetParamRelations. For each valid InterfaceValue, we
128 // have its StratifiedIndex scanned here and check if the index is presented
129 // in InterfaceMap: if it is not, we add the correspondence to the map;
130 // otherwise, an aliasing relation is found and we add it to
131 // RetParamRelations.
George Burgess IV7161bf82016-06-24 01:00:03 +0000132
George Burgess IVf71f3652016-06-23 20:59:13 +0000133 auto AddToRetParamRelations = [&](unsigned InterfaceIndex,
134 StratifiedIndex SetIndex) {
George Burgess IV39639d92016-06-23 18:55:23 +0000135 unsigned Level = 0;
136 while (true) {
137 InterfaceValue CurrValue{InterfaceIndex, Level};
George Burgess IV4ac87182016-06-20 23:10:56 +0000138
George Burgess IV39639d92016-06-23 18:55:23 +0000139 auto Itr = InterfaceMap.find(SetIndex);
140 if (Itr != InterfaceMap.end()) {
141 if (CurrValue != Itr->second)
George Burgess IV654ec292016-07-09 02:54:42 +0000142 Summary.RetParamRelations.push_back(
George Burgess IV3dba9032016-07-22 22:30:48 +0000143 ExternalRelation{CurrValue, Itr->second, UnknownOffset});
George Burgess IV39639d92016-06-23 18:55:23 +0000144 break;
George Burgess IV7161bf82016-06-24 01:00:03 +0000145 }
George Burgess IV4ac87182016-06-20 23:10:56 +0000146
George Burgess IV39639d92016-06-23 18:55:23 +0000147 auto &Link = Sets.getLink(SetIndex);
George Burgess IV7161bf82016-06-24 01:00:03 +0000148 InterfaceMap.insert(std::make_pair(SetIndex, CurrValue));
George Burgess IVcc48e0f2016-07-06 00:47:21 +0000149 auto ExternalAttrs = getExternallyVisibleAttrs(Link.Attrs);
George Burgess IV7161bf82016-06-24 01:00:03 +0000150 if (ExternalAttrs.any())
George Burgess IV654ec292016-07-09 02:54:42 +0000151 Summary.RetParamAttributes.push_back(
George Burgess IV7161bf82016-06-24 01:00:03 +0000152 ExternalAttribute{CurrValue, ExternalAttrs});
153
George Burgess IV39639d92016-06-23 18:55:23 +0000154 if (!Link.hasBelow())
155 break;
George Burgess IV4ac87182016-06-20 23:10:56 +0000156
George Burgess IV39639d92016-06-23 18:55:23 +0000157 ++Level;
158 SetIndex = Link.Below;
George Burgess IV4ac87182016-06-20 23:10:56 +0000159 }
George Burgess IV39639d92016-06-23 18:55:23 +0000160 };
161
162 // Populate RetParamRelations for return values
163 for (auto *RetVal : RetVals) {
George Burgess IV7161bf82016-06-24 01:00:03 +0000164 assert(RetVal != nullptr);
165 assert(RetVal->getType()->isPointerTy());
George Burgess IV9e937062016-07-11 22:59:09 +0000166 auto RetInfo = Sets.find(InstantiatedValue{RetVal, 0});
George Burgess IV39639d92016-06-23 18:55:23 +0000167 if (RetInfo.hasValue())
168 AddToRetParamRelations(0, RetInfo->Index);
169 }
170
171 // Populate RetParamRelations for parameters
172 unsigned I = 0;
173 for (auto &Param : Fn.args()) {
174 if (Param.getType()->isPointerTy()) {
George Burgess IV9e937062016-07-11 22:59:09 +0000175 auto ParamInfo = Sets.find(InstantiatedValue{&Param, 0});
George Burgess IV39639d92016-06-23 18:55:23 +0000176 if (ParamInfo.hasValue())
177 AddToRetParamRelations(I + 1, ParamInfo->Index);
178 }
179 ++I;
George Burgess IV4ac87182016-06-20 23:10:56 +0000180 }
181}
182
Chandler Carruth519ed7c2015-08-14 02:42:20 +0000183// Builds the graph + StratifiedSets for a function.
George Burgess IV3b5b98a2016-07-06 00:26:41 +0000184CFLSteensAAResult::FunctionInfo CFLSteensAAResult::buildSetsFrom(Function *Fn) {
George Burgess IV654ec292016-07-09 02:54:42 +0000185 CFLGraphBuilder<CFLSteensAAResult> GraphBuilder(*this, TLI, *Fn);
George Burgess IV9e937062016-07-11 22:59:09 +0000186 StratifiedSetsBuilder<InstantiatedValue> SetBuilder;
Hal Finkelbf301d52014-09-02 21:43:13 +0000187
George Burgess IV9e937062016-07-11 22:59:09 +0000188 // Add all CFLGraph nodes and all Dereference edges to StratifiedSets
George Burgess IV59a34862016-06-14 18:02:27 +0000189 auto &Graph = GraphBuilder.getCFLGraph();
George Burgess IV9e937062016-07-11 22:59:09 +0000190 for (const auto &Mapping : Graph.value_mappings()) {
191 auto Val = Mapping.first;
192 if (canSkipAddingToSets(Val))
George Burgess IVb7ebc012016-06-13 19:21:18 +0000193 continue;
George Burgess IV9e937062016-07-11 22:59:09 +0000194 auto &ValueInfo = Mapping.second;
George Burgess IVb7ebc012016-06-13 19:21:18 +0000195
George Burgess IV9e937062016-07-11 22:59:09 +0000196 assert(ValueInfo.getNumLevels() > 0);
197 SetBuilder.add(InstantiatedValue{Val, 0});
198 SetBuilder.noteAttributes(InstantiatedValue{Val, 0},
199 ValueInfo.getNodeInfoAtLevel(0).Attr);
200 for (unsigned I = 0, E = ValueInfo.getNumLevels() - 1; I < E; ++I) {
201 SetBuilder.add(InstantiatedValue{Val, I + 1});
202 SetBuilder.noteAttributes(InstantiatedValue{Val, I + 1},
203 ValueInfo.getNodeInfoAtLevel(I + 1).Attr);
204 SetBuilder.addBelow(InstantiatedValue{Val, I},
205 InstantiatedValue{Val, I + 1});
Hal Finkelbf301d52014-09-02 21:43:13 +0000206 }
207 }
208
George Burgess IV9e937062016-07-11 22:59:09 +0000209 // Add all assign edges to StratifiedSets
210 for (const auto &Mapping : Graph.value_mappings()) {
211 auto Val = Mapping.first;
212 if (canSkipAddingToSets(Val))
213 continue;
214 auto &ValueInfo = Mapping.second;
George Burgess IV39639d92016-06-23 18:55:23 +0000215
George Burgess IV9e937062016-07-11 22:59:09 +0000216 for (unsigned I = 0, E = ValueInfo.getNumLevels(); I < E; ++I) {
217 auto Src = InstantiatedValue{Val, I};
218 for (auto &Edge : ValueInfo.getNodeInfoAtLevel(I).Edges)
219 SetBuilder.addWith(Src, Edge.Other);
220 }
George Burgess IV7161bf82016-06-24 01:00:03 +0000221 }
222
George Burgess IV4ac87182016-06-20 23:10:56 +0000223 return FunctionInfo(*Fn, GraphBuilder.getReturnValues(), SetBuilder.build());
Hal Finkelbf301d52014-09-02 21:43:13 +0000224}
225
George Burgess IV3b5b98a2016-07-06 00:26:41 +0000226void CFLSteensAAResult::scan(Function *Fn) {
Hal Finkel8de42822014-09-02 22:52:30 +0000227 auto InsertPair = Cache.insert(std::make_pair(Fn, Optional<FunctionInfo>()));
Hal Finkelbf301d52014-09-02 21:43:13 +0000228 (void)InsertPair;
229 assert(InsertPair.second &&
230 "Trying to scan a function that has already been cached");
231
George Burgess IVc3791a92016-05-02 18:09:19 +0000232 // Note that we can't do Cache[Fn] = buildSetsFrom(Fn) here: the function call
233 // may get evaluated after operator[], potentially triggering a DenseMap
234 // resize and invalidating the reference returned by operator[]
235 auto FunInfo = buildSetsFrom(Fn);
236 Cache[Fn] = std::move(FunInfo);
237
Davide Italiano4d73d7a2017-06-26 23:59:14 +0000238 Handles.emplace_front(Fn, this);
Hal Finkelbf301d52014-09-02 21:43:13 +0000239}
240
George Burgess IV3b5b98a2016-07-06 00:26:41 +0000241void CFLSteensAAResult::evict(Function *Fn) { Cache.erase(Fn); }
Chandler Carruth519ed7c2015-08-14 02:42:20 +0000242
George Burgess IVea896952016-04-13 23:27:37 +0000243/// Ensures that the given function is available in the cache, and returns the
244/// entry.
George Burgess IV3b5b98a2016-07-06 00:26:41 +0000245const Optional<CFLSteensAAResult::FunctionInfo> &
246CFLSteensAAResult::ensureCached(Function *Fn) {
Chandler Carruth519ed7c2015-08-14 02:42:20 +0000247 auto Iter = Cache.find(Fn);
248 if (Iter == Cache.end()) {
249 scan(Fn);
250 Iter = Cache.find(Fn);
251 assert(Iter != Cache.end());
252 assert(Iter->second.hasValue());
253 }
254 return Iter->second;
255}
256
George Burgess IV654ec292016-07-09 02:54:42 +0000257const AliasSummary *CFLSteensAAResult::getAliasSummary(Function &Fn) {
258 auto &FunInfo = ensureCached(&Fn);
259 if (FunInfo.hasValue())
260 return &FunInfo->getAliasSummary();
261 else
262 return nullptr;
263}
264
George Burgess IV3b5b98a2016-07-06 00:26:41 +0000265AliasResult CFLSteensAAResult::query(const MemoryLocation &LocA,
266 const MemoryLocation &LocB) {
Hal Finkelbf301d52014-09-02 21:43:13 +0000267 auto *ValA = const_cast<Value *>(LocA.Ptr);
268 auto *ValB = const_cast<Value *>(LocB.Ptr);
269
George Burgess IV3cdf3eb2016-06-15 20:43:41 +0000270 if (!ValA->getType()->isPointerTy() || !ValB->getType()->isPointerTy())
271 return NoAlias;
272
Hal Finkelbf301d52014-09-02 21:43:13 +0000273 Function *Fn = nullptr;
Davide Italiano257136b2017-06-27 02:25:06 +0000274 Function *MaybeFnA = const_cast<Function *>(parentFunctionOfValue(ValA));
275 Function *MaybeFnB = const_cast<Function *>(parentFunctionOfValue(ValB));
Davide Italiano2ba26722017-06-27 00:33:37 +0000276 if (!MaybeFnA && !MaybeFnB) {
George Burgess IVea896952016-04-13 23:27:37 +0000277 // The only times this is known to happen are when globals + InlineAsm are
278 // involved
Nicola Zaghen0818e782018-05-14 12:53:11 +0000279 LLVM_DEBUG(
280 dbgs()
281 << "CFLSteensAA: could not extract parent function information.\n");
Chandler Carruth1e3557d2015-06-22 02:16:51 +0000282 return MayAlias;
Hal Finkelbf301d52014-09-02 21:43:13 +0000283 }
284
Davide Italiano2ba26722017-06-27 00:33:37 +0000285 if (MaybeFnA) {
286 Fn = MaybeFnA;
287 assert((!MaybeFnB || MaybeFnB == MaybeFnA) &&
Hal Finkelbf301d52014-09-02 21:43:13 +0000288 "Interprocedural queries not supported");
289 } else {
Davide Italiano2ba26722017-06-27 00:33:37 +0000290 Fn = MaybeFnB;
Hal Finkelbf301d52014-09-02 21:43:13 +0000291 }
292
293 assert(Fn != nullptr);
294 auto &MaybeInfo = ensureCached(Fn);
295 assert(MaybeInfo.hasValue());
296
George Burgess IV4ac87182016-06-20 23:10:56 +0000297 auto &Sets = MaybeInfo->getStratifiedSets();
George Burgess IV9e937062016-07-11 22:59:09 +0000298 auto MaybeA = Sets.find(InstantiatedValue{ValA, 0});
Hal Finkelbf301d52014-09-02 21:43:13 +0000299 if (!MaybeA.hasValue())
Chandler Carruth1e3557d2015-06-22 02:16:51 +0000300 return MayAlias;
Hal Finkelbf301d52014-09-02 21:43:13 +0000301
George Burgess IV9e937062016-07-11 22:59:09 +0000302 auto MaybeB = Sets.find(InstantiatedValue{ValB, 0});
Hal Finkelbf301d52014-09-02 21:43:13 +0000303 if (!MaybeB.hasValue())
Chandler Carruth1e3557d2015-06-22 02:16:51 +0000304 return MayAlias;
Hal Finkelbf301d52014-09-02 21:43:13 +0000305
306 auto SetA = *MaybeA;
307 auto SetB = *MaybeB;
Hal Finkelbf301d52014-09-02 21:43:13 +0000308 auto AttrsA = Sets.getLink(SetA.Index).Attrs;
309 auto AttrsB = Sets.getLink(SetB.Index).Attrs;
George Burgess IVc571d112015-02-12 03:07:07 +0000310
George Burgess IV90fe2c52016-06-07 18:35:37 +0000311 // If both values are local (meaning the corresponding set has attribute
George Burgess IV3b5b98a2016-07-06 00:26:41 +0000312 // AttrNone or AttrEscaped), then we know that CFLSteensAA fully models them:
313 // they may-alias each other if and only if they are in the same set.
George Burgess IV90fe2c52016-06-07 18:35:37 +0000314 // If at least one value is non-local (meaning it either is global/argument or
315 // it comes from unknown sources like integer cast), the situation becomes a
316 // bit more interesting. We follow three general rules described below:
317 // - Non-local values may alias each other
318 // - AttrNone values do not alias any non-local values
George Burgess IVbec2df62016-06-09 23:15:04 +0000319 // - AttrEscaped do not alias globals/arguments, but they may alias
George Burgess IV90fe2c52016-06-07 18:35:37 +0000320 // AttrUnknown values
321 if (SetA.Index == SetB.Index)
Chandler Carruth1e3557d2015-06-22 02:16:51 +0000322 return MayAlias;
George Burgess IV90fe2c52016-06-07 18:35:37 +0000323 if (AttrsA.none() || AttrsB.none())
324 return NoAlias;
George Burgess IVcc48e0f2016-07-06 00:47:21 +0000325 if (hasUnknownOrCallerAttr(AttrsA) || hasUnknownOrCallerAttr(AttrsB))
George Burgess IV90fe2c52016-06-07 18:35:37 +0000326 return MayAlias;
327 if (isGlobalOrArgAttr(AttrsA) && isGlobalOrArgAttr(AttrsB))
328 return MayAlias;
329 return NoAlias;
Hal Finkelbf301d52014-09-02 21:43:13 +0000330}
Mehdi Aminic94da202015-03-04 18:43:29 +0000331
Chandler Carruth33d56812016-11-23 17:53:26 +0000332AnalysisKey CFLSteensAA::Key;
Chandler Carruthe95015f2016-03-11 10:22:49 +0000333
Sean Silva20b343c2016-08-09 00:28:15 +0000334CFLSteensAAResult CFLSteensAA::run(Function &F, FunctionAnalysisManager &AM) {
George Burgess IV3b5b98a2016-07-06 00:26:41 +0000335 return CFLSteensAAResult(AM.getResult<TargetLibraryAnalysis>(F));
Chandler Carruth91468332015-09-09 17:55:00 +0000336}
337
George Burgess IV3b5b98a2016-07-06 00:26:41 +0000338char CFLSteensAAWrapperPass::ID = 0;
339INITIALIZE_PASS(CFLSteensAAWrapperPass, "cfl-steens-aa",
340 "Unification-Based CFL Alias Analysis", false, true)
Chandler Carruth91468332015-09-09 17:55:00 +0000341
George Burgess IV3b5b98a2016-07-06 00:26:41 +0000342ImmutablePass *llvm::createCFLSteensAAWrapperPass() {
343 return new CFLSteensAAWrapperPass();
Chandler Carruth91468332015-09-09 17:55:00 +0000344}
345
George Burgess IV3b5b98a2016-07-06 00:26:41 +0000346CFLSteensAAWrapperPass::CFLSteensAAWrapperPass() : ImmutablePass(ID) {
347 initializeCFLSteensAAWrapperPassPass(*PassRegistry::getPassRegistry());
348}
349
350void CFLSteensAAWrapperPass::initializePass() {
George Burgess IVdbfc82f2016-06-01 18:39:54 +0000351 auto &TLIWP = getAnalysis<TargetLibraryInfoWrapperPass>();
George Burgess IV3b5b98a2016-07-06 00:26:41 +0000352 Result.reset(new CFLSteensAAResult(TLIWP.getTLI()));
Chandler Carruth91468332015-09-09 17:55:00 +0000353}
354
George Burgess IV3b5b98a2016-07-06 00:26:41 +0000355void CFLSteensAAWrapperPass::getAnalysisUsage(AnalysisUsage &AU) const {
Chandler Carruth91468332015-09-09 17:55:00 +0000356 AU.setPreservesAll();
George Burgess IVdbfc82f2016-06-01 18:39:54 +0000357 AU.addRequired<TargetLibraryInfoWrapperPass>();
Mehdi Aminic94da202015-03-04 18:43:29 +0000358}