blob: 9fdb8caac6f2132a1bc6e64a3dd73c3745c28b92 [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
100 unsigned PrivateMemoryPtrUserSGPR;
101
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
Marek Olsakfccabaf2016-01-13 11:45:36 +0000122 // Graphics info.
123 unsigned PSInputAddr;
Matt Arsenaulte622dc32017-04-11 22:29:24 +0000124 unsigned PSInputEnable;
125
Marek Olsak8e9cc632016-01-13 17:23:09 +0000126 bool ReturnsVoid;
Marek Olsakfccabaf2016-01-13 11:45:36 +0000127
Konstantin Zhuravlyov1d650262016-09-06 20:22:28 +0000128 // A pair of default/requested minimum/maximum flat work group sizes.
129 // Minimum - first, maximum - second.
130 std::pair<unsigned, unsigned> FlatWorkGroupSizes;
Tom Stellard79a1fd72016-04-14 16:27:07 +0000131
Konstantin Zhuravlyov1d650262016-09-06 20:22:28 +0000132 // A pair of default/requested minimum/maximum number of waves per execution
133 // unit. Minimum - first, maximum - second.
134 std::pair<unsigned, unsigned> WavesPerEU;
135
Konstantin Zhuravlyovf2f3d142016-06-25 03:11:28 +0000136 // Stack object indices for work group IDs.
NAKAMURA Takumi5cbd41e2016-06-27 10:26:43 +0000137 std::array<int, 3> DebuggerWorkGroupIDStackObjectIndices;
Konstantin Zhuravlyovf2f3d142016-06-25 03:11:28 +0000138 // Stack object indices for work item IDs.
NAKAMURA Takumi5cbd41e2016-06-27 10:26:43 +0000139 std::array<int, 3> DebuggerWorkItemIDStackObjectIndices;
Konstantin Zhuravlyov71515e52016-04-26 17:24:40 +0000140
Tom Stellard6f9ef142016-12-20 17:19:44 +0000141 AMDGPUBufferPseudoSourceValue BufferPSV;
Tom Stellardbb138882016-12-20 17:26:34 +0000142 AMDGPUImagePseudoSourceValue ImagePSV;
Tom Stellard244891d2016-12-20 15:52:17 +0000143
Matt Arsenault161e2b42017-04-18 20:59:40 +0000144private:
Matt Arsenault49affb82015-11-25 20:55:12 +0000145 unsigned LDSWaveSpillSize;
Matt Arsenault49affb82015-11-25 20:55:12 +0000146 unsigned ScratchOffsetReg;
147 unsigned NumUserSGPRs;
Matt Arsenault26f8f3d2015-11-30 21:16:03 +0000148 unsigned NumSystemSGPRs;
Matt Arsenault49affb82015-11-25 20:55:12 +0000149
Matt Arsenault5b22dfa2015-11-05 05:27:10 +0000150 bool HasSpilledSGPRs;
Tom Stellard42fb60e2015-01-14 15:42:31 +0000151 bool HasSpilledVGPRs;
Matt Arsenault296b8492016-02-12 06:31:30 +0000152 bool HasNonSpillStackObjects;
Tom Stellard96468902014-09-24 01:33:17 +0000153
Marek Olsak0532c192016-07-13 17:35:15 +0000154 unsigned NumSpilledSGPRs;
155 unsigned NumSpilledVGPRs;
156
Matt Arsenault26f8f3d2015-11-30 21:16:03 +0000157 // Feature bits required for inputs passed in user SGPRs.
158 bool PrivateSegmentBuffer : 1;
Matt Arsenault49affb82015-11-25 20:55:12 +0000159 bool DispatchPtr : 1;
160 bool QueuePtr : 1;
Matt Arsenault49affb82015-11-25 20:55:12 +0000161 bool KernargSegmentPtr : 1;
Matt Arsenault8d718dc2016-07-22 17:01:30 +0000162 bool DispatchID : 1;
Matt Arsenault49affb82015-11-25 20:55:12 +0000163 bool FlatScratchInit : 1;
164 bool GridWorkgroupCountX : 1;
165 bool GridWorkgroupCountY : 1;
166 bool GridWorkgroupCountZ : 1;
Tom Stellardc149dc02013-11-27 21:23:35 +0000167
Matt Arsenault26f8f3d2015-11-30 21:16:03 +0000168 // Feature bits required for inputs passed in system SGPRs.
Matt Arsenault49affb82015-11-25 20:55:12 +0000169 bool WorkGroupIDX : 1; // Always initialized.
170 bool WorkGroupIDY : 1;
171 bool WorkGroupIDZ : 1;
172 bool WorkGroupInfo : 1;
Matt Arsenault26f8f3d2015-11-30 21:16:03 +0000173 bool PrivateSegmentWaveByteOffset : 1;
Matt Arsenault49affb82015-11-25 20:55:12 +0000174
175 bool WorkItemIDX : 1; // Always initialized.
176 bool WorkItemIDY : 1;
177 bool WorkItemIDZ : 1;
178
Tom Stellard2f3f9852017-01-25 01:25:13 +0000179 // Private memory buffer
180 // Compute directly in sgpr[0:1]
181 // Other shaders indirect 64-bits at sgpr[0:1]
182 bool PrivateMemoryInputPtr : 1;
183
Matt Arsenault26f8f3d2015-11-30 21:16:03 +0000184 MCPhysReg getNextUserSGPR() const {
185 assert(NumSystemSGPRs == 0 && "System SGPRs must be added after user SGPRs");
186 return AMDGPU::SGPR0 + NumUserSGPRs;
187 }
188
189 MCPhysReg getNextSystemSGPR() const {
190 return AMDGPU::SGPR0 + NumUserSGPRs + NumSystemSGPRs;
191 }
192
Matt Arsenault49affb82015-11-25 20:55:12 +0000193public:
Tom Stellardc149dc02013-11-27 21:23:35 +0000194 struct SpilledReg {
Eugene Zelenko66203762017-01-21 00:53:49 +0000195 unsigned VGPR = AMDGPU::NoRegister;
196 int Lane = -1;
197
198 SpilledReg() = default;
Tom Stellardc149dc02013-11-27 21:23:35 +0000199 SpilledReg(unsigned R, int L) : VGPR (R), Lane (L) { }
Eugene Zelenko66203762017-01-21 00:53:49 +0000200
Tom Stellardc149dc02013-11-27 21:23:35 +0000201 bool hasLane() { return Lane != -1;}
Tom Stellard649b5db2016-03-04 18:31:18 +0000202 bool hasReg() { return VGPR != AMDGPU::NoRegister;}
Tom Stellardc149dc02013-11-27 21:23:35 +0000203 };
204
Matt Arsenaulte0bf7d02017-02-21 19:12:08 +0000205private:
206 // SGPR->VGPR spilling support.
207 typedef std::pair<unsigned, unsigned> SpillRegMask;
208
209 // Track VGPR + wave index for each subregister of the SGPR spilled to
210 // frameindex key.
211 DenseMap<int, std::vector<SpilledReg>> SGPRToVGPRSpills;
212 unsigned NumVGPRSpillLanes = 0;
213 SmallVector<unsigned, 2> SpillVGPRs;
214
215public:
Tom Stellardc149dc02013-11-27 21:23:35 +0000216
Tom Stellard75aadc22012-12-11 21:25:42 +0000217 SIMachineFunctionInfo(const MachineFunction &MF);
Eugene Zelenko66203762017-01-21 00:53:49 +0000218
Matt Arsenaulte0bf7d02017-02-21 19:12:08 +0000219 ArrayRef<SpilledReg> getSGPRToVGPRSpills(int FrameIndex) const {
220 auto I = SGPRToVGPRSpills.find(FrameIndex);
221 return (I == SGPRToVGPRSpills.end()) ?
222 ArrayRef<SpilledReg>() : makeArrayRef(I->second);
223 }
224
225 bool allocateSGPRSpillToVGPR(MachineFunction &MF, int FI);
226 void removeSGPRToVGPRFrameIndices(MachineFrameInfo &MFI);
227
Tom Stellard96468902014-09-24 01:33:17 +0000228 bool hasCalculatedTID() const { return TIDReg != AMDGPU::NoRegister; };
229 unsigned getTIDReg() const { return TIDReg; };
230 void setTIDReg(unsigned Reg) { TIDReg = Reg; }
Matt Arsenault5b22dfa2015-11-05 05:27:10 +0000231
Matt Arsenault26f8f3d2015-11-30 21:16:03 +0000232 // Add user SGPRs.
233 unsigned addPrivateSegmentBuffer(const SIRegisterInfo &TRI);
234 unsigned addDispatchPtr(const SIRegisterInfo &TRI);
235 unsigned addQueuePtr(const SIRegisterInfo &TRI);
236 unsigned addKernargSegmentPtr(const SIRegisterInfo &TRI);
Matt Arsenault8d718dc2016-07-22 17:01:30 +0000237 unsigned addDispatchID(const SIRegisterInfo &TRI);
Matt Arsenault296b8492016-02-12 06:31:30 +0000238 unsigned addFlatScratchInit(const SIRegisterInfo &TRI);
Tom Stellard2f3f9852017-01-25 01:25:13 +0000239 unsigned addPrivateMemoryPtr(const SIRegisterInfo &TRI);
Matt Arsenault26f8f3d2015-11-30 21:16:03 +0000240
241 // Add system SGPRs.
242 unsigned addWorkGroupIDX() {
243 WorkGroupIDXSystemSGPR = getNextSystemSGPR();
244 NumSystemSGPRs += 1;
245 return WorkGroupIDXSystemSGPR;
246 }
247
248 unsigned addWorkGroupIDY() {
249 WorkGroupIDYSystemSGPR = getNextSystemSGPR();
250 NumSystemSGPRs += 1;
251 return WorkGroupIDYSystemSGPR;
252 }
253
254 unsigned addWorkGroupIDZ() {
255 WorkGroupIDZSystemSGPR = getNextSystemSGPR();
256 NumSystemSGPRs += 1;
257 return WorkGroupIDZSystemSGPR;
258 }
259
260 unsigned addWorkGroupInfo() {
261 WorkGroupInfoSystemSGPR = getNextSystemSGPR();
262 NumSystemSGPRs += 1;
263 return WorkGroupInfoSystemSGPR;
264 }
265
266 unsigned addPrivateSegmentWaveByteOffset() {
267 PrivateSegmentWaveByteOffsetSystemSGPR = getNextSystemSGPR();
268 NumSystemSGPRs += 1;
269 return PrivateSegmentWaveByteOffsetSystemSGPR;
270 }
271
Tom Stellardf110f8f2016-04-14 16:27:03 +0000272 void setPrivateSegmentWaveByteOffset(unsigned Reg) {
273 PrivateSegmentWaveByteOffsetSystemSGPR = Reg;
274 }
275
Matt Arsenault26f8f3d2015-11-30 21:16:03 +0000276 bool hasPrivateSegmentBuffer() const {
277 return PrivateSegmentBuffer;
278 }
279
Matt Arsenault49affb82015-11-25 20:55:12 +0000280 bool hasDispatchPtr() const {
281 return DispatchPtr;
282 }
283
284 bool hasQueuePtr() const {
285 return QueuePtr;
286 }
287
Matt Arsenault49affb82015-11-25 20:55:12 +0000288 bool hasKernargSegmentPtr() const {
289 return KernargSegmentPtr;
290 }
291
Matt Arsenault8d718dc2016-07-22 17:01:30 +0000292 bool hasDispatchID() const {
293 return DispatchID;
294 }
295
Matt Arsenault49affb82015-11-25 20:55:12 +0000296 bool hasFlatScratchInit() const {
297 return FlatScratchInit;
298 }
299
300 bool hasGridWorkgroupCountX() const {
301 return GridWorkgroupCountX;
302 }
303
304 bool hasGridWorkgroupCountY() const {
305 return GridWorkgroupCountY;
306 }
307
308 bool hasGridWorkgroupCountZ() const {
309 return GridWorkgroupCountZ;
310 }
311
312 bool hasWorkGroupIDX() const {
313 return WorkGroupIDX;
314 }
315
316 bool hasWorkGroupIDY() const {
317 return WorkGroupIDY;
318 }
319
320 bool hasWorkGroupIDZ() const {
321 return WorkGroupIDZ;
322 }
323
324 bool hasWorkGroupInfo() const {
325 return WorkGroupInfo;
326 }
327
Matt Arsenault26f8f3d2015-11-30 21:16:03 +0000328 bool hasPrivateSegmentWaveByteOffset() const {
329 return PrivateSegmentWaveByteOffset;
330 }
331
Matt Arsenault49affb82015-11-25 20:55:12 +0000332 bool hasWorkItemIDX() const {
333 return WorkItemIDX;
334 }
335
336 bool hasWorkItemIDY() const {
337 return WorkItemIDY;
338 }
339
340 bool hasWorkItemIDZ() const {
341 return WorkItemIDZ;
342 }
343
Tom Stellard2f3f9852017-01-25 01:25:13 +0000344 bool hasPrivateMemoryInputPtr() const {
345 return PrivateMemoryInputPtr;
346 }
347
Matt Arsenault26f8f3d2015-11-30 21:16:03 +0000348 unsigned getNumUserSGPRs() const {
349 return NumUserSGPRs;
350 }
351
352 unsigned getNumPreloadedSGPRs() const {
353 return NumUserSGPRs + NumSystemSGPRs;
354 }
355
356 unsigned getPrivateSegmentWaveByteOffsetSystemSGPR() const {
357 return PrivateSegmentWaveByteOffsetSystemSGPR;
358 }
359
Matt Arsenault49affb82015-11-25 20:55:12 +0000360 /// \brief Returns the physical register reserved for use as the resource
361 /// descriptor for scratch accesses.
362 unsigned getScratchRSrcReg() const {
363 return ScratchRSrcReg;
364 }
365
Matt Arsenault26f8f3d2015-11-30 21:16:03 +0000366 void setScratchRSrcReg(unsigned Reg) {
367 assert(Reg != AMDGPU::NoRegister && "Should never be unset");
368 ScratchRSrcReg = Reg;
369 }
370
371 unsigned getScratchWaveOffsetReg() const {
372 return ScratchWaveOffsetReg;
373 }
374
Matt Arsenault1c0ae392017-04-24 18:05:16 +0000375 unsigned getFrameOffsetReg() const {
376 return FrameOffsetReg;
377 }
378
379 void setStackPtrOffsetReg(unsigned Reg) {
380 assert(Reg != AMDGPU::NoRegister && "Should never be unset");
381 StackPtrOffsetReg = Reg;
382 }
383
384 unsigned getStackPtrOffsetReg() const {
385 return StackPtrOffsetReg;
386 }
387
Matt Arsenault26f8f3d2015-11-30 21:16:03 +0000388 void setScratchWaveOffsetReg(unsigned Reg) {
389 assert(Reg != AMDGPU::NoRegister && "Should never be unset");
390 ScratchWaveOffsetReg = Reg;
Matt Arsenault2b1f9aa2017-05-17 21:56:25 +0000391 if (isEntryFunction())
392 FrameOffsetReg = ScratchWaveOffsetReg;
Matt Arsenault26f8f3d2015-11-30 21:16:03 +0000393 }
Matt Arsenault49affb82015-11-25 20:55:12 +0000394
Matt Arsenault99c14522016-04-25 19:27:24 +0000395 unsigned getQueuePtrUserSGPR() const {
396 return QueuePtrUserSGPR;
397 }
398
Tom Stellard2f3f9852017-01-25 01:25:13 +0000399 unsigned getPrivateMemoryPtrUserSGPR() const {
400 return PrivateMemoryPtrUserSGPR;
401 }
402
Matt Arsenault5b22dfa2015-11-05 05:27:10 +0000403 bool hasSpilledSGPRs() const {
404 return HasSpilledSGPRs;
405 }
406
407 void setHasSpilledSGPRs(bool Spill = true) {
408 HasSpilledSGPRs = Spill;
409 }
410
411 bool hasSpilledVGPRs() const {
412 return HasSpilledVGPRs;
413 }
414
415 void setHasSpilledVGPRs(bool Spill = true) {
416 HasSpilledVGPRs = Spill;
417 }
Tom Stellard96468902014-09-24 01:33:17 +0000418
Matt Arsenault296b8492016-02-12 06:31:30 +0000419 bool hasNonSpillStackObjects() const {
420 return HasNonSpillStackObjects;
421 }
422
423 void setHasNonSpillStackObjects(bool StackObject = true) {
424 HasNonSpillStackObjects = StackObject;
425 }
426
Marek Olsak0532c192016-07-13 17:35:15 +0000427 unsigned getNumSpilledSGPRs() const {
428 return NumSpilledSGPRs;
429 }
430
431 unsigned getNumSpilledVGPRs() const {
432 return NumSpilledVGPRs;
433 }
434
435 void addToSpilledSGPRs(unsigned num) {
436 NumSpilledSGPRs += num;
437 }
438
439 void addToSpilledVGPRs(unsigned num) {
440 NumSpilledVGPRs += num;
441 }
442
Marek Olsakfccabaf2016-01-13 11:45:36 +0000443 unsigned getPSInputAddr() const {
444 return PSInputAddr;
445 }
446
Matt Arsenaulte622dc32017-04-11 22:29:24 +0000447 unsigned getPSInputEnable() const {
448 return PSInputEnable;
449 }
450
Marek Olsakfccabaf2016-01-13 11:45:36 +0000451 bool isPSInputAllocated(unsigned Index) const {
452 return PSInputAddr & (1 << Index);
453 }
454
455 void markPSInputAllocated(unsigned Index) {
456 PSInputAddr |= 1 << Index;
457 }
458
Matt Arsenaulte622dc32017-04-11 22:29:24 +0000459 void markPSInputEnabled(unsigned Index) {
460 PSInputEnable |= 1 << Index;
461 }
462
Marek Olsak8e9cc632016-01-13 17:23:09 +0000463 bool returnsVoid() const {
464 return ReturnsVoid;
465 }
466
467 void setIfReturnsVoid(bool Value) {
468 ReturnsVoid = Value;
469 }
470
Konstantin Zhuravlyov1d650262016-09-06 20:22:28 +0000471 /// \returns A pair of default/requested minimum/maximum flat work group sizes
472 /// for this function.
473 std::pair<unsigned, unsigned> getFlatWorkGroupSizes() const {
474 return FlatWorkGroupSizes;
475 }
476
477 /// \returns Default/requested minimum flat work group size for this function.
478 unsigned getMinFlatWorkGroupSize() const {
479 return FlatWorkGroupSizes.first;
480 }
481
482 /// \returns Default/requested maximum flat work group size for this function.
483 unsigned getMaxFlatWorkGroupSize() const {
484 return FlatWorkGroupSizes.second;
485 }
486
487 /// \returns A pair of default/requested minimum/maximum number of waves per
488 /// execution unit.
489 std::pair<unsigned, unsigned> getWavesPerEU() const {
490 return WavesPerEU;
491 }
492
493 /// \returns Default/requested minimum number of waves per execution unit.
494 unsigned getMinWavesPerEU() const {
495 return WavesPerEU.first;
496 }
497
498 /// \returns Default/requested maximum number of waves per execution unit.
499 unsigned getMaxWavesPerEU() const {
500 return WavesPerEU.second;
Konstantin Zhuravlyov71515e52016-04-26 17:24:40 +0000501 }
502
Konstantin Zhuravlyovf2f3d142016-06-25 03:11:28 +0000503 /// \returns Stack object index for \p Dim's work group ID.
504 int getDebuggerWorkGroupIDStackObjectIndex(unsigned Dim) const {
505 assert(Dim < 3);
506 return DebuggerWorkGroupIDStackObjectIndices[Dim];
507 }
508
509 /// \brief Sets stack object index for \p Dim's work group ID to \p ObjectIdx.
510 void setDebuggerWorkGroupIDStackObjectIndex(unsigned Dim, int ObjectIdx) {
511 assert(Dim < 3);
512 DebuggerWorkGroupIDStackObjectIndices[Dim] = ObjectIdx;
513 }
514
515 /// \returns Stack object index for \p Dim's work item ID.
516 int getDebuggerWorkItemIDStackObjectIndex(unsigned Dim) const {
517 assert(Dim < 3);
518 return DebuggerWorkItemIDStackObjectIndices[Dim];
519 }
520
521 /// \brief Sets stack object index for \p Dim's work item ID to \p ObjectIdx.
522 void setDebuggerWorkItemIDStackObjectIndex(unsigned Dim, int ObjectIdx) {
523 assert(Dim < 3);
524 DebuggerWorkItemIDStackObjectIndices[Dim] = ObjectIdx;
525 }
526
527 /// \returns SGPR used for \p Dim's work group ID.
528 unsigned getWorkGroupIDSGPR(unsigned Dim) const {
529 switch (Dim) {
530 case 0:
531 assert(hasWorkGroupIDX());
532 return WorkGroupIDXSystemSGPR;
533 case 1:
534 assert(hasWorkGroupIDY());
535 return WorkGroupIDYSystemSGPR;
536 case 2:
537 assert(hasWorkGroupIDZ());
538 return WorkGroupIDZSystemSGPR;
539 }
540 llvm_unreachable("unexpected dimension");
541 }
542
543 /// \returns VGPR used for \p Dim' work item ID.
544 unsigned getWorkItemIDVGPR(unsigned Dim) const {
545 switch (Dim) {
546 case 0:
547 assert(hasWorkItemIDX());
548 return AMDGPU::VGPR0;
549 case 1:
550 assert(hasWorkItemIDY());
551 return AMDGPU::VGPR1;
552 case 2:
553 assert(hasWorkItemIDZ());
554 return AMDGPU::VGPR2;
555 }
556 llvm_unreachable("unexpected dimension");
557 }
Tom Stellard244891d2016-12-20 15:52:17 +0000558
Matt Arsenault161e2b42017-04-18 20:59:40 +0000559 unsigned getLDSWaveSpillSize() const {
560 return LDSWaveSpillSize;
561 }
562
Tom Stellard6f9ef142016-12-20 17:19:44 +0000563 const AMDGPUBufferPseudoSourceValue *getBufferPSV() const {
564 return &BufferPSV;
565 }
566
Tom Stellardbb138882016-12-20 17:26:34 +0000567 const AMDGPUImagePseudoSourceValue *getImagePSV() const {
568 return &ImagePSV;
Tom Stellard244891d2016-12-20 15:52:17 +0000569 }
Tom Stellard75aadc22012-12-11 21:25:42 +0000570};
571
Eugene Zelenko66203762017-01-21 00:53:49 +0000572} // end namespace llvm
Tom Stellard75aadc22012-12-11 21:25:42 +0000573
Eugene Zelenko66203762017-01-21 00:53:49 +0000574#endif // LLVM_LIB_TARGET_AMDGPU_SIMACHINEFUNCTIONINFO_H