blob: 645a38af753ced74184a63aa909a2f42c184d18e [file] [log] [blame]
Eugene Zelenkod16eff82017-08-08 23:53:55 +00001//===- AMDGPUAliasAnalysis --------------------------------------*- C++ -*-===//
Stanislav Mekhanoshin8e45acf2017-03-17 23:56:58 +00002//
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 Zelenkod16eff82017-08-08 23:53:55 +000013#ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPUALIASANALYSIS_H
14#define LLVM_LIB_TARGET_AMDGPU_AMDGPUALIASANALYSIS_H
Stanislav Mekhanoshin8e45acf2017-03-17 23:56:58 +000015
Yaxun Liu1a14bfa2017-03-27 14:04:01 +000016#include "AMDGPU.h"
Eugene Zelenkod16eff82017-08-08 23:53:55 +000017#include "llvm/ADT/Triple.h"
Stanislav Mekhanoshin8e45acf2017-03-17 23:56:58 +000018#include "llvm/Analysis/AliasAnalysis.h"
19#include "llvm/IR/Function.h"
20#include "llvm/IR/Module.h"
21#include "llvm/Pass.h"
Eugene Zelenkod16eff82017-08-08 23:53:55 +000022#include <algorithm>
23#include <memory>
Stanislav Mekhanoshin8e45acf2017-03-17 23:56:58 +000024
25namespace llvm {
26
Eugene Zelenkod16eff82017-08-08 23:53:55 +000027class DataLayout;
28class MDNode;
29class MemoryLocation;
30
Stanislav Mekhanoshin8e45acf2017-03-17 23:56:58 +000031/// A simple AA result that uses TBAA metadata to answer queries.
32class AMDGPUAAResult : public AAResultBase<AMDGPUAAResult> {
33 friend AAResultBase<AMDGPUAAResult>;
34
35 const DataLayout &DL;
Yaxun Liu1a14bfa2017-03-27 14:04:01 +000036 AMDGPUAS AS;
Stanislav Mekhanoshin8e45acf2017-03-17 23:56:58 +000037
38public:
Yaxun Liu1a14bfa2017-03-27 14:04:01 +000039 explicit AMDGPUAAResult(const DataLayout &DL, Triple T) : AAResultBase(),
Jan Vesely3c994412017-03-31 19:26:23 +000040 DL(DL), AS(AMDGPU::getAMDGPUAS(T)), ASAliasRules(AS, T.getArch()) {}
Stanislav Mekhanoshin8e45acf2017-03-17 23:56:58 +000041 AMDGPUAAResult(AMDGPUAAResult &&Arg)
Yaxun Liu1a14bfa2017-03-27 14:04:01 +000042 : AAResultBase(std::move(Arg)), DL(Arg.DL), AS(Arg.AS),
43 ASAliasRules(Arg.ASAliasRules){}
Stanislav Mekhanoshin8e45acf2017-03-17 23:56:58 +000044
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
53private:
54 bool Aliases(const MDNode *A, const MDNode *B) const;
55 bool PathAliases(const MDNode *A, const MDNode *B) const;
Yaxun Liu1a14bfa2017-03-27 14:04:01 +000056
57 class ASAliasRulesTy {
58 public:
Jan Vesely3c994412017-03-31 19:26:23 +000059 ASAliasRulesTy(AMDGPUAS AS_, Triple::ArchType Arch_);
Eugene Zelenkod16eff82017-08-08 23:53:55 +000060
Yaxun Liu1a14bfa2017-03-27 14:04:01 +000061 AliasResult getAliasResult(unsigned AS1, unsigned AS2) const;
Eugene Zelenkod16eff82017-08-08 23:53:55 +000062
Yaxun Liu1a14bfa2017-03-27 14:04:01 +000063 private:
Jan Vesely3c994412017-03-31 19:26:23 +000064 Triple::ArchType Arch;
Yaxun Liu1a14bfa2017-03-27 14:04:01 +000065 AMDGPUAS AS;
66 const AliasResult (*ASAliasRules)[6][6];
67 } ASAliasRules;
Stanislav Mekhanoshin8e45acf2017-03-17 23:56:58 +000068};
69
70/// Analysis pass providing a never-invalidated alias analysis result.
71class AMDGPUAA : public AnalysisInfoMixin<AMDGPUAA> {
72 friend AnalysisInfoMixin<AMDGPUAA>;
Eugene Zelenkod16eff82017-08-08 23:53:55 +000073
Stanislav Mekhanoshin8e45acf2017-03-17 23:56:58 +000074 static char PassID;
75
76public:
Eugene Zelenkod16eff82017-08-08 23:53:55 +000077 using Result = AMDGPUAAResult;
Stanislav Mekhanoshin8e45acf2017-03-17 23:56:58 +000078
79 AMDGPUAAResult run(Function &F, AnalysisManager<Function> &AM) {
Yaxun Liu1a14bfa2017-03-27 14:04:01 +000080 return AMDGPUAAResult(F.getParent()->getDataLayout(),
81 Triple(F.getParent()->getTargetTriple()));
Stanislav Mekhanoshin8e45acf2017-03-17 23:56:58 +000082 }
83};
84
85/// Legacy wrapper pass to provide the AMDGPUAAResult object.
86class AMDGPUAAWrapperPass : public ImmutablePass {
87 std::unique_ptr<AMDGPUAAResult> Result;
88
89public:
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 Liu1a14bfa2017-03-27 14:04:01 +0000100 Result.reset(new AMDGPUAAResult(M.getDataLayout(),
101 Triple(M.getTargetTriple())));
Stanislav Mekhanoshin8e45acf2017-03-17 23:56:58 +0000102 return false;
103 }
Eugene Zelenkod16eff82017-08-08 23:53:55 +0000104
Stanislav Mekhanoshin8e45acf2017-03-17 23:56:58 +0000105 bool doFinalization(Module &M) override {
106 Result.reset();
107 return false;
108 }
Eugene Zelenkod16eff82017-08-08 23:53:55 +0000109
Stanislav Mekhanoshin8e45acf2017-03-17 23:56:58 +0000110 void getAnalysisUsage(AnalysisUsage &AU) const override;
111};
112
Eugene Zelenkod16eff82017-08-08 23:53:55 +0000113} // end namespace llvm
114
115#endif // LLVM_LIB_TARGET_AMDGPU_AMDGPUALIASANALYSIS_H