blob: acbd276848ff830af30f7952d3df1081786b2e53 [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
Matt Arsenault49affb82015-11-25 20:55:12 +000065public:
66 // FIXME: Make private
67 unsigned LDSWaveSpillSize;
Marek Olsakfccabaf2016-01-13 11:45:36 +000068 unsigned PSInputEna;
Matt Arsenault49affb82015-11-25 20:55:12 +000069 std::map<unsigned, unsigned> LaneVGPRs;
70 unsigned ScratchOffsetReg;
71 unsigned NumUserSGPRs;
Matt Arsenault26f8f3d2015-11-30 21:16:03 +000072 unsigned NumSystemSGPRs;
Matt Arsenault49affb82015-11-25 20:55:12 +000073
74private:
Matt Arsenault5b22dfa2015-11-05 05:27:10 +000075 bool HasSpilledSGPRs;
Tom Stellard42fb60e2015-01-14 15:42:31 +000076 bool HasSpilledVGPRs;
Matt Arsenault296b8492016-02-12 06:31:30 +000077 bool HasNonSpillStackObjects;
78 bool HasFlatInstructions;
Tom Stellard96468902014-09-24 01:33:17 +000079
Matt Arsenault26f8f3d2015-11-30 21:16:03 +000080 // Feature bits required for inputs passed in user SGPRs.
81 bool PrivateSegmentBuffer : 1;
Matt Arsenault49affb82015-11-25 20:55:12 +000082 bool DispatchPtr : 1;
83 bool QueuePtr : 1;
84 bool DispatchID : 1;
85 bool KernargSegmentPtr : 1;
86 bool FlatScratchInit : 1;
87 bool GridWorkgroupCountX : 1;
88 bool GridWorkgroupCountY : 1;
89 bool GridWorkgroupCountZ : 1;
Tom Stellardc149dc02013-11-27 21:23:35 +000090
Matt Arsenault26f8f3d2015-11-30 21:16:03 +000091 // Feature bits required for inputs passed in system SGPRs.
Matt Arsenault49affb82015-11-25 20:55:12 +000092 bool WorkGroupIDX : 1; // Always initialized.
93 bool WorkGroupIDY : 1;
94 bool WorkGroupIDZ : 1;
95 bool WorkGroupInfo : 1;
Matt Arsenault26f8f3d2015-11-30 21:16:03 +000096 bool PrivateSegmentWaveByteOffset : 1;
Matt Arsenault49affb82015-11-25 20:55:12 +000097
98 bool WorkItemIDX : 1; // Always initialized.
99 bool WorkItemIDY : 1;
100 bool WorkItemIDZ : 1;
101
Matt Arsenault26f8f3d2015-11-30 21:16:03 +0000102
103 MCPhysReg getNextUserSGPR() const {
104 assert(NumSystemSGPRs == 0 && "System SGPRs must be added after user SGPRs");
105 return AMDGPU::SGPR0 + NumUserSGPRs;
106 }
107
108 MCPhysReg getNextSystemSGPR() const {
109 return AMDGPU::SGPR0 + NumUserSGPRs + NumSystemSGPRs;
110 }
111
Matt Arsenault49affb82015-11-25 20:55:12 +0000112public:
Tom Stellardc149dc02013-11-27 21:23:35 +0000113 struct SpilledReg {
114 unsigned VGPR;
115 int Lane;
116 SpilledReg(unsigned R, int L) : VGPR (R), Lane (L) { }
Tom Stellard649b5db2016-03-04 18:31:18 +0000117 SpilledReg() : VGPR(AMDGPU::NoRegister), Lane(-1) { }
Tom Stellardc149dc02013-11-27 21:23:35 +0000118 bool hasLane() { return Lane != -1;}
Tom Stellard649b5db2016-03-04 18:31:18 +0000119 bool hasReg() { return VGPR != AMDGPU::NoRegister;}
Tom Stellardc149dc02013-11-27 21:23:35 +0000120 };
121
Tom Stellardc149dc02013-11-27 21:23:35 +0000122 // SIMachineFunctionInfo definition
123
Tom Stellard75aadc22012-12-11 21:25:42 +0000124 SIMachineFunctionInfo(const MachineFunction &MF);
Tom Stellardc5cf2f02014-08-21 20:40:54 +0000125 SpilledReg getSpilledReg(MachineFunction *MF, unsigned FrameIndex,
126 unsigned SubIdx);
Tom Stellard96468902014-09-24 01:33:17 +0000127 bool hasCalculatedTID() const { return TIDReg != AMDGPU::NoRegister; };
128 unsigned getTIDReg() const { return TIDReg; };
129 void setTIDReg(unsigned Reg) { TIDReg = Reg; }
Matt Arsenault5b22dfa2015-11-05 05:27:10 +0000130
Matt Arsenault26f8f3d2015-11-30 21:16:03 +0000131 // Add user SGPRs.
132 unsigned addPrivateSegmentBuffer(const SIRegisterInfo &TRI);
133 unsigned addDispatchPtr(const SIRegisterInfo &TRI);
134 unsigned addQueuePtr(const SIRegisterInfo &TRI);
135 unsigned addKernargSegmentPtr(const SIRegisterInfo &TRI);
Matt Arsenault296b8492016-02-12 06:31:30 +0000136 unsigned addFlatScratchInit(const SIRegisterInfo &TRI);
Matt Arsenault26f8f3d2015-11-30 21:16:03 +0000137
138 // Add system SGPRs.
139 unsigned addWorkGroupIDX() {
140 WorkGroupIDXSystemSGPR = getNextSystemSGPR();
141 NumSystemSGPRs += 1;
142 return WorkGroupIDXSystemSGPR;
143 }
144
145 unsigned addWorkGroupIDY() {
146 WorkGroupIDYSystemSGPR = getNextSystemSGPR();
147 NumSystemSGPRs += 1;
148 return WorkGroupIDYSystemSGPR;
149 }
150
151 unsigned addWorkGroupIDZ() {
152 WorkGroupIDZSystemSGPR = getNextSystemSGPR();
153 NumSystemSGPRs += 1;
154 return WorkGroupIDZSystemSGPR;
155 }
156
157 unsigned addWorkGroupInfo() {
158 WorkGroupInfoSystemSGPR = getNextSystemSGPR();
159 NumSystemSGPRs += 1;
160 return WorkGroupInfoSystemSGPR;
161 }
162
163 unsigned addPrivateSegmentWaveByteOffset() {
164 PrivateSegmentWaveByteOffsetSystemSGPR = getNextSystemSGPR();
165 NumSystemSGPRs += 1;
166 return PrivateSegmentWaveByteOffsetSystemSGPR;
167 }
168
Tom Stellardf110f8f2016-04-14 16:27:03 +0000169 void setPrivateSegmentWaveByteOffset(unsigned Reg) {
170 PrivateSegmentWaveByteOffsetSystemSGPR = Reg;
171 }
172
Matt Arsenault26f8f3d2015-11-30 21:16:03 +0000173 bool hasPrivateSegmentBuffer() const {
174 return PrivateSegmentBuffer;
175 }
176
Matt Arsenault49affb82015-11-25 20:55:12 +0000177 bool hasDispatchPtr() const {
178 return DispatchPtr;
179 }
180
181 bool hasQueuePtr() const {
182 return QueuePtr;
183 }
184
185 bool hasDispatchID() const {
186 return DispatchID;
187 }
188
189 bool hasKernargSegmentPtr() const {
190 return KernargSegmentPtr;
191 }
192
193 bool hasFlatScratchInit() const {
194 return FlatScratchInit;
195 }
196
197 bool hasGridWorkgroupCountX() const {
198 return GridWorkgroupCountX;
199 }
200
201 bool hasGridWorkgroupCountY() const {
202 return GridWorkgroupCountY;
203 }
204
205 bool hasGridWorkgroupCountZ() const {
206 return GridWorkgroupCountZ;
207 }
208
209 bool hasWorkGroupIDX() const {
210 return WorkGroupIDX;
211 }
212
213 bool hasWorkGroupIDY() const {
214 return WorkGroupIDY;
215 }
216
217 bool hasWorkGroupIDZ() const {
218 return WorkGroupIDZ;
219 }
220
221 bool hasWorkGroupInfo() const {
222 return WorkGroupInfo;
223 }
224
Matt Arsenault26f8f3d2015-11-30 21:16:03 +0000225 bool hasPrivateSegmentWaveByteOffset() const {
226 return PrivateSegmentWaveByteOffset;
227 }
228
Matt Arsenault49affb82015-11-25 20:55:12 +0000229 bool hasWorkItemIDX() const {
230 return WorkItemIDX;
231 }
232
233 bool hasWorkItemIDY() const {
234 return WorkItemIDY;
235 }
236
237 bool hasWorkItemIDZ() const {
238 return WorkItemIDZ;
239 }
240
Matt Arsenault26f8f3d2015-11-30 21:16:03 +0000241 unsigned getNumUserSGPRs() const {
242 return NumUserSGPRs;
243 }
244
245 unsigned getNumPreloadedSGPRs() const {
246 return NumUserSGPRs + NumSystemSGPRs;
247 }
248
249 unsigned getPrivateSegmentWaveByteOffsetSystemSGPR() const {
250 return PrivateSegmentWaveByteOffsetSystemSGPR;
251 }
252
Matt Arsenault49affb82015-11-25 20:55:12 +0000253 /// \brief Returns the physical register reserved for use as the resource
254 /// descriptor for scratch accesses.
255 unsigned getScratchRSrcReg() const {
256 return ScratchRSrcReg;
257 }
258
Matt Arsenault26f8f3d2015-11-30 21:16:03 +0000259 void setScratchRSrcReg(unsigned Reg) {
260 assert(Reg != AMDGPU::NoRegister && "Should never be unset");
261 ScratchRSrcReg = Reg;
262 }
263
264 unsigned getScratchWaveOffsetReg() const {
265 return ScratchWaveOffsetReg;
266 }
267
268 void setScratchWaveOffsetReg(unsigned Reg) {
269 assert(Reg != AMDGPU::NoRegister && "Should never be unset");
270 ScratchWaveOffsetReg = Reg;
271 }
Matt Arsenault49affb82015-11-25 20:55:12 +0000272
Matt Arsenault5b22dfa2015-11-05 05:27:10 +0000273 bool hasSpilledSGPRs() const {
274 return HasSpilledSGPRs;
275 }
276
277 void setHasSpilledSGPRs(bool Spill = true) {
278 HasSpilledSGPRs = Spill;
279 }
280
281 bool hasSpilledVGPRs() const {
282 return HasSpilledVGPRs;
283 }
284
285 void setHasSpilledVGPRs(bool Spill = true) {
286 HasSpilledVGPRs = Spill;
287 }
Tom Stellard96468902014-09-24 01:33:17 +0000288
Matt Arsenault296b8492016-02-12 06:31:30 +0000289 bool hasNonSpillStackObjects() const {
290 return HasNonSpillStackObjects;
291 }
292
293 void setHasNonSpillStackObjects(bool StackObject = true) {
294 HasNonSpillStackObjects = StackObject;
295 }
296
297 bool hasFlatInstructions() const {
298 return HasFlatInstructions;
299 }
300
301 void setHasFlatInstructions(bool UseFlat = true) {
302 HasFlatInstructions = UseFlat;
303 }
304
Marek Olsakfccabaf2016-01-13 11:45:36 +0000305 unsigned getPSInputAddr() const {
306 return PSInputAddr;
307 }
308
309 bool isPSInputAllocated(unsigned Index) const {
310 return PSInputAddr & (1 << Index);
311 }
312
313 void markPSInputAllocated(unsigned Index) {
314 PSInputAddr |= 1 << Index;
315 }
316
Marek Olsak8e9cc632016-01-13 17:23:09 +0000317 bool returnsVoid() const {
318 return ReturnsVoid;
319 }
320
321 void setIfReturnsVoid(bool Value) {
322 ReturnsVoid = Value;
323 }
324
Tom Stellard96468902014-09-24 01:33:17 +0000325 unsigned getMaximumWorkGroupSize(const MachineFunction &MF) const;
Tom Stellard75aadc22012-12-11 21:25:42 +0000326};
327
328} // End namespace llvm
329
Benjamin Kramera7c40ef2014-08-13 16:26:38 +0000330#endif