| Eugene Zelenko | d16eff8 | 2017-08-08 23:53:55 +0000 | [diff] [blame] | 1 | //===- AMDGPUAliasAnalysis --------------------------------------*- C++ -*-===// | 
| Stanislav Mekhanoshin | 8e45acf | 2017-03-17 23:56:58 +0000 | [diff] [blame] | 2 | // | 
|  | 3 | //                     The LLVM Compiler Infrastructure | 
|  | 4 | // | 
|  | 5 | // This file is distributed under the University of Illinois Open Source | 
|  | 6 | // License. See LICENSE.TXT for details. | 
|  | 7 | // | 
|  | 8 | //===----------------------------------------------------------------------===// | 
|  | 9 | /// \file | 
|  | 10 | /// This is the AMGPU address space based alias analysis pass. | 
|  | 11 | //===----------------------------------------------------------------------===// | 
|  | 12 |  | 
| Eugene Zelenko | d16eff8 | 2017-08-08 23:53:55 +0000 | [diff] [blame] | 13 | #ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPUALIASANALYSIS_H | 
|  | 14 | #define LLVM_LIB_TARGET_AMDGPU_AMDGPUALIASANALYSIS_H | 
| Stanislav Mekhanoshin | 8e45acf | 2017-03-17 23:56:58 +0000 | [diff] [blame] | 15 |  | 
| Yaxun Liu | 1a14bfa | 2017-03-27 14:04:01 +0000 | [diff] [blame] | 16 | #include "AMDGPU.h" | 
| Eugene Zelenko | d16eff8 | 2017-08-08 23:53:55 +0000 | [diff] [blame] | 17 | #include "llvm/ADT/Triple.h" | 
| Stanislav Mekhanoshin | 8e45acf | 2017-03-17 23:56:58 +0000 | [diff] [blame] | 18 | #include "llvm/Analysis/AliasAnalysis.h" | 
|  | 19 | #include "llvm/IR/Function.h" | 
|  | 20 | #include "llvm/IR/Module.h" | 
|  | 21 | #include "llvm/Pass.h" | 
| Eugene Zelenko | d16eff8 | 2017-08-08 23:53:55 +0000 | [diff] [blame] | 22 | #include <algorithm> | 
|  | 23 | #include <memory> | 
| Stanislav Mekhanoshin | 8e45acf | 2017-03-17 23:56:58 +0000 | [diff] [blame] | 24 |  | 
|  | 25 | namespace llvm { | 
|  | 26 |  | 
| Eugene Zelenko | d16eff8 | 2017-08-08 23:53:55 +0000 | [diff] [blame] | 27 | class DataLayout; | 
|  | 28 | class MDNode; | 
|  | 29 | class MemoryLocation; | 
|  | 30 |  | 
| Stanislav Mekhanoshin | 8e45acf | 2017-03-17 23:56:58 +0000 | [diff] [blame] | 31 | /// A simple AA result that uses TBAA metadata to answer queries. | 
|  | 32 | class AMDGPUAAResult : public AAResultBase<AMDGPUAAResult> { | 
|  | 33 | friend AAResultBase<AMDGPUAAResult>; | 
|  | 34 |  | 
|  | 35 | const DataLayout &DL; | 
| Yaxun Liu | 1a14bfa | 2017-03-27 14:04:01 +0000 | [diff] [blame] | 36 | AMDGPUAS AS; | 
| Stanislav Mekhanoshin | 8e45acf | 2017-03-17 23:56:58 +0000 | [diff] [blame] | 37 |  | 
|  | 38 | public: | 
| Yaxun Liu | 1a14bfa | 2017-03-27 14:04:01 +0000 | [diff] [blame] | 39 | explicit AMDGPUAAResult(const DataLayout &DL, Triple T) : AAResultBase(), | 
| Jan Vesely | 3c99441 | 2017-03-31 19:26:23 +0000 | [diff] [blame] | 40 | DL(DL), AS(AMDGPU::getAMDGPUAS(T)), ASAliasRules(AS, T.getArch()) {} | 
| Stanislav Mekhanoshin | 8e45acf | 2017-03-17 23:56:58 +0000 | [diff] [blame] | 41 | AMDGPUAAResult(AMDGPUAAResult &&Arg) | 
| Yaxun Liu | 1a14bfa | 2017-03-27 14:04:01 +0000 | [diff] [blame] | 42 | : AAResultBase(std::move(Arg)), DL(Arg.DL), AS(Arg.AS), | 
|  | 43 | ASAliasRules(Arg.ASAliasRules){} | 
| Stanislav Mekhanoshin | 8e45acf | 2017-03-17 23:56:58 +0000 | [diff] [blame] | 44 |  | 
|  | 45 | /// Handle invalidation events from the new pass manager. | 
|  | 46 | /// | 
|  | 47 | /// By definition, this result is stateless and so remains valid. | 
|  | 48 | bool invalidate(Function &, const PreservedAnalyses &) { return false; } | 
|  | 49 |  | 
|  | 50 | AliasResult alias(const MemoryLocation &LocA, const MemoryLocation &LocB); | 
|  | 51 | bool pointsToConstantMemory(const MemoryLocation &Loc, bool OrLocal); | 
|  | 52 |  | 
|  | 53 | private: | 
|  | 54 | bool Aliases(const MDNode *A, const MDNode *B) const; | 
|  | 55 | bool PathAliases(const MDNode *A, const MDNode *B) const; | 
| Yaxun Liu | 1a14bfa | 2017-03-27 14:04:01 +0000 | [diff] [blame] | 56 |  | 
|  | 57 | class ASAliasRulesTy { | 
|  | 58 | public: | 
| Jan Vesely | 3c99441 | 2017-03-31 19:26:23 +0000 | [diff] [blame] | 59 | ASAliasRulesTy(AMDGPUAS AS_, Triple::ArchType Arch_); | 
| Eugene Zelenko | d16eff8 | 2017-08-08 23:53:55 +0000 | [diff] [blame] | 60 |  | 
| Yaxun Liu | 1a14bfa | 2017-03-27 14:04:01 +0000 | [diff] [blame] | 61 | AliasResult getAliasResult(unsigned AS1, unsigned AS2) const; | 
| Eugene Zelenko | d16eff8 | 2017-08-08 23:53:55 +0000 | [diff] [blame] | 62 |  | 
| Yaxun Liu | 1a14bfa | 2017-03-27 14:04:01 +0000 | [diff] [blame] | 63 | private: | 
| Jan Vesely | 3c99441 | 2017-03-31 19:26:23 +0000 | [diff] [blame] | 64 | Triple::ArchType Arch; | 
| Yaxun Liu | 1a14bfa | 2017-03-27 14:04:01 +0000 | [diff] [blame] | 65 | AMDGPUAS AS; | 
| Samuel Pitoiset | 7bd9dcf | 2018-08-22 16:08:48 +0000 | [diff] [blame^] | 66 | const AliasResult (*ASAliasRules)[7][7]; | 
| Yaxun Liu | 1a14bfa | 2017-03-27 14:04:01 +0000 | [diff] [blame] | 67 | } ASAliasRules; | 
| Stanislav Mekhanoshin | 8e45acf | 2017-03-17 23:56:58 +0000 | [diff] [blame] | 68 | }; | 
|  | 69 |  | 
|  | 70 | /// Analysis pass providing a never-invalidated alias analysis result. | 
|  | 71 | class AMDGPUAA : public AnalysisInfoMixin<AMDGPUAA> { | 
|  | 72 | friend AnalysisInfoMixin<AMDGPUAA>; | 
| Eugene Zelenko | d16eff8 | 2017-08-08 23:53:55 +0000 | [diff] [blame] | 73 |  | 
| Stanislav Mekhanoshin | 8e45acf | 2017-03-17 23:56:58 +0000 | [diff] [blame] | 74 | static char PassID; | 
|  | 75 |  | 
|  | 76 | public: | 
| Eugene Zelenko | d16eff8 | 2017-08-08 23:53:55 +0000 | [diff] [blame] | 77 | using Result = AMDGPUAAResult; | 
| Stanislav Mekhanoshin | 8e45acf | 2017-03-17 23:56:58 +0000 | [diff] [blame] | 78 |  | 
|  | 79 | AMDGPUAAResult run(Function &F, AnalysisManager<Function> &AM) { | 
| Yaxun Liu | 1a14bfa | 2017-03-27 14:04:01 +0000 | [diff] [blame] | 80 | return AMDGPUAAResult(F.getParent()->getDataLayout(), | 
|  | 81 | Triple(F.getParent()->getTargetTriple())); | 
| Stanislav Mekhanoshin | 8e45acf | 2017-03-17 23:56:58 +0000 | [diff] [blame] | 82 | } | 
|  | 83 | }; | 
|  | 84 |  | 
|  | 85 | /// Legacy wrapper pass to provide the AMDGPUAAResult object. | 
|  | 86 | class AMDGPUAAWrapperPass : public ImmutablePass { | 
|  | 87 | std::unique_ptr<AMDGPUAAResult> Result; | 
|  | 88 |  | 
|  | 89 | public: | 
|  | 90 | static char ID; | 
|  | 91 |  | 
|  | 92 | AMDGPUAAWrapperPass() : ImmutablePass(ID) { | 
|  | 93 | initializeAMDGPUAAWrapperPassPass(*PassRegistry::getPassRegistry()); | 
|  | 94 | } | 
|  | 95 |  | 
|  | 96 | AMDGPUAAResult &getResult() { return *Result; } | 
|  | 97 | const AMDGPUAAResult &getResult() const { return *Result; } | 
|  | 98 |  | 
|  | 99 | bool doInitialization(Module &M) override { | 
| Yaxun Liu | 1a14bfa | 2017-03-27 14:04:01 +0000 | [diff] [blame] | 100 | Result.reset(new AMDGPUAAResult(M.getDataLayout(), | 
|  | 101 | Triple(M.getTargetTriple()))); | 
| Stanislav Mekhanoshin | 8e45acf | 2017-03-17 23:56:58 +0000 | [diff] [blame] | 102 | return false; | 
|  | 103 | } | 
| Eugene Zelenko | d16eff8 | 2017-08-08 23:53:55 +0000 | [diff] [blame] | 104 |  | 
| Stanislav Mekhanoshin | 8e45acf | 2017-03-17 23:56:58 +0000 | [diff] [blame] | 105 | bool doFinalization(Module &M) override { | 
|  | 106 | Result.reset(); | 
|  | 107 | return false; | 
|  | 108 | } | 
| Eugene Zelenko | d16eff8 | 2017-08-08 23:53:55 +0000 | [diff] [blame] | 109 |  | 
| Stanislav Mekhanoshin | 8e45acf | 2017-03-17 23:56:58 +0000 | [diff] [blame] | 110 | void getAnalysisUsage(AnalysisUsage &AU) const override; | 
|  | 111 | }; | 
|  | 112 |  | 
| Eugene Zelenko | d16eff8 | 2017-08-08 23:53:55 +0000 | [diff] [blame] | 113 | } // end namespace llvm | 
|  | 114 |  | 
|  | 115 | #endif // LLVM_LIB_TARGET_AMDGPU_AMDGPUALIASANALYSIS_H |