blob: ee2f722aba5608a9b91fadfe6042db9ef2119730 [file] [log] [blame]
Tom Stellard75aadc22012-12-11 21:25:42 +00001//===- SIMachineFunctionInfo.h - SIMachineFunctionInfo interface -*- 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/// \file
11//
12//===----------------------------------------------------------------------===//
13
Matt Arsenault6b6a2c32016-03-11 08:00:27 +000014#ifndef LLVM_LIB_TARGET_AMDGPU_SIMACHINEFUNCTIONINFO_H
15#define LLVM_LIB_TARGET_AMDGPU_SIMACHINEFUNCTIONINFO_H
Tom Stellard75aadc22012-12-11 21:25:42 +000016
Vincent Lejeuneace6f732013-04-01 21:47:53 +000017#include "AMDGPUMachineFunction.h"
Tom Stellard96468902014-09-24 01:33:17 +000018#include "SIRegisterInfo.h"
Tom Stellardc149dc02013-11-27 21:23:35 +000019#include <map>
Tom Stellard75aadc22012-12-11 21:25:42 +000020
21namespace llvm {
22
Tom Stellardc149dc02013-11-27 21:23:35 +000023class MachineRegisterInfo;
24
Tom Stellard75aadc22012-12-11 21:25:42 +000025/// This class keeps track of the SPI_SP_INPUT_ADDR config register, which
26/// tells the hardware which interpolation parameters to load.
Matt Arsenault6b6a2c32016-03-11 08:00:27 +000027class SIMachineFunctionInfo final : public AMDGPUMachineFunction {
Matt Arsenault26f8f3d2015-11-30 21:16:03 +000028 // FIXME: This should be removed and getPreloadedValue moved here.
29 friend struct SIRegisterInfo;
Craig Topper5656db42014-04-29 07:57:24 +000030 void anchor() override;
Tom Stellard96468902014-09-24 01:33:17 +000031
32 unsigned TIDReg;
Matt Arsenault26f8f3d2015-11-30 21:16:03 +000033
34 // Registers that may be reserved for spilling purposes. These may be the same
35 // as the input registers.
Matt Arsenault49affb82015-11-25 20:55:12 +000036 unsigned ScratchRSrcReg;
Matt Arsenault26f8f3d2015-11-30 21:16:03 +000037 unsigned ScratchWaveOffsetReg;
38
39 // Input registers setup for the HSA ABI.
40 // User SGPRs in allocation order.
41 unsigned PrivateSegmentBufferUserSGPR;
42 unsigned DispatchPtrUserSGPR;
43 unsigned QueuePtrUserSGPR;
44 unsigned KernargSegmentPtrUserSGPR;
45 unsigned DispatchIDUserSGPR;
46 unsigned FlatScratchInitUserSGPR;
47 unsigned PrivateSegmentSizeUserSGPR;
48 unsigned GridWorkGroupCountXUserSGPR;
49 unsigned GridWorkGroupCountYUserSGPR;
50 unsigned GridWorkGroupCountZUserSGPR;
51
52 // System SGPRs in allocation order.
53 unsigned WorkGroupIDXSystemSGPR;
54 unsigned WorkGroupIDYSystemSGPR;
55 unsigned WorkGroupIDZSystemSGPR;
56 unsigned WorkGroupInfoSystemSGPR;
57 unsigned PrivateSegmentWaveByteOffsetSystemSGPR;
Matt Arsenault49affb82015-11-25 20:55:12 +000058
Marek Olsakfccabaf2016-01-13 11:45:36 +000059 // Graphics info.
60 unsigned PSInputAddr;
Marek Olsak8e9cc632016-01-13 17:23:09 +000061 bool ReturnsVoid;
Marek Olsakfccabaf2016-01-13 11:45:36 +000062
Tom Stellard79a1fd72016-04-14 16:27:07 +000063 unsigned MaximumWorkGroupSize;
64
Konstantin Zhuravlyov29ddd2b2016-05-24 18:37:18 +000065 // Number of reserved VGPRs for debugger usage.
66 unsigned DebuggerReservedVGPRCount;
Konstantin Zhuravlyov71515e52016-04-26 17:24:40 +000067
Matt Arsenault49affb82015-11-25 20:55:12 +000068public:
69 // FIXME: Make private
70 unsigned LDSWaveSpillSize;
Marek Olsakfccabaf2016-01-13 11:45:36 +000071 unsigned PSInputEna;
Matt Arsenault49affb82015-11-25 20:55:12 +000072 std::map<unsigned, unsigned> LaneVGPRs;
73 unsigned ScratchOffsetReg;
74 unsigned NumUserSGPRs;
Matt Arsenault26f8f3d2015-11-30 21:16:03 +000075 unsigned NumSystemSGPRs;
Matt Arsenault49affb82015-11-25 20:55:12 +000076
77private:
Matt Arsenault5b22dfa2015-11-05 05:27:10 +000078 bool HasSpilledSGPRs;
Tom Stellard42fb60e2015-01-14 15:42:31 +000079 bool HasSpilledVGPRs;
Matt Arsenault296b8492016-02-12 06:31:30 +000080 bool HasNonSpillStackObjects;
81 bool HasFlatInstructions;
Tom Stellard96468902014-09-24 01:33:17 +000082
Matt Arsenault26f8f3d2015-11-30 21:16:03 +000083 // Feature bits required for inputs passed in user SGPRs.
84 bool PrivateSegmentBuffer : 1;
Matt Arsenault49affb82015-11-25 20:55:12 +000085 bool DispatchPtr : 1;
86 bool QueuePtr : 1;
87 bool DispatchID : 1;
88 bool KernargSegmentPtr : 1;
89 bool FlatScratchInit : 1;
90 bool GridWorkgroupCountX : 1;
91 bool GridWorkgroupCountY : 1;
92 bool GridWorkgroupCountZ : 1;
Tom Stellardc149dc02013-11-27 21:23:35 +000093
Matt Arsenault26f8f3d2015-11-30 21:16:03 +000094 // Feature bits required for inputs passed in system SGPRs.
Matt Arsenault49affb82015-11-25 20:55:12 +000095 bool WorkGroupIDX : 1; // Always initialized.
96 bool WorkGroupIDY : 1;
97 bool WorkGroupIDZ : 1;
98 bool WorkGroupInfo : 1;
Matt Arsenault26f8f3d2015-11-30 21:16:03 +000099 bool PrivateSegmentWaveByteOffset : 1;
Matt Arsenault49affb82015-11-25 20:55:12 +0000100
101 bool WorkItemIDX : 1; // Always initialized.
102 bool WorkItemIDY : 1;
103 bool WorkItemIDZ : 1;
104
Matt Arsenault26f8f3d2015-11-30 21:16:03 +0000105
106 MCPhysReg getNextUserSGPR() const {
107 assert(NumSystemSGPRs == 0 && "System SGPRs must be added after user SGPRs");
108 return AMDGPU::SGPR0 + NumUserSGPRs;
109 }
110
111 MCPhysReg getNextSystemSGPR() const {
112 return AMDGPU::SGPR0 + NumUserSGPRs + NumSystemSGPRs;
113 }
114
Matt Arsenault49affb82015-11-25 20:55:12 +0000115public:
Tom Stellardc149dc02013-11-27 21:23:35 +0000116 struct SpilledReg {
117 unsigned VGPR;
118 int Lane;
119 SpilledReg(unsigned R, int L) : VGPR (R), Lane (L) { }
Tom Stellard649b5db2016-03-04 18:31:18 +0000120 SpilledReg() : VGPR(AMDGPU::NoRegister), Lane(-1) { }
Tom Stellardc149dc02013-11-27 21:23:35 +0000121 bool hasLane() { return Lane != -1;}
Tom Stellard649b5db2016-03-04 18:31:18 +0000122 bool hasReg() { return VGPR != AMDGPU::NoRegister;}
Tom Stellardc149dc02013-11-27 21:23:35 +0000123 };
124
Tom Stellardc149dc02013-11-27 21:23:35 +0000125 // SIMachineFunctionInfo definition
126
Tom Stellard75aadc22012-12-11 21:25:42 +0000127 SIMachineFunctionInfo(const MachineFunction &MF);
Tom Stellardc5cf2f02014-08-21 20:40:54 +0000128 SpilledReg getSpilledReg(MachineFunction *MF, unsigned FrameIndex,
129 unsigned SubIdx);
Tom Stellard96468902014-09-24 01:33:17 +0000130 bool hasCalculatedTID() const { return TIDReg != AMDGPU::NoRegister; };
131 unsigned getTIDReg() const { return TIDReg; };
132 void setTIDReg(unsigned Reg) { TIDReg = Reg; }
Matt Arsenault5b22dfa2015-11-05 05:27:10 +0000133
Matt Arsenault26f8f3d2015-11-30 21:16:03 +0000134 // Add user SGPRs.
135 unsigned addPrivateSegmentBuffer(const SIRegisterInfo &TRI);
136 unsigned addDispatchPtr(const SIRegisterInfo &TRI);
137 unsigned addQueuePtr(const SIRegisterInfo &TRI);
138 unsigned addKernargSegmentPtr(const SIRegisterInfo &TRI);
Matt Arsenault296b8492016-02-12 06:31:30 +0000139 unsigned addFlatScratchInit(const SIRegisterInfo &TRI);
Matt Arsenault26f8f3d2015-11-30 21:16:03 +0000140
141 // Add system SGPRs.
142 unsigned addWorkGroupIDX() {
143 WorkGroupIDXSystemSGPR = getNextSystemSGPR();
144 NumSystemSGPRs += 1;
145 return WorkGroupIDXSystemSGPR;
146 }
147
148 unsigned addWorkGroupIDY() {
149 WorkGroupIDYSystemSGPR = getNextSystemSGPR();
150 NumSystemSGPRs += 1;
151 return WorkGroupIDYSystemSGPR;
152 }
153
154 unsigned addWorkGroupIDZ() {
155 WorkGroupIDZSystemSGPR = getNextSystemSGPR();
156 NumSystemSGPRs += 1;
157 return WorkGroupIDZSystemSGPR;
158 }
159
160 unsigned addWorkGroupInfo() {
161 WorkGroupInfoSystemSGPR = getNextSystemSGPR();
162 NumSystemSGPRs += 1;
163 return WorkGroupInfoSystemSGPR;
164 }
165
166 unsigned addPrivateSegmentWaveByteOffset() {
167 PrivateSegmentWaveByteOffsetSystemSGPR = getNextSystemSGPR();
168 NumSystemSGPRs += 1;
169 return PrivateSegmentWaveByteOffsetSystemSGPR;
170 }
171
Tom Stellardf110f8f2016-04-14 16:27:03 +0000172 void setPrivateSegmentWaveByteOffset(unsigned Reg) {
173 PrivateSegmentWaveByteOffsetSystemSGPR = Reg;
174 }
175
Matt Arsenault26f8f3d2015-11-30 21:16:03 +0000176 bool hasPrivateSegmentBuffer() const {
177 return PrivateSegmentBuffer;
178 }
179
Matt Arsenault49affb82015-11-25 20:55:12 +0000180 bool hasDispatchPtr() const {
181 return DispatchPtr;
182 }
183
184 bool hasQueuePtr() const {
185 return QueuePtr;
186 }
187
188 bool hasDispatchID() const {
189 return DispatchID;
190 }
191
192 bool hasKernargSegmentPtr() const {
193 return KernargSegmentPtr;
194 }
195
196 bool hasFlatScratchInit() const {
197 return FlatScratchInit;
198 }
199
200 bool hasGridWorkgroupCountX() const {
201 return GridWorkgroupCountX;
202 }
203
204 bool hasGridWorkgroupCountY() const {
205 return GridWorkgroupCountY;
206 }
207
208 bool hasGridWorkgroupCountZ() const {
209 return GridWorkgroupCountZ;
210 }
211
212 bool hasWorkGroupIDX() const {
213 return WorkGroupIDX;
214 }
215
216 bool hasWorkGroupIDY() const {
217 return WorkGroupIDY;
218 }
219
220 bool hasWorkGroupIDZ() const {
221 return WorkGroupIDZ;
222 }
223
224 bool hasWorkGroupInfo() const {
225 return WorkGroupInfo;
226 }
227
Matt Arsenault26f8f3d2015-11-30 21:16:03 +0000228 bool hasPrivateSegmentWaveByteOffset() const {
229 return PrivateSegmentWaveByteOffset;
230 }
231
Matt Arsenault49affb82015-11-25 20:55:12 +0000232 bool hasWorkItemIDX() const {
233 return WorkItemIDX;
234 }
235
236 bool hasWorkItemIDY() const {
237 return WorkItemIDY;
238 }
239
240 bool hasWorkItemIDZ() const {
241 return WorkItemIDZ;
242 }
243
Matt Arsenault26f8f3d2015-11-30 21:16:03 +0000244 unsigned getNumUserSGPRs() const {
245 return NumUserSGPRs;
246 }
247
248 unsigned getNumPreloadedSGPRs() const {
249 return NumUserSGPRs + NumSystemSGPRs;
250 }
251
252 unsigned getPrivateSegmentWaveByteOffsetSystemSGPR() const {
253 return PrivateSegmentWaveByteOffsetSystemSGPR;
254 }
255
Matt Arsenault49affb82015-11-25 20:55:12 +0000256 /// \brief Returns the physical register reserved for use as the resource
257 /// descriptor for scratch accesses.
258 unsigned getScratchRSrcReg() const {
259 return ScratchRSrcReg;
260 }
261
Matt Arsenault26f8f3d2015-11-30 21:16:03 +0000262 void setScratchRSrcReg(unsigned Reg) {
263 assert(Reg != AMDGPU::NoRegister && "Should never be unset");
264 ScratchRSrcReg = Reg;
265 }
266
267 unsigned getScratchWaveOffsetReg() const {
268 return ScratchWaveOffsetReg;
269 }
270
271 void setScratchWaveOffsetReg(unsigned Reg) {
272 assert(Reg != AMDGPU::NoRegister && "Should never be unset");
273 ScratchWaveOffsetReg = Reg;
274 }
Matt Arsenault49affb82015-11-25 20:55:12 +0000275
Matt Arsenault99c14522016-04-25 19:27:24 +0000276 unsigned getQueuePtrUserSGPR() const {
277 return QueuePtrUserSGPR;
278 }
279
Matt Arsenault5b22dfa2015-11-05 05:27:10 +0000280 bool hasSpilledSGPRs() const {
281 return HasSpilledSGPRs;
282 }
283
284 void setHasSpilledSGPRs(bool Spill = true) {
285 HasSpilledSGPRs = Spill;
286 }
287
288 bool hasSpilledVGPRs() const {
289 return HasSpilledVGPRs;
290 }
291
292 void setHasSpilledVGPRs(bool Spill = true) {
293 HasSpilledVGPRs = Spill;
294 }
Tom Stellard96468902014-09-24 01:33:17 +0000295
Matt Arsenault296b8492016-02-12 06:31:30 +0000296 bool hasNonSpillStackObjects() const {
297 return HasNonSpillStackObjects;
298 }
299
300 void setHasNonSpillStackObjects(bool StackObject = true) {
301 HasNonSpillStackObjects = StackObject;
302 }
303
304 bool hasFlatInstructions() const {
305 return HasFlatInstructions;
306 }
307
308 void setHasFlatInstructions(bool UseFlat = true) {
309 HasFlatInstructions = UseFlat;
310 }
311
Marek Olsakfccabaf2016-01-13 11:45:36 +0000312 unsigned getPSInputAddr() const {
313 return PSInputAddr;
314 }
315
316 bool isPSInputAllocated(unsigned Index) const {
317 return PSInputAddr & (1 << Index);
318 }
319
320 void markPSInputAllocated(unsigned Index) {
321 PSInputAddr |= 1 << Index;
322 }
323
Marek Olsak8e9cc632016-01-13 17:23:09 +0000324 bool returnsVoid() const {
325 return ReturnsVoid;
326 }
327
328 void setIfReturnsVoid(bool Value) {
329 ReturnsVoid = Value;
330 }
331
Konstantin Zhuravlyov29ddd2b2016-05-24 18:37:18 +0000332 /// \returns Number of reserved VGPRs for debugger usage.
333 unsigned getDebuggerReservedVGPRCount() const {
334 return DebuggerReservedVGPRCount;
Konstantin Zhuravlyov71515e52016-04-26 17:24:40 +0000335 }
336
Tom Stellard96468902014-09-24 01:33:17 +0000337 unsigned getMaximumWorkGroupSize(const MachineFunction &MF) const;
Tom Stellard75aadc22012-12-11 21:25:42 +0000338};
339
340} // End namespace llvm
341
Benjamin Kramera7c40ef2014-08-13 16:26:38 +0000342#endif