113 lines · c
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-exception6//7//===----------------------------------------------------------------------===//8/// \file9/// This is the NVPTX address space based alias analysis pass.10//===----------------------------------------------------------------------===//11 12#ifndef LLVM_LIB_TARGET_NVPTX_NVPTXALIASANALYSIS_H13#define LLVM_LIB_TARGET_NVPTX_NVPTXALIASANALYSIS_H14 15#include "llvm/Analysis/AliasAnalysis.h"16 17namespace llvm {18 19class MemoryLocation;20 21class NVPTXAAResult : public AAResultBase {22public:23 NVPTXAAResult() = default;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(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 default87// 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(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 llvm111 112#endif // LLVM_LIB_TARGET_NVPTX_NVPTXALIASANALYSIS_H113