blob: 6f50fca8831ec9651c0080f8d3cf8282fa56735e [file] [log] [blame]
Matt Arsenault6b6a2c32016-03-11 08:00:27 +00001//===-- AMDGPUMachineFunctionInfo.h -------------------------------*- C++ -*-=//
Vincent Lejeuneace6f732013-04-01 21:47:53 +00002//
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//===----------------------------------------------------------------------===//
Vincent Lejeuneace6f732013-04-01 21:47:53 +00009
Matt Arsenault6b6a2c32016-03-11 08:00:27 +000010#ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPUMACHINEFUNCTION_H
11#define LLVM_LIB_TARGET_AMDGPU_AMDGPUMACHINEFUNCTION_H
Vincent Lejeuneace6f732013-04-01 21:47:53 +000012
Matt Arsenault52ef4012016-07-26 16:45:58 +000013#include "llvm/ADT/DenseMap.h"
Chandler Carruth6bda14b2017-06-06 11:49:48 +000014#include "llvm/CodeGen/MachineFunction.h"
Vincent Lejeuneace6f732013-04-01 21:47:53 +000015
16namespace llvm {
17
18class AMDGPUMachineFunction : public MachineFunctionInfo {
Matt Arsenault52ef4012016-07-26 16:45:58 +000019 /// A map to keep track of local memory objects and their offsets within the
20 /// local memory space.
21 SmallDenseMap<const GlobalValue *, unsigned, 4> LocalMemoryObjects;
22
Matt Arsenaulte935f052016-06-18 05:15:53 +000023 uint64_t KernArgSize;
24 unsigned MaxKernArgAlign;
25
Matt Arsenault52ef4012016-07-26 16:45:58 +000026 /// Number of bytes in the LDS that are being used.
27 unsigned LDSSize;
28
29 // FIXME: This should probably be removed.
30 /// Start of implicit kernel args
31 unsigned ABIArgOffset;
32
Hiroshi Inoueae179002018-04-14 08:59:00 +000033 // Kernels + shaders. i.e. functions called by the driver and not called
Matt Arsenault1074cb52017-03-30 23:58:04 +000034 // by other functions.
35 bool IsEntryFunction;
36
Matt Arsenault3cb39042017-02-27 19:35:42 +000037 bool NoSignedZerosFPMath;
Matt Arsenault762af962014-07-13 03:06:39 +000038
Stanislav Mekhanoshin1c538422018-05-25 17:25:12 +000039 // Function may be memory bound.
40 bool MemoryBound;
41
42 // Kernel may need limited waves per EU for better performance.
43 bool WaveLimiter;
44
Vincent Lejeuneace6f732013-04-01 21:47:53 +000045public:
46 AMDGPUMachineFunction(const MachineFunction &MF);
Matt Arsenaulte935f052016-06-18 05:15:53 +000047
48 uint64_t allocateKernArg(uint64_t Size, unsigned Align) {
49 assert(isPowerOf2_32(Align));
50 KernArgSize = alignTo(KernArgSize, Align);
51
52 uint64_t Result = KernArgSize;
53 KernArgSize += Size;
54
55 MaxKernArgAlign = std::max(Align, MaxKernArgAlign);
56 return Result;
57 }
58
Matt Arsenault52ef4012016-07-26 16:45:58 +000059 uint64_t getKernArgSize() const {
60 return KernArgSize;
61 }
Matt Arsenault762af962014-07-13 03:06:39 +000062
Tom Stellard175959e2016-12-06 21:53:10 +000063 unsigned getMaxKernArgAlign() const {
64 return MaxKernArgAlign;
65 }
66
Matt Arsenault52ef4012016-07-26 16:45:58 +000067 void setABIArgOffset(unsigned NewOffset) {
68 ABIArgOffset = NewOffset;
69 }
Jan Veselye5121f32014-10-14 20:05:26 +000070
Matt Arsenault52ef4012016-07-26 16:45:58 +000071 unsigned getABIArgOffset() const {
72 return ABIArgOffset;
73 }
Tom Stellard1e1b05d2015-11-06 11:45:14 +000074
Matt Arsenault52ef4012016-07-26 16:45:58 +000075 unsigned getLDSSize() const {
76 return LDSSize;
77 }
78
Matt Arsenault1074cb52017-03-30 23:58:04 +000079 bool isEntryFunction() const {
80 return IsEntryFunction;
Matt Arsenault52ef4012016-07-26 16:45:58 +000081 }
82
Matt Arsenault3cb39042017-02-27 19:35:42 +000083 bool hasNoSignedZerosFPMath() const {
84 return NoSignedZerosFPMath;
85 }
86
Stanislav Mekhanoshin1c538422018-05-25 17:25:12 +000087 bool isMemoryBound() const {
88 return MemoryBound;
89 }
90
91 bool needsWaveLimiter() const {
92 return WaveLimiter;
93 }
94
Matt Arsenault52ef4012016-07-26 16:45:58 +000095 unsigned allocateLDSGlobal(const DataLayout &DL, const GlobalValue &GV);
Vincent Lejeuneace6f732013-04-01 21:47:53 +000096};
97
Alexander Kornienkof00654e2015-06-23 09:49:53 +000098}
Benjamin Kramera7c40ef2014-08-13 16:26:38 +000099#endif