Skip to content

Commit 1ccd779

Browse files
authored
[AMDGPU][NewPM] Port "AMDGPUResourceUsageAnalysis" to NPM (#130959)
1 parent f573f6b commit 1ccd779

10 files changed

+90
-31
lines changed

llvm/include/llvm/Passes/TargetPassRegistry.inc

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -187,12 +187,13 @@ PB.registerAnalysisRegistrationCallback([](LoopAnalysisManager &AM) {
187187
#undef LOOP_ANALYSIS
188188
});
189189

190-
PB.registerAnalysisRegistrationCallback([](MachineFunctionAnalysisManager &AM) {
190+
PB.registerAnalysisRegistrationCallback(
191+
[=](MachineFunctionAnalysisManager &AM) {
191192
#define MACHINE_FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
192193
AM.registerPass([&] { return CREATE_PASS; });
193194
#include GET_PASS_REGISTRY
194195
#undef MACHINE_FUNCTION_ANALYSIS
195-
});
196+
});
196197

197198
#undef GET_PASS_REGISTRY
198199
#endif // GET_PASS_REGISTRY

llvm/lib/Target/AMDGPU/AMDGPU.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -428,7 +428,7 @@ ModulePass *createAMDGPUPrintfRuntimeBinding();
428428
void initializeAMDGPUPrintfRuntimeBindingPass(PassRegistry&);
429429
extern char &AMDGPUPrintfRuntimeBindingID;
430430

431-
void initializeAMDGPUResourceUsageAnalysisPass(PassRegistry &);
431+
void initializeAMDGPUResourceUsageAnalysisWrapperPassPass(PassRegistry &);
432432
extern char &AMDGPUResourceUsageAnalysisID;
433433

434434
struct AMDGPUPrintfRuntimeBindingPass

llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -646,7 +646,8 @@ bool AMDGPUAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
646646
if (!IsTargetStreamerInitialized)
647647
initTargetStreamer(*MF.getFunction().getParent());
648648

649-
ResourceUsage = &getAnalysis<AMDGPUResourceUsageAnalysis>();
649+
ResourceUsage =
650+
&getAnalysis<AMDGPUResourceUsageAnalysisWrapperPass>().getResourceInfo();
650651
CurrentProgramInfo.reset(MF);
651652

652653
const AMDGPUMachineFunction *MFI = MF.getInfo<AMDGPUMachineFunction>();
@@ -668,9 +669,7 @@ bool AMDGPUAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
668669
OutStreamer->switchSection(ConfigSection);
669670
}
670671

671-
const AMDGPUResourceUsageAnalysis::SIFunctionResourceInfo &Info =
672-
ResourceUsage->getResourceInfo();
673-
RI.gatherResourceInfo(MF, Info, OutContext);
672+
RI.gatherResourceInfo(MF, *ResourceUsage, OutContext);
674673

675674
if (MFI->isModuleEntryFunction()) {
676675
getSIProgramInfo(CurrentProgramInfo, MF);
@@ -1677,8 +1676,8 @@ bool AMDGPUAsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,
16771676
}
16781677

16791678
void AMDGPUAsmPrinter::getAnalysisUsage(AnalysisUsage &AU) const {
1680-
AU.addRequired<AMDGPUResourceUsageAnalysis>();
1681-
AU.addPreserved<AMDGPUResourceUsageAnalysis>();
1679+
AU.addRequired<AMDGPUResourceUsageAnalysisWrapperPass>();
1680+
AU.addPreserved<AMDGPUResourceUsageAnalysisWrapperPass>();
16821681
AU.addRequired<MachineModuleInfoWrapperPass>();
16831682
AU.addPreserved<MachineModuleInfoWrapperPass>();
16841683
AsmPrinter::getAnalysisUsage(AU);

llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,8 @@ class AMDGPUAsmPrinter final : public AsmPrinter {
4343
unsigned CodeObjectVersion;
4444
void initializeTargetID(const Module &M);
4545

46-
AMDGPUResourceUsageAnalysis *ResourceUsage;
46+
const AMDGPUResourceUsageAnalysisWrapperPass::FunctionResourceInfo
47+
*ResourceUsage;
4748

4849
MCResourceInfo RI;
4950

llvm/lib/Target/AMDGPU/AMDGPUMCResourceInfo.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ void MCResourceInfo::assignResourceInfoExpr(
238238

239239
void MCResourceInfo::gatherResourceInfo(
240240
const MachineFunction &MF,
241-
const AMDGPUResourceUsageAnalysis::SIFunctionResourceInfo &FRI,
241+
const AMDGPUResourceUsageAnalysisWrapperPass::FunctionResourceInfo &FRI,
242242
MCContext &OutContext) {
243243
// Worst case VGPR use for non-hardware-entrypoints.
244244
MCSymbol *MaxVGPRSym = getMaxVGPRSymbol(OutContext);

llvm/lib/Target/AMDGPU/AMDGPUMCResourceInfo.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ class MCResourceInfo {
9898
/// functions with indirect calls should be assigned the module level maximum.
9999
void gatherResourceInfo(
100100
const MachineFunction &MF,
101-
const AMDGPUResourceUsageAnalysis::SIFunctionResourceInfo &FRI,
101+
const AMDGPUResourceUsageAnalysisWrapperPass::FunctionResourceInfo &FRI,
102102
MCContext &OutContext);
103103

104104
const MCExpr *createTotalNumVGPRs(const MachineFunction &MF, MCContext &Ctx);

llvm/lib/Target/AMDGPU/AMDGPUPassRegistry.def

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,13 @@ FUNCTION_PASS_WITH_PARAMS(
9494
parseAMDGPUAtomicOptimizerStrategy, "strategy=dpp|iterative|none")
9595
#undef FUNCTION_PASS_WITH_PARAMS
9696

97+
#ifndef MACHINE_FUNCTION_ANALYSIS
98+
#define MACHINE_FUNCTION_ANALYSIS(NAME, CREATE_PASS)
99+
#endif
100+
101+
MACHINE_FUNCTION_ANALYSIS("amdgpu-resource-usage", AMDGPUResourceUsageAnalysis(*static_cast<const GCNTargetMachine *>(this)))
102+
#undef MACHINE_FUNCTION_ANALYSIS
103+
97104
#ifndef MACHINE_FUNCTION_PASS
98105
#define MACHINE_FUNCTION_PASS(NAME, CREATE_PASS)
99106
#endif

llvm/lib/Target/AMDGPU/AMDGPUResourceUsageAnalysis.cpp

Lines changed: 36 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,9 @@ using namespace llvm::AMDGPU;
3030

3131
#define DEBUG_TYPE "amdgpu-resource-usage"
3232

33-
char llvm::AMDGPUResourceUsageAnalysis::ID = 0;
34-
char &llvm::AMDGPUResourceUsageAnalysisID = AMDGPUResourceUsageAnalysis::ID;
33+
char llvm::AMDGPUResourceUsageAnalysisWrapperPass::ID = 0;
34+
char &llvm::AMDGPUResourceUsageAnalysisID =
35+
AMDGPUResourceUsageAnalysisWrapperPass::ID;
3536

3637
// In code object v4 and older, we need to tell the runtime some amount ahead of
3738
// 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(
4748
"variable sized objects (in bytes)"),
4849
cl::Hidden, cl::init(4096));
4950

50-
INITIALIZE_PASS(AMDGPUResourceUsageAnalysis, DEBUG_TYPE,
51+
INITIALIZE_PASS(AMDGPUResourceUsageAnalysisWrapperPass, DEBUG_TYPE,
5152
"Function register usage analysis", true, true)
5253

5354
static const Function *getCalleeFunction(const MachineOperand &Op) {
@@ -68,7 +69,8 @@ static bool hasAnyNonFlatUseOfReg(const MachineRegisterInfo &MRI,
6869
return false;
6970
}
7071

71-
bool AMDGPUResourceUsageAnalysis::runOnMachineFunction(MachineFunction &MF) {
72+
bool AMDGPUResourceUsageAnalysisWrapperPass::runOnMachineFunction(
73+
MachineFunction &MF) {
7274
auto *TPC = getAnalysisIfAvailable<TargetPassConfig>();
7375
if (!TPC)
7476
return false;
@@ -90,14 +92,40 @@ bool AMDGPUResourceUsageAnalysis::runOnMachineFunction(MachineFunction &MF) {
9092
AssumedStackSizeForExternalCall = 0;
9193
}
9294

93-
ResourceInfo = analyzeResourceUsage(MF, AssumedStackSizeForDynamicSizeObjects,
94-
AssumedStackSizeForExternalCall);
95+
ResourceInfo = AMDGPUResourceUsageAnalysisImpl().analyzeResourceUsage(
96+
MF, AssumedStackSizeForDynamicSizeObjects,
97+
AssumedStackSizeForExternalCall);
9598

9699
return false;
97100
}
98101

99-
AMDGPUResourceUsageAnalysis::SIFunctionResourceInfo
100-
AMDGPUResourceUsageAnalysis::analyzeResourceUsage(
102+
AnalysisKey AMDGPUResourceUsageAnalysis::Key;
103+
AMDGPUResourceUsageAnalysis::Result
104+
AMDGPUResourceUsageAnalysis::run(MachineFunction &MF,
105+
MachineFunctionAnalysisManager &MFAM) {
106+
const MCSubtargetInfo &STI = *TM.getMCSubtargetInfo();
107+
108+
// By default, for code object v5 and later, track only the minimum scratch
109+
// size
110+
uint32_t AssumedStackSizeForDynamicSizeObjects =
111+
clAssumedStackSizeForDynamicSizeObjects;
112+
uint32_t AssumedStackSizeForExternalCall = clAssumedStackSizeForExternalCall;
113+
if (AMDGPU::getAMDHSACodeObjectVersion(*MF.getFunction().getParent()) >=
114+
AMDGPU::AMDHSA_COV5 ||
115+
STI.getTargetTriple().getOS() == Triple::AMDPAL) {
116+
if (!clAssumedStackSizeForDynamicSizeObjects.getNumOccurrences())
117+
AssumedStackSizeForDynamicSizeObjects = 0;
118+
if (!clAssumedStackSizeForExternalCall.getNumOccurrences())
119+
AssumedStackSizeForExternalCall = 0;
120+
}
121+
122+
return AMDGPUResourceUsageAnalysisImpl().analyzeResourceUsage(
123+
MF, AssumedStackSizeForDynamicSizeObjects,
124+
AssumedStackSizeForExternalCall);
125+
}
126+
127+
AMDGPUResourceUsageAnalysisImpl::SIFunctionResourceInfo
128+
AMDGPUResourceUsageAnalysisImpl::analyzeResourceUsage(
101129
const MachineFunction &MF, uint32_t AssumedStackSizeForDynamicSizeObjects,
102130
uint32_t AssumedStackSizeForExternalCall) const {
103131
SIFunctionResourceInfo Info;

llvm/lib/Target/AMDGPU/AMDGPUResourceUsageAnalysis.h

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,15 @@
1717

1818
#include "llvm/ADT/SmallVector.h"
1919
#include "llvm/CodeGen/MachineFunctionPass.h"
20+
#include "llvm/IR/PassManager.h"
2021

2122
namespace llvm {
2223

2324
class GCNSubtarget;
2425
class MachineFunction;
25-
class TargetMachine;
26+
class GCNTargetMachine;
2627

27-
struct AMDGPUResourceUsageAnalysis : public MachineFunctionPass {
28+
struct AMDGPUResourceUsageAnalysisImpl {
2829
public:
2930
static char ID;
3031
// Track resource usage for callee functions.
@@ -44,23 +45,44 @@ struct AMDGPUResourceUsageAnalysis : public MachineFunctionPass {
4445
SmallVector<const Function *, 16> Callees;
4546
};
4647

47-
AMDGPUResourceUsageAnalysis() : MachineFunctionPass(ID) {}
48+
SIFunctionResourceInfo
49+
analyzeResourceUsage(const MachineFunction &MF,
50+
uint32_t AssumedStackSizeForDynamicSizeObjects,
51+
uint32_t AssumedStackSizeForExternalCall) const;
52+
};
53+
54+
struct AMDGPUResourceUsageAnalysisWrapperPass : public MachineFunctionPass {
55+
using FunctionResourceInfo =
56+
AMDGPUResourceUsageAnalysisImpl::SIFunctionResourceInfo;
57+
FunctionResourceInfo ResourceInfo;
58+
59+
public:
60+
static char ID;
61+
AMDGPUResourceUsageAnalysisWrapperPass() : MachineFunctionPass(ID) {}
4862

4963
bool runOnMachineFunction(MachineFunction &MF) override;
5064

51-
const SIFunctionResourceInfo &getResourceInfo() const { return ResourceInfo; }
65+
const FunctionResourceInfo &getResourceInfo() const { return ResourceInfo; }
5266

5367
void getAnalysisUsage(AnalysisUsage &AU) const override {
5468
AU.setPreservesAll();
5569
MachineFunctionPass::getAnalysisUsage(AU);
5670
}
71+
};
5772

58-
private:
59-
SIFunctionResourceInfo
60-
analyzeResourceUsage(const MachineFunction &MF,
61-
uint32_t AssumedStackSizeForDynamicSizeObjects,
62-
uint32_t AssumedStackSizeForExternalCall) const;
63-
SIFunctionResourceInfo ResourceInfo;
73+
class AMDGPUResourceUsageAnalysis
74+
: public AnalysisInfoMixin<AMDGPUResourceUsageAnalysis> {
75+
friend AnalysisInfoMixin<AMDGPUResourceUsageAnalysis>;
76+
static AnalysisKey Key;
77+
78+
const GCNTargetMachine &TM;
79+
80+
public:
81+
using Result = AMDGPUResourceUsageAnalysisImpl::SIFunctionResourceInfo;
82+
Result run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM);
83+
84+
AMDGPUResourceUsageAnalysis(const GCNTargetMachine &TM_) : TM(TM_) {}
6485
};
86+
6587
} // namespace llvm
6688
#endif // LLVM_LIB_TARGET_AMDGPU_AMDGPURESOURCEUSAGEANALYSIS_H

llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#include "AMDGPUPreloadKernArgProlog.h"
2828
#include "AMDGPURemoveIncompatibleFunctions.h"
2929
#include "AMDGPUReserveWWMRegs.h"
30+
#include "AMDGPUResourceUsageAnalysis.h"
3031
#include "AMDGPUSplitModule.h"
3132
#include "AMDGPUTargetObjectFile.h"
3233
#include "AMDGPUTargetTransformInfo.h"
@@ -557,7 +558,7 @@ extern "C" LLVM_ABI LLVM_EXTERNAL_VISIBILITY void LLVMInitializeAMDGPUTarget() {
557558
initializeAMDGPUExternalAAWrapperPass(*PR);
558559
initializeAMDGPUImageIntrinsicOptimizerPass(*PR);
559560
initializeAMDGPUPrintfRuntimeBindingPass(*PR);
560-
initializeAMDGPUResourceUsageAnalysisPass(*PR);
561+
initializeAMDGPUResourceUsageAnalysisWrapperPassPass(*PR);
561562
initializeGCNNSAReassignLegacyPass(*PR);
562563
initializeGCNPreRAOptimizationsLegacyPass(*PR);
563564
initializeGCNPreRALongBranchRegLegacyPass(*PR);

0 commit comments

Comments
 (0)