blob: 94145c46e10a346d8e59958a6e1a7c758731ea3a [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"
Matt Arsenault678e1112017-04-10 17:58:06 +000018#include "MCTargetDesc/AMDGPUMCTargetDesc.h"
Chandler Carruth6bda14b2017-06-06 11:49:48 +000019#include "SIRegisterInfo.h"
Eugene Zelenko66203762017-01-21 00:53:49 +000020#include "llvm/CodeGen/PseudoSourceValue.h"
21#include "llvm/MC/MCRegisterInfo.h"
22#include "llvm/Support/ErrorHandling.h"
NAKAMURA Takumi5cbd41e2016-06-27 10:26:43 +000023#include <array>
Eugene Zelenko66203762017-01-21 00:53:49 +000024#include <cassert>
Tom Stellardc149dc02013-11-27 21:23:35 +000025#include <map>
Eugene Zelenko66203762017-01-21 00:53:49 +000026#include <utility>
Tom Stellard75aadc22012-12-11 21:25:42 +000027
28namespace llvm {
29
Tom Stellard244891d2016-12-20 15:52:17 +000030class AMDGPUImagePseudoSourceValue : public PseudoSourceValue {
31public:
32 explicit AMDGPUImagePseudoSourceValue() :
33 PseudoSourceValue(PseudoSourceValue::TargetCustom) { }
34
35 bool isConstant(const MachineFrameInfo *) const override {
36 // This should probably be true for most images, but we will start by being
37 // conservative.
38 return false;
39 }
40
41 bool isAliased(const MachineFrameInfo *) const override {
42 // FIXME: If we ever change image intrinsics to accept fat pointers, then
43 // this could be true for some cases.
44 return false;
45 }
46
47 bool mayAlias(const MachineFrameInfo*) const override {
48 // FIXME: If we ever change image intrinsics to accept fat pointers, then
49 // this could be true for some cases.
50 return false;
51 }
52};
53
Tom Stellard6f9ef142016-12-20 17:19:44 +000054class AMDGPUBufferPseudoSourceValue : public PseudoSourceValue {
55public:
56 explicit AMDGPUBufferPseudoSourceValue() :
57 PseudoSourceValue(PseudoSourceValue::TargetCustom) { }
58
59 bool isConstant(const MachineFrameInfo *) const override {
60 // This should probably be true for most images, but we will start by being
61 // conservative.
62 return false;
63 }
64
65 bool isAliased(const MachineFrameInfo *) const override {
66 // FIXME: If we ever change image intrinsics to accept fat pointers, then
67 // this could be true for some cases.
68 return false;
69 }
70
71 bool mayAlias(const MachineFrameInfo*) const override {
72 // FIXME: If we ever change image intrinsics to accept fat pointers, then
73 // this could be true for some cases.
74 return false;
75 }
76};
Tom Stellard244891d2016-12-20 15:52:17 +000077
Tom Stellard75aadc22012-12-11 21:25:42 +000078/// This class keeps track of the SPI_SP_INPUT_ADDR config register, which
79/// tells the hardware which interpolation parameters to load.
Matt Arsenault6b6a2c32016-03-11 08:00:27 +000080class SIMachineFunctionInfo final : public AMDGPUMachineFunction {
Matt Arsenault26f8f3d2015-11-30 21:16:03 +000081 // FIXME: This should be removed and getPreloadedValue moved here.
Saleem Abdulrasool43e5fe32016-08-29 20:42:07 +000082 friend class SIRegisterInfo;
Tom Stellard96468902014-09-24 01:33:17 +000083
84 unsigned TIDReg;
Matt Arsenault26f8f3d2015-11-30 21:16:03 +000085
86 // Registers that may be reserved for spilling purposes. These may be the same
87 // as the input registers.
Matt Arsenault49affb82015-11-25 20:55:12 +000088 unsigned ScratchRSrcReg;
Matt Arsenault26f8f3d2015-11-30 21:16:03 +000089 unsigned ScratchWaveOffsetReg;
90
Matt Arsenault1c0ae392017-04-24 18:05:16 +000091 // This is the current function's incremented size from the kernel's scratch
92 // wave offset register. For an entry function, this is exactly the same as
93 // the ScratchWaveOffsetReg.
94 unsigned FrameOffsetReg;
95
96 // Top of the stack SGPR offset derived from the ScratchWaveOffsetReg.
97 unsigned StackPtrOffsetReg;
98
Tom Stellard2f3f9852017-01-25 01:25:13 +000099 // Input registers for non-HSA ABI
Matt Arsenault10fc0622017-06-26 03:01:31 +0000100 unsigned ImplicitBufferPtrUserSGPR;
Tom Stellard2f3f9852017-01-25 01:25:13 +0000101
Matt Arsenault26f8f3d2015-11-30 21:16:03 +0000102 // Input registers setup for the HSA ABI.
103 // User SGPRs in allocation order.
104 unsigned PrivateSegmentBufferUserSGPR;
105 unsigned DispatchPtrUserSGPR;
106 unsigned QueuePtrUserSGPR;
107 unsigned KernargSegmentPtrUserSGPR;
108 unsigned DispatchIDUserSGPR;
109 unsigned FlatScratchInitUserSGPR;
110 unsigned PrivateSegmentSizeUserSGPR;
111 unsigned GridWorkGroupCountXUserSGPR;
112 unsigned GridWorkGroupCountYUserSGPR;
113 unsigned GridWorkGroupCountZUserSGPR;
114
115 // System SGPRs in allocation order.
116 unsigned WorkGroupIDXSystemSGPR;
117 unsigned WorkGroupIDYSystemSGPR;
118 unsigned WorkGroupIDZSystemSGPR;
119 unsigned WorkGroupInfoSystemSGPR;
120 unsigned PrivateSegmentWaveByteOffsetSystemSGPR;
Matt Arsenault49affb82015-11-25 20:55:12 +0000121
Matt Arsenaulte15855d2017-07-17 22:35:50 +0000122 // VGPR inputs. These are always v0, v1 and v2 for entry functions.
123 unsigned WorkItemIDXVGPR;
124 unsigned WorkItemIDYVGPR;
125 unsigned WorkItemIDZVGPR;
126
Marek Olsakfccabaf2016-01-13 11:45:36 +0000127 // Graphics info.
128 unsigned PSInputAddr;
Matt Arsenaulte622dc32017-04-11 22:29:24 +0000129 unsigned PSInputEnable;
130
Marek Olsak8e9cc632016-01-13 17:23:09 +0000131 bool ReturnsVoid;
Marek Olsakfccabaf2016-01-13 11:45:36 +0000132
Konstantin Zhuravlyov1d650262016-09-06 20:22:28 +0000133 // A pair of default/requested minimum/maximum flat work group sizes.
134 // Minimum - first, maximum - second.
135 std::pair<unsigned, unsigned> FlatWorkGroupSizes;
Tom Stellard79a1fd72016-04-14 16:27:07 +0000136
Konstantin Zhuravlyov1d650262016-09-06 20:22:28 +0000137 // A pair of default/requested minimum/maximum number of waves per execution
138 // unit. Minimum - first, maximum - second.
139 std::pair<unsigned, unsigned> WavesPerEU;
140
Konstantin Zhuravlyovf2f3d142016-06-25 03:11:28 +0000141 // Stack object indices for work group IDs.
NAKAMURA Takumi5cbd41e2016-06-27 10:26:43 +0000142 std::array<int, 3> DebuggerWorkGroupIDStackObjectIndices;
Konstantin Zhuravlyovf2f3d142016-06-25 03:11:28 +0000143 // Stack object indices for work item IDs.
NAKAMURA Takumi5cbd41e2016-06-27 10:26:43 +0000144 std::array<int, 3> DebuggerWorkItemIDStackObjectIndices;
Konstantin Zhuravlyov71515e52016-04-26 17:24:40 +0000145
Tom Stellard6f9ef142016-12-20 17:19:44 +0000146 AMDGPUBufferPseudoSourceValue BufferPSV;
Tom Stellardbb138882016-12-20 17:26:34 +0000147 AMDGPUImagePseudoSourceValue ImagePSV;
Tom Stellard244891d2016-12-20 15:52:17 +0000148
Matt Arsenault161e2b42017-04-18 20:59:40 +0000149private:
Matt Arsenault49affb82015-11-25 20:55:12 +0000150 unsigned LDSWaveSpillSize;
Matt Arsenault49affb82015-11-25 20:55:12 +0000151 unsigned ScratchOffsetReg;
152 unsigned NumUserSGPRs;
Matt Arsenault26f8f3d2015-11-30 21:16:03 +0000153 unsigned NumSystemSGPRs;
Matt Arsenault49affb82015-11-25 20:55:12 +0000154
Matt Arsenault5b22dfa2015-11-05 05:27:10 +0000155 bool HasSpilledSGPRs;
Tom Stellard42fb60e2015-01-14 15:42:31 +0000156 bool HasSpilledVGPRs;
Matt Arsenault296b8492016-02-12 06:31:30 +0000157 bool HasNonSpillStackObjects;
Tom Stellard96468902014-09-24 01:33:17 +0000158
Marek Olsak0532c192016-07-13 17:35:15 +0000159 unsigned NumSpilledSGPRs;
160 unsigned NumSpilledVGPRs;
161
Matt Arsenault26f8f3d2015-11-30 21:16:03 +0000162 // Feature bits required for inputs passed in user SGPRs.
163 bool PrivateSegmentBuffer : 1;
Matt Arsenault49affb82015-11-25 20:55:12 +0000164 bool DispatchPtr : 1;
165 bool QueuePtr : 1;
Matt Arsenault49affb82015-11-25 20:55:12 +0000166 bool KernargSegmentPtr : 1;
Matt Arsenault8d718dc2016-07-22 17:01:30 +0000167 bool DispatchID : 1;
Matt Arsenault49affb82015-11-25 20:55:12 +0000168 bool FlatScratchInit : 1;
169 bool GridWorkgroupCountX : 1;
170 bool GridWorkgroupCountY : 1;
171 bool GridWorkgroupCountZ : 1;
Tom Stellardc149dc02013-11-27 21:23:35 +0000172
Matt Arsenault26f8f3d2015-11-30 21:16:03 +0000173 // Feature bits required for inputs passed in system SGPRs.
Matt Arsenault49affb82015-11-25 20:55:12 +0000174 bool WorkGroupIDX : 1; // Always initialized.
175 bool WorkGroupIDY : 1;
176 bool WorkGroupIDZ : 1;
177 bool WorkGroupInfo : 1;
Matt Arsenault26f8f3d2015-11-30 21:16:03 +0000178 bool PrivateSegmentWaveByteOffset : 1;
Matt Arsenault49affb82015-11-25 20:55:12 +0000179
180 bool WorkItemIDX : 1; // Always initialized.
181 bool WorkItemIDY : 1;
182 bool WorkItemIDZ : 1;
183
Tom Stellard2f3f9852017-01-25 01:25:13 +0000184 // Private memory buffer
185 // Compute directly in sgpr[0:1]
186 // Other shaders indirect 64-bits at sgpr[0:1]
Matt Arsenault10fc0622017-06-26 03:01:31 +0000187 bool ImplicitBufferPtr : 1;
Tom Stellard2f3f9852017-01-25 01:25:13 +0000188
Matt Arsenault9166ce82017-07-28 15:52:08 +0000189 // Pointer to where the ABI inserts special kernel arguments separate from the
190 // user arguments. This is an offset from the KernargSegmentPtr.
191 bool ImplicitArgPtr : 1;
192
Matt Arsenault26f8f3d2015-11-30 21:16:03 +0000193 MCPhysReg getNextUserSGPR() const {
194 assert(NumSystemSGPRs == 0 && "System SGPRs must be added after user SGPRs");
195 return AMDGPU::SGPR0 + NumUserSGPRs;
196 }
197
198 MCPhysReg getNextSystemSGPR() const {
199 return AMDGPU::SGPR0 + NumUserSGPRs + NumSystemSGPRs;
200 }
201
Matt Arsenault49affb82015-11-25 20:55:12 +0000202public:
Tom Stellardc149dc02013-11-27 21:23:35 +0000203 struct SpilledReg {
Eugene Zelenko66203762017-01-21 00:53:49 +0000204 unsigned VGPR = AMDGPU::NoRegister;
205 int Lane = -1;
206
207 SpilledReg() = default;
Tom Stellardc149dc02013-11-27 21:23:35 +0000208 SpilledReg(unsigned R, int L) : VGPR (R), Lane (L) { }
Eugene Zelenko66203762017-01-21 00:53:49 +0000209
Tom Stellardc149dc02013-11-27 21:23:35 +0000210 bool hasLane() { return Lane != -1;}
Tom Stellard649b5db2016-03-04 18:31:18 +0000211 bool hasReg() { return VGPR != AMDGPU::NoRegister;}
Tom Stellardc149dc02013-11-27 21:23:35 +0000212 };
213
Matt Arsenault8e8f8f42017-08-02 01:52:45 +0000214 struct SGPRSpillVGPRCSR {
215 // VGPR used for SGPR spills
216 unsigned VGPR;
217
218 // If the VGPR is a CSR, the stack slot used to save/restore it in the
219 // prolog/epilog.
220 Optional<int> FI;
221
222 SGPRSpillVGPRCSR(unsigned V, Optional<int> F) :
223 VGPR(V),
224 FI(F) {}
225 };
226
Matt Arsenaulte0bf7d02017-02-21 19:12:08 +0000227private:
228 // SGPR->VGPR spilling support.
229 typedef std::pair<unsigned, unsigned> SpillRegMask;
230
231 // Track VGPR + wave index for each subregister of the SGPR spilled to
232 // frameindex key.
233 DenseMap<int, std::vector<SpilledReg>> SGPRToVGPRSpills;
234 unsigned NumVGPRSpillLanes = 0;
Matt Arsenault8e8f8f42017-08-02 01:52:45 +0000235 SmallVector<SGPRSpillVGPRCSR, 2> SpillVGPRs;
Matt Arsenaulte0bf7d02017-02-21 19:12:08 +0000236
237public:
Tom Stellardc149dc02013-11-27 21:23:35 +0000238
Tom Stellard75aadc22012-12-11 21:25:42 +0000239 SIMachineFunctionInfo(const MachineFunction &MF);
Eugene Zelenko66203762017-01-21 00:53:49 +0000240
Matt Arsenaulte0bf7d02017-02-21 19:12:08 +0000241 ArrayRef<SpilledReg> getSGPRToVGPRSpills(int FrameIndex) const {
242 auto I = SGPRToVGPRSpills.find(FrameIndex);
243 return (I == SGPRToVGPRSpills.end()) ?
244 ArrayRef<SpilledReg>() : makeArrayRef(I->second);
245 }
246
Matt Arsenault8e8f8f42017-08-02 01:52:45 +0000247 ArrayRef<SGPRSpillVGPRCSR> getSGPRSpillVGPRs() const {
248 return SpillVGPRs;
249 }
250
Matt Arsenaulte0bf7d02017-02-21 19:12:08 +0000251 bool allocateSGPRSpillToVGPR(MachineFunction &MF, int FI);
252 void removeSGPRToVGPRFrameIndices(MachineFrameInfo &MFI);
253
Tom Stellard96468902014-09-24 01:33:17 +0000254 bool hasCalculatedTID() const { return TIDReg != AMDGPU::NoRegister; };
255 unsigned getTIDReg() const { return TIDReg; };
256 void setTIDReg(unsigned Reg) { TIDReg = Reg; }
Matt Arsenault5b22dfa2015-11-05 05:27:10 +0000257
Matt Arsenault26f8f3d2015-11-30 21:16:03 +0000258 // Add user SGPRs.
259 unsigned addPrivateSegmentBuffer(const SIRegisterInfo &TRI);
260 unsigned addDispatchPtr(const SIRegisterInfo &TRI);
261 unsigned addQueuePtr(const SIRegisterInfo &TRI);
262 unsigned addKernargSegmentPtr(const SIRegisterInfo &TRI);
Matt Arsenault8d718dc2016-07-22 17:01:30 +0000263 unsigned addDispatchID(const SIRegisterInfo &TRI);
Matt Arsenault296b8492016-02-12 06:31:30 +0000264 unsigned addFlatScratchInit(const SIRegisterInfo &TRI);
Matt Arsenault10fc0622017-06-26 03:01:31 +0000265 unsigned addImplicitBufferPtr(const SIRegisterInfo &TRI);
Matt Arsenault26f8f3d2015-11-30 21:16:03 +0000266
267 // Add system SGPRs.
268 unsigned addWorkGroupIDX() {
269 WorkGroupIDXSystemSGPR = getNextSystemSGPR();
270 NumSystemSGPRs += 1;
271 return WorkGroupIDXSystemSGPR;
272 }
273
274 unsigned addWorkGroupIDY() {
275 WorkGroupIDYSystemSGPR = getNextSystemSGPR();
276 NumSystemSGPRs += 1;
277 return WorkGroupIDYSystemSGPR;
278 }
279
280 unsigned addWorkGroupIDZ() {
281 WorkGroupIDZSystemSGPR = getNextSystemSGPR();
282 NumSystemSGPRs += 1;
283 return WorkGroupIDZSystemSGPR;
284 }
285
286 unsigned addWorkGroupInfo() {
287 WorkGroupInfoSystemSGPR = getNextSystemSGPR();
288 NumSystemSGPRs += 1;
289 return WorkGroupInfoSystemSGPR;
290 }
291
292 unsigned addPrivateSegmentWaveByteOffset() {
293 PrivateSegmentWaveByteOffsetSystemSGPR = getNextSystemSGPR();
294 NumSystemSGPRs += 1;
295 return PrivateSegmentWaveByteOffsetSystemSGPR;
296 }
297
Tom Stellardf110f8f2016-04-14 16:27:03 +0000298 void setPrivateSegmentWaveByteOffset(unsigned Reg) {
299 PrivateSegmentWaveByteOffsetSystemSGPR = Reg;
300 }
301
Matt Arsenault26f8f3d2015-11-30 21:16:03 +0000302 bool hasPrivateSegmentBuffer() const {
303 return PrivateSegmentBuffer;
304 }
305
Matt Arsenault49affb82015-11-25 20:55:12 +0000306 bool hasDispatchPtr() const {
307 return DispatchPtr;
308 }
309
310 bool hasQueuePtr() const {
311 return QueuePtr;
312 }
313
Matt Arsenault49affb82015-11-25 20:55:12 +0000314 bool hasKernargSegmentPtr() const {
315 return KernargSegmentPtr;
316 }
317
Matt Arsenault8d718dc2016-07-22 17:01:30 +0000318 bool hasDispatchID() const {
319 return DispatchID;
320 }
321
Matt Arsenault49affb82015-11-25 20:55:12 +0000322 bool hasFlatScratchInit() const {
323 return FlatScratchInit;
324 }
325
326 bool hasGridWorkgroupCountX() const {
327 return GridWorkgroupCountX;
328 }
329
330 bool hasGridWorkgroupCountY() const {
331 return GridWorkgroupCountY;
332 }
333
334 bool hasGridWorkgroupCountZ() const {
335 return GridWorkgroupCountZ;
336 }
337
338 bool hasWorkGroupIDX() const {
339 return WorkGroupIDX;
340 }
341
342 bool hasWorkGroupIDY() const {
343 return WorkGroupIDY;
344 }
345
346 bool hasWorkGroupIDZ() const {
347 return WorkGroupIDZ;
348 }
349
350 bool hasWorkGroupInfo() const {
351 return WorkGroupInfo;
352 }
353
Matt Arsenault26f8f3d2015-11-30 21:16:03 +0000354 bool hasPrivateSegmentWaveByteOffset() const {
355 return PrivateSegmentWaveByteOffset;
356 }
357
Matt Arsenault49affb82015-11-25 20:55:12 +0000358 bool hasWorkItemIDX() const {
359 return WorkItemIDX;
360 }
361
362 bool hasWorkItemIDY() const {
363 return WorkItemIDY;
364 }
365
366 bool hasWorkItemIDZ() const {
367 return WorkItemIDZ;
368 }
369
Matt Arsenault9166ce82017-07-28 15:52:08 +0000370 bool hasImplicitArgPtr() const {
371 return ImplicitArgPtr;
372 }
373
Matt Arsenault10fc0622017-06-26 03:01:31 +0000374 bool hasImplicitBufferPtr() const {
375 return ImplicitBufferPtr;
Tom Stellard2f3f9852017-01-25 01:25:13 +0000376 }
377
Matt Arsenault26f8f3d2015-11-30 21:16:03 +0000378 unsigned getNumUserSGPRs() const {
379 return NumUserSGPRs;
380 }
381
382 unsigned getNumPreloadedSGPRs() const {
383 return NumUserSGPRs + NumSystemSGPRs;
384 }
385
386 unsigned getPrivateSegmentWaveByteOffsetSystemSGPR() const {
387 return PrivateSegmentWaveByteOffsetSystemSGPR;
388 }
389
Matt Arsenault49affb82015-11-25 20:55:12 +0000390 /// \brief Returns the physical register reserved for use as the resource
391 /// descriptor for scratch accesses.
392 unsigned getScratchRSrcReg() const {
393 return ScratchRSrcReg;
394 }
395
Matt Arsenault26f8f3d2015-11-30 21:16:03 +0000396 void setScratchRSrcReg(unsigned Reg) {
397 assert(Reg != AMDGPU::NoRegister && "Should never be unset");
398 ScratchRSrcReg = Reg;
399 }
400
401 unsigned getScratchWaveOffsetReg() const {
402 return ScratchWaveOffsetReg;
403 }
404
Matt Arsenault1c0ae392017-04-24 18:05:16 +0000405 unsigned getFrameOffsetReg() const {
406 return FrameOffsetReg;
407 }
408
409 void setStackPtrOffsetReg(unsigned Reg) {
Matt Arsenault1c0ae392017-04-24 18:05:16 +0000410 StackPtrOffsetReg = Reg;
411 }
412
Matt Arsenault1cc47f82017-07-18 16:44:56 +0000413 // Note the unset value for this is AMDGPU::SP_REG rather than
414 // NoRegister. This is mostly a workaround for MIR tests where state that
415 // can't be directly computed from the function is not preserved in serialized
416 // MIR.
Matt Arsenault1c0ae392017-04-24 18:05:16 +0000417 unsigned getStackPtrOffsetReg() const {
418 return StackPtrOffsetReg;
419 }
420
Matt Arsenault26f8f3d2015-11-30 21:16:03 +0000421 void setScratchWaveOffsetReg(unsigned Reg) {
422 assert(Reg != AMDGPU::NoRegister && "Should never be unset");
423 ScratchWaveOffsetReg = Reg;
Matt Arsenault2b1f9aa2017-05-17 21:56:25 +0000424 if (isEntryFunction())
425 FrameOffsetReg = ScratchWaveOffsetReg;
Matt Arsenault26f8f3d2015-11-30 21:16:03 +0000426 }
Matt Arsenault49affb82015-11-25 20:55:12 +0000427
Matt Arsenault99c14522016-04-25 19:27:24 +0000428 unsigned getQueuePtrUserSGPR() const {
429 return QueuePtrUserSGPR;
430 }
431
Matt Arsenault10fc0622017-06-26 03:01:31 +0000432 unsigned getImplicitBufferPtrUserSGPR() const {
433 return ImplicitBufferPtrUserSGPR;
Tom Stellard2f3f9852017-01-25 01:25:13 +0000434 }
435
Matt Arsenault5b22dfa2015-11-05 05:27:10 +0000436 bool hasSpilledSGPRs() const {
437 return HasSpilledSGPRs;
438 }
439
440 void setHasSpilledSGPRs(bool Spill = true) {
441 HasSpilledSGPRs = Spill;
442 }
443
444 bool hasSpilledVGPRs() const {
445 return HasSpilledVGPRs;
446 }
447
448 void setHasSpilledVGPRs(bool Spill = true) {
449 HasSpilledVGPRs = Spill;
450 }
Tom Stellard96468902014-09-24 01:33:17 +0000451
Matt Arsenault296b8492016-02-12 06:31:30 +0000452 bool hasNonSpillStackObjects() const {
453 return HasNonSpillStackObjects;
454 }
455
456 void setHasNonSpillStackObjects(bool StackObject = true) {
457 HasNonSpillStackObjects = StackObject;
458 }
459
Marek Olsak0532c192016-07-13 17:35:15 +0000460 unsigned getNumSpilledSGPRs() const {
461 return NumSpilledSGPRs;
462 }
463
464 unsigned getNumSpilledVGPRs() const {
465 return NumSpilledVGPRs;
466 }
467
468 void addToSpilledSGPRs(unsigned num) {
469 NumSpilledSGPRs += num;
470 }
471
472 void addToSpilledVGPRs(unsigned num) {
473 NumSpilledVGPRs += num;
474 }
475
Marek Olsakfccabaf2016-01-13 11:45:36 +0000476 unsigned getPSInputAddr() const {
477 return PSInputAddr;
478 }
479
Matt Arsenaulte622dc32017-04-11 22:29:24 +0000480 unsigned getPSInputEnable() const {
481 return PSInputEnable;
482 }
483
Marek Olsakfccabaf2016-01-13 11:45:36 +0000484 bool isPSInputAllocated(unsigned Index) const {
485 return PSInputAddr & (1 << Index);
486 }
487
488 void markPSInputAllocated(unsigned Index) {
489 PSInputAddr |= 1 << Index;
490 }
491
Matt Arsenaulte622dc32017-04-11 22:29:24 +0000492 void markPSInputEnabled(unsigned Index) {
493 PSInputEnable |= 1 << Index;
494 }
495
Marek Olsak8e9cc632016-01-13 17:23:09 +0000496 bool returnsVoid() const {
497 return ReturnsVoid;
498 }
499
500 void setIfReturnsVoid(bool Value) {
501 ReturnsVoid = Value;
502 }
503
Konstantin Zhuravlyov1d650262016-09-06 20:22:28 +0000504 /// \returns A pair of default/requested minimum/maximum flat work group sizes
505 /// for this function.
506 std::pair<unsigned, unsigned> getFlatWorkGroupSizes() const {
507 return FlatWorkGroupSizes;
508 }
509
510 /// \returns Default/requested minimum flat work group size for this function.
511 unsigned getMinFlatWorkGroupSize() const {
512 return FlatWorkGroupSizes.first;
513 }
514
515 /// \returns Default/requested maximum flat work group size for this function.
516 unsigned getMaxFlatWorkGroupSize() const {
517 return FlatWorkGroupSizes.second;
518 }
519
520 /// \returns A pair of default/requested minimum/maximum number of waves per
521 /// execution unit.
522 std::pair<unsigned, unsigned> getWavesPerEU() const {
523 return WavesPerEU;
524 }
525
526 /// \returns Default/requested minimum number of waves per execution unit.
527 unsigned getMinWavesPerEU() const {
528 return WavesPerEU.first;
529 }
530
531 /// \returns Default/requested maximum number of waves per execution unit.
532 unsigned getMaxWavesPerEU() const {
533 return WavesPerEU.second;
Konstantin Zhuravlyov71515e52016-04-26 17:24:40 +0000534 }
535
Konstantin Zhuravlyovf2f3d142016-06-25 03:11:28 +0000536 /// \returns Stack object index for \p Dim's work group ID.
537 int getDebuggerWorkGroupIDStackObjectIndex(unsigned Dim) const {
538 assert(Dim < 3);
539 return DebuggerWorkGroupIDStackObjectIndices[Dim];
540 }
541
542 /// \brief Sets stack object index for \p Dim's work group ID to \p ObjectIdx.
543 void setDebuggerWorkGroupIDStackObjectIndex(unsigned Dim, int ObjectIdx) {
544 assert(Dim < 3);
545 DebuggerWorkGroupIDStackObjectIndices[Dim] = ObjectIdx;
546 }
547
548 /// \returns Stack object index for \p Dim's work item ID.
549 int getDebuggerWorkItemIDStackObjectIndex(unsigned Dim) const {
550 assert(Dim < 3);
551 return DebuggerWorkItemIDStackObjectIndices[Dim];
552 }
553
554 /// \brief Sets stack object index for \p Dim's work item ID to \p ObjectIdx.
555 void setDebuggerWorkItemIDStackObjectIndex(unsigned Dim, int ObjectIdx) {
556 assert(Dim < 3);
557 DebuggerWorkItemIDStackObjectIndices[Dim] = ObjectIdx;
558 }
559
560 /// \returns SGPR used for \p Dim's work group ID.
561 unsigned getWorkGroupIDSGPR(unsigned Dim) const {
562 switch (Dim) {
563 case 0:
564 assert(hasWorkGroupIDX());
565 return WorkGroupIDXSystemSGPR;
566 case 1:
567 assert(hasWorkGroupIDY());
568 return WorkGroupIDYSystemSGPR;
569 case 2:
570 assert(hasWorkGroupIDZ());
571 return WorkGroupIDZSystemSGPR;
572 }
573 llvm_unreachable("unexpected dimension");
574 }
575
576 /// \returns VGPR used for \p Dim' work item ID.
577 unsigned getWorkItemIDVGPR(unsigned Dim) const {
578 switch (Dim) {
579 case 0:
580 assert(hasWorkItemIDX());
581 return AMDGPU::VGPR0;
582 case 1:
583 assert(hasWorkItemIDY());
584 return AMDGPU::VGPR1;
585 case 2:
586 assert(hasWorkItemIDZ());
587 return AMDGPU::VGPR2;
588 }
589 llvm_unreachable("unexpected dimension");
590 }
Tom Stellard244891d2016-12-20 15:52:17 +0000591
Matt Arsenault161e2b42017-04-18 20:59:40 +0000592 unsigned getLDSWaveSpillSize() const {
593 return LDSWaveSpillSize;
594 }
595
Tom Stellard6f9ef142016-12-20 17:19:44 +0000596 const AMDGPUBufferPseudoSourceValue *getBufferPSV() const {
597 return &BufferPSV;
598 }
599
Tom Stellardbb138882016-12-20 17:26:34 +0000600 const AMDGPUImagePseudoSourceValue *getImagePSV() const {
601 return &ImagePSV;
Tom Stellard244891d2016-12-20 15:52:17 +0000602 }
Tom Stellard75aadc22012-12-11 21:25:42 +0000603};
604
Eugene Zelenko66203762017-01-21 00:53:49 +0000605} // end namespace llvm
Tom Stellard75aadc22012-12-11 21:25:42 +0000606
Eugene Zelenko66203762017-01-21 00:53:49 +0000607#endif // LLVM_LIB_TARGET_AMDGPU_SIMACHINEFUNCTIONINFO_H