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 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 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 NVPTXAAResult run(Function &F, AnalysisManager<Function> &AM) { 51 return NVPTXAAResult(); 52 } 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 NVPTXAAResult &getResult() { return *Result; } 65 const NVPTXAAResult &getResult() const { return *Result; } 66 67 bool doInitialization(Module &M) override { 68 Result.reset(new NVPTXAAResult()); 69 return false; 70 } 71 72 bool doFinalization(Module &M) override { 73 Result.reset(); 74 return false; 75 } 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 : ExternalAAWrapperPass([](Pass &P, Function &, AAResults &AAR) { 88 if (auto *WrapperPass = 89 P.getAnalysisIfAvailable<NVPTXAAWrapperPass>()) 90 AAR.addAAResult(WrapperPass->getResult()); 91 }) {} 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 102