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 static bool isRequired() { return true; } 52 }; 53 54 /// Legacy analysis pass which computes a \ref CycleInfo. 55 class UniformityInfoWrapperPass : public FunctionPass { 56 Function *m_function = nullptr; 57 UniformityInfo m_uniformityInfo; 58 59 public: 60 static char ID; 61 62 UniformityInfoWrapperPass(); 63 64 UniformityInfo &getUniformityInfo() { return m_uniformityInfo; } 65 const UniformityInfo &getUniformityInfo() const { return m_uniformityInfo; } 66 67 bool runOnFunction(Function &F) override; 68 void getAnalysisUsage(AnalysisUsage &AU) const override; 69 void releaseMemory() override; 70 void print(raw_ostream &OS, const Module *M = nullptr) const override; 71 72 // TODO: verify analysis 73 }; 74 75 } // namespace llvm 76 77 #endif // LLVM_ANALYSIS_UNIFORMITYANALYSIS_H 78