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 12*e8d8bef9SDimitry Andric #include "Utils/AMDGPUBaseInfo.h" 130b57cec5SDimitry Andric #include "llvm/ADT/DenseMap.h" 140b57cec5SDimitry Andric #include "llvm/CodeGen/MachineFunction.h" 150b57cec5SDimitry Andric 160b57cec5SDimitry Andric namespace llvm { 170b57cec5SDimitry Andric 180b57cec5SDimitry Andric class GCNSubtarget; 190b57cec5SDimitry Andric 200b57cec5SDimitry Andric class AMDGPUMachineFunction : public MachineFunctionInfo { 210b57cec5SDimitry Andric /// A map to keep track of local memory objects and their offsets within the 220b57cec5SDimitry Andric /// local memory space. 230b57cec5SDimitry Andric SmallDenseMap<const GlobalValue *, unsigned, 4> LocalMemoryObjects; 240b57cec5SDimitry Andric 250b57cec5SDimitry Andric protected: 265ffd83dbSDimitry Andric uint64_t ExplicitKernArgSize = 0; // Cache for this. 278bcb0991SDimitry Andric Align MaxKernArgAlign; // Cache for this. 280b57cec5SDimitry Andric 290b57cec5SDimitry Andric /// Number of bytes in the LDS that are being used. 305ffd83dbSDimitry Andric unsigned LDSSize = 0; 310b57cec5SDimitry Andric 32*e8d8bef9SDimitry Andric /// Number of bytes in the LDS allocated statically. This field is only used 33*e8d8bef9SDimitry Andric /// in the instruction selector and not part of the machine function info. 34*e8d8bef9SDimitry Andric unsigned StaticLDSSize = 0; 35*e8d8bef9SDimitry Andric 36*e8d8bef9SDimitry Andric /// Align for dynamic shared memory if any. Dynamic shared memory is 37*e8d8bef9SDimitry Andric /// allocated directly after the static one, i.e., LDSSize. Need to pad 38*e8d8bef9SDimitry Andric /// LDSSize to ensure that dynamic one is aligned accordingly. 39*e8d8bef9SDimitry Andric /// The maximal alignment is updated during IR translation or lowering 40*e8d8bef9SDimitry Andric /// stages. 41*e8d8bef9SDimitry Andric Align DynLDSAlign; 42*e8d8bef9SDimitry Andric 43480093f4SDimitry Andric // State of MODE register, assumed FP mode. 44480093f4SDimitry Andric AMDGPU::SIModeRegisterDefaults Mode; 45480093f4SDimitry Andric 46*e8d8bef9SDimitry Andric // Kernels + shaders. i.e. functions called by the hardware and not called 470b57cec5SDimitry Andric // by other functions. 485ffd83dbSDimitry Andric bool IsEntryFunction = false; 490b57cec5SDimitry Andric 50*e8d8bef9SDimitry Andric // Entry points called by other functions instead of directly by the hardware. 51*e8d8bef9SDimitry Andric bool IsModuleEntryFunction = false; 52*e8d8bef9SDimitry Andric 535ffd83dbSDimitry Andric bool NoSignedZerosFPMath = false; 540b57cec5SDimitry Andric 550b57cec5SDimitry Andric // Function may be memory bound. 565ffd83dbSDimitry Andric bool MemoryBound = false; 570b57cec5SDimitry Andric 580b57cec5SDimitry Andric // Kernel may need limited waves per EU for better performance. 595ffd83dbSDimitry Andric bool WaveLimiter = false; 600b57cec5SDimitry Andric 610b57cec5SDimitry Andric public: 620b57cec5SDimitry Andric AMDGPUMachineFunction(const MachineFunction &MF); 630b57cec5SDimitry Andric 640b57cec5SDimitry Andric uint64_t getExplicitKernArgSize() const { 650b57cec5SDimitry Andric return ExplicitKernArgSize; 660b57cec5SDimitry Andric } 670b57cec5SDimitry Andric 688bcb0991SDimitry Andric unsigned getMaxKernArgAlign() const { return MaxKernArgAlign.value(); } 690b57cec5SDimitry Andric 700b57cec5SDimitry Andric unsigned getLDSSize() const { 710b57cec5SDimitry Andric return LDSSize; 720b57cec5SDimitry Andric } 730b57cec5SDimitry Andric 74480093f4SDimitry Andric AMDGPU::SIModeRegisterDefaults getMode() const { 75480093f4SDimitry Andric return Mode; 76480093f4SDimitry Andric } 77480093f4SDimitry Andric 780b57cec5SDimitry Andric bool isEntryFunction() const { 790b57cec5SDimitry Andric return IsEntryFunction; 800b57cec5SDimitry Andric } 810b57cec5SDimitry Andric 82*e8d8bef9SDimitry Andric bool isModuleEntryFunction() const { return IsModuleEntryFunction; } 83*e8d8bef9SDimitry Andric 840b57cec5SDimitry Andric bool hasNoSignedZerosFPMath() const { 850b57cec5SDimitry Andric return NoSignedZerosFPMath; 860b57cec5SDimitry Andric } 870b57cec5SDimitry Andric 880b57cec5SDimitry Andric bool isMemoryBound() const { 890b57cec5SDimitry Andric return MemoryBound; 900b57cec5SDimitry Andric } 910b57cec5SDimitry Andric 920b57cec5SDimitry Andric bool needsWaveLimiter() const { 930b57cec5SDimitry Andric return WaveLimiter; 940b57cec5SDimitry Andric } 950b57cec5SDimitry Andric 965ffd83dbSDimitry Andric unsigned allocateLDSGlobal(const DataLayout &DL, const GlobalVariable &GV); 97*e8d8bef9SDimitry Andric 98*e8d8bef9SDimitry Andric Align getDynLDSAlign() const { return DynLDSAlign; } 99*e8d8bef9SDimitry Andric 100*e8d8bef9SDimitry Andric void setDynLDSAlign(const DataLayout &DL, const GlobalVariable &GV); 1010b57cec5SDimitry Andric }; 1020b57cec5SDimitry Andric 1030b57cec5SDimitry Andric } 1040b57cec5SDimitry Andric #endif 105