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