Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
14 | pmbaty | 1 | //===- llvm/Analysis/AliasAnalysis.h - Alias Analysis Interface -*- C++ -*-===// |
2 | // |
||
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
||
4 | // See https://llvm.org/LICENSE.txt for license information. |
||
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
||
6 | // |
||
7 | //===----------------------------------------------------------------------===// |
||
8 | // |
||
9 | // This file defines the generic AliasAnalysis interface, which is used as the |
||
10 | // common interface used by all clients of alias analysis information, and |
||
11 | // implemented by all alias analysis implementations. Mod/Ref information is |
||
12 | // also captured by this interface. |
||
13 | // |
||
14 | // Implementations of this interface must implement the various virtual methods, |
||
15 | // which automatically provides functionality for the entire suite of client |
||
16 | // APIs. |
||
17 | // |
||
18 | // This API identifies memory regions with the MemoryLocation class. The pointer |
||
19 | // component specifies the base memory address of the region. The Size specifies |
||
20 | // the maximum size (in address units) of the memory region, or |
||
21 | // MemoryLocation::UnknownSize if the size is not known. The TBAA tag |
||
22 | // identifies the "type" of the memory reference; see the |
||
23 | // TypeBasedAliasAnalysis class for details. |
||
24 | // |
||
25 | // Some non-obvious details include: |
||
26 | // - Pointers that point to two completely different objects in memory never |
||
27 | // alias, regardless of the value of the Size component. |
||
28 | // - NoAlias doesn't imply inequal pointers. The most obvious example of this |
||
29 | // is two pointers to constant memory. Even if they are equal, constant |
||
30 | // memory is never stored to, so there will never be any dependencies. |
||
31 | // In this and other situations, the pointers may be both NoAlias and |
||
32 | // MustAlias at the same time. The current API can only return one result, |
||
33 | // though this is rarely a problem in practice. |
||
34 | // |
||
35 | //===----------------------------------------------------------------------===// |
||
36 | |||
37 | #ifndef LLVM_ANALYSIS_ALIASANALYSIS_H |
||
38 | #define LLVM_ANALYSIS_ALIASANALYSIS_H |
||
39 | |||
40 | #include "llvm/ADT/DenseMap.h" |
||
41 | #include "llvm/ADT/Sequence.h" |
||
42 | #include "llvm/ADT/SmallVector.h" |
||
43 | #include "llvm/Analysis/MemoryLocation.h" |
||
44 | #include "llvm/IR/PassManager.h" |
||
45 | #include "llvm/Pass.h" |
||
46 | #include "llvm/Support/ModRef.h" |
||
47 | #include <cstdint> |
||
48 | #include <functional> |
||
49 | #include <memory> |
||
50 | #include <optional> |
||
51 | #include <vector> |
||
52 | |||
53 | namespace llvm { |
||
54 | |||
55 | class AnalysisUsage; |
||
56 | class AtomicCmpXchgInst; |
||
57 | class BasicAAResult; |
||
58 | class BasicBlock; |
||
59 | class CatchPadInst; |
||
60 | class CatchReturnInst; |
||
61 | class DominatorTree; |
||
62 | class FenceInst; |
||
63 | class Function; |
||
64 | class LoopInfo; |
||
65 | class PreservedAnalyses; |
||
66 | class TargetLibraryInfo; |
||
67 | class Value; |
||
68 | template <typename> class SmallPtrSetImpl; |
||
69 | |||
70 | /// The possible results of an alias query. |
||
71 | /// |
||
72 | /// These results are always computed between two MemoryLocation objects as |
||
73 | /// a query to some alias analysis. |
||
74 | /// |
||
75 | /// Note that these are unscoped enumerations because we would like to support |
||
76 | /// implicitly testing a result for the existence of any possible aliasing with |
||
77 | /// a conversion to bool, but an "enum class" doesn't support this. The |
||
78 | /// canonical names from the literature are suffixed and unique anyways, and so |
||
79 | /// they serve as global constants in LLVM for these results. |
||
80 | /// |
||
81 | /// See docs/AliasAnalysis.html for more information on the specific meanings |
||
82 | /// of these values. |
||
83 | class AliasResult { |
||
84 | private: |
||
85 | static const int OffsetBits = 23; |
||
86 | static const int AliasBits = 8; |
||
87 | static_assert(AliasBits + 1 + OffsetBits <= 32, |
||
88 | "AliasResult size is intended to be 4 bytes!"); |
||
89 | |||
90 | unsigned int Alias : AliasBits; |
||
91 | unsigned int HasOffset : 1; |
||
92 | signed int Offset : OffsetBits; |
||
93 | |||
94 | public: |
||
95 | enum Kind : uint8_t { |
||
96 | /// The two locations do not alias at all. |
||
97 | /// |
||
98 | /// This value is arranged to convert to false, while all other values |
||
99 | /// convert to true. This allows a boolean context to convert the result to |
||
100 | /// a binary flag indicating whether there is the possibility of aliasing. |
||
101 | NoAlias = 0, |
||
102 | /// The two locations may or may not alias. This is the least precise |
||
103 | /// result. |
||
104 | MayAlias, |
||
105 | /// The two locations alias, but only due to a partial overlap. |
||
106 | PartialAlias, |
||
107 | /// The two locations precisely alias each other. |
||
108 | MustAlias, |
||
109 | }; |
||
110 | static_assert(MustAlias < (1 << AliasBits), |
||
111 | "Not enough bit field size for the enum!"); |
||
112 | |||
113 | explicit AliasResult() = delete; |
||
114 | constexpr AliasResult(const Kind &Alias) |
||
115 | : Alias(Alias), HasOffset(false), Offset(0) {} |
||
116 | |||
117 | operator Kind() const { return static_cast<Kind>(Alias); } |
||
118 | |||
119 | bool operator==(const AliasResult &Other) const { |
||
120 | return Alias == Other.Alias && HasOffset == Other.HasOffset && |
||
121 | Offset == Other.Offset; |
||
122 | } |
||
123 | bool operator!=(const AliasResult &Other) const { return !(*this == Other); } |
||
124 | |||
125 | bool operator==(Kind K) const { return Alias == K; } |
||
126 | bool operator!=(Kind K) const { return !(*this == K); } |
||
127 | |||
128 | constexpr bool hasOffset() const { return HasOffset; } |
||
129 | constexpr int32_t getOffset() const { |
||
130 | assert(HasOffset && "No offset!"); |
||
131 | return Offset; |
||
132 | } |
||
133 | void setOffset(int32_t NewOffset) { |
||
134 | if (isInt<OffsetBits>(NewOffset)) { |
||
135 | HasOffset = true; |
||
136 | Offset = NewOffset; |
||
137 | } |
||
138 | } |
||
139 | |||
140 | /// Helper for processing AliasResult for swapped memory location pairs. |
||
141 | void swap(bool DoSwap = true) { |
||
142 | if (DoSwap && hasOffset()) |
||
143 | setOffset(-getOffset()); |
||
144 | } |
||
145 | }; |
||
146 | |||
147 | static_assert(sizeof(AliasResult) == 4, |
||
148 | "AliasResult size is intended to be 4 bytes!"); |
||
149 | |||
150 | /// << operator for AliasResult. |
||
151 | raw_ostream &operator<<(raw_ostream &OS, AliasResult AR); |
||
152 | |||
153 | /// Virtual base class for providers of capture information. |
||
154 | struct CaptureInfo { |
||
155 | virtual ~CaptureInfo() = 0; |
||
156 | virtual bool isNotCapturedBeforeOrAt(const Value *Object, |
||
157 | const Instruction *I) = 0; |
||
158 | }; |
||
159 | |||
160 | /// Context-free CaptureInfo provider, which computes and caches whether an |
||
161 | /// object is captured in the function at all, but does not distinguish whether |
||
162 | /// it was captured before or after the context instruction. |
||
163 | class SimpleCaptureInfo final : public CaptureInfo { |
||
164 | SmallDenseMap<const Value *, bool, 8> IsCapturedCache; |
||
165 | |||
166 | public: |
||
167 | bool isNotCapturedBeforeOrAt(const Value *Object, |
||
168 | const Instruction *I) override; |
||
169 | }; |
||
170 | |||
171 | /// Context-sensitive CaptureInfo provider, which computes and caches the |
||
172 | /// earliest common dominator closure of all captures. It provides a good |
||
173 | /// approximation to a precise "captures before" analysis. |
||
174 | class EarliestEscapeInfo final : public CaptureInfo { |
||
175 | DominatorTree &DT; |
||
176 | const LoopInfo &LI; |
||
177 | |||
178 | /// Map from identified local object to an instruction before which it does |
||
179 | /// not escape, or nullptr if it never escapes. The "earliest" instruction |
||
180 | /// may be a conservative approximation, e.g. the first instruction in the |
||
181 | /// function is always a legal choice. |
||
182 | DenseMap<const Value *, Instruction *> EarliestEscapes; |
||
183 | |||
184 | /// Reverse map from instruction to the objects it is the earliest escape for. |
||
185 | /// This is used for cache invalidation purposes. |
||
186 | DenseMap<Instruction *, TinyPtrVector<const Value *>> Inst2Obj; |
||
187 | |||
188 | const SmallPtrSetImpl<const Value *> &EphValues; |
||
189 | |||
190 | public: |
||
191 | EarliestEscapeInfo(DominatorTree &DT, const LoopInfo &LI, |
||
192 | const SmallPtrSetImpl<const Value *> &EphValues) |
||
193 | : DT(DT), LI(LI), EphValues(EphValues) {} |
||
194 | |||
195 | bool isNotCapturedBeforeOrAt(const Value *Object, |
||
196 | const Instruction *I) override; |
||
197 | |||
198 | void removeInstruction(Instruction *I); |
||
199 | }; |
||
200 | |||
201 | /// Cache key for BasicAA results. It only includes the pointer and size from |
||
202 | /// MemoryLocation, as BasicAA is AATags independent. Additionally, it includes |
||
203 | /// the value of MayBeCrossIteration, which may affect BasicAA results. |
||
204 | struct AACacheLoc { |
||
205 | using PtrTy = PointerIntPair<const Value *, 1, bool>; |
||
206 | PtrTy Ptr; |
||
207 | LocationSize Size; |
||
208 | |||
209 | AACacheLoc(PtrTy Ptr, LocationSize Size) : Ptr(Ptr), Size(Size) {} |
||
210 | AACacheLoc(const Value *Ptr, LocationSize Size, bool MayBeCrossIteration) |
||
211 | : Ptr(Ptr, MayBeCrossIteration), Size(Size) {} |
||
212 | }; |
||
213 | |||
214 | template <> struct DenseMapInfo<AACacheLoc> { |
||
215 | static inline AACacheLoc getEmptyKey() { |
||
216 | return {DenseMapInfo<AACacheLoc::PtrTy>::getEmptyKey(), |
||
217 | DenseMapInfo<LocationSize>::getEmptyKey()}; |
||
218 | } |
||
219 | static inline AACacheLoc getTombstoneKey() { |
||
220 | return {DenseMapInfo<AACacheLoc::PtrTy>::getTombstoneKey(), |
||
221 | DenseMapInfo<LocationSize>::getTombstoneKey()}; |
||
222 | } |
||
223 | static unsigned getHashValue(const AACacheLoc &Val) { |
||
224 | return DenseMapInfo<AACacheLoc::PtrTy>::getHashValue(Val.Ptr) ^ |
||
225 | DenseMapInfo<LocationSize>::getHashValue(Val.Size); |
||
226 | } |
||
227 | static bool isEqual(const AACacheLoc &LHS, const AACacheLoc &RHS) { |
||
228 | return LHS.Ptr == RHS.Ptr && LHS.Size == RHS.Size; |
||
229 | } |
||
230 | }; |
||
231 | |||
232 | class AAResults; |
||
233 | |||
234 | /// This class stores info we want to provide to or retain within an alias |
||
235 | /// query. By default, the root query is stateless and starts with a freshly |
||
236 | /// constructed info object. Specific alias analyses can use this query info to |
||
237 | /// store per-query state that is important for recursive or nested queries to |
||
238 | /// avoid recomputing. To enable preserving this state across multiple queries |
||
239 | /// where safe (due to the IR not changing), use a `BatchAAResults` wrapper. |
||
240 | /// The information stored in an `AAQueryInfo` is currently limitted to the |
||
241 | /// caches used by BasicAA, but can further be extended to fit other AA needs. |
||
242 | class AAQueryInfo { |
||
243 | public: |
||
244 | using LocPair = std::pair<AACacheLoc, AACacheLoc>; |
||
245 | struct CacheEntry { |
||
246 | AliasResult Result; |
||
247 | /// Number of times a NoAlias assumption has been used. |
||
248 | /// 0 for assumptions that have not been used, -1 for definitive results. |
||
249 | int NumAssumptionUses; |
||
250 | /// Whether this is a definitive (non-assumption) result. |
||
251 | bool isDefinitive() const { return NumAssumptionUses < 0; } |
||
252 | }; |
||
253 | |||
254 | // Alias analysis result aggregration using which this query is performed. |
||
255 | // Can be used to perform recursive queries. |
||
256 | AAResults &AAR; |
||
257 | |||
258 | using AliasCacheT = SmallDenseMap<LocPair, CacheEntry, 8>; |
||
259 | AliasCacheT AliasCache; |
||
260 | |||
261 | CaptureInfo *CI; |
||
262 | |||
263 | /// Query depth used to distinguish recursive queries. |
||
264 | unsigned Depth = 0; |
||
265 | |||
266 | /// How many active NoAlias assumption uses there are. |
||
267 | int NumAssumptionUses = 0; |
||
268 | |||
269 | /// Location pairs for which an assumption based result is currently stored. |
||
270 | /// Used to remove all potentially incorrect results from the cache if an |
||
271 | /// assumption is disproven. |
||
272 | SmallVector<AAQueryInfo::LocPair, 4> AssumptionBasedResults; |
||
273 | |||
274 | /// Tracks whether the accesses may be on different cycle iterations. |
||
275 | /// |
||
276 | /// When interpret "Value" pointer equality as value equality we need to make |
||
277 | /// sure that the "Value" is not part of a cycle. Otherwise, two uses could |
||
278 | /// come from different "iterations" of a cycle and see different values for |
||
279 | /// the same "Value" pointer. |
||
280 | /// |
||
281 | /// The following example shows the problem: |
||
282 | /// %p = phi(%alloca1, %addr2) |
||
283 | /// %l = load %ptr |
||
284 | /// %addr1 = gep, %alloca2, 0, %l |
||
285 | /// %addr2 = gep %alloca2, 0, (%l + 1) |
||
286 | /// alias(%p, %addr1) -> MayAlias ! |
||
287 | /// store %l, ... |
||
288 | bool MayBeCrossIteration = false; |
||
289 | |||
290 | AAQueryInfo(AAResults &AAR, CaptureInfo *CI) : AAR(AAR), CI(CI) {} |
||
291 | }; |
||
292 | |||
293 | /// AAQueryInfo that uses SimpleCaptureInfo. |
||
294 | class SimpleAAQueryInfo : public AAQueryInfo { |
||
295 | SimpleCaptureInfo CI; |
||
296 | |||
297 | public: |
||
298 | SimpleAAQueryInfo(AAResults &AAR) : AAQueryInfo(AAR, &CI) {} |
||
299 | }; |
||
300 | |||
301 | class BatchAAResults; |
||
302 | |||
303 | class AAResults { |
||
304 | public: |
||
305 | // Make these results default constructable and movable. We have to spell |
||
306 | // these out because MSVC won't synthesize them. |
||
307 | AAResults(const TargetLibraryInfo &TLI) : TLI(TLI) {} |
||
308 | AAResults(AAResults &&Arg); |
||
309 | ~AAResults(); |
||
310 | |||
311 | /// Register a specific AA result. |
||
312 | template <typename AAResultT> void addAAResult(AAResultT &AAResult) { |
||
313 | // FIXME: We should use a much lighter weight system than the usual |
||
314 | // polymorphic pattern because we don't own AAResult. It should |
||
315 | // ideally involve two pointers and no separate allocation. |
||
316 | AAs.emplace_back(new Model<AAResultT>(AAResult, *this)); |
||
317 | } |
||
318 | |||
319 | /// Register a function analysis ID that the results aggregation depends on. |
||
320 | /// |
||
321 | /// This is used in the new pass manager to implement the invalidation logic |
||
322 | /// where we must invalidate the results aggregation if any of our component |
||
323 | /// analyses become invalid. |
||
324 | void addAADependencyID(AnalysisKey *ID) { AADeps.push_back(ID); } |
||
325 | |||
326 | /// Handle invalidation events in the new pass manager. |
||
327 | /// |
||
328 | /// The aggregation is invalidated if any of the underlying analyses is |
||
329 | /// invalidated. |
||
330 | bool invalidate(Function &F, const PreservedAnalyses &PA, |
||
331 | FunctionAnalysisManager::Invalidator &Inv); |
||
332 | |||
333 | //===--------------------------------------------------------------------===// |
||
334 | /// \name Alias Queries |
||
335 | /// @{ |
||
336 | |||
337 | /// The main low level interface to the alias analysis implementation. |
||
338 | /// Returns an AliasResult indicating whether the two pointers are aliased to |
||
339 | /// each other. This is the interface that must be implemented by specific |
||
340 | /// alias analysis implementations. |
||
341 | AliasResult alias(const MemoryLocation &LocA, const MemoryLocation &LocB); |
||
342 | |||
343 | /// A convenience wrapper around the primary \c alias interface. |
||
344 | AliasResult alias(const Value *V1, LocationSize V1Size, const Value *V2, |
||
345 | LocationSize V2Size) { |
||
346 | return alias(MemoryLocation(V1, V1Size), MemoryLocation(V2, V2Size)); |
||
347 | } |
||
348 | |||
349 | /// A convenience wrapper around the primary \c alias interface. |
||
350 | AliasResult alias(const Value *V1, const Value *V2) { |
||
351 | return alias(MemoryLocation::getBeforeOrAfter(V1), |
||
352 | MemoryLocation::getBeforeOrAfter(V2)); |
||
353 | } |
||
354 | |||
355 | /// A trivial helper function to check to see if the specified pointers are |
||
356 | /// no-alias. |
||
357 | bool isNoAlias(const MemoryLocation &LocA, const MemoryLocation &LocB) { |
||
358 | return alias(LocA, LocB) == AliasResult::NoAlias; |
||
359 | } |
||
360 | |||
361 | /// A convenience wrapper around the \c isNoAlias helper interface. |
||
362 | bool isNoAlias(const Value *V1, LocationSize V1Size, const Value *V2, |
||
363 | LocationSize V2Size) { |
||
364 | return isNoAlias(MemoryLocation(V1, V1Size), MemoryLocation(V2, V2Size)); |
||
365 | } |
||
366 | |||
367 | /// A convenience wrapper around the \c isNoAlias helper interface. |
||
368 | bool isNoAlias(const Value *V1, const Value *V2) { |
||
369 | return isNoAlias(MemoryLocation::getBeforeOrAfter(V1), |
||
370 | MemoryLocation::getBeforeOrAfter(V2)); |
||
371 | } |
||
372 | |||
373 | /// A trivial helper function to check to see if the specified pointers are |
||
374 | /// must-alias. |
||
375 | bool isMustAlias(const MemoryLocation &LocA, const MemoryLocation &LocB) { |
||
376 | return alias(LocA, LocB) == AliasResult::MustAlias; |
||
377 | } |
||
378 | |||
379 | /// A convenience wrapper around the \c isMustAlias helper interface. |
||
380 | bool isMustAlias(const Value *V1, const Value *V2) { |
||
381 | return alias(V1, LocationSize::precise(1), V2, LocationSize::precise(1)) == |
||
382 | AliasResult::MustAlias; |
||
383 | } |
||
384 | |||
385 | /// Checks whether the given location points to constant memory, or if |
||
386 | /// \p OrLocal is true whether it points to a local alloca. |
||
387 | bool pointsToConstantMemory(const MemoryLocation &Loc, bool OrLocal = false) { |
||
388 | return isNoModRef(getModRefInfoMask(Loc, OrLocal)); |
||
389 | } |
||
390 | |||
391 | /// A convenience wrapper around the primary \c pointsToConstantMemory |
||
392 | /// interface. |
||
393 | bool pointsToConstantMemory(const Value *P, bool OrLocal = false) { |
||
394 | return pointsToConstantMemory(MemoryLocation::getBeforeOrAfter(P), OrLocal); |
||
395 | } |
||
396 | |||
397 | /// @} |
||
398 | //===--------------------------------------------------------------------===// |
||
399 | /// \name Simple mod/ref information |
||
400 | /// @{ |
||
401 | |||
402 | /// Returns a bitmask that should be unconditionally applied to the ModRef |
||
403 | /// info of a memory location. This allows us to eliminate Mod and/or Ref |
||
404 | /// from the ModRef info based on the knowledge that the memory location |
||
405 | /// points to constant and/or locally-invariant memory. |
||
406 | /// |
||
407 | /// If IgnoreLocals is true, then this method returns NoModRef for memory |
||
408 | /// that points to a local alloca. |
||
409 | ModRefInfo getModRefInfoMask(const MemoryLocation &Loc, |
||
410 | bool IgnoreLocals = false); |
||
411 | |||
412 | /// A convenience wrapper around the primary \c getModRefInfoMask |
||
413 | /// interface. |
||
414 | ModRefInfo getModRefInfoMask(const Value *P, bool IgnoreLocals = false) { |
||
415 | return getModRefInfoMask(MemoryLocation::getBeforeOrAfter(P), IgnoreLocals); |
||
416 | } |
||
417 | |||
418 | /// Get the ModRef info associated with a pointer argument of a call. The |
||
419 | /// result's bits are set to indicate the allowed aliasing ModRef kinds. Note |
||
420 | /// that these bits do not necessarily account for the overall behavior of |
||
421 | /// the function, but rather only provide additional per-argument |
||
422 | /// information. |
||
423 | ModRefInfo getArgModRefInfo(const CallBase *Call, unsigned ArgIdx); |
||
424 | |||
425 | /// Return the behavior of the given call site. |
||
426 | MemoryEffects getMemoryEffects(const CallBase *Call); |
||
427 | |||
428 | /// Return the behavior when calling the given function. |
||
429 | MemoryEffects getMemoryEffects(const Function *F); |
||
430 | |||
431 | /// Checks if the specified call is known to never read or write memory. |
||
432 | /// |
||
433 | /// Note that if the call only reads from known-constant memory, it is also |
||
434 | /// legal to return true. Also, calls that unwind the stack are legal for |
||
435 | /// this predicate. |
||
436 | /// |
||
437 | /// Many optimizations (such as CSE and LICM) can be performed on such calls |
||
438 | /// without worrying about aliasing properties, and many calls have this |
||
439 | /// property (e.g. calls to 'sin' and 'cos'). |
||
440 | /// |
||
441 | /// This property corresponds to the GCC 'const' attribute. |
||
442 | bool doesNotAccessMemory(const CallBase *Call) { |
||
443 | return getMemoryEffects(Call).doesNotAccessMemory(); |
||
444 | } |
||
445 | |||
446 | /// Checks if the specified function is known to never read or write memory. |
||
447 | /// |
||
448 | /// Note that if the function only reads from known-constant memory, it is |
||
449 | /// also legal to return true. Also, function that unwind the stack are legal |
||
450 | /// for this predicate. |
||
451 | /// |
||
452 | /// Many optimizations (such as CSE and LICM) can be performed on such calls |
||
453 | /// to such functions without worrying about aliasing properties, and many |
||
454 | /// functions have this property (e.g. 'sin' and 'cos'). |
||
455 | /// |
||
456 | /// This property corresponds to the GCC 'const' attribute. |
||
457 | bool doesNotAccessMemory(const Function *F) { |
||
458 | return getMemoryEffects(F).doesNotAccessMemory(); |
||
459 | } |
||
460 | |||
461 | /// Checks if the specified call is known to only read from non-volatile |
||
462 | /// memory (or not access memory at all). |
||
463 | /// |
||
464 | /// Calls that unwind the stack are legal for this predicate. |
||
465 | /// |
||
466 | /// This property allows many common optimizations to be performed in the |
||
467 | /// absence of interfering store instructions, such as CSE of strlen calls. |
||
468 | /// |
||
469 | /// This property corresponds to the GCC 'pure' attribute. |
||
470 | bool onlyReadsMemory(const CallBase *Call) { |
||
471 | return getMemoryEffects(Call).onlyReadsMemory(); |
||
472 | } |
||
473 | |||
474 | /// Checks if the specified function is known to only read from non-volatile |
||
475 | /// memory (or not access memory at all). |
||
476 | /// |
||
477 | /// Functions that unwind the stack are legal for this predicate. |
||
478 | /// |
||
479 | /// This property allows many common optimizations to be performed in the |
||
480 | /// absence of interfering store instructions, such as CSE of strlen calls. |
||
481 | /// |
||
482 | /// This property corresponds to the GCC 'pure' attribute. |
||
483 | bool onlyReadsMemory(const Function *F) { |
||
484 | return getMemoryEffects(F).onlyReadsMemory(); |
||
485 | } |
||
486 | |||
487 | /// Check whether or not an instruction may read or write the optionally |
||
488 | /// specified memory location. |
||
489 | /// |
||
490 | /// |
||
491 | /// An instruction that doesn't read or write memory may be trivially LICM'd |
||
492 | /// for example. |
||
493 | /// |
||
494 | /// For function calls, this delegates to the alias-analysis specific |
||
495 | /// call-site mod-ref behavior queries. Otherwise it delegates to the specific |
||
496 | /// helpers above. |
||
497 | ModRefInfo getModRefInfo(const Instruction *I, |
||
498 | const std::optional<MemoryLocation> &OptLoc) { |
||
499 | SimpleAAQueryInfo AAQIP(*this); |
||
500 | return getModRefInfo(I, OptLoc, AAQIP); |
||
501 | } |
||
502 | |||
503 | /// A convenience wrapper for constructing the memory location. |
||
504 | ModRefInfo getModRefInfo(const Instruction *I, const Value *P, |
||
505 | LocationSize Size) { |
||
506 | return getModRefInfo(I, MemoryLocation(P, Size)); |
||
507 | } |
||
508 | |||
509 | /// Return information about whether a call and an instruction may refer to |
||
510 | /// the same memory locations. |
||
511 | ModRefInfo getModRefInfo(const Instruction *I, const CallBase *Call); |
||
512 | |||
513 | /// Return information about whether a particular call site modifies |
||
514 | /// or reads the specified memory location \p MemLoc before instruction \p I |
||
515 | /// in a BasicBlock. |
||
516 | ModRefInfo callCapturesBefore(const Instruction *I, |
||
517 | const MemoryLocation &MemLoc, |
||
518 | DominatorTree *DT) { |
||
519 | SimpleAAQueryInfo AAQIP(*this); |
||
520 | return callCapturesBefore(I, MemLoc, DT, AAQIP); |
||
521 | } |
||
522 | |||
523 | /// A convenience wrapper to synthesize a memory location. |
||
524 | ModRefInfo callCapturesBefore(const Instruction *I, const Value *P, |
||
525 | LocationSize Size, DominatorTree *DT) { |
||
526 | return callCapturesBefore(I, MemoryLocation(P, Size), DT); |
||
527 | } |
||
528 | |||
529 | /// @} |
||
530 | //===--------------------------------------------------------------------===// |
||
531 | /// \name Higher level methods for querying mod/ref information. |
||
532 | /// @{ |
||
533 | |||
534 | /// Check if it is possible for execution of the specified basic block to |
||
535 | /// modify the location Loc. |
||
536 | bool canBasicBlockModify(const BasicBlock &BB, const MemoryLocation &Loc); |
||
537 | |||
538 | /// A convenience wrapper synthesizing a memory location. |
||
539 | bool canBasicBlockModify(const BasicBlock &BB, const Value *P, |
||
540 | LocationSize Size) { |
||
541 | return canBasicBlockModify(BB, MemoryLocation(P, Size)); |
||
542 | } |
||
543 | |||
544 | /// Check if it is possible for the execution of the specified instructions |
||
545 | /// to mod\ref (according to the mode) the location Loc. |
||
546 | /// |
||
547 | /// The instructions to consider are all of the instructions in the range of |
||
548 | /// [I1,I2] INCLUSIVE. I1 and I2 must be in the same basic block. |
||
549 | bool canInstructionRangeModRef(const Instruction &I1, const Instruction &I2, |
||
550 | const MemoryLocation &Loc, |
||
551 | const ModRefInfo Mode); |
||
552 | |||
553 | /// A convenience wrapper synthesizing a memory location. |
||
554 | bool canInstructionRangeModRef(const Instruction &I1, const Instruction &I2, |
||
555 | const Value *Ptr, LocationSize Size, |
||
556 | const ModRefInfo Mode) { |
||
557 | return canInstructionRangeModRef(I1, I2, MemoryLocation(Ptr, Size), Mode); |
||
558 | } |
||
559 | |||
560 | // CtxI can be nullptr, in which case the query is whether or not the aliasing |
||
561 | // relationship holds through the entire function. |
||
562 | AliasResult alias(const MemoryLocation &LocA, const MemoryLocation &LocB, |
||
563 | AAQueryInfo &AAQI, const Instruction *CtxI = nullptr); |
||
564 | |||
565 | bool pointsToConstantMemory(const MemoryLocation &Loc, AAQueryInfo &AAQI, |
||
566 | bool OrLocal = false); |
||
567 | ModRefInfo getModRefInfoMask(const MemoryLocation &Loc, AAQueryInfo &AAQI, |
||
568 | bool IgnoreLocals = false); |
||
569 | ModRefInfo getModRefInfo(const Instruction *I, const CallBase *Call2, |
||
570 | AAQueryInfo &AAQIP); |
||
571 | ModRefInfo getModRefInfo(const CallBase *Call, const MemoryLocation &Loc, |
||
572 | AAQueryInfo &AAQI); |
||
573 | ModRefInfo getModRefInfo(const CallBase *Call1, const CallBase *Call2, |
||
574 | AAQueryInfo &AAQI); |
||
575 | ModRefInfo getModRefInfo(const VAArgInst *V, const MemoryLocation &Loc, |
||
576 | AAQueryInfo &AAQI); |
||
577 | ModRefInfo getModRefInfo(const LoadInst *L, const MemoryLocation &Loc, |
||
578 | AAQueryInfo &AAQI); |
||
579 | ModRefInfo getModRefInfo(const StoreInst *S, const MemoryLocation &Loc, |
||
580 | AAQueryInfo &AAQI); |
||
581 | ModRefInfo getModRefInfo(const FenceInst *S, const MemoryLocation &Loc, |
||
582 | AAQueryInfo &AAQI); |
||
583 | ModRefInfo getModRefInfo(const AtomicCmpXchgInst *CX, |
||
584 | const MemoryLocation &Loc, AAQueryInfo &AAQI); |
||
585 | ModRefInfo getModRefInfo(const AtomicRMWInst *RMW, const MemoryLocation &Loc, |
||
586 | AAQueryInfo &AAQI); |
||
587 | ModRefInfo getModRefInfo(const CatchPadInst *I, const MemoryLocation &Loc, |
||
588 | AAQueryInfo &AAQI); |
||
589 | ModRefInfo getModRefInfo(const CatchReturnInst *I, const MemoryLocation &Loc, |
||
590 | AAQueryInfo &AAQI); |
||
591 | ModRefInfo getModRefInfo(const Instruction *I, |
||
592 | const std::optional<MemoryLocation> &OptLoc, |
||
593 | AAQueryInfo &AAQIP); |
||
594 | ModRefInfo callCapturesBefore(const Instruction *I, |
||
595 | const MemoryLocation &MemLoc, DominatorTree *DT, |
||
596 | AAQueryInfo &AAQIP); |
||
597 | MemoryEffects getMemoryEffects(const CallBase *Call, AAQueryInfo &AAQI); |
||
598 | |||
599 | private: |
||
600 | class Concept; |
||
601 | |||
602 | template <typename T> class Model; |
||
603 | |||
604 | friend class AAResultBase; |
||
605 | |||
606 | const TargetLibraryInfo &TLI; |
||
607 | |||
608 | std::vector<std::unique_ptr<Concept>> AAs; |
||
609 | |||
610 | std::vector<AnalysisKey *> AADeps; |
||
611 | |||
612 | friend class BatchAAResults; |
||
613 | }; |
||
614 | |||
615 | /// This class is a wrapper over an AAResults, and it is intended to be used |
||
616 | /// only when there are no IR changes inbetween queries. BatchAAResults is |
||
617 | /// reusing the same `AAQueryInfo` to preserve the state across queries, |
||
618 | /// esentially making AA work in "batch mode". The internal state cannot be |
||
619 | /// cleared, so to go "out-of-batch-mode", the user must either use AAResults, |
||
620 | /// or create a new BatchAAResults. |
||
621 | class BatchAAResults { |
||
622 | AAResults &AA; |
||
623 | AAQueryInfo AAQI; |
||
624 | SimpleCaptureInfo SimpleCI; |
||
625 | |||
626 | public: |
||
627 | BatchAAResults(AAResults &AAR) : AA(AAR), AAQI(AAR, &SimpleCI) {} |
||
628 | BatchAAResults(AAResults &AAR, CaptureInfo *CI) : AA(AAR), AAQI(AAR, CI) {} |
||
629 | |||
630 | AliasResult alias(const MemoryLocation &LocA, const MemoryLocation &LocB) { |
||
631 | return AA.alias(LocA, LocB, AAQI); |
||
632 | } |
||
633 | bool pointsToConstantMemory(const MemoryLocation &Loc, bool OrLocal = false) { |
||
634 | return AA.pointsToConstantMemory(Loc, AAQI, OrLocal); |
||
635 | } |
||
636 | ModRefInfo getModRefInfoMask(const MemoryLocation &Loc, |
||
637 | bool IgnoreLocals = false) { |
||
638 | return AA.getModRefInfoMask(Loc, AAQI, IgnoreLocals); |
||
639 | } |
||
640 | ModRefInfo getModRefInfo(const Instruction *I, |
||
641 | const std::optional<MemoryLocation> &OptLoc) { |
||
642 | return AA.getModRefInfo(I, OptLoc, AAQI); |
||
643 | } |
||
644 | ModRefInfo getModRefInfo(const Instruction *I, const CallBase *Call2) { |
||
645 | return AA.getModRefInfo(I, Call2, AAQI); |
||
646 | } |
||
647 | ModRefInfo getArgModRefInfo(const CallBase *Call, unsigned ArgIdx) { |
||
648 | return AA.getArgModRefInfo(Call, ArgIdx); |
||
649 | } |
||
650 | MemoryEffects getMemoryEffects(const CallBase *Call) { |
||
651 | return AA.getMemoryEffects(Call, AAQI); |
||
652 | } |
||
653 | bool isMustAlias(const MemoryLocation &LocA, const MemoryLocation &LocB) { |
||
654 | return alias(LocA, LocB) == AliasResult::MustAlias; |
||
655 | } |
||
656 | bool isMustAlias(const Value *V1, const Value *V2) { |
||
657 | return alias(MemoryLocation(V1, LocationSize::precise(1)), |
||
658 | MemoryLocation(V2, LocationSize::precise(1))) == |
||
659 | AliasResult::MustAlias; |
||
660 | } |
||
661 | ModRefInfo callCapturesBefore(const Instruction *I, |
||
662 | const MemoryLocation &MemLoc, |
||
663 | DominatorTree *DT) { |
||
664 | return AA.callCapturesBefore(I, MemLoc, DT, AAQI); |
||
665 | } |
||
666 | |||
667 | /// Assume that values may come from different cycle iterations. |
||
668 | void enableCrossIterationMode() { |
||
669 | AAQI.MayBeCrossIteration = true; |
||
670 | } |
||
671 | }; |
||
672 | |||
673 | /// Temporary typedef for legacy code that uses a generic \c AliasAnalysis |
||
674 | /// pointer or reference. |
||
675 | using AliasAnalysis = AAResults; |
||
676 | |||
677 | /// A private abstract base class describing the concept of an individual alias |
||
678 | /// analysis implementation. |
||
679 | /// |
||
680 | /// This interface is implemented by any \c Model instantiation. It is also the |
||
681 | /// interface which a type used to instantiate the model must provide. |
||
682 | /// |
||
683 | /// All of these methods model methods by the same name in the \c |
||
684 | /// AAResults class. Only differences and specifics to how the |
||
685 | /// implementations are called are documented here. |
||
686 | class AAResults::Concept { |
||
687 | public: |
||
688 | virtual ~Concept() = 0; |
||
689 | |||
690 | //===--------------------------------------------------------------------===// |
||
691 | /// \name Alias Queries |
||
692 | /// @{ |
||
693 | |||
694 | /// The main low level interface to the alias analysis implementation. |
||
695 | /// Returns an AliasResult indicating whether the two pointers are aliased to |
||
696 | /// each other. This is the interface that must be implemented by specific |
||
697 | /// alias analysis implementations. |
||
698 | virtual AliasResult alias(const MemoryLocation &LocA, |
||
699 | const MemoryLocation &LocB, AAQueryInfo &AAQI, |
||
700 | const Instruction *CtxI) = 0; |
||
701 | |||
702 | /// @} |
||
703 | //===--------------------------------------------------------------------===// |
||
704 | /// \name Simple mod/ref information |
||
705 | /// @{ |
||
706 | |||
707 | /// Returns a bitmask that should be unconditionally applied to the ModRef |
||
708 | /// info of a memory location. This allows us to eliminate Mod and/or Ref from |
||
709 | /// the ModRef info based on the knowledge that the memory location points to |
||
710 | /// constant and/or locally-invariant memory. |
||
711 | virtual ModRefInfo getModRefInfoMask(const MemoryLocation &Loc, |
||
712 | AAQueryInfo &AAQI, |
||
713 | bool IgnoreLocals) = 0; |
||
714 | |||
715 | /// Get the ModRef info associated with a pointer argument of a callsite. The |
||
716 | /// result's bits are set to indicate the allowed aliasing ModRef kinds. Note |
||
717 | /// that these bits do not necessarily account for the overall behavior of |
||
718 | /// the function, but rather only provide additional per-argument |
||
719 | /// information. |
||
720 | virtual ModRefInfo getArgModRefInfo(const CallBase *Call, |
||
721 | unsigned ArgIdx) = 0; |
||
722 | |||
723 | /// Return the behavior of the given call site. |
||
724 | virtual MemoryEffects getMemoryEffects(const CallBase *Call, |
||
725 | AAQueryInfo &AAQI) = 0; |
||
726 | |||
727 | /// Return the behavior when calling the given function. |
||
728 | virtual MemoryEffects getMemoryEffects(const Function *F) = 0; |
||
729 | |||
730 | /// getModRefInfo (for call sites) - Return information about whether |
||
731 | /// a particular call site modifies or reads the specified memory location. |
||
732 | virtual ModRefInfo getModRefInfo(const CallBase *Call, |
||
733 | const MemoryLocation &Loc, |
||
734 | AAQueryInfo &AAQI) = 0; |
||
735 | |||
736 | /// Return information about whether two call sites may refer to the same set |
||
737 | /// of memory locations. See the AA documentation for details: |
||
738 | /// http://llvm.org/docs/AliasAnalysis.html#ModRefInfo |
||
739 | virtual ModRefInfo getModRefInfo(const CallBase *Call1, const CallBase *Call2, |
||
740 | AAQueryInfo &AAQI) = 0; |
||
741 | |||
742 | /// @} |
||
743 | }; |
||
744 | |||
745 | /// A private class template which derives from \c Concept and wraps some other |
||
746 | /// type. |
||
747 | /// |
||
748 | /// This models the concept by directly forwarding each interface point to the |
||
749 | /// wrapped type which must implement a compatible interface. This provides |
||
750 | /// a type erased binding. |
||
751 | template <typename AAResultT> class AAResults::Model final : public Concept { |
||
752 | AAResultT &Result; |
||
753 | |||
754 | public: |
||
755 | explicit Model(AAResultT &Result, AAResults &AAR) : Result(Result) {} |
||
756 | ~Model() override = default; |
||
757 | |||
758 | AliasResult alias(const MemoryLocation &LocA, const MemoryLocation &LocB, |
||
759 | AAQueryInfo &AAQI, const Instruction *CtxI) override { |
||
760 | return Result.alias(LocA, LocB, AAQI, CtxI); |
||
761 | } |
||
762 | |||
763 | ModRefInfo getModRefInfoMask(const MemoryLocation &Loc, AAQueryInfo &AAQI, |
||
764 | bool IgnoreLocals) override { |
||
765 | return Result.getModRefInfoMask(Loc, AAQI, IgnoreLocals); |
||
766 | } |
||
767 | |||
768 | ModRefInfo getArgModRefInfo(const CallBase *Call, unsigned ArgIdx) override { |
||
769 | return Result.getArgModRefInfo(Call, ArgIdx); |
||
770 | } |
||
771 | |||
772 | MemoryEffects getMemoryEffects(const CallBase *Call, |
||
773 | AAQueryInfo &AAQI) override { |
||
774 | return Result.getMemoryEffects(Call, AAQI); |
||
775 | } |
||
776 | |||
777 | MemoryEffects getMemoryEffects(const Function *F) override { |
||
778 | return Result.getMemoryEffects(F); |
||
779 | } |
||
780 | |||
781 | ModRefInfo getModRefInfo(const CallBase *Call, const MemoryLocation &Loc, |
||
782 | AAQueryInfo &AAQI) override { |
||
783 | return Result.getModRefInfo(Call, Loc, AAQI); |
||
784 | } |
||
785 | |||
786 | ModRefInfo getModRefInfo(const CallBase *Call1, const CallBase *Call2, |
||
787 | AAQueryInfo &AAQI) override { |
||
788 | return Result.getModRefInfo(Call1, Call2, AAQI); |
||
789 | } |
||
790 | }; |
||
791 | |||
792 | /// A base class to help implement the function alias analysis results concept. |
||
793 | /// |
||
794 | /// Because of the nature of many alias analysis implementations, they often |
||
795 | /// only implement a subset of the interface. This base class will attempt to |
||
796 | /// implement the remaining portions of the interface in terms of simpler forms |
||
797 | /// of the interface where possible, and otherwise provide conservatively |
||
798 | /// correct fallback implementations. |
||
799 | /// |
||
800 | /// Implementors of an alias analysis should derive from this class, and then |
||
801 | /// override specific methods that they wish to customize. There is no need to |
||
802 | /// use virtual anywhere. |
||
803 | class AAResultBase { |
||
804 | protected: |
||
805 | explicit AAResultBase() = default; |
||
806 | |||
807 | // Provide all the copy and move constructors so that derived types aren't |
||
808 | // constrained. |
||
809 | AAResultBase(const AAResultBase &Arg) {} |
||
810 | AAResultBase(AAResultBase &&Arg) {} |
||
811 | |||
812 | public: |
||
813 | AliasResult alias(const MemoryLocation &LocA, const MemoryLocation &LocB, |
||
814 | AAQueryInfo &AAQI, const Instruction *I) { |
||
815 | return AliasResult::MayAlias; |
||
816 | } |
||
817 | |||
818 | ModRefInfo getModRefInfoMask(const MemoryLocation &Loc, AAQueryInfo &AAQI, |
||
819 | bool IgnoreLocals) { |
||
820 | return ModRefInfo::ModRef; |
||
821 | } |
||
822 | |||
823 | ModRefInfo getArgModRefInfo(const CallBase *Call, unsigned ArgIdx) { |
||
824 | return ModRefInfo::ModRef; |
||
825 | } |
||
826 | |||
827 | MemoryEffects getMemoryEffects(const CallBase *Call, AAQueryInfo &AAQI) { |
||
828 | return MemoryEffects::unknown(); |
||
829 | } |
||
830 | |||
831 | MemoryEffects getMemoryEffects(const Function *F) { |
||
832 | return MemoryEffects::unknown(); |
||
833 | } |
||
834 | |||
835 | ModRefInfo getModRefInfo(const CallBase *Call, const MemoryLocation &Loc, |
||
836 | AAQueryInfo &AAQI) { |
||
837 | return ModRefInfo::ModRef; |
||
838 | } |
||
839 | |||
840 | ModRefInfo getModRefInfo(const CallBase *Call1, const CallBase *Call2, |
||
841 | AAQueryInfo &AAQI) { |
||
842 | return ModRefInfo::ModRef; |
||
843 | } |
||
844 | }; |
||
845 | |||
846 | /// Return true if this pointer is returned by a noalias function. |
||
847 | bool isNoAliasCall(const Value *V); |
||
848 | |||
849 | /// Return true if this pointer refers to a distinct and identifiable object. |
||
850 | /// This returns true for: |
||
851 | /// Global Variables and Functions (but not Global Aliases) |
||
852 | /// Allocas |
||
853 | /// ByVal and NoAlias Arguments |
||
854 | /// NoAlias returns (e.g. calls to malloc) |
||
855 | /// |
||
856 | bool isIdentifiedObject(const Value *V); |
||
857 | |||
858 | /// Return true if V is umabigously identified at the function-level. |
||
859 | /// Different IdentifiedFunctionLocals can't alias. |
||
860 | /// Further, an IdentifiedFunctionLocal can not alias with any function |
||
861 | /// arguments other than itself, which is not necessarily true for |
||
862 | /// IdentifiedObjects. |
||
863 | bool isIdentifiedFunctionLocal(const Value *V); |
||
864 | |||
865 | /// Returns true if the pointer is one which would have been considered an |
||
866 | /// escape by isNonEscapingLocalObject. |
||
867 | bool isEscapeSource(const Value *V); |
||
868 | |||
869 | /// Return true if Object memory is not visible after an unwind, in the sense |
||
870 | /// that program semantics cannot depend on Object containing any particular |
||
871 | /// value on unwind. If the RequiresNoCaptureBeforeUnwind out parameter is set |
||
872 | /// to true, then the memory is only not visible if the object has not been |
||
873 | /// captured prior to the unwind. Otherwise it is not visible even if captured. |
||
874 | bool isNotVisibleOnUnwind(const Value *Object, |
||
875 | bool &RequiresNoCaptureBeforeUnwind); |
||
876 | |||
877 | /// A manager for alias analyses. |
||
878 | /// |
||
879 | /// This class can have analyses registered with it and when run, it will run |
||
880 | /// all of them and aggregate their results into single AA results interface |
||
881 | /// that dispatches across all of the alias analysis results available. |
||
882 | /// |
||
883 | /// Note that the order in which analyses are registered is very significant. |
||
884 | /// That is the order in which the results will be aggregated and queried. |
||
885 | /// |
||
886 | /// This manager effectively wraps the AnalysisManager for registering alias |
||
887 | /// analyses. When you register your alias analysis with this manager, it will |
||
888 | /// ensure the analysis itself is registered with its AnalysisManager. |
||
889 | /// |
||
890 | /// The result of this analysis is only invalidated if one of the particular |
||
891 | /// aggregated AA results end up being invalidated. This removes the need to |
||
892 | /// explicitly preserve the results of `AAManager`. Note that analyses should no |
||
893 | /// longer be registered once the `AAManager` is run. |
||
894 | class AAManager : public AnalysisInfoMixin<AAManager> { |
||
895 | public: |
||
896 | using Result = AAResults; |
||
897 | |||
898 | /// Register a specific AA result. |
||
899 | template <typename AnalysisT> void registerFunctionAnalysis() { |
||
900 | ResultGetters.push_back(&getFunctionAAResultImpl<AnalysisT>); |
||
901 | } |
||
902 | |||
903 | /// Register a specific AA result. |
||
904 | template <typename AnalysisT> void registerModuleAnalysis() { |
||
905 | ResultGetters.push_back(&getModuleAAResultImpl<AnalysisT>); |
||
906 | } |
||
907 | |||
908 | Result run(Function &F, FunctionAnalysisManager &AM); |
||
909 | |||
910 | private: |
||
911 | friend AnalysisInfoMixin<AAManager>; |
||
912 | |||
913 | static AnalysisKey Key; |
||
914 | |||
915 | SmallVector<void (*)(Function &F, FunctionAnalysisManager &AM, |
||
916 | AAResults &AAResults), |
||
917 | 4> ResultGetters; |
||
918 | |||
919 | template <typename AnalysisT> |
||
920 | static void getFunctionAAResultImpl(Function &F, |
||
921 | FunctionAnalysisManager &AM, |
||
922 | AAResults &AAResults) { |
||
923 | AAResults.addAAResult(AM.template getResult<AnalysisT>(F)); |
||
924 | AAResults.addAADependencyID(AnalysisT::ID()); |
||
925 | } |
||
926 | |||
927 | template <typename AnalysisT> |
||
928 | static void getModuleAAResultImpl(Function &F, FunctionAnalysisManager &AM, |
||
929 | AAResults &AAResults) { |
||
930 | auto &MAMProxy = AM.getResult<ModuleAnalysisManagerFunctionProxy>(F); |
||
931 | if (auto *R = |
||
932 | MAMProxy.template getCachedResult<AnalysisT>(*F.getParent())) { |
||
933 | AAResults.addAAResult(*R); |
||
934 | MAMProxy |
||
935 | .template registerOuterAnalysisInvalidation<AnalysisT, AAManager>(); |
||
936 | } |
||
937 | } |
||
938 | }; |
||
939 | |||
940 | /// A wrapper pass to provide the legacy pass manager access to a suitably |
||
941 | /// prepared AAResults object. |
||
942 | class AAResultsWrapperPass : public FunctionPass { |
||
943 | std::unique_ptr<AAResults> AAR; |
||
944 | |||
945 | public: |
||
946 | static char ID; |
||
947 | |||
948 | AAResultsWrapperPass(); |
||
949 | |||
950 | AAResults &getAAResults() { return *AAR; } |
||
951 | const AAResults &getAAResults() const { return *AAR; } |
||
952 | |||
953 | bool runOnFunction(Function &F) override; |
||
954 | |||
955 | void getAnalysisUsage(AnalysisUsage &AU) const override; |
||
956 | }; |
||
957 | |||
958 | /// A wrapper pass for external alias analyses. This just squirrels away the |
||
959 | /// callback used to run any analyses and register their results. |
||
960 | struct ExternalAAWrapperPass : ImmutablePass { |
||
961 | using CallbackT = std::function<void(Pass &, Function &, AAResults &)>; |
||
962 | |||
963 | CallbackT CB; |
||
964 | |||
965 | static char ID; |
||
966 | |||
967 | ExternalAAWrapperPass(); |
||
968 | |||
969 | explicit ExternalAAWrapperPass(CallbackT CB); |
||
970 | |||
971 | void getAnalysisUsage(AnalysisUsage &AU) const override { |
||
972 | AU.setPreservesAll(); |
||
973 | } |
||
974 | }; |
||
975 | |||
976 | FunctionPass *createAAResultsWrapperPass(); |
||
977 | |||
978 | /// A wrapper pass around a callback which can be used to populate the |
||
979 | /// AAResults in the AAResultsWrapperPass from an external AA. |
||
980 | /// |
||
981 | /// The callback provided here will be used each time we prepare an AAResults |
||
982 | /// object, and will receive a reference to the function wrapper pass, the |
||
983 | /// function, and the AAResults object to populate. This should be used when |
||
984 | /// setting up a custom pass pipeline to inject a hook into the AA results. |
||
985 | ImmutablePass *createExternalAAWrapperPass( |
||
986 | std::function<void(Pass &, Function &, AAResults &)> Callback); |
||
987 | |||
988 | /// A helper for the legacy pass manager to create a \c AAResults |
||
989 | /// object populated to the best of our ability for a particular function when |
||
990 | /// inside of a \c ModulePass or a \c CallGraphSCCPass. |
||
991 | /// |
||
992 | /// If a \c ModulePass or a \c CallGraphSCCPass calls \p |
||
993 | /// createLegacyPMAAResults, it also needs to call \p addUsedAAAnalyses in \p |
||
994 | /// getAnalysisUsage. |
||
995 | AAResults createLegacyPMAAResults(Pass &P, Function &F, BasicAAResult &BAR); |
||
996 | |||
997 | /// A helper for the legacy pass manager to populate \p AU to add uses to make |
||
998 | /// sure the analyses required by \p createLegacyPMAAResults are available. |
||
999 | void getAAResultsAnalysisUsage(AnalysisUsage &AU); |
||
1000 | |||
1001 | } // end namespace llvm |
||
1002 | |||
1003 | #endif // LLVM_ANALYSIS_ALIASANALYSIS_H |