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