1 | //===- AMDGPUAliasAnalysis --------------------------------------*- 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 | /// \file |
9 | /// This is the AMGPU address space based alias analysis pass. |
10 | //===----------------------------------------------------------------------===// |
11 | |
12 | #ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPUALIASANALYSIS_H |
13 | #define LLVM_LIB_TARGET_AMDGPU_AMDGPUALIASANALYSIS_H |
14 | |
15 | #include "llvm/Analysis/AliasAnalysis.h" |
16 | |
17 | namespace llvm { |
18 | |
19 | class DataLayout; |
20 | class MemoryLocation; |
21 | |
22 | /// A simple AA result that uses TBAA metadata to answer queries. |
23 | class AMDGPUAAResult : public AAResultBase { |
24 | const DataLayout &DL; |
25 | |
26 | public: |
27 | explicit AMDGPUAAResult(const DataLayout &DL) : DL(DL) {} |
28 | AMDGPUAAResult(AMDGPUAAResult &&Arg) |
29 | : AAResultBase(std::move(Arg)), DL(Arg.DL) {} |
30 | |
31 | /// Handle invalidation events from the new pass manager. |
32 | /// |
33 | /// By definition, this result is stateless and so remains valid. |
34 | bool invalidate(Function &, const PreservedAnalyses &, |
35 | FunctionAnalysisManager::Invalidator &Inv) { |
36 | return false; |
37 | } |
38 | |
39 | AliasResult alias(const MemoryLocation &LocA, const MemoryLocation &LocB, |
40 | AAQueryInfo &AAQI, const Instruction *CtxI); |
41 | ModRefInfo getModRefInfoMask(const MemoryLocation &Loc, AAQueryInfo &AAQI, |
42 | bool IgnoreLocals); |
43 | }; |
44 | |
45 | /// Analysis pass providing a never-invalidated alias analysis result. |
46 | class AMDGPUAA : public AnalysisInfoMixin<AMDGPUAA> { |
47 | friend AnalysisInfoMixin<AMDGPUAA>; |
48 | |
49 | static AnalysisKey Key; |
50 | |
51 | public: |
52 | using Result = AMDGPUAAResult; |
53 | |
54 | AMDGPUAAResult run(Function &F, AnalysisManager<Function> &AM) { |
55 | return AMDGPUAAResult(F.getParent()->getDataLayout()); |
56 | } |
57 | }; |
58 | |
59 | /// Legacy wrapper pass to provide the AMDGPUAAResult object. |
60 | class AMDGPUAAWrapperPass : public ImmutablePass { |
61 | std::unique_ptr<AMDGPUAAResult> Result; |
62 | |
63 | public: |
64 | static char ID; |
65 | |
66 | AMDGPUAAWrapperPass(); |
67 | |
68 | AMDGPUAAResult &getResult() { return *Result; } |
69 | const AMDGPUAAResult &getResult() const { return *Result; } |
70 | |
71 | bool doInitialization(Module &M) override { |
72 | Result.reset(p: new AMDGPUAAResult(M.getDataLayout())); |
73 | return false; |
74 | } |
75 | |
76 | bool doFinalization(Module &M) override { |
77 | Result.reset(); |
78 | return false; |
79 | } |
80 | |
81 | void getAnalysisUsage(AnalysisUsage &AU) const override; |
82 | }; |
83 | |
84 | // Wrapper around ExternalAAWrapperPass so that the default constructor gets the |
85 | // callback. |
86 | class AMDGPUExternalAAWrapper : public ExternalAAWrapperPass { |
87 | public: |
88 | static char ID; |
89 | |
90 | AMDGPUExternalAAWrapper() : ExternalAAWrapperPass( |
91 | [](Pass &P, Function &, AAResults &AAR) { |
92 | if (auto *WrapperPass = P.getAnalysisIfAvailable<AMDGPUAAWrapperPass>()) |
93 | AAR.addAAResult(AAResult&: WrapperPass->getResult()); |
94 | }) {} |
95 | }; |
96 | |
97 | } // end namespace llvm |
98 | |
99 | #endif // LLVM_LIB_TARGET_AMDGPU_AMDGPUALIASANALYSIS_H |
100 | |