[llvm] [AMDGPU][NPM] Complete AsmPrinter support (PR #203509)

Vikram Hegde via llvm-commits llvm-commits at lists.llvm.org
Sun Jul 5 09:06:13 PDT 2026


https://github.com/vikramRH updated https://github.com/llvm/llvm-project/pull/203509

>From deba4c08339fe182eb0690d1a5082f0b7aad3c35 Mon Sep 17 00:00:00 2001
From: vikhegde <vikram.hegde at amd.com>
Date: Thu, 4 Jun 2026 11:24:30 +0530
Subject: [PATCH] [AMDGPU][NPM] Complete AsmPrinter support for AMDGPU

---
 llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp   | 48 +++++++++++++++++--
 llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.h     | 22 +++++++++
 .../lib/Target/AMDGPU/AMDGPUTargetMachine.cpp | 16 +++++--
 llvm/test/CodeGen/AMDGPU/llc-pipeline-npm.ll  | 11 ++++-
 4 files changed, 89 insertions(+), 8 deletions(-)

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



More information about the llvm-commits mailing list