1*86de486dSMatt Arsenault //===-- AMDGPUCodeGenPrepare.cpp ------------------------------------------===//
2*86de486dSMatt Arsenault //
3*86de486dSMatt Arsenault //                     The LLVM Compiler Infrastructure
4*86de486dSMatt Arsenault //
5*86de486dSMatt Arsenault // This file is distributed under the University of Illinois Open Source
6*86de486dSMatt Arsenault // License. See LICENSE.TXT for details.
7*86de486dSMatt Arsenault //
8*86de486dSMatt Arsenault //===----------------------------------------------------------------------===//
9*86de486dSMatt Arsenault //
10*86de486dSMatt Arsenault /// \file
11*86de486dSMatt Arsenault /// This pass does misc. AMDGPU optimizations on IR before instruction
12*86de486dSMatt Arsenault /// selection.
13*86de486dSMatt Arsenault //
14*86de486dSMatt Arsenault //===----------------------------------------------------------------------===//
15*86de486dSMatt Arsenault 
16*86de486dSMatt Arsenault #include "AMDGPU.h"
17*86de486dSMatt Arsenault #include "AMDGPUSubtarget.h"
18*86de486dSMatt Arsenault 
19*86de486dSMatt Arsenault #include "llvm/Analysis/DivergenceAnalysis.h"
20*86de486dSMatt Arsenault #include "llvm/CodeGen/Passes.h"
21*86de486dSMatt Arsenault #include "llvm/IR/InstVisitor.h"
22*86de486dSMatt Arsenault #include "llvm/IR/IRBuilder.h"
23*86de486dSMatt Arsenault #include "llvm/Support/Debug.h"
24*86de486dSMatt Arsenault #include "llvm/Support/raw_ostream.h"
25*86de486dSMatt Arsenault 
26*86de486dSMatt Arsenault #define DEBUG_TYPE "amdgpu-codegenprepare"
27*86de486dSMatt Arsenault 
28*86de486dSMatt Arsenault using namespace llvm;
29*86de486dSMatt Arsenault 
30*86de486dSMatt Arsenault namespace {
31*86de486dSMatt Arsenault 
32*86de486dSMatt Arsenault class AMDGPUCodeGenPrepare : public FunctionPass,
33*86de486dSMatt Arsenault                              public InstVisitor<AMDGPUCodeGenPrepare> {
34*86de486dSMatt Arsenault   DivergenceAnalysis *DA;
35*86de486dSMatt Arsenault   const TargetMachine *TM;
36*86de486dSMatt Arsenault 
37*86de486dSMatt Arsenault public:
38*86de486dSMatt Arsenault   static char ID;
39*86de486dSMatt Arsenault   AMDGPUCodeGenPrepare(const TargetMachine *TM = nullptr) :
40*86de486dSMatt Arsenault     FunctionPass(ID),
41*86de486dSMatt Arsenault     TM(TM) { }
42*86de486dSMatt Arsenault 
43*86de486dSMatt Arsenault   bool doInitialization(Module &M) override;
44*86de486dSMatt Arsenault   bool runOnFunction(Function &F) override;
45*86de486dSMatt Arsenault 
46*86de486dSMatt Arsenault   const char *getPassName() const override {
47*86de486dSMatt Arsenault     return "AMDGPU IR optimizations";
48*86de486dSMatt Arsenault   }
49*86de486dSMatt Arsenault 
50*86de486dSMatt Arsenault   void getAnalysisUsage(AnalysisUsage &AU) const override {
51*86de486dSMatt Arsenault     AU.addRequired<DivergenceAnalysis>();
52*86de486dSMatt Arsenault     AU.setPreservesAll();
53*86de486dSMatt Arsenault  }
54*86de486dSMatt Arsenault };
55*86de486dSMatt Arsenault 
56*86de486dSMatt Arsenault } // End anonymous namespace
57*86de486dSMatt Arsenault 
58*86de486dSMatt Arsenault bool AMDGPUCodeGenPrepare::doInitialization(Module &M) {
59*86de486dSMatt Arsenault   return false;
60*86de486dSMatt Arsenault }
61*86de486dSMatt Arsenault 
62*86de486dSMatt Arsenault bool AMDGPUCodeGenPrepare::runOnFunction(Function &F) {
63*86de486dSMatt Arsenault   if (!TM || skipFunction(F))
64*86de486dSMatt Arsenault     return false;
65*86de486dSMatt Arsenault 
66*86de486dSMatt Arsenault   DA = &getAnalysis<DivergenceAnalysis>();
67*86de486dSMatt Arsenault   visit(F);
68*86de486dSMatt Arsenault 
69*86de486dSMatt Arsenault   return true;
70*86de486dSMatt Arsenault }
71*86de486dSMatt Arsenault 
72*86de486dSMatt Arsenault INITIALIZE_TM_PASS_BEGIN(AMDGPUCodeGenPrepare, DEBUG_TYPE,
73*86de486dSMatt Arsenault                       "AMDGPU IR optimizations", false, false)
74*86de486dSMatt Arsenault INITIALIZE_PASS_DEPENDENCY(DivergenceAnalysis)
75*86de486dSMatt Arsenault INITIALIZE_TM_PASS_END(AMDGPUCodeGenPrepare, DEBUG_TYPE,
76*86de486dSMatt Arsenault                        "AMDGPU IR optimizations", false, false)
77*86de486dSMatt Arsenault 
78*86de486dSMatt Arsenault char AMDGPUCodeGenPrepare::ID = 0;
79*86de486dSMatt Arsenault 
80*86de486dSMatt Arsenault FunctionPass *llvm::createAMDGPUCodeGenPreparePass(const TargetMachine *TM) {
81*86de486dSMatt Arsenault   return new AMDGPUCodeGenPrepare(TM);
82*86de486dSMatt Arsenault }
83