xref: /freebsd/contrib/llvm-project/llvm/lib/Target/AMDGPU/AMDGPUMachineFunction.h (revision 81ad626541db97eb356e2c1d4a20eb2a26a766ab)
10b57cec5SDimitry Andric //===-- AMDGPUMachineFunctionInfo.h -------------------------------*- C++ -*-=//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric 
90b57cec5SDimitry Andric #ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPUMACHINEFUNCTION_H
100b57cec5SDimitry Andric #define LLVM_LIB_TARGET_AMDGPU_AMDGPUMACHINEFUNCTION_H
110b57cec5SDimitry Andric 
12e8d8bef9SDimitry Andric #include "Utils/AMDGPUBaseInfo.h"
130b57cec5SDimitry Andric #include "llvm/ADT/DenseMap.h"
140b57cec5SDimitry Andric #include "llvm/CodeGen/MachineFunction.h"
15*81ad6265SDimitry Andric #include "llvm/IR/DataLayout.h"
16*81ad6265SDimitry Andric #include "llvm/IR/GlobalValue.h"
17*81ad6265SDimitry Andric #include "llvm/IR/GlobalVariable.h"
18*81ad6265SDimitry Andric #include "llvm/IR/Function.h"
190b57cec5SDimitry Andric 
200b57cec5SDimitry Andric namespace llvm {
210b57cec5SDimitry Andric 
220b57cec5SDimitry Andric class AMDGPUMachineFunction : public MachineFunctionInfo {
230b57cec5SDimitry Andric   /// A map to keep track of local memory objects and their offsets within the
240b57cec5SDimitry Andric   /// local memory space.
250b57cec5SDimitry Andric   SmallDenseMap<const GlobalValue *, unsigned, 4> LocalMemoryObjects;
260b57cec5SDimitry Andric 
270b57cec5SDimitry Andric protected:
285ffd83dbSDimitry Andric   uint64_t ExplicitKernArgSize = 0; // Cache for this.
298bcb0991SDimitry Andric   Align MaxKernArgAlign;        // Cache for this.
300b57cec5SDimitry Andric 
310b57cec5SDimitry Andric   /// Number of bytes in the LDS that are being used.
32*81ad6265SDimitry Andric   uint32_t LDSSize = 0;
33*81ad6265SDimitry Andric   uint32_t GDSSize = 0;
340b57cec5SDimitry Andric 
35e8d8bef9SDimitry Andric   /// Number of bytes in the LDS allocated statically. This field is only used
36e8d8bef9SDimitry Andric   /// in the instruction selector and not part of the machine function info.
37*81ad6265SDimitry Andric   uint32_t StaticLDSSize = 0;
38*81ad6265SDimitry Andric   uint32_t StaticGDSSize = 0;
39e8d8bef9SDimitry Andric 
40e8d8bef9SDimitry Andric   /// Align for dynamic shared memory if any. Dynamic shared memory is
41e8d8bef9SDimitry Andric   /// allocated directly after the static one, i.e., LDSSize. Need to pad
42e8d8bef9SDimitry Andric   /// LDSSize to ensure that dynamic one is aligned accordingly.
43e8d8bef9SDimitry Andric   /// The maximal alignment is updated during IR translation or lowering
44e8d8bef9SDimitry Andric   /// stages.
45e8d8bef9SDimitry Andric   Align DynLDSAlign;
46e8d8bef9SDimitry Andric 
47480093f4SDimitry Andric   // State of MODE register, assumed FP mode.
48480093f4SDimitry Andric   AMDGPU::SIModeRegisterDefaults Mode;
49480093f4SDimitry Andric 
50e8d8bef9SDimitry Andric   // Kernels + shaders. i.e. functions called by the hardware and not called
510b57cec5SDimitry Andric   // by other functions.
525ffd83dbSDimitry Andric   bool IsEntryFunction = false;
530b57cec5SDimitry Andric 
54e8d8bef9SDimitry Andric   // Entry points called by other functions instead of directly by the hardware.
55e8d8bef9SDimitry Andric   bool IsModuleEntryFunction = false;
56e8d8bef9SDimitry Andric 
575ffd83dbSDimitry Andric   bool NoSignedZerosFPMath = false;
580b57cec5SDimitry Andric 
590b57cec5SDimitry Andric   // Function may be memory bound.
605ffd83dbSDimitry Andric   bool MemoryBound = false;
610b57cec5SDimitry Andric 
620b57cec5SDimitry Andric   // Kernel may need limited waves per EU for better performance.
635ffd83dbSDimitry Andric   bool WaveLimiter = false;
640b57cec5SDimitry Andric 
650b57cec5SDimitry Andric public:
660b57cec5SDimitry Andric   AMDGPUMachineFunction(const MachineFunction &MF);
670b57cec5SDimitry Andric 
680b57cec5SDimitry Andric   uint64_t getExplicitKernArgSize() const {
690b57cec5SDimitry Andric     return ExplicitKernArgSize;
700b57cec5SDimitry Andric   }
710b57cec5SDimitry Andric 
72*81ad6265SDimitry Andric   Align getMaxKernArgAlign() const { return MaxKernArgAlign; }
730b57cec5SDimitry Andric 
74*81ad6265SDimitry Andric   uint32_t getLDSSize() const {
750b57cec5SDimitry Andric     return LDSSize;
760b57cec5SDimitry Andric   }
770b57cec5SDimitry Andric 
78*81ad6265SDimitry Andric   uint32_t getGDSSize() const {
79*81ad6265SDimitry Andric     return GDSSize;
80*81ad6265SDimitry Andric   }
81*81ad6265SDimitry Andric 
82480093f4SDimitry Andric   AMDGPU::SIModeRegisterDefaults getMode() const {
83480093f4SDimitry Andric     return Mode;
84480093f4SDimitry Andric   }
85480093f4SDimitry Andric 
860b57cec5SDimitry Andric   bool isEntryFunction() const {
870b57cec5SDimitry Andric     return IsEntryFunction;
880b57cec5SDimitry Andric   }
890b57cec5SDimitry Andric 
90e8d8bef9SDimitry Andric   bool isModuleEntryFunction() const { return IsModuleEntryFunction; }
91e8d8bef9SDimitry Andric 
920b57cec5SDimitry Andric   bool hasNoSignedZerosFPMath() const {
930b57cec5SDimitry Andric     return NoSignedZerosFPMath;
940b57cec5SDimitry Andric   }
950b57cec5SDimitry Andric 
960b57cec5SDimitry Andric   bool isMemoryBound() const {
970b57cec5SDimitry Andric     return MemoryBound;
980b57cec5SDimitry Andric   }
990b57cec5SDimitry Andric 
1000b57cec5SDimitry Andric   bool needsWaveLimiter() const {
1010b57cec5SDimitry Andric     return WaveLimiter;
1020b57cec5SDimitry Andric   }
1030b57cec5SDimitry Andric 
1045ffd83dbSDimitry Andric   unsigned allocateLDSGlobal(const DataLayout &DL, const GlobalVariable &GV);
105*81ad6265SDimitry Andric   void allocateModuleLDSGlobal(const Function &F);
106e8d8bef9SDimitry Andric 
107e8d8bef9SDimitry Andric   Align getDynLDSAlign() const { return DynLDSAlign; }
108e8d8bef9SDimitry Andric 
109e8d8bef9SDimitry Andric   void setDynLDSAlign(const DataLayout &DL, const GlobalVariable &GV);
1100b57cec5SDimitry Andric };
1110b57cec5SDimitry Andric 
1120b57cec5SDimitry Andric }
1130b57cec5SDimitry Andric #endif
114