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
17namespace llvm {
18
19class MemoryLocation;
20
21class NVPTXAAResult : public AAResultBase {
22public:
23 NVPTXAAResult() {}
24 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 FunctionAnalysisManager::Invalidator &Inv) {
31 return false;
32 }
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 MemoryEffects getMemoryEffects(const CallBase *Call, AAQueryInfo &AAQI);
41
42 MemoryEffects getMemoryEffects(const Function *F) {
43 return MemoryEffects::unknown();
44 }
45};
46
47/// Analysis pass providing a never-invalidated alias analysis result.
48class NVPTXAA : public AnalysisInfoMixin<NVPTXAA> {
49 friend AnalysisInfoMixin<NVPTXAA>;
50
51 static AnalysisKey Key;
52
53public:
54 using Result = NVPTXAAResult;
55
56 NVPTXAAResult run(Function &F, AnalysisManager<Function> &AM) {
57 return NVPTXAAResult();
58 }
59};
60
61/// Legacy wrapper pass to provide the NVPTXAAResult object.
62class NVPTXAAWrapperPass : public ImmutablePass {
63 std::unique_ptr<NVPTXAAResult> Result;
64
65public:
66 static char ID;
67
68 NVPTXAAWrapperPass();
69
70 NVPTXAAResult &getResult() { return *Result; }
71 const NVPTXAAResult &getResult() const { return *Result; }
72
73 bool doInitialization(Module &M) override {
74 Result.reset(p: new NVPTXAAResult());
75 return false;
76 }
77
78 bool doFinalization(Module &M) override {
79 Result.reset();
80 return false;
81 }
82
83 void getAnalysisUsage(AnalysisUsage &AU) const override;
84};
85
86// Wrapper around ExternalAAWrapperPass so that the default
87// constructor gets the callback.
88// Note that NVPTXAA will run before BasicAA for compile time considerations.
89class NVPTXExternalAAWrapper : public ExternalAAWrapperPass {
90public:
91 static char ID;
92
93 NVPTXExternalAAWrapper()
94 : ExternalAAWrapperPass(
95 [](Pass &P, Function &, AAResults &AAR) {
96 if (auto *WrapperPass =
97 P.getAnalysisIfAvailable<NVPTXAAWrapperPass>())
98 AAR.addAAResult(AAResult&: WrapperPass->getResult());
99 },
100 /*RunEarly=*/true) {}
101
102 StringRef getPassName() const override {
103 return "NVPTX Address space based Alias Analysis Wrapper";
104 }
105};
106
107ImmutablePass *createNVPTXAAWrapperPass();
108ImmutablePass *createNVPTXExternalAAWrapperPass();
109
110} // end namespace llvm
111
112#endif // LLVM_LIB_TARGET_NVPTX_NVPTXALIASANALYSIS_H
113