Home | History | Annotate | Download | only in PTX
      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