xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/AMDGPU/AMDGPUAliasAnalysis.h (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
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