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