1 //===-- PTXMFInfoExtract.cpp - Extract PTX machine function info ----------===// 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 // This file defines an information extractor for PTX machine functions. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #define DEBUG_TYPE "ptx-mf-info-extract" 15 16 #include "PTX.h" 17 #include "PTXTargetMachine.h" 18 #include "PTXMachineFunctionInfo.h" 19 #include "llvm/CodeGen/MachineFunctionPass.h" 20 #include "llvm/CodeGen/MachineRegisterInfo.h" 21 #include "llvm/Support/Debug.h" 22 #include "llvm/Support/ErrorHandling.h" 23 #include "llvm/Support/raw_ostream.h" 24 25 using namespace llvm; 26 27 // NOTE: PTXMFInfoExtract must after register allocation! 28 29 namespace { 30 /// PTXMFInfoExtract - PTX specific code to extract of PTX machine 31 /// function information for PTXAsmPrinter 32 /// 33 class PTXMFInfoExtract : public MachineFunctionPass { 34 private: 35 static char ID; 36 37 public: 38 PTXMFInfoExtract(PTXTargetMachine &TM, CodeGenOpt::Level OptLevel) 39 : MachineFunctionPass(ID) {} 40 41 virtual bool runOnMachineFunction(MachineFunction &MF); 42 43 virtual const char *getPassName() const { 44 return "PTX Machine Function Info Extractor"; 45 } 46 }; // class PTXMFInfoExtract 47 } // end anonymous namespace 48 49 using namespace llvm; 50 51 char PTXMFInfoExtract::ID = 0; 52 53 bool PTXMFInfoExtract::runOnMachineFunction(MachineFunction &MF) { 54 PTXMachineFunctionInfo *MFI = MF.getInfo<PTXMachineFunctionInfo>(); 55 MachineRegisterInfo &MRI = MF.getRegInfo(); 56 57 // Generate list of all virtual registers used in this function 58 for (unsigned i = 0; i < MRI.getNumVirtRegs(); ++i) { 59 unsigned Reg = TargetRegisterInfo::index2VirtReg(i); 60 const TargetRegisterClass *TRC = MRI.getRegClass(Reg); 61 unsigned RegType; 62 if (TRC == PTX::RegPredRegisterClass) 63 RegType = PTXRegisterType::Pred; 64 else if (TRC == PTX::RegI16RegisterClass) 65 RegType = PTXRegisterType::B16; 66 else if (TRC == PTX::RegI32RegisterClass) 67 RegType = PTXRegisterType::B32; 68 else if (TRC == PTX::RegI64RegisterClass) 69 RegType = PTXRegisterType::B64; 70 else if (TRC == PTX::RegF32RegisterClass) 71 RegType = PTXRegisterType::F32; 72 else if (TRC == PTX::RegF64RegisterClass) 73 RegType = PTXRegisterType::F64; 74 else 75 llvm_unreachable("Unkown register class."); 76 MFI->addRegister(Reg, RegType, PTXRegisterSpace::Reg); 77 } 78 79 return false; 80 } 81 82 FunctionPass *llvm::createPTXMFInfoExtract(PTXTargetMachine &TM, 83 CodeGenOpt::Level OptLevel) { 84 return new PTXMFInfoExtract(TM, OptLevel); 85 } 86