172a0e0313567eb9a3a1ffc2b6c4ef2e9a3b4231
[oota-llvm.git] / lib / Target / PTX / PTXMFInfoExtract.cpp
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 }