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