1 //===-- PTXMFInfoExtract.cpp - Extract PTX machine function info ----------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file defines an information extractor for PTX machine functions.
12 //===----------------------------------------------------------------------===//
14 #define DEBUG_TYPE "ptx-mf-info-extract"
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"
27 // NOTE: PTXMFInfoExtract must after register allocation!
30 /// PTXMFInfoExtract - PTX specific code to extract of PTX machine
31 /// function information for PTXAsmPrinter
33 class PTXMFInfoExtract : public MachineFunctionPass {
38 PTXMFInfoExtract(PTXTargetMachine &TM, CodeGenOpt::Level OptLevel)
39 : MachineFunctionPass(ID) {}
41 virtual bool runOnMachineFunction(MachineFunction &MF);
43 virtual const char *getPassName() const {
44 return "PTX Machine Function Info Extractor";
46 }; // class PTXMFInfoExtract
47 } // end anonymous namespace
51 char PTXMFInfoExtract::ID = 0;
53 bool PTXMFInfoExtract::runOnMachineFunction(MachineFunction &MF) {
54 PTXMachineFunctionInfo *MFI = MF.getInfo<PTXMachineFunctionInfo>();
55 MachineRegisterInfo &MRI = MF.getRegInfo();
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);
62 if (TRC == &PTX::RegPredRegClass)
63 RegType = PTXRegisterType::Pred;
64 else if (TRC == &PTX::RegI16RegClass)
65 RegType = PTXRegisterType::B16;
66 else if (TRC == &PTX::RegI32RegClass)
67 RegType = PTXRegisterType::B32;
68 else if (TRC == &PTX::RegI64RegClass)
69 RegType = PTXRegisterType::B64;
70 else if (TRC == &PTX::RegF32RegClass)
71 RegType = PTXRegisterType::F32;
72 else if (TRC == &PTX::RegF64RegClass)
73 RegType = PTXRegisterType::F64;
75 llvm_unreachable("Unkown register class.");
76 MFI->addRegister(Reg, RegType, PTXRegisterSpace::Reg);
82 FunctionPass *llvm::createPTXMFInfoExtract(PTXTargetMachine &TM,
83 CodeGenOpt::Level OptLevel) {
84 return new PTXMFInfoExtract(TM, OptLevel);