xref: /freebsd/contrib/llvm-project/llvm/lib/Target/AMDGPU/AMDGPUMachineFunction.h (revision fcaf7f8644a9988098ac6be2165bce3ea4786e91)
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"
14*fcaf7f86SDimitry Andric #include "llvm/ADT/Optional.h"
150b57cec5SDimitry Andric #include "llvm/CodeGen/MachineFunction.h"
1681ad6265SDimitry Andric #include "llvm/IR/DataLayout.h"
17*fcaf7f86SDimitry Andric #include "llvm/IR/Function.h"
1881ad6265SDimitry Andric #include "llvm/IR/GlobalValue.h"
1981ad6265SDimitry Andric #include "llvm/IR/GlobalVariable.h"
200b57cec5SDimitry Andric 
210b57cec5SDimitry Andric namespace llvm {
220b57cec5SDimitry Andric 
230b57cec5SDimitry Andric class AMDGPUMachineFunction : public MachineFunctionInfo {
240b57cec5SDimitry Andric   /// A map to keep track of local memory objects and their offsets within the
250b57cec5SDimitry Andric   /// local memory space.
260b57cec5SDimitry Andric   SmallDenseMap<const GlobalValue *, unsigned, 4> LocalMemoryObjects;
270b57cec5SDimitry Andric 
280b57cec5SDimitry Andric protected:
295ffd83dbSDimitry Andric   uint64_t ExplicitKernArgSize = 0; // Cache for this.
308bcb0991SDimitry Andric   Align MaxKernArgAlign;        // Cache for this.
310b57cec5SDimitry Andric 
320b57cec5SDimitry Andric   /// Number of bytes in the LDS that are being used.
3381ad6265SDimitry Andric   uint32_t LDSSize = 0;
3481ad6265SDimitry Andric   uint32_t GDSSize = 0;
350b57cec5SDimitry Andric 
36e8d8bef9SDimitry Andric   /// Number of bytes in the LDS allocated statically. This field is only used
37e8d8bef9SDimitry Andric   /// in the instruction selector and not part of the machine function info.
3881ad6265SDimitry Andric   uint32_t StaticLDSSize = 0;
3981ad6265SDimitry Andric   uint32_t StaticGDSSize = 0;
40e8d8bef9SDimitry Andric 
41e8d8bef9SDimitry Andric   /// Align for dynamic shared memory if any. Dynamic shared memory is
42e8d8bef9SDimitry Andric   /// allocated directly after the static one, i.e., LDSSize. Need to pad
43e8d8bef9SDimitry Andric   /// LDSSize to ensure that dynamic one is aligned accordingly.
44e8d8bef9SDimitry Andric   /// The maximal alignment is updated during IR translation or lowering
45e8d8bef9SDimitry Andric   /// stages.
46e8d8bef9SDimitry Andric   Align DynLDSAlign;
47e8d8bef9SDimitry Andric 
48480093f4SDimitry Andric   // State of MODE register, assumed FP mode.
49480093f4SDimitry Andric   AMDGPU::SIModeRegisterDefaults Mode;
50480093f4SDimitry Andric 
51e8d8bef9SDimitry Andric   // Kernels + shaders. i.e. functions called by the hardware and not called
520b57cec5SDimitry Andric   // by other functions.
535ffd83dbSDimitry Andric   bool IsEntryFunction = false;
540b57cec5SDimitry Andric 
55e8d8bef9SDimitry Andric   // Entry points called by other functions instead of directly by the hardware.
56e8d8bef9SDimitry Andric   bool IsModuleEntryFunction = false;
57e8d8bef9SDimitry Andric 
585ffd83dbSDimitry Andric   bool NoSignedZerosFPMath = false;
590b57cec5SDimitry Andric 
600b57cec5SDimitry Andric   // Function may be memory bound.
615ffd83dbSDimitry Andric   bool MemoryBound = false;
620b57cec5SDimitry Andric 
630b57cec5SDimitry Andric   // Kernel may need limited waves per EU for better performance.
645ffd83dbSDimitry Andric   bool WaveLimiter = false;
650b57cec5SDimitry Andric 
660b57cec5SDimitry Andric public:
670b57cec5SDimitry Andric   AMDGPUMachineFunction(const MachineFunction &MF);
680b57cec5SDimitry Andric 
690b57cec5SDimitry Andric   uint64_t getExplicitKernArgSize() const {
700b57cec5SDimitry Andric     return ExplicitKernArgSize;
710b57cec5SDimitry Andric   }
720b57cec5SDimitry Andric 
7381ad6265SDimitry Andric   Align getMaxKernArgAlign() const { return MaxKernArgAlign; }
740b57cec5SDimitry Andric 
7581ad6265SDimitry Andric   uint32_t getLDSSize() const {
760b57cec5SDimitry Andric     return LDSSize;
770b57cec5SDimitry Andric   }
780b57cec5SDimitry Andric 
7981ad6265SDimitry Andric   uint32_t getGDSSize() const {
8081ad6265SDimitry Andric     return GDSSize;
8181ad6265SDimitry Andric   }
8281ad6265SDimitry Andric 
83480093f4SDimitry Andric   AMDGPU::SIModeRegisterDefaults getMode() const {
84480093f4SDimitry Andric     return Mode;
85480093f4SDimitry Andric   }
86480093f4SDimitry Andric 
870b57cec5SDimitry Andric   bool isEntryFunction() const {
880b57cec5SDimitry Andric     return IsEntryFunction;
890b57cec5SDimitry Andric   }
900b57cec5SDimitry Andric 
91e8d8bef9SDimitry Andric   bool isModuleEntryFunction() const { return IsModuleEntryFunction; }
92e8d8bef9SDimitry Andric 
930b57cec5SDimitry Andric   bool hasNoSignedZerosFPMath() const {
940b57cec5SDimitry Andric     return NoSignedZerosFPMath;
950b57cec5SDimitry Andric   }
960b57cec5SDimitry Andric 
970b57cec5SDimitry Andric   bool isMemoryBound() const {
980b57cec5SDimitry Andric     return MemoryBound;
990b57cec5SDimitry Andric   }
1000b57cec5SDimitry Andric 
1010b57cec5SDimitry Andric   bool needsWaveLimiter() const {
1020b57cec5SDimitry Andric     return WaveLimiter;
1030b57cec5SDimitry Andric   }
1040b57cec5SDimitry Andric 
1055ffd83dbSDimitry Andric   unsigned allocateLDSGlobal(const DataLayout &DL, const GlobalVariable &GV);
10681ad6265SDimitry Andric   void allocateModuleLDSGlobal(const Function &F);
107e8d8bef9SDimitry Andric 
108*fcaf7f86SDimitry Andric   static Optional<uint32_t> getLDSKernelIdMetadata(const Function &F);
109*fcaf7f86SDimitry Andric 
110e8d8bef9SDimitry Andric   Align getDynLDSAlign() const { return DynLDSAlign; }
111e8d8bef9SDimitry Andric 
112e8d8bef9SDimitry Andric   void setDynLDSAlign(const DataLayout &DL, const GlobalVariable &GV);
1130b57cec5SDimitry Andric };
1140b57cec5SDimitry Andric 
1150b57cec5SDimitry Andric }
1160b57cec5SDimitry Andric #endif
117