aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Target/AMDGPU/AMDGPUResourceUsageAnalysis.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Target/AMDGPU/AMDGPUResourceUsageAnalysis.cpp')
-rw-r--r--llvm/lib/Target/AMDGPU/AMDGPUResourceUsageAnalysis.cpp44
1 files changed, 36 insertions, 8 deletions
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUResourceUsageAnalysis.cpp b/llvm/lib/Target/AMDGPU/AMDGPUResourceUsageAnalysis.cpp
index 9a609a1752de..46027b889023 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUResourceUsageAnalysis.cpp
+++ b/llvm/lib/Target/AMDGPU/AMDGPUResourceUsageAnalysis.cpp
@@ -30,8 +30,9 @@ using namespace llvm::AMDGPU;
#define DEBUG_TYPE "amdgpu-resource-usage"
-char llvm::AMDGPUResourceUsageAnalysis::ID = 0;
-char &llvm::AMDGPUResourceUsageAnalysisID = AMDGPUResourceUsageAnalysis::ID;
+char llvm::AMDGPUResourceUsageAnalysisWrapperPass::ID = 0;
+char &llvm::AMDGPUResourceUsageAnalysisID =
+ AMDGPUResourceUsageAnalysisWrapperPass::ID;
// In code object v4 and older, we need to tell the runtime some amount ahead of
// time if we don't know the true stack size. Assume a smaller number if this is
@@ -47,7 +48,7 @@ static cl::opt<uint32_t> clAssumedStackSizeForDynamicSizeObjects(
"variable sized objects (in bytes)"),
cl::Hidden, cl::init(4096));
-INITIALIZE_PASS(AMDGPUResourceUsageAnalysis, DEBUG_TYPE,
+INITIALIZE_PASS(AMDGPUResourceUsageAnalysisWrapperPass, DEBUG_TYPE,
"Function register usage analysis", true, true)
static const Function *getCalleeFunction(const MachineOperand &Op) {
@@ -68,7 +69,8 @@ static bool hasAnyNonFlatUseOfReg(const MachineRegisterInfo &MRI,
return false;
}
-bool AMDGPUResourceUsageAnalysis::runOnMachineFunction(MachineFunction &MF) {
+bool AMDGPUResourceUsageAnalysisWrapperPass::runOnMachineFunction(
+ MachineFunction &MF) {
auto *TPC = getAnalysisIfAvailable<TargetPassConfig>();
if (!TPC)
return false;
@@ -90,14 +92,40 @@ bool AMDGPUResourceUsageAnalysis::runOnMachineFunction(MachineFunction &MF) {
AssumedStackSizeForExternalCall = 0;
}
- ResourceInfo = analyzeResourceUsage(MF, AssumedStackSizeForDynamicSizeObjects,
- AssumedStackSizeForExternalCall);
+ ResourceInfo = AMDGPUResourceUsageAnalysisImpl().analyzeResourceUsage(
+ MF, AssumedStackSizeForDynamicSizeObjects,
+ AssumedStackSizeForExternalCall);
return false;
}
-AMDGPUResourceUsageAnalysis::SIFunctionResourceInfo
-AMDGPUResourceUsageAnalysis::analyzeResourceUsage(
+AnalysisKey AMDGPUResourceUsageAnalysis::Key;
+AMDGPUResourceUsageAnalysis::Result
+AMDGPUResourceUsageAnalysis::run(MachineFunction &MF,
+ MachineFunctionAnalysisManager &MFAM) {
+ const MCSubtargetInfo &STI = *TM.getMCSubtargetInfo();
+
+ // By default, for code object v5 and later, track only the minimum scratch
+ // size
+ uint32_t AssumedStackSizeForDynamicSizeObjects =
+ clAssumedStackSizeForDynamicSizeObjects;
+ uint32_t AssumedStackSizeForExternalCall = clAssumedStackSizeForExternalCall;
+ if (AMDGPU::getAMDHSACodeObjectVersion(*MF.getFunction().getParent()) >=
+ AMDGPU::AMDHSA_COV5 ||
+ STI.getTargetTriple().getOS() == Triple::AMDPAL) {
+ if (!clAssumedStackSizeForDynamicSizeObjects.getNumOccurrences())
+ AssumedStackSizeForDynamicSizeObjects = 0;
+ if (!clAssumedStackSizeForExternalCall.getNumOccurrences())
+ AssumedStackSizeForExternalCall = 0;
+ }
+
+ return AMDGPUResourceUsageAnalysisImpl().analyzeResourceUsage(
+ MF, AssumedStackSizeForDynamicSizeObjects,
+ AssumedStackSizeForExternalCall);
+}
+
+AMDGPUResourceUsageAnalysisImpl::SIFunctionResourceInfo
+AMDGPUResourceUsageAnalysisImpl::analyzeResourceUsage(
const MachineFunction &MF, uint32_t AssumedStackSizeForDynamicSizeObjects,
uint32_t AssumedStackSizeForExternalCall) const {
SIFunctionResourceInfo Info;