1//===-- AMDGPUMachineFunctionInfo.h -------------------------------*- C++ -*-=//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPUMACHINEFUNCTION_H
10#define LLVM_LIB_TARGET_AMDGPU_AMDGPUMACHINEFUNCTION_H
11
12#include "llvm/ADT/DenseMap.h"
13#include "llvm/CodeGen/MachineFunction.h"
14#include "Utils/AMDGPUBaseInfo.h"
15
16namespace llvm {
17
18class GCNSubtarget;
19
20class AMDGPUMachineFunction : public MachineFunctionInfo {
21  /// A map to keep track of local memory objects and their offsets within the
22  /// local memory space.
23  SmallDenseMap<const GlobalValue *, unsigned, 4> LocalMemoryObjects;
24
25protected:
26  uint64_t ExplicitKernArgSize = 0; // Cache for this.
27  Align MaxKernArgAlign;        // Cache for this.
28
29  /// Number of bytes in the LDS that are being used.
30  unsigned LDSSize = 0;
31
32  // State of MODE register, assumed FP mode.
33  AMDGPU::SIModeRegisterDefaults Mode;
34
35  // Kernels + shaders. i.e. functions called by the driver and not called
36  // by other functions.
37  bool IsEntryFunction = false;
38
39  bool NoSignedZerosFPMath = false;
40
41  // Function may be memory bound.
42  bool MemoryBound = false;
43
44  // Kernel may need limited waves per EU for better performance.
45  bool WaveLimiter = false;
46
47public:
48  AMDGPUMachineFunction(const MachineFunction &MF);
49
50  uint64_t getExplicitKernArgSize() const {
51    return ExplicitKernArgSize;
52  }
53
54  unsigned getMaxKernArgAlign() const { return MaxKernArgAlign.value(); }
55
56  unsigned getLDSSize() const {
57    return LDSSize;
58  }
59
60  AMDGPU::SIModeRegisterDefaults getMode() const {
61    return Mode;
62  }
63
64  bool isEntryFunction() const {
65    return IsEntryFunction;
66  }
67
68  bool hasNoSignedZerosFPMath() const {
69    return NoSignedZerosFPMath;
70  }
71
72  bool isMemoryBound() const {
73    return MemoryBound;
74  }
75
76  bool needsWaveLimiter() const {
77    return WaveLimiter;
78  }
79
80  unsigned allocateLDSGlobal(const DataLayout &DL, const GlobalVariable &GV);
81};
82
83}
84#endif
85