blob: fb722920900f0d68cfee3cf4a3879322ed77853a [file] [log] [blame]
Eugene Zelenkod16eff82017-08-08 23:53:55 +00001//===- AMDGPUAliasAnalysis --------------------------------------*- C++ -*-===//
Stanislav Mekhanoshin8e45acf2017-03-17 23:56:58 +00002//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Stanislav Mekhanoshin8e45acf2017-03-17 23:56:58 +00006//
7//===----------------------------------------------------------------------===//
8/// \file
9/// This is the AMGPU address space based alias analysis pass.
10//===----------------------------------------------------------------------===//
11
Eugene Zelenkod16eff82017-08-08 23:53:55 +000012#ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPUALIASANALYSIS_H
13#define LLVM_LIB_TARGET_AMDGPU_AMDGPUALIASANALYSIS_H
Stanislav Mekhanoshin8e45acf2017-03-17 23:56:58 +000014
Yaxun Liu1a14bfa2017-03-27 14:04:01 +000015#include "AMDGPU.h"
Eugene Zelenkod16eff82017-08-08 23:53:55 +000016#include "llvm/ADT/Triple.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"
Eugene Zelenkod16eff82017-08-08 23:53:55 +000021#include <algorithm>
22#include <memory>
Stanislav Mekhanoshin8e45acf2017-03-17 23:56:58 +000023
24namespace llvm {
25
Eugene Zelenkod16eff82017-08-08 23:53:55 +000026class DataLayout;
27class MDNode;
28class MemoryLocation;
29
Stanislav Mekhanoshin8e45acf2017-03-17 23:56:58 +000030/// A simple AA result that uses TBAA metadata to answer queries.
31class AMDGPUAAResult : public AAResultBase<AMDGPUAAResult> {
32 friend AAResultBase<AMDGPUAAResult>;
33
34 const DataLayout &DL;
35
36public:
Yaxun Liu1a14bfa2017-03-27 14:04:01 +000037 explicit AMDGPUAAResult(const DataLayout &DL, Triple T) : AAResultBase(),
Matt Arsenault796b0e72018-09-11 04:00:49 +000038 DL(DL) {}
Stanislav Mekhanoshin8e45acf2017-03-17 23:56:58 +000039 AMDGPUAAResult(AMDGPUAAResult &&Arg)
Matt Arsenault796b0e72018-09-11 04:00:49 +000040 : AAResultBase(std::move(Arg)), DL(Arg.DL) {}
Stanislav Mekhanoshin8e45acf2017-03-17 23:56:58 +000041
42 /// Handle invalidation events from the new pass manager.
43 ///
44 /// By definition, this result is stateless and so remains valid.
45 bool invalidate(Function &, const PreservedAnalyses &) { return false; }
46
Alina Sbirleabfc779e2019-03-22 17:22:19 +000047 AliasResult alias(const MemoryLocation &LocA, const MemoryLocation &LocB,
48 AAQueryInfo &AAQI);
49 bool pointsToConstantMemory(const MemoryLocation &Loc, AAQueryInfo &AAQI,
50 bool OrLocal);
Stanislav Mekhanoshin8e45acf2017-03-17 23:56:58 +000051
52private:
53 bool Aliases(const MDNode *A, const MDNode *B) const;
54 bool PathAliases(const MDNode *A, const MDNode *B) const;
55};
56
57/// Analysis pass providing a never-invalidated alias analysis result.
58class AMDGPUAA : public AnalysisInfoMixin<AMDGPUAA> {
59 friend AnalysisInfoMixin<AMDGPUAA>;
Eugene Zelenkod16eff82017-08-08 23:53:55 +000060
Stanislav Mekhanoshin8e45acf2017-03-17 23:56:58 +000061 static char PassID;
62
63public:
Eugene Zelenkod16eff82017-08-08 23:53:55 +000064 using Result = AMDGPUAAResult;
Stanislav Mekhanoshin8e45acf2017-03-17 23:56:58 +000065
66 AMDGPUAAResult run(Function &F, AnalysisManager<Function> &AM) {
Yaxun Liu1a14bfa2017-03-27 14:04:01 +000067 return AMDGPUAAResult(F.getParent()->getDataLayout(),
68 Triple(F.getParent()->getTargetTriple()));
Stanislav Mekhanoshin8e45acf2017-03-17 23:56:58 +000069 }
70};
71
72/// Legacy wrapper pass to provide the AMDGPUAAResult object.
73class AMDGPUAAWrapperPass : public ImmutablePass {
74 std::unique_ptr<AMDGPUAAResult> Result;
75
76public:
77 static char ID;
78
79 AMDGPUAAWrapperPass() : ImmutablePass(ID) {
80 initializeAMDGPUAAWrapperPassPass(*PassRegistry::getPassRegistry());
81 }
82
83 AMDGPUAAResult &getResult() { return *Result; }
84 const AMDGPUAAResult &getResult() const { return *Result; }
85
86 bool doInitialization(Module &M) override {
Yaxun Liu1a14bfa2017-03-27 14:04:01 +000087 Result.reset(new AMDGPUAAResult(M.getDataLayout(),
88 Triple(M.getTargetTriple())));
Stanislav Mekhanoshin8e45acf2017-03-17 23:56:58 +000089 return false;
90 }
Eugene Zelenkod16eff82017-08-08 23:53:55 +000091
Stanislav Mekhanoshin8e45acf2017-03-17 23:56:58 +000092 bool doFinalization(Module &M) override {
93 Result.reset();
94 return false;
95 }
Eugene Zelenkod16eff82017-08-08 23:53:55 +000096
Stanislav Mekhanoshin8e45acf2017-03-17 23:56:58 +000097 void getAnalysisUsage(AnalysisUsage &AU) const override;
98};
99
Matt Arsenault8ba740a2018-11-07 20:26:42 +0000100// Wrapper around ExternalAAWrapperPass so that the default constructor gets the
101// callback.
102class AMDGPUExternalAAWrapper : public ExternalAAWrapperPass {
103public:
104 static char ID;
105
106 AMDGPUExternalAAWrapper() : ExternalAAWrapperPass(
107 [](Pass &P, Function &, AAResults &AAR) {
108 if (auto *WrapperPass = P.getAnalysisIfAvailable<AMDGPUAAWrapperPass>())
109 AAR.addAAResult(WrapperPass->getResult());
110 }) {}
111};
112
Eugene Zelenkod16eff82017-08-08 23:53:55 +0000113} // end namespace llvm
114
115#endif // LLVM_LIB_TARGET_AMDGPU_AMDGPUALIASANALYSIS_H