[llvm] [AMDGPU][NPM] Complete AsmPrinter support (PR #203509)
via llvm-commits
llvm-commits at lists.llvm.org
Sun Jul 5 09:10:59 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-amdgpu
Author: Vikram Hegde (vikramRH)
<details>
<summary>Changes</summary>
---
Full diff: https://github.com/llvm/llvm-project/pull/203509.diff
4 Files Affected:
- (modified) llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp (+44-4)
- (modified) llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.h (+22)
- (modified) llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp (+13-3)
- (modified) llvm/test/CodeGen/AMDGPU/llc-pipeline-npm.ll (+10-1)
``````````diff
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp b/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp
index 53d45d97ab527..984b96af01354 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp
+++ b/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp
@@ -116,6 +116,13 @@ AMDGPUAsmPrinter::AMDGPUAsmPrinter(TargetMachine &TM,
std::unique_ptr<MCStreamer> Streamer)
: AsmPrinter(TM, std::move(Streamer)) {
assert(OutStreamer && "AsmPrinter constructed without streamer");
+ GetResourceUsage = [this](MachineFunction &MF)
+ -> const AMDGPUResourceUsageAnalysisImpl::SIFunctionResourceInfo * {
+ if (auto *ResourceUsageW =
+ getAnalysisIfAvailable<AMDGPUResourceUsageAnalysisWrapperPass>())
+ return &ResourceUsageW->getResourceInfo();
+ return nullptr;
+ };
}
StringRef AMDGPUAsmPrinter::getPassName() const {
@@ -544,8 +551,7 @@ void AMDGPUAsmPrinter::validateMCResourceInfo(Function &F) {
RI.getSymbol(FnSym->getName(), RIK::RIK_NumAGPR, OutContext);
uint64_t NumVgpr, NumAgpr;
- MachineModuleInfo &MMI =
- getAnalysis<MachineModuleInfoWrapperPass>().getMMI();
+ MachineModuleInfo &MMI = *GetMMI();
MachineFunction *MF = MMI.getMachineFunction(F);
if (MF && NumVgprSymbol->isVariable() && NumAgprSymbol->isVariable() &&
TryGetMCExprValue(NumVgprSymbol->getVariableValue(), NumVgpr) &&
@@ -893,8 +899,7 @@ bool AMDGPUAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
if (!IsTargetStreamerInitialized)
initTargetStreamer(*MF.getFunction().getParent());
- ResourceUsage =
- &getAnalysis<AMDGPUResourceUsageAnalysisWrapperPass>().getResourceInfo();
+ ResourceUsage = GetResourceUsage(MF);
CurrentProgramInfo.reset(MF);
const AMDGPUMachineFunctionInfo *MFI =
@@ -2008,6 +2013,41 @@ void AMDGPUAsmPrinter::emitResourceUsageRemarks(
CurrentProgramInfo.LDSSize);
}
+PreservedAnalyses AMDGPUAsmPrinterBeginPass::run(Module &M,
+ ModuleAnalysisManager &MAM) {
+
+ AMDGPUAsmPrinter &AsmPrinter = static_cast<AMDGPUAsmPrinter &>(
+ MAM.getResult<AsmPrinterAnalysis>(M).getPrinter());
+ setupModuleAsmPrinter(M, MAM, AsmPrinter);
+ AsmPrinter.doInitialization(M);
+ return PreservedAnalyses::all();
+}
+
+PreservedAnalyses
+AMDGPUAsmPrinterPass::run(MachineFunction &MF,
+ MachineFunctionAnalysisManager &MFAM) {
+ AMDGPUAsmPrinter &AsmPrinter = static_cast<AMDGPUAsmPrinter &>(
+ MFAM.getResult<ModuleAnalysisManagerMachineFunctionProxy>(MF)
+ .getCachedResult<AsmPrinterAnalysis>(*MF.getFunction().getParent())
+ ->getPrinter());
+ setupMachineFunctionAsmPrinter(MFAM, MF, AsmPrinter);
+ AsmPrinter.GetResourceUsage = [&MFAM](MachineFunction &MF)
+ -> const AMDGPUResourceUsageAnalysisImpl::SIFunctionResourceInfo * {
+ return &MFAM.getResult<AMDGPUResourceUsageAnalysis>(MF);
+ };
+ AsmPrinter.runOnMachineFunction(MF);
+ return PreservedAnalyses::all();
+}
+
+PreservedAnalyses AMDGPUAsmPrinterEndPass::run(Module &M,
+ ModuleAnalysisManager &MAM) {
+ AMDGPUAsmPrinter &AsmPrinter = static_cast<AMDGPUAsmPrinter &>(
+ MAM.getResult<AsmPrinterAnalysis>(M).getPrinter());
+ setupModuleAsmPrinter(M, MAM, AsmPrinter);
+ AsmPrinter.doFinalization(M);
+ return PreservedAnalyses::all();
+}
+
char AMDGPUAsmPrinter::ID = 0;
INITIALIZE_PASS(AMDGPUAsmPrinter, "amdgpu-asm-printer",
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.h b/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.h
index 9066b2d419f89..b1b1d025058e9 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.h
+++ b/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.h
@@ -20,6 +20,7 @@
#include "SIProgramInfo.h"
#include "llvm/ADT/SetVector.h"
#include "llvm/CodeGen/AsmPrinter.h"
+#include "llvm/Passes/CodeGenPassBuilder.h"
namespace llvm {
@@ -104,6 +105,9 @@ class AMDGPUAsmPrinter final : public AsmPrinter {
void validateMCResourceInfo(Function &F);
public:
+ std::function<const AMDGPUResourceUsageAnalysisImpl::SIFunctionResourceInfo *(
+ MachineFunction &)>
+ GetResourceUsage;
explicit AMDGPUAsmPrinter(TargetMachine &TM,
std::unique_ptr<MCStreamer> Streamer);
@@ -161,6 +165,24 @@ class AMDGPUAsmPrinter final : public AsmPrinter {
bool IsTargetStreamerInitialized;
};
+class AMDGPUAsmPrinterBeginPass
+ : public PassInfoMixin<AMDGPUAsmPrinterBeginPass> {
+public:
+ PreservedAnalyses run(Module &M, ModuleAnalysisManager &MAM);
+};
+
+class AMDGPUAsmPrinterPass
+ : public RequiredPassInfoMixin<AMDGPUAsmPrinterPass> {
+public:
+ PreservedAnalyses run(MachineFunction &MF,
+ MachineFunctionAnalysisManager &MFAM);
+};
+
+class AMDGPUAsmPrinterEndPass : public PassInfoMixin<AMDGPUAsmPrinterEndPass> {
+public:
+ PreservedAnalyses run(Module &M, ModuleAnalysisManager &MAM);
+};
+
} // end namespace llvm
#endif // LLVM_LIB_TARGET_AMDGPU_AMDGPUASMPRINTER_H
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp b/llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp
index 06bfc7e1a5162..b4a0aae2c3d45 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp
+++ b/llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp
@@ -17,6 +17,7 @@
#include "AMDGPUTargetMachine.h"
#include "AMDGPU.h"
#include "AMDGPUAliasAnalysis.h"
+#include "AMDGPUAsmPrinter.h"
#include "AMDGPUBarrierLatency.h"
#include "AMDGPUCoExecSchedStrategy.h"
#include "AMDGPUCtorDtorLowering.h"
@@ -962,6 +963,14 @@ void AMDGPUTargetMachine::registerPassBuilderCallbacks(PassBuilder &PB) {
#define GET_PASS_REGISTRY "AMDGPUPassRegistry.def"
#include "llvm/Passes/TargetPassRegistry.inc"
+ if (PIC) {
+ PIC->addClassToPassName(AMDGPUAsmPrinterBeginPass::name(),
+ "amdgpu-asm-printer-begin");
+ PIC->addClassToPassName(AMDGPUAsmPrinterPass::name(), "amdgpu-asm-printer");
+ PIC->addClassToPassName(AMDGPUAsmPrinterEndPass::name(),
+ "amdgpu-asm-printer-end");
+ }
+
PB.registerPipelineParsingCallback(
[this](StringRef Name, CGSCCPassManager &PM,
ArrayRef<PassBuilder::PipelineElement> Pipeline) {
@@ -2406,15 +2415,16 @@ void AMDGPUCodeGenPassBuilder::addILPOpts(PassManagerWrapper &PMW) const {
void AMDGPUCodeGenPassBuilder::addAsmPrinterBegin(
PassManagerWrapper &PMW) const {
- // TODO: Add AsmPrinterBegin
+ addModulePass(AMDGPUAsmPrinterBeginPass(), PMW,
+ /*Force=*/true);
}
void AMDGPUCodeGenPassBuilder::addAsmPrinter(PassManagerWrapper &PMW) const {
- // TODO: Add AsmPrinter.
+ addMachineFunctionPass(AMDGPUAsmPrinterPass(), PMW);
}
void AMDGPUCodeGenPassBuilder::addAsmPrinterEnd(PassManagerWrapper &PMW) const {
- // TODO: Add AsmPrinterEnd
+ addModulePass(AMDGPUAsmPrinterEndPass(), PMW, /*Force=*/true);
}
Error AMDGPUCodeGenPassBuilder::addInstSelector(PassManagerWrapper &PMW) const {
diff --git a/llvm/test/CodeGen/AMDGPU/llc-pipeline-npm.ll b/llvm/test/CodeGen/AMDGPU/llc-pipeline-npm.ll
index 0c591ec5b4669..865058fa1d92c 100644
--- a/llvm/test/CodeGen/AMDGPU/llc-pipeline-npm.ll
+++ b/llvm/test/CodeGen/AMDGPU/llc-pipeline-npm.ll
@@ -55,6 +55,7 @@
; GCN-O0-NEXT: safe-stack
; GCN-O0-NEXT: stack-protector
; GCN-O0-NEXT: verify
+; GCN-O0-NEXT: amdgpu-asm-printer-begin
; GCN-O0-NEXT: cgscc
; GCN-O0-NEXT: function
; GCN-O0-NEXT: machine-function
@@ -103,7 +104,9 @@
; GCN-O0-NEXT: amdgpu-preload-kern-arg-prolog
; GCN-O0-NEXT: stack-frame-layout
; GCN-O0-NEXT: verify
-; GCN-O0-NEXT: free-machine-function
+; GCN-O0-NEXT: amdgpu-asm-printer
+; GCN-O0-NEXT: free-machine-function
+; GCN-O0-NEXT: amdgpu-asm-printer-end
; GCN-O2: require<MachineModuleAnalysis>
; GCN-O2-NEXT: require<profile-summary>
@@ -183,6 +186,7 @@
; GCN-O2-NEXT: safe-stack
; GCN-O2-NEXT: stack-protector
; GCN-O2-NEXT: verify
+; GCN-O2-NEXT: amdgpu-asm-printer-begin
; GCN-O2-NEXT: cgscc
; GCN-O2-NEXT: function
; GCN-O2-NEXT: machine-function
@@ -289,7 +293,9 @@
; GCN-O2-NEXT: amdgpu-preload-kern-arg-prolog
; GCN-O2-NEXT: stack-frame-layout
; GCN-O2-NEXT: verify
+; GCN-O2-NEXT: amdgpu-asm-printer
; GCN-O2-NEXT: free-machine-function
+; GCN-O2-NEXT: amdgpu-asm-printer-end
; GCN-O3: require<MachineModuleAnalysis>
; GCN-O3-NEXT: require<profile-summary>
@@ -369,6 +375,7 @@
; GCN-O3-NEXT: safe-stack
; GCN-O3-NEXT: stack-protector
; GCN-O3-NEXT: verify
+; GCN-O3-NEXT: amdgpu-asm-printer-begin
; GCN-O3-NEXT: cgscc
; GCN-O3-NEXT: function
; GCN-O3-NEXT: machine-function
@@ -475,7 +482,9 @@
; GCN-O3-NEXT: amdgpu-preload-kern-arg-prolog
; GCN-O3-NEXT: stack-frame-layout
; GCN-O3-NEXT: verify
+; GCN-O3-NEXT: amdgpu-asm-printer
; GCN-O3-NEXT: free-machine-function
+; GCN-O3-NEXT: amdgpu-asm-printer-end
define void @empty() {
ret void
``````````
</details>
https://github.com/llvm/llvm-project/pull/203509
More information about the llvm-commits
mailing list