blob: 5f8ed9b1f9a3e99df50e18f3f68757e9f870544e [file] [log] [blame]
Stanislav Mekhanoshin8e45acf2017-03-17 23:56:58 +00001//===- AMDGPUAliasAnalysis ---------------------------------------*- C++ -*-==//
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
13#ifndef LLVM_ANALYSIS_AMDGPUALIASANALYSIS_H
14#define LLVM_ANALYSIS_AMDGPUALIASANALYSIS_H
15
Yaxun Liu1a14bfa2017-03-27 14:04:01 +000016#include "AMDGPU.h"
Stanislav Mekhanoshin8e45acf2017-03-17 23:56:58 +000017#include "llvm/Analysis/AliasAnalysis.h"
18#include "llvm/IR/Function.h"
19#include "llvm/IR/Module.h"
20#include "llvm/Pass.h"
21
22namespace llvm {
23
24/// A simple AA result that uses TBAA metadata to answer queries.
25class AMDGPUAAResult : public AAResultBase<AMDGPUAAResult> {
26 friend AAResultBase<AMDGPUAAResult>;
27
28 const DataLayout &DL;
Yaxun Liu1a14bfa2017-03-27 14:04:01 +000029 AMDGPUAS AS;
Stanislav Mekhanoshin8e45acf2017-03-17 23:56:58 +000030
31public:
Yaxun Liu1a14bfa2017-03-27 14:04:01 +000032 explicit AMDGPUAAResult(const DataLayout &DL, Triple T) : AAResultBase(),
Jan Vesely3c994412017-03-31 19:26:23 +000033 DL(DL), AS(AMDGPU::getAMDGPUAS(T)), ASAliasRules(AS, T.getArch()) {}
Stanislav Mekhanoshin8e45acf2017-03-17 23:56:58 +000034 AMDGPUAAResult(AMDGPUAAResult &&Arg)
Yaxun Liu1a14bfa2017-03-27 14:04:01 +000035 : AAResultBase(std::move(Arg)), DL(Arg.DL), AS(Arg.AS),
36 ASAliasRules(Arg.ASAliasRules){}
Stanislav Mekhanoshin8e45acf2017-03-17 23:56:58 +000037
38 /// Handle invalidation events from the new pass manager.
39 ///
40 /// By definition, this result is stateless and so remains valid.
41 bool invalidate(Function &, const PreservedAnalyses &) { return false; }
42
43 AliasResult alias(const MemoryLocation &LocA, const MemoryLocation &LocB);
44 bool pointsToConstantMemory(const MemoryLocation &Loc, bool OrLocal);
45
46private:
47 bool Aliases(const MDNode *A, const MDNode *B) const;
48 bool PathAliases(const MDNode *A, const MDNode *B) const;
Yaxun Liu1a14bfa2017-03-27 14:04:01 +000049
50 class ASAliasRulesTy {
51 public:
Jan Vesely3c994412017-03-31 19:26:23 +000052 ASAliasRulesTy(AMDGPUAS AS_, Triple::ArchType Arch_);
Yaxun Liu1a14bfa2017-03-27 14:04:01 +000053 AliasResult getAliasResult(unsigned AS1, unsigned AS2) const;
54 private:
Jan Vesely3c994412017-03-31 19:26:23 +000055 Triple::ArchType Arch;
Yaxun Liu1a14bfa2017-03-27 14:04:01 +000056 AMDGPUAS AS;
57 const AliasResult (*ASAliasRules)[6][6];
58 } ASAliasRules;
Stanislav Mekhanoshin8e45acf2017-03-17 23:56:58 +000059};
60
61/// Analysis pass providing a never-invalidated alias analysis result.
62class AMDGPUAA : public AnalysisInfoMixin<AMDGPUAA> {
63 friend AnalysisInfoMixin<AMDGPUAA>;
64 static char PassID;
65
66public:
67 typedef AMDGPUAAResult Result;
68
69 AMDGPUAAResult run(Function &F, AnalysisManager<Function> &AM) {
Yaxun Liu1a14bfa2017-03-27 14:04:01 +000070 return AMDGPUAAResult(F.getParent()->getDataLayout(),
71 Triple(F.getParent()->getTargetTriple()));
Stanislav Mekhanoshin8e45acf2017-03-17 23:56:58 +000072 }
73};
74
75/// Legacy wrapper pass to provide the AMDGPUAAResult object.
76class AMDGPUAAWrapperPass : public ImmutablePass {
77 std::unique_ptr<AMDGPUAAResult> Result;
78
79public:
80 static char ID;
81
82 AMDGPUAAWrapperPass() : ImmutablePass(ID) {
83 initializeAMDGPUAAWrapperPassPass(*PassRegistry::getPassRegistry());
84 }
85
86 AMDGPUAAResult &getResult() { return *Result; }
87 const AMDGPUAAResult &getResult() const { return *Result; }
88
89 bool doInitialization(Module &M) override {
Yaxun Liu1a14bfa2017-03-27 14:04:01 +000090 Result.reset(new AMDGPUAAResult(M.getDataLayout(),
91 Triple(M.getTargetTriple())));
Stanislav Mekhanoshin8e45acf2017-03-17 23:56:58 +000092 return false;
93 }
94 bool doFinalization(Module &M) override {
95 Result.reset();
96 return false;
97 }
98 void getAnalysisUsage(AnalysisUsage &AU) const override;
99};
100
101}
102#endif // LLVM_ANALYSIS_AMDGPUALIASANALYSIS_H