[llvm] [AMDGPU] Store resource analysis result into SIMachineFunctionInfo (PR #124040)
Gang Chen via llvm-commits
llvm-commits at lists.llvm.org
Wed Jan 22 16:53:55 PST 2025
https://github.com/cmc-rep created https://github.com/llvm/llvm-project/pull/124040
So we make sure it is only run once per function.
>From 1c8b0c78d612a99e52e831842b0a0bbaf5d5a358 Mon Sep 17 00:00:00 2001
From: Gang Chen <Gang.Chen at amd.com>
Date: Wed, 22 Jan 2025 16:50:23 -0800
Subject: [PATCH] [AMDGPU] Store resource analysis result into
SIMachineFunctionInfo
So we make sure it is only run once per function.
---
llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp | 7 +++---
.../Target/AMDGPU/AMDGPUMCResourceInfo.cpp | 2 +-
llvm/lib/Target/AMDGPU/AMDGPUMCResourceInfo.h | 2 +-
.../AMDGPU/AMDGPUResourceUsageAnalysis.cpp | 13 +++++++----
.../AMDGPU/AMDGPUResourceUsageAnalysis.h | 22 ++-----------------
.../lib/Target/AMDGPU/SIMachineFunctionInfo.h | 19 ++++++++++++++++
6 files changed, 36 insertions(+), 29 deletions(-)
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp b/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp
index 0c151d06924d8d..5bb675ebb8002f 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp
+++ b/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp
@@ -19,7 +19,6 @@
#include "AMDGPU.h"
#include "AMDGPUHSAMetadataStreamer.h"
#include "AMDGPUMCResourceInfo.h"
-#include "AMDGPUResourceUsageAnalysis.h"
#include "GCNSubtarget.h"
#include "MCTargetDesc/AMDGPUInstPrinter.h"
#include "MCTargetDesc/AMDGPUMCExpr.h"
@@ -664,8 +663,10 @@ bool AMDGPUAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
OutStreamer->switchSection(ConfigSection);
}
- const AMDGPUResourceUsageAnalysis::SIFunctionResourceInfo &Info =
- ResourceUsage->getResourceInfo();
+ const SIMachineFunctionInfo *SIMFI = MF.getInfo<SIMachineFunctionInfo>();
+ assert(SIMFI->ResourceInfo.has_value());
+ const SIMachineFunctionInfo::SIFunctionResourceInfo &Info =
+ SIMFI->ResourceInfo.value();
RI.gatherResourceInfo(MF, Info, OutContext);
if (MFI->isModuleEntryFunction()) {
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUMCResourceInfo.cpp b/llvm/lib/Target/AMDGPU/AMDGPUMCResourceInfo.cpp
index 47679f89f3f022..7206adcc01d7f3 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUMCResourceInfo.cpp
+++ b/llvm/lib/Target/AMDGPU/AMDGPUMCResourceInfo.cpp
@@ -155,7 +155,7 @@ void MCResourceInfo::assignResourceInfoExpr(
void MCResourceInfo::gatherResourceInfo(
const MachineFunction &MF,
- const AMDGPUResourceUsageAnalysis::SIFunctionResourceInfo &FRI,
+ const SIMachineFunctionInfo::SIFunctionResourceInfo &FRI,
MCContext &OutContext) {
// Worst case VGPR use for non-hardware-entrypoints.
MCSymbol *MaxVGPRSym = getMaxVGPRSymbol(OutContext);
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUMCResourceInfo.h b/llvm/lib/Target/AMDGPU/AMDGPUMCResourceInfo.h
index a670878948c31b..d450bec46e60ea 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUMCResourceInfo.h
+++ b/llvm/lib/Target/AMDGPU/AMDGPUMCResourceInfo.h
@@ -92,7 +92,7 @@ class MCResourceInfo {
/// functions with indirect calls should be assigned the module level maximum.
void gatherResourceInfo(
const MachineFunction &MF,
- const AMDGPUResourceUsageAnalysis::SIFunctionResourceInfo &FRI,
+ const SIMachineFunctionInfo::SIFunctionResourceInfo &FRI,
MCContext &OutContext);
const MCExpr *createTotalNumVGPRs(const MachineFunction &MF, MCContext &Ctx);
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUResourceUsageAnalysis.cpp b/llvm/lib/Target/AMDGPU/AMDGPUResourceUsageAnalysis.cpp
index 9a609a1752de06..7ff625b96f5946 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUResourceUsageAnalysis.cpp
+++ b/llvm/lib/Target/AMDGPU/AMDGPUResourceUsageAnalysis.cpp
@@ -73,6 +73,10 @@ bool AMDGPUResourceUsageAnalysis::runOnMachineFunction(MachineFunction &MF) {
if (!TPC)
return false;
+ SIMachineFunctionInfo *MFI = MF.getInfo<SIMachineFunctionInfo>();
+ if (MFI->ResourceInfo.has_value())
+ return false;
+
const TargetMachine &TM = TPC->getTM<TargetMachine>();
const MCSubtargetInfo &STI = *TM.getMCSubtargetInfo();
@@ -90,17 +94,18 @@ bool AMDGPUResourceUsageAnalysis::runOnMachineFunction(MachineFunction &MF) {
AssumedStackSizeForExternalCall = 0;
}
- ResourceInfo = analyzeResourceUsage(MF, AssumedStackSizeForDynamicSizeObjects,
- AssumedStackSizeForExternalCall);
+ MFI->ResourceInfo =
+ analyzeResourceUsage(MF, AssumedStackSizeForDynamicSizeObjects,
+ AssumedStackSizeForExternalCall);
return false;
}
-AMDGPUResourceUsageAnalysis::SIFunctionResourceInfo
+SIMachineFunctionInfo::SIFunctionResourceInfo
AMDGPUResourceUsageAnalysis::analyzeResourceUsage(
const MachineFunction &MF, uint32_t AssumedStackSizeForDynamicSizeObjects,
uint32_t AssumedStackSizeForExternalCall) const {
- SIFunctionResourceInfo Info;
+ SIMachineFunctionInfo::SIFunctionResourceInfo Info;
const SIMachineFunctionInfo *MFI = MF.getInfo<SIMachineFunctionInfo>();
const GCNSubtarget &ST = MF.getSubtarget<GCNSubtarget>();
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUResourceUsageAnalysis.h b/llvm/lib/Target/AMDGPU/AMDGPUResourceUsageAnalysis.h
index 92ef41f49b3ba8..8716e48cb23f8a 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUResourceUsageAnalysis.h
+++ b/llvm/lib/Target/AMDGPU/AMDGPUResourceUsageAnalysis.h
@@ -17,6 +17,7 @@
#include "llvm/ADT/SmallVector.h"
#include "llvm/CodeGen/MachineFunctionPass.h"
+#include "SIMachineFunctionInfo.h"
namespace llvm {
@@ -27,40 +28,21 @@ class TargetMachine;
struct AMDGPUResourceUsageAnalysis : public MachineFunctionPass {
public:
static char ID;
- // Track resource usage for callee functions.
- struct SIFunctionResourceInfo {
- // Track the number of explicitly used VGPRs. Special registers reserved at
- // the end are tracked separately.
- int32_t NumVGPR = 0;
- int32_t NumAGPR = 0;
- int32_t NumExplicitSGPR = 0;
- uint64_t CalleeSegmentSize = 0;
- uint64_t PrivateSegmentSize = 0;
- bool UsesVCC = false;
- bool UsesFlatScratch = false;
- bool HasDynamicallySizedStack = false;
- bool HasRecursion = false;
- bool HasIndirectCall = false;
- SmallVector<const Function *, 16> Callees;
- };
AMDGPUResourceUsageAnalysis() : MachineFunctionPass(ID) {}
bool runOnMachineFunction(MachineFunction &MF) override;
- const SIFunctionResourceInfo &getResourceInfo() const { return ResourceInfo; }
-
void getAnalysisUsage(AnalysisUsage &AU) const override {
AU.setPreservesAll();
MachineFunctionPass::getAnalysisUsage(AU);
}
private:
- SIFunctionResourceInfo
+ SIMachineFunctionInfo::SIFunctionResourceInfo
analyzeResourceUsage(const MachineFunction &MF,
uint32_t AssumedStackSizeForDynamicSizeObjects,
uint32_t AssumedStackSizeForExternalCall) const;
- SIFunctionResourceInfo ResourceInfo;
};
} // namespace llvm
#endif // LLVM_LIB_TARGET_AMDGPU_AMDGPURESOURCEUSAGEANALYSIS_H
diff --git a/llvm/lib/Target/AMDGPU/SIMachineFunctionInfo.h b/llvm/lib/Target/AMDGPU/SIMachineFunctionInfo.h
index 2e2716f1ce8889..3b55e713d1e1ad 100644
--- a/llvm/lib/Target/AMDGPU/SIMachineFunctionInfo.h
+++ b/llvm/lib/Target/AMDGPU/SIMachineFunctionInfo.h
@@ -1135,6 +1135,25 @@ class SIMachineFunctionInfo final : public AMDGPUMachineFunction,
unsigned getMaxNumWorkGroupsX() const { return MaxNumWorkGroups[0]; }
unsigned getMaxNumWorkGroupsY() const { return MaxNumWorkGroups[1]; }
unsigned getMaxNumWorkGroupsZ() const { return MaxNumWorkGroups[2]; }
+ // Track resource usage for callee functions.
+ struct SIFunctionResourceInfo {
+ // Track the number of explicitly used VGPRs. Special registers reserved at
+ // the end are tracked separately.
+ // NumVGPR is the wave-private number of VGPRs, it excludes shared VGPRs.
+ int32_t NumVGPR = 0;
+ int32_t NumAGPR = 0;
+ int32_t NumExplicitSGPR = 0;
+ int32_t NumNamedBarrier = 0;
+ uint64_t CalleeSegmentSize = 0;
+ uint64_t PrivateSegmentSize = 0;
+ bool UsesVCC = false;
+ bool UsesFlatScratch = false;
+ bool HasDynamicallySizedStack = false;
+ bool HasRecursion = false;
+ bool HasIndirectCall = false;
+ SmallVector<const Function *, 16> Callees;
+ };
+ std::optional<SIFunctionResourceInfo> ResourceInfo;
};
} // end namespace llvm
More information about the llvm-commits
mailing list