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