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