10b57cec5SDimitry Andric //===- AMDGPUAliasAnalysis --------------------------------------*- C++ -*-===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric /// \file 90b57cec5SDimitry Andric /// This is the AMGPU address space based alias analysis pass. 100b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 110b57cec5SDimitry Andric 120b57cec5SDimitry Andric #ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPUALIASANALYSIS_H 130b57cec5SDimitry Andric #define LLVM_LIB_TARGET_AMDGPU_AMDGPUALIASANALYSIS_H 140b57cec5SDimitry Andric 150b57cec5SDimitry Andric #include "llvm/Analysis/AliasAnalysis.h" 16*0fca6ea1SDimitry Andric #include "llvm/IR/Module.h" 170b57cec5SDimitry Andric 180b57cec5SDimitry Andric namespace llvm { 190b57cec5SDimitry Andric 200b57cec5SDimitry Andric class DataLayout; 210b57cec5SDimitry Andric class MemoryLocation; 220b57cec5SDimitry Andric 230b57cec5SDimitry Andric /// A simple AA result that uses TBAA metadata to answer queries. 24bdd1243dSDimitry Andric class AMDGPUAAResult : public AAResultBase { 250b57cec5SDimitry Andric const DataLayout &DL; 260b57cec5SDimitry Andric 270b57cec5SDimitry Andric public: 2804eeddc0SDimitry Andric explicit AMDGPUAAResult(const DataLayout &DL) : DL(DL) {} 290b57cec5SDimitry Andric AMDGPUAAResult(AMDGPUAAResult &&Arg) 300b57cec5SDimitry Andric : AAResultBase(std::move(Arg)), DL(Arg.DL) {} 310b57cec5SDimitry Andric 320b57cec5SDimitry Andric /// Handle invalidation events from the new pass manager. 330b57cec5SDimitry Andric /// 340b57cec5SDimitry Andric /// By definition, this result is stateless and so remains valid. 35e8d8bef9SDimitry Andric bool invalidate(Function &, const PreservedAnalyses &, 36e8d8bef9SDimitry Andric FunctionAnalysisManager::Invalidator &Inv) { 37e8d8bef9SDimitry Andric return false; 38e8d8bef9SDimitry Andric } 390b57cec5SDimitry Andric 400b57cec5SDimitry Andric AliasResult alias(const MemoryLocation &LocA, const MemoryLocation &LocB, 41bdd1243dSDimitry Andric AAQueryInfo &AAQI, const Instruction *CtxI); 42bdd1243dSDimitry Andric ModRefInfo getModRefInfoMask(const MemoryLocation &Loc, AAQueryInfo &AAQI, 43bdd1243dSDimitry Andric bool IgnoreLocals); 440b57cec5SDimitry Andric }; 450b57cec5SDimitry Andric 460b57cec5SDimitry Andric /// Analysis pass providing a never-invalidated alias analysis result. 470b57cec5SDimitry Andric class AMDGPUAA : public AnalysisInfoMixin<AMDGPUAA> { 480b57cec5SDimitry Andric friend AnalysisInfoMixin<AMDGPUAA>; 490b57cec5SDimitry Andric 50e8d8bef9SDimitry Andric static AnalysisKey Key; 510b57cec5SDimitry Andric 520b57cec5SDimitry Andric public: 530b57cec5SDimitry Andric using Result = AMDGPUAAResult; 540b57cec5SDimitry Andric 550b57cec5SDimitry Andric AMDGPUAAResult run(Function &F, AnalysisManager<Function> &AM) { 56*0fca6ea1SDimitry Andric return AMDGPUAAResult(F.getDataLayout()); 570b57cec5SDimitry Andric } 580b57cec5SDimitry Andric }; 590b57cec5SDimitry Andric 600b57cec5SDimitry Andric /// Legacy wrapper pass to provide the AMDGPUAAResult object. 610b57cec5SDimitry Andric class AMDGPUAAWrapperPass : public ImmutablePass { 620b57cec5SDimitry Andric std::unique_ptr<AMDGPUAAResult> Result; 630b57cec5SDimitry Andric 640b57cec5SDimitry Andric public: 650b57cec5SDimitry Andric static char ID; 660b57cec5SDimitry Andric 67349cc55cSDimitry Andric AMDGPUAAWrapperPass(); 680b57cec5SDimitry Andric 690b57cec5SDimitry Andric AMDGPUAAResult &getResult() { return *Result; } 700b57cec5SDimitry Andric const AMDGPUAAResult &getResult() const { return *Result; } 710b57cec5SDimitry Andric 720b57cec5SDimitry Andric bool doInitialization(Module &M) override { 73e8d8bef9SDimitry Andric Result.reset(new AMDGPUAAResult(M.getDataLayout())); 740b57cec5SDimitry Andric return false; 750b57cec5SDimitry Andric } 760b57cec5SDimitry Andric 770b57cec5SDimitry Andric bool doFinalization(Module &M) override { 780b57cec5SDimitry Andric Result.reset(); 790b57cec5SDimitry Andric return false; 800b57cec5SDimitry Andric } 810b57cec5SDimitry Andric 820b57cec5SDimitry Andric void getAnalysisUsage(AnalysisUsage &AU) const override; 830b57cec5SDimitry Andric }; 840b57cec5SDimitry Andric 850b57cec5SDimitry Andric // Wrapper around ExternalAAWrapperPass so that the default constructor gets the 860b57cec5SDimitry Andric // callback. 870b57cec5SDimitry Andric class AMDGPUExternalAAWrapper : public ExternalAAWrapperPass { 880b57cec5SDimitry Andric public: 890b57cec5SDimitry Andric static char ID; 900b57cec5SDimitry Andric 910b57cec5SDimitry Andric AMDGPUExternalAAWrapper() : ExternalAAWrapperPass( 920b57cec5SDimitry Andric [](Pass &P, Function &, AAResults &AAR) { 930b57cec5SDimitry Andric if (auto *WrapperPass = P.getAnalysisIfAvailable<AMDGPUAAWrapperPass>()) 940b57cec5SDimitry Andric AAR.addAAResult(WrapperPass->getResult()); 950b57cec5SDimitry Andric }) {} 960b57cec5SDimitry Andric }; 970b57cec5SDimitry Andric 980b57cec5SDimitry Andric } // end namespace llvm 990b57cec5SDimitry Andric 1000b57cec5SDimitry Andric #endif // LLVM_LIB_TARGET_AMDGPU_AMDGPUALIASANALYSIS_H 101