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