1 //===- UniformityAnalysis.h ---------------------*- C++ -*-----------------===//
2 //
3 // 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
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 /// \file
10 /// \brief LLVM IR instance of the generic uniformity analysis
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #ifndef LLVM_ANALYSIS_UNIFORMITYANALYSIS_H
15 #define LLVM_ANALYSIS_UNIFORMITYANALYSIS_H
16 
17 #include "llvm/ADT/GenericUniformityInfo.h"
18 #include "llvm/Analysis/CycleAnalysis.h"
19 
20 namespace llvm {
21 
22 extern template class GenericUniformityInfo<SSAContext>;
23 using UniformityInfo = GenericUniformityInfo<SSAContext>;
24 
25 /// Analysis pass which computes \ref UniformityInfo.
26 class UniformityInfoAnalysis
27     : public AnalysisInfoMixin<UniformityInfoAnalysis> {
28   friend AnalysisInfoMixin<UniformityInfoAnalysis>;
29   static AnalysisKey Key;
30 
31 public:
32   /// Provide the result typedef for this analysis pass.
33   using Result = UniformityInfo;
34 
35   /// Run the analysis pass over a function and produce a dominator tree.
36   UniformityInfo run(Function &F, FunctionAnalysisManager &);
37 
38   // TODO: verify analysis
39 };
40 
41 /// Printer pass for the \c UniformityInfo.
42 class UniformityInfoPrinterPass
43     : public PassInfoMixin<UniformityInfoPrinterPass> {
44   raw_ostream &OS;
45 
46 public:
47   explicit UniformityInfoPrinterPass(raw_ostream &OS);
48 
49   PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
50 };
51 
52 /// Legacy analysis pass which computes a \ref CycleInfo.
53 class UniformityInfoWrapperPass : public FunctionPass {
54   Function *m_function = nullptr;
55   UniformityInfo m_uniformityInfo;
56 
57 public:
58   static char ID;
59 
60   UniformityInfoWrapperPass();
61 
62   UniformityInfo &getUniformityInfo() { return m_uniformityInfo; }
63   const UniformityInfo &getUniformityInfo() const { return m_uniformityInfo; }
64 
65   bool runOnFunction(Function &F) override;
66   void getAnalysisUsage(AnalysisUsage &AU) const override;
67   void releaseMemory() override;
68   void print(raw_ostream &OS, const Module *M = nullptr) const override;
69 
70   // TODO: verify analysis
71 };
72 
73 } // namespace llvm
74 
75 #endif // LLVM_ANALYSIS_UNIFORMITYANALYSIS_H
76