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