13ca95b02SDimitry Andric //===-- AMDGPUMachineFunctionInfo.h -------------------------------*- C++ -*-=// 28f0fd8f6SDimitry Andric // 38f0fd8f6SDimitry Andric // The LLVM Compiler Infrastructure 48f0fd8f6SDimitry Andric // 58f0fd8f6SDimitry Andric // This file is distributed under the University of Illinois Open Source 68f0fd8f6SDimitry Andric // License. See LICENSE.TXT for details. 78f0fd8f6SDimitry Andric // 88f0fd8f6SDimitry Andric //===----------------------------------------------------------------------===// 98f0fd8f6SDimitry Andric 103ca95b02SDimitry Andric #ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPUMACHINEFUNCTION_H 113ca95b02SDimitry Andric #define LLVM_LIB_TARGET_AMDGPU_AMDGPUMACHINEFUNCTION_H 128f0fd8f6SDimitry Andric 13d88c1a5aSDimitry Andric #include "llvm/ADT/DenseMap.h" 14db17bf38SDimitry Andric #include "llvm/CodeGen/MachineFunction.h" 158f0fd8f6SDimitry Andric 168f0fd8f6SDimitry Andric namespace llvm { 178f0fd8f6SDimitry Andric 18*4ba319b5SDimitry Andric class GCNSubtarget; 19*4ba319b5SDimitry Andric 208f0fd8f6SDimitry Andric class AMDGPUMachineFunction : public MachineFunctionInfo { 21d88c1a5aSDimitry Andric /// A map to keep track of local memory objects and their offsets within the 22d88c1a5aSDimitry Andric /// local memory space. 23d88c1a5aSDimitry Andric SmallDenseMap<const GlobalValue *, unsigned, 4> LocalMemoryObjects; 24d88c1a5aSDimitry Andric 25*4ba319b5SDimitry Andric protected: 26*4ba319b5SDimitry Andric uint64_t ExplicitKernArgSize; // Cache for this. 27*4ba319b5SDimitry Andric unsigned MaxKernArgAlign; // Cache for this. 283ca95b02SDimitry Andric 29d88c1a5aSDimitry Andric /// Number of bytes in the LDS that are being used. 30d88c1a5aSDimitry Andric unsigned LDSSize; 31d88c1a5aSDimitry Andric 32*4ba319b5SDimitry Andric // Kernels + shaders. i.e. functions called by the driver and not called 337a7e6055SDimitry Andric // by other functions. 347a7e6055SDimitry Andric bool IsEntryFunction; 357a7e6055SDimitry Andric 367a7e6055SDimitry Andric bool NoSignedZerosFPMath; 378f0fd8f6SDimitry Andric 38*4ba319b5SDimitry Andric // Function may be memory bound. 39*4ba319b5SDimitry Andric bool MemoryBound; 40*4ba319b5SDimitry Andric 41*4ba319b5SDimitry Andric // Kernel may need limited waves per EU for better performance. 42*4ba319b5SDimitry Andric bool WaveLimiter; 43*4ba319b5SDimitry Andric 448f0fd8f6SDimitry Andric public: 458f0fd8f6SDimitry Andric AMDGPUMachineFunction(const MachineFunction &MF); 463ca95b02SDimitry Andric getExplicitKernArgSize()47*4ba319b5SDimitry Andric uint64_t getExplicitKernArgSize() const { 48*4ba319b5SDimitry Andric return ExplicitKernArgSize; 49d88c1a5aSDimitry Andric } 508f0fd8f6SDimitry Andric getMaxKernArgAlign()51d88c1a5aSDimitry Andric unsigned getMaxKernArgAlign() const { 52d88c1a5aSDimitry Andric return MaxKernArgAlign; 53d88c1a5aSDimitry Andric } 548f0fd8f6SDimitry Andric getLDSSize()55d88c1a5aSDimitry Andric unsigned getLDSSize() const { 56d88c1a5aSDimitry Andric return LDSSize; 57d88c1a5aSDimitry Andric } 58d88c1a5aSDimitry Andric isEntryFunction()597a7e6055SDimitry Andric bool isEntryFunction() const { 607a7e6055SDimitry Andric return IsEntryFunction; 617a7e6055SDimitry Andric } 627a7e6055SDimitry Andric hasNoSignedZerosFPMath()637a7e6055SDimitry Andric bool hasNoSignedZerosFPMath() const { 647a7e6055SDimitry Andric return NoSignedZerosFPMath; 65d88c1a5aSDimitry Andric } 66d88c1a5aSDimitry Andric isMemoryBound()67*4ba319b5SDimitry Andric bool isMemoryBound() const { 68*4ba319b5SDimitry Andric return MemoryBound; 69*4ba319b5SDimitry Andric } 70*4ba319b5SDimitry Andric needsWaveLimiter()71*4ba319b5SDimitry Andric bool needsWaveLimiter() const { 72*4ba319b5SDimitry Andric return WaveLimiter; 73*4ba319b5SDimitry Andric } 74*4ba319b5SDimitry Andric 75d88c1a5aSDimitry Andric unsigned allocateLDSGlobal(const DataLayout &DL, const GlobalValue &GV); 768f0fd8f6SDimitry Andric }; 778f0fd8f6SDimitry Andric 783dac3a9bSDimitry Andric } 798f0fd8f6SDimitry Andric #endif 80