blob: f40d8ca50110778b1a404b96488a35d30e41ae95 [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;
Justin Holewinskif47dfba2011-09-27 18:12:55 +000041 typedef DenseMap<int, std::string> FrameMap;
Justin Holewinski297984d2011-09-22 16:45:40 +000042
Justin Holewinskidc0baf92011-09-23 17:15:53 +000043 RegisterMap UsedRegs;
44 RegisterNameMap RegNames;
Justin Holewinskif47dfba2011-09-27 18:12:55 +000045 FrameMap FrameSymbols;
Justin Holewinski5422a0f2011-09-22 16:45:46 +000046
Justin Holewinski27f08fc2011-09-23 14:18:22 +000047 PTXParamManager ParamManager;
48
Che-Liang Chiou3278c422010-11-08 03:00:52 +000049public:
Justin Holewinskidc0baf92011-09-23 17:15:53 +000050 typedef DenseSet<unsigned>::const_iterator reg_iterator;
Justin Holewinski5422a0f2011-09-22 16:45:46 +000051
Justin Holewinskidc0baf92011-09-23 17:15:53 +000052 PTXMachineFunctionInfo(MachineFunction &MF)
53 : IsKernel(false) {
54 UsedRegs[PTX::RegPredRegisterClass] = RegisterList();
55 UsedRegs[PTX::RegI16RegisterClass] = RegisterList();
56 UsedRegs[PTX::RegI32RegisterClass] = RegisterList();
57 UsedRegs[PTX::RegI64RegisterClass] = RegisterList();
58 UsedRegs[PTX::RegF32RegisterClass] = RegisterList();
59 UsedRegs[PTX::RegF64RegisterClass] = RegisterList();
Che-Liang Chiou3278c422010-11-08 03:00:52 +000060 }
61
Justin Holewinskidc0baf92011-09-23 17:15:53 +000062 /// getParamManager - Returns the PTXParamManager instance for this function.
Justin Holewinski27f08fc2011-09-23 14:18:22 +000063 PTXParamManager& getParamManager() { return ParamManager; }
64 const PTXParamManager& getParamManager() const { return ParamManager; }
65
Justin Holewinskidc0baf92011-09-23 17:15:53 +000066 /// setKernel/isKernel - Gets/sets a flag that indicates if this function is
67 /// a PTX kernel function.
68 void setKernel(bool _IsKernel=true) { IsKernel = _IsKernel; }
69 bool isKernel() const { return IsKernel; }
Che-Liang Chiou3278c422010-11-08 03:00:52 +000070
Justin Holewinskidc0baf92011-09-23 17:15:53 +000071 /// argreg_begin/argreg_end - Returns iterators to the set of registers
72 /// containing function arguments.
73 reg_iterator argreg_begin() const { return RegArgs.begin(); }
74 reg_iterator argreg_end() const { return RegArgs.end(); }
Justin Holewinski5422a0f2011-09-22 16:45:46 +000075
Justin Holewinskidc0baf92011-09-23 17:15:53 +000076 /// retreg_begin/retreg_end - Returns iterators to the set of registers
77 /// containing the function return values.
78 reg_iterator retreg_begin() const { return RegRets.begin(); }
79 reg_iterator retreg_end() const { return RegRets.end(); }
Justin Holewinski5422a0f2011-09-22 16:45:46 +000080
Justin Holewinskidc0baf92011-09-23 17:15:53 +000081 /// addRetReg - Adds a register to the set of return-value registers.
Justin Holewinski5422a0f2011-09-22 16:45:46 +000082 void addRetReg(unsigned Reg) {
Justin Holewinskidc0baf92011-09-23 17:15:53 +000083 if (!RegRets.count(Reg)) {
84 RegRets.insert(Reg);
Justin Holewinski5422a0f2011-09-22 16:45:46 +000085 std::string name;
86 name = "%ret";
Justin Holewinskidc0baf92011-09-23 17:15:53 +000087 name += utostr(RegRets.size() - 1);
88 RegNames[Reg] = name;
Justin Holewinski5422a0f2011-09-22 16:45:46 +000089 }
90 }
Justin Holewinski297984d2011-09-22 16:45:40 +000091
Justin Holewinskidc0baf92011-09-23 17:15:53 +000092 /// addArgReg - Adds a register to the set of function argument registers.
Justin Holewinski5422a0f2011-09-22 16:45:46 +000093 void addArgReg(unsigned Reg) {
Justin Holewinskidc0baf92011-09-23 17:15:53 +000094 RegArgs.insert(Reg);
Justin Holewinski5422a0f2011-09-22 16:45:46 +000095 std::string name;
96 name = "%param";
Justin Holewinskidc0baf92011-09-23 17:15:53 +000097 name += utostr(RegArgs.size() - 1);
98 RegNames[Reg] = name;
Justin Holewinski5422a0f2011-09-22 16:45:46 +000099 }
100
Justin Holewinskidc0baf92011-09-23 17:15:53 +0000101 /// addVirtualRegister - Adds a virtual register to the set of all used
102 /// registers in the function.
Justin Holewinski5422a0f2011-09-22 16:45:46 +0000103 void addVirtualRegister(const TargetRegisterClass *TRC, unsigned Reg) {
Justin Holewinski297984d2011-09-22 16:45:40 +0000104 std::string name;
105
Justin Holewinskidc0baf92011-09-23 17:15:53 +0000106 // Do not count registers that are argument/return registers.
107 if (!RegRets.count(Reg) && !RegArgs.count(Reg)) {
108 UsedRegs[TRC].push_back(Reg);
Justin Holewinski5422a0f2011-09-22 16:45:46 +0000109 if (TRC == PTX::RegPredRegisterClass)
110 name = "%p";
111 else if (TRC == PTX::RegI16RegisterClass)
112 name = "%rh";
113 else if (TRC == PTX::RegI32RegisterClass)
114 name = "%r";
115 else if (TRC == PTX::RegI64RegisterClass)
116 name = "%rd";
117 else if (TRC == PTX::RegF32RegisterClass)
118 name = "%f";
119 else if (TRC == PTX::RegF64RegisterClass)
120 name = "%fd";
121 else
122 llvm_unreachable("Invalid register class");
Justin Holewinski297984d2011-09-22 16:45:40 +0000123
Justin Holewinskidc0baf92011-09-23 17:15:53 +0000124 name += utostr(UsedRegs[TRC].size() - 1);
125 RegNames[Reg] = name;
Justin Holewinski5422a0f2011-09-22 16:45:46 +0000126 }
Justin Holewinski297984d2011-09-22 16:45:40 +0000127 }
128
Justin Holewinskidc0baf92011-09-23 17:15:53 +0000129 /// getRegisterName - Returns the name of the specified virtual register. This
130 /// name is used during PTX emission.
Justin Holewinski297984d2011-09-22 16:45:40 +0000131 std::string getRegisterName(unsigned Reg) const {
Justin Holewinskidc0baf92011-09-23 17:15:53 +0000132 if (RegNames.count(Reg))
133 return RegNames.lookup(Reg);
Justin Holewinski5422a0f2011-09-22 16:45:46 +0000134 else if (Reg == PTX::NoRegister)
135 return "%noreg";
Justin Holewinski297984d2011-09-22 16:45:40 +0000136 else
137 llvm_unreachable("Register not in register name map");
138 }
139
Justin Holewinskidc0baf92011-09-23 17:15:53 +0000140 /// getNumRegistersForClass - Returns the number of virtual registers that are
141 /// used for the specified register class.
Justin Holewinski297984d2011-09-22 16:45:40 +0000142 unsigned getNumRegistersForClass(const TargetRegisterClass *TRC) const {
Justin Holewinskidc0baf92011-09-23 17:15:53 +0000143 return UsedRegs.lookup(TRC).size();
Justin Holewinski297984d2011-09-22 16:45:40 +0000144 }
145
Justin Holewinskif47dfba2011-09-27 18:12:55 +0000146 /// getFrameSymbol - Returns the symbol name for the given FrameIndex.
147 const char* getFrameSymbol(int FrameIndex) {
148 if (FrameSymbols.count(FrameIndex)) {
149 return FrameSymbols.lookup(FrameIndex).c_str();
150 } else {
151 std::string Name = "__local";
152 Name += utostr(FrameIndex);
153 // The whole point of caching this name is to ensure the pointer we pass
154 // to any getExternalSymbol() calls will remain valid for the lifetime of
155 // the back-end instance. This is to work around an issue in SelectionDAG
156 // where symbol names are expected to be life-long strings.
157 FrameSymbols[FrameIndex] = Name;
158 return FrameSymbols[FrameIndex].c_str();
159 }
160 }
Che-Liang Chiou3278c422010-11-08 03:00:52 +0000161}; // class PTXMachineFunctionInfo
162} // namespace llvm
163
164#endif // PTX_MACHINE_FUNCTION_INFO_H