xref: /freebsd/contrib/llvm-project/llvm/lib/Target/AMDGPU/AMDGPUMachineFunction.h (revision 06c3fb2749bda94cb5201f81ffdb8fa6c3161b2e)
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"
1581ad6265SDimitry Andric #include "llvm/IR/DataLayout.h"
16fcaf7f86SDimitry Andric #include "llvm/IR/Function.h"
1781ad6265SDimitry Andric #include "llvm/IR/GlobalValue.h"
1881ad6265SDimitry Andric #include "llvm/IR/GlobalVariable.h"
190b57cec5SDimitry Andric 
200b57cec5SDimitry Andric namespace llvm {
210b57cec5SDimitry Andric 
22bdd1243dSDimitry Andric class AMDGPUSubtarget;
23bdd1243dSDimitry Andric class GCNSubtarget;
24bdd1243dSDimitry Andric 
250b57cec5SDimitry Andric class AMDGPUMachineFunction : public MachineFunctionInfo {
260b57cec5SDimitry Andric   /// A map to keep track of local memory objects and their offsets within the
270b57cec5SDimitry Andric   /// local memory space.
280b57cec5SDimitry Andric   SmallDenseMap<const GlobalValue *, unsigned, 4> LocalMemoryObjects;
290b57cec5SDimitry Andric 
300b57cec5SDimitry Andric protected:
315ffd83dbSDimitry Andric   uint64_t ExplicitKernArgSize = 0; // Cache for this.
328bcb0991SDimitry Andric   Align MaxKernArgAlign;        // Cache for this.
330b57cec5SDimitry Andric 
340b57cec5SDimitry Andric   /// Number of bytes in the LDS that are being used.
3581ad6265SDimitry Andric   uint32_t LDSSize = 0;
3681ad6265SDimitry Andric   uint32_t GDSSize = 0;
370b57cec5SDimitry Andric 
38e8d8bef9SDimitry Andric   /// Number of bytes in the LDS allocated statically. This field is only used
39e8d8bef9SDimitry Andric   /// in the instruction selector and not part of the machine function info.
4081ad6265SDimitry Andric   uint32_t StaticLDSSize = 0;
4181ad6265SDimitry Andric   uint32_t StaticGDSSize = 0;
42e8d8bef9SDimitry Andric 
43e8d8bef9SDimitry Andric   /// Align for dynamic shared memory if any. Dynamic shared memory is
44e8d8bef9SDimitry Andric   /// allocated directly after the static one, i.e., LDSSize. Need to pad
45e8d8bef9SDimitry Andric   /// LDSSize to ensure that dynamic one is aligned accordingly.
46e8d8bef9SDimitry Andric   /// The maximal alignment is updated during IR translation or lowering
47e8d8bef9SDimitry Andric   /// stages.
48e8d8bef9SDimitry Andric   Align DynLDSAlign;
49e8d8bef9SDimitry 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:
66bdd1243dSDimitry Andric   AMDGPUMachineFunction(const Function &F, const AMDGPUSubtarget &ST);
670b57cec5SDimitry Andric 
680b57cec5SDimitry Andric   uint64_t getExplicitKernArgSize() const {
690b57cec5SDimitry Andric     return ExplicitKernArgSize;
700b57cec5SDimitry Andric   }
710b57cec5SDimitry Andric 
7281ad6265SDimitry Andric   Align getMaxKernArgAlign() const { return MaxKernArgAlign; }
730b57cec5SDimitry Andric 
7481ad6265SDimitry Andric   uint32_t getLDSSize() const {
750b57cec5SDimitry Andric     return LDSSize;
760b57cec5SDimitry Andric   }
770b57cec5SDimitry Andric 
7881ad6265SDimitry Andric   uint32_t getGDSSize() const {
7981ad6265SDimitry Andric     return GDSSize;
8081ad6265SDimitry Andric   }
8181ad6265SDimitry Andric 
820b57cec5SDimitry Andric   bool isEntryFunction() const {
830b57cec5SDimitry Andric     return IsEntryFunction;
840b57cec5SDimitry Andric   }
850b57cec5SDimitry Andric 
86e8d8bef9SDimitry Andric   bool isModuleEntryFunction() const { return IsModuleEntryFunction; }
87e8d8bef9SDimitry Andric 
880b57cec5SDimitry Andric   bool hasNoSignedZerosFPMath() const {
890b57cec5SDimitry Andric     return NoSignedZerosFPMath;
900b57cec5SDimitry Andric   }
910b57cec5SDimitry Andric 
920b57cec5SDimitry Andric   bool isMemoryBound() const {
930b57cec5SDimitry Andric     return MemoryBound;
940b57cec5SDimitry Andric   }
950b57cec5SDimitry Andric 
960b57cec5SDimitry Andric   bool needsWaveLimiter() const {
970b57cec5SDimitry Andric     return WaveLimiter;
980b57cec5SDimitry Andric   }
990b57cec5SDimitry Andric 
100bdd1243dSDimitry Andric   unsigned allocateLDSGlobal(const DataLayout &DL, const GlobalVariable &GV) {
101bdd1243dSDimitry Andric     return allocateLDSGlobal(DL, GV, DynLDSAlign);
102bdd1243dSDimitry Andric   }
103e8d8bef9SDimitry Andric 
104bdd1243dSDimitry Andric   unsigned allocateLDSGlobal(const DataLayout &DL, const GlobalVariable &GV,
105bdd1243dSDimitry Andric                              Align Trailing);
106bdd1243dSDimitry Andric 
107bdd1243dSDimitry Andric   static std::optional<uint32_t> getLDSKernelIdMetadata(const Function &F);
108*06c3fb27SDimitry Andric   static std::optional<uint32_t> getLDSAbsoluteAddress(const GlobalValue &GV);
109fcaf7f86SDimitry Andric 
110e8d8bef9SDimitry Andric   Align getDynLDSAlign() const { return DynLDSAlign; }
111e8d8bef9SDimitry Andric 
112*06c3fb27SDimitry Andric   void setDynLDSAlign(const Function &F, const GlobalVariable &GV);
1130b57cec5SDimitry Andric };
1140b57cec5SDimitry Andric 
1150b57cec5SDimitry Andric }
1160b57cec5SDimitry Andric #endif
117