blob: b2d3bb203f7e283f6ff7203e23bd91939b783d9b [file] [log] [blame]
Che-Liang Chiou3278c422010-11-08 03:00:52 +00001//===- PTXMachineFuctionInfo.h - PTX machine function info -------*- C++ -*-==//
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 declares PTX-specific per-machine-function information.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef PTX_MACHINE_FUNCTION_INFO_H
15#define PTX_MACHINE_FUNCTION_INFO_H
16
17#include "PTX.h"
Justin Holewinski27f08fc2011-09-23 14:18:22 +000018#include "PTXParamManager.h"
Justin Holewinski297984d2011-09-22 16:45:40 +000019#include "PTXRegisterInfo.h"
20#include "llvm/ADT/DenseMap.h"
Justin Holewinskie0aef2d2011-06-16 17:50:00 +000021#include "llvm/ADT/DenseSet.h"
Justin Holewinski297984d2011-09-22 16:45:40 +000022#include "llvm/ADT/StringExtras.h"
Che-Liang Chiou3278c422010-11-08 03:00:52 +000023#include "llvm/CodeGen/MachineFunction.h"
Justin Holewinski5422a0f2011-09-22 16:45:46 +000024#include "llvm/Support/Debug.h"
25#include "llvm/Support/raw_ostream.h"
Che-Liang Chiou3278c422010-11-08 03:00:52 +000026
27namespace llvm {
Justin Holewinski5422a0f2011-09-22 16:45:46 +000028
Che-Liang Chiou3278c422010-11-08 03:00:52 +000029/// PTXMachineFunctionInfo - This class is derived from MachineFunction and
30/// contains private PTX target-specific information for each MachineFunction.
31///
32class PTXMachineFunctionInfo : public MachineFunctionInfo {
33private:
Justin Holewinskidc0baf92011-09-23 17:15:53 +000034 bool IsKernel;
35 DenseSet<unsigned> RegArgs;
36 DenseSet<unsigned> RegRets;
Che-Liang Chiou3278c422010-11-08 03:00:52 +000037
Justin Holewinski297984d2011-09-22 16:45:40 +000038 typedef std::vector<unsigned> RegisterList;
39 typedef DenseMap<const TargetRegisterClass*, RegisterList> RegisterMap;
40 typedef DenseMap<unsigned, std::string> RegisterNameMap;
41
Justin Holewinskidc0baf92011-09-23 17:15:53 +000042 RegisterMap UsedRegs;
43 RegisterNameMap RegNames;
Justin Holewinski5422a0f2011-09-22 16:45:46 +000044
Justin Holewinski27f08fc2011-09-23 14:18:22 +000045 PTXParamManager ParamManager;
46
Che-Liang Chiou3278c422010-11-08 03:00:52 +000047public:
Justin Holewinskidc0baf92011-09-23 17:15:53 +000048 typedef DenseSet<unsigned>::const_iterator reg_iterator;
Justin Holewinski5422a0f2011-09-22 16:45:46 +000049
Justin Holewinskidc0baf92011-09-23 17:15:53 +000050 PTXMachineFunctionInfo(MachineFunction &MF)
51 : IsKernel(false) {
52 UsedRegs[PTX::RegPredRegisterClass] = RegisterList();
53 UsedRegs[PTX::RegI16RegisterClass] = RegisterList();
54 UsedRegs[PTX::RegI32RegisterClass] = RegisterList();
55 UsedRegs[PTX::RegI64RegisterClass] = RegisterList();
56 UsedRegs[PTX::RegF32RegisterClass] = RegisterList();
57 UsedRegs[PTX::RegF64RegisterClass] = RegisterList();
Che-Liang Chiou3278c422010-11-08 03:00:52 +000058 }
59
Justin Holewinskidc0baf92011-09-23 17:15:53 +000060 /// getParamManager - Returns the PTXParamManager instance for this function.
Justin Holewinski27f08fc2011-09-23 14:18:22 +000061 PTXParamManager& getParamManager() { return ParamManager; }
62 const PTXParamManager& getParamManager() const { return ParamManager; }
63
Justin Holewinskidc0baf92011-09-23 17:15:53 +000064 /// setKernel/isKernel - Gets/sets a flag that indicates if this function is
65 /// a PTX kernel function.
66 void setKernel(bool _IsKernel=true) { IsKernel = _IsKernel; }
67 bool isKernel() const { return IsKernel; }
Che-Liang Chiou3278c422010-11-08 03:00:52 +000068
Justin Holewinskidc0baf92011-09-23 17:15:53 +000069 /// argreg_begin/argreg_end - Returns iterators to the set of registers
70 /// containing function arguments.
71 reg_iterator argreg_begin() const { return RegArgs.begin(); }
72 reg_iterator argreg_end() const { return RegArgs.end(); }
Justin Holewinski5422a0f2011-09-22 16:45:46 +000073
Justin Holewinskidc0baf92011-09-23 17:15:53 +000074 /// retreg_begin/retreg_end - Returns iterators to the set of registers
75 /// containing the function return values.
76 reg_iterator retreg_begin() const { return RegRets.begin(); }
77 reg_iterator retreg_end() const { return RegRets.end(); }
Justin Holewinski5422a0f2011-09-22 16:45:46 +000078
Justin Holewinskidc0baf92011-09-23 17:15:53 +000079 /// addRetReg - Adds a register to the set of return-value registers.
Justin Holewinski5422a0f2011-09-22 16:45:46 +000080 void addRetReg(unsigned Reg) {
Justin Holewinskidc0baf92011-09-23 17:15:53 +000081 if (!RegRets.count(Reg)) {
82 RegRets.insert(Reg);
Justin Holewinski5422a0f2011-09-22 16:45:46 +000083 std::string name;
84 name = "%ret";
Justin Holewinskidc0baf92011-09-23 17:15:53 +000085 name += utostr(RegRets.size() - 1);
86 RegNames[Reg] = name;
Justin Holewinski5422a0f2011-09-22 16:45:46 +000087 }
88 }
Justin Holewinski297984d2011-09-22 16:45:40 +000089
Justin Holewinskidc0baf92011-09-23 17:15:53 +000090 /// addArgReg - Adds a register to the set of function argument registers.
Justin Holewinski5422a0f2011-09-22 16:45:46 +000091 void addArgReg(unsigned Reg) {
Justin Holewinskidc0baf92011-09-23 17:15:53 +000092 RegArgs.insert(Reg);
Justin Holewinski5422a0f2011-09-22 16:45:46 +000093 std::string name;
94 name = "%param";
Justin Holewinskidc0baf92011-09-23 17:15:53 +000095 name += utostr(RegArgs.size() - 1);
96 RegNames[Reg] = name;
Justin Holewinski5422a0f2011-09-22 16:45:46 +000097 }
98
Justin Holewinskidc0baf92011-09-23 17:15:53 +000099 /// addVirtualRegister - Adds a virtual register to the set of all used
100 /// registers in the function.
Justin Holewinski5422a0f2011-09-22 16:45:46 +0000101 void addVirtualRegister(const TargetRegisterClass *TRC, unsigned Reg) {
Justin Holewinski297984d2011-09-22 16:45:40 +0000102 std::string name;
103
Justin Holewinskidc0baf92011-09-23 17:15:53 +0000104 // Do not count registers that are argument/return registers.
105 if (!RegRets.count(Reg) && !RegArgs.count(Reg)) {
106 UsedRegs[TRC].push_back(Reg);
Justin Holewinski5422a0f2011-09-22 16:45:46 +0000107 if (TRC == PTX::RegPredRegisterClass)
108 name = "%p";
109 else if (TRC == PTX::RegI16RegisterClass)
110 name = "%rh";
111 else if (TRC == PTX::RegI32RegisterClass)
112 name = "%r";
113 else if (TRC == PTX::RegI64RegisterClass)
114 name = "%rd";
115 else if (TRC == PTX::RegF32RegisterClass)
116 name = "%f";
117 else if (TRC == PTX::RegF64RegisterClass)
118 name = "%fd";
119 else
120 llvm_unreachable("Invalid register class");
Justin Holewinski297984d2011-09-22 16:45:40 +0000121
Justin Holewinskidc0baf92011-09-23 17:15:53 +0000122 name += utostr(UsedRegs[TRC].size() - 1);
123 RegNames[Reg] = name;
Justin Holewinski5422a0f2011-09-22 16:45:46 +0000124 }
Justin Holewinski297984d2011-09-22 16:45:40 +0000125 }
126
Justin Holewinskidc0baf92011-09-23 17:15:53 +0000127 /// getRegisterName - Returns the name of the specified virtual register. This
128 /// name is used during PTX emission.
Justin Holewinski297984d2011-09-22 16:45:40 +0000129 std::string getRegisterName(unsigned Reg) const {
Justin Holewinskidc0baf92011-09-23 17:15:53 +0000130 if (RegNames.count(Reg))
131 return RegNames.lookup(Reg);
Justin Holewinski5422a0f2011-09-22 16:45:46 +0000132 else if (Reg == PTX::NoRegister)
133 return "%noreg";
Justin Holewinski297984d2011-09-22 16:45:40 +0000134 else
135 llvm_unreachable("Register not in register name map");
136 }
137
Justin Holewinskidc0baf92011-09-23 17:15:53 +0000138 /// getNumRegistersForClass - Returns the number of virtual registers that are
139 /// used for the specified register class.
Justin Holewinski297984d2011-09-22 16:45:40 +0000140 unsigned getNumRegistersForClass(const TargetRegisterClass *TRC) const {
Justin Holewinskidc0baf92011-09-23 17:15:53 +0000141 return UsedRegs.lookup(TRC).size();
Justin Holewinski297984d2011-09-22 16:45:40 +0000142 }
143
Che-Liang Chiou3278c422010-11-08 03:00:52 +0000144}; // class PTXMachineFunctionInfo
145} // namespace llvm
146
147#endif // PTX_MACHINE_FUNCTION_INFO_H