[llvm] [NVPTX] Add NewPM boilerplate to AsmPrinter (PR #215022)

Alex MacLean via llvm-commits llvm-commits at lists.llvm.org
Sat Aug 8 13:41:56 PDT 2026


https://github.com/AlexMaclean created https://github.com/llvm/llvm-project/pull/215022

None

>From 187e9765506e02ab1f9d2b56502cd1719aadd6fe Mon Sep 17 00:00:00 2001
From: Alex Maclean <amaclean at nvidia.com>
Date: Sat, 8 Aug 2026 13:39:06 -0700
Subject: [PATCH] [NVPTX] Add NewPM boilerplate to AsmPrinter

---
 llvm/lib/Target/NVPTX/NVPTXAsmPrinter.cpp    | 37 ++++++++++++++++++--
 llvm/lib/Target/NVPTX/NVPTXAsmPrinter.h      | 37 ++++++++++++++++++++
 llvm/lib/Target/NVPTX/NVPTXTargetMachine.cpp | 11 ++++++
 3 files changed, 82 insertions(+), 3 deletions(-)
 create mode 100644 llvm/lib/Target/NVPTX/NVPTXAsmPrinter.h

diff --git a/llvm/lib/Target/NVPTX/NVPTXAsmPrinter.cpp b/llvm/lib/Target/NVPTX/NVPTXAsmPrinter.cpp
index b550e985aa243..9f8051ebc2ed8 100644
--- a/llvm/lib/Target/NVPTX/NVPTXAsmPrinter.cpp
+++ b/llvm/lib/Target/NVPTX/NVPTXAsmPrinter.cpp
@@ -11,6 +11,7 @@
 //
 //===----------------------------------------------------------------------===//
 
+#include "NVPTXAsmPrinter.h"
 #include "MCTargetDesc/NVPTXBaseInfo.h"
 #include "MCTargetDesc/NVPTXInstPrinter.h"
 #include "MCTargetDesc/NVPTXTargetStreamer.h"
@@ -43,6 +44,7 @@
 #include "llvm/Analysis/ConstantFolding.h"
 #include "llvm/CodeGen/Analysis.h"
 #include "llvm/CodeGen/AsmPrinter.h"
+#include "llvm/CodeGen/AsmPrinterAnalysis.h"
 #include "llvm/CodeGen/MachineBasicBlock.h"
 #include "llvm/CodeGen/MachineFrameInfo.h"
 #include "llvm/CodeGen/MachineFunction.h"
@@ -839,16 +841,17 @@ void NVPTXAsmPrinter::emitJumpTable(const MachineJumpTableEntry &MJT,
 // llvm.loop.unroll.disable or llvm.loop.unroll.count=1.
 bool NVPTXAsmPrinter::isLoopHeaderOfNoUnroll(
     const MachineBasicBlock &MBB) const {
-  MachineLoopInfo &LI = getAnalysis<MachineLoopInfoWrapperPass>().getLI();
+  const MachineLoopInfo *LI = GetMLI(*MF);
+  assert(LI && "NVPTXAsmPrinter requires MachineLoopInfo");
   // We insert .pragma "nounroll" only to the loop header.
-  if (!LI.isLoopHeader(&MBB))
+  if (!LI->isLoopHeader(&MBB))
     return false;
 
   // llvm.loop.unroll.disable is marked on the back edges of a loop. Therefore,
   // we iterate through each back edge of the loop with header MBB, and check
   // whether its metadata contains llvm.loop.unroll.disable.
   for (const MachineBasicBlock *PMBB : MBB.predecessors()) {
-    if (LI.getLoopFor(PMBB) != LI.getLoopFor(&MBB)) {
+    if (LI->getLoopFor(PMBB) != LI->getLoopFor(&MBB)) {
       // Edges from other loops to MBB are not back edges.
       continue;
     }
@@ -2760,3 +2763,31 @@ LLVMInitializeNVPTXAsmPrinter() {
   RegisterAsmPrinter<NVPTXAsmPrinter> X(getTheNVPTXTarget32());
   RegisterAsmPrinter<NVPTXAsmPrinter> Y(getTheNVPTXTarget64());
 }
+
+PreservedAnalyses NVPTXAsmPrinterBeginPass::run(Module &M,
+                                                ModuleAnalysisManager &MAM) {
+  AsmPrinter &Printer = MAM.getResult<AsmPrinterAnalysis>(M).getPrinter();
+  setupModuleAsmPrinter(M, MAM, Printer);
+  Printer.doInitialization(M);
+  return PreservedAnalyses::all();
+}
+
+PreservedAnalyses
+NVPTXAsmPrinterPass::run(MachineFunction &MF,
+                         MachineFunctionAnalysisManager &MFAM) {
+  AsmPrinter &Printer =
+      MFAM.getResult<ModuleAnalysisManagerMachineFunctionProxy>(MF)
+          .getCachedResult<AsmPrinterAnalysis>(*MF.getFunction().getParent())
+          ->getPrinter();
+  setupMachineFunctionAsmPrinter(MFAM, MF, Printer);
+  Printer.runOnMachineFunction(MF);
+  return PreservedAnalyses::all();
+}
+
+PreservedAnalyses NVPTXAsmPrinterEndPass::run(Module &M,
+                                              ModuleAnalysisManager &MAM) {
+  AsmPrinter &Printer = MAM.getResult<AsmPrinterAnalysis>(M).getPrinter();
+  setupModuleAsmPrinter(M, MAM, Printer);
+  Printer.doFinalization(M);
+  return PreservedAnalyses::all();
+}
diff --git a/llvm/lib/Target/NVPTX/NVPTXAsmPrinter.h b/llvm/lib/Target/NVPTX/NVPTXAsmPrinter.h
new file mode 100644
index 0000000000000..bab59ced279bd
--- /dev/null
+++ b/llvm/lib/Target/NVPTX/NVPTXAsmPrinter.h
@@ -0,0 +1,37 @@
+//===-- NVPTXAsmPrinter.h - NVPTX LLVM assembly writer ----------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIB_TARGET_NVPTX_NVPTXASMPRINTER_H
+#define LLVM_LIB_TARGET_NVPTX_NVPTXASMPRINTER_H
+
+#include "llvm/CodeGen/MachineFunctionAnalysisManager.h"
+#include "llvm/IR/PassManager.h"
+
+namespace llvm {
+
+class NVPTXAsmPrinterBeginPass
+    : public RequiredPassInfoMixin<NVPTXAsmPrinterBeginPass> {
+public:
+  PreservedAnalyses run(Module &M, ModuleAnalysisManager &MAM);
+};
+
+class NVPTXAsmPrinterPass : public RequiredPassInfoMixin<NVPTXAsmPrinterPass> {
+public:
+  PreservedAnalyses run(MachineFunction &MF,
+                        MachineFunctionAnalysisManager &MFAM);
+};
+
+class NVPTXAsmPrinterEndPass
+    : public RequiredPassInfoMixin<NVPTXAsmPrinterEndPass> {
+public:
+  PreservedAnalyses run(Module &M, ModuleAnalysisManager &MAM);
+};
+
+} // end namespace llvm
+
+#endif // LLVM_LIB_TARGET_NVPTX_NVPTXASMPRINTER_H
diff --git a/llvm/lib/Target/NVPTX/NVPTXTargetMachine.cpp b/llvm/lib/Target/NVPTX/NVPTXTargetMachine.cpp
index 3c548bc581686..ea2c7aa8b27ed 100644
--- a/llvm/lib/Target/NVPTX/NVPTXTargetMachine.cpp
+++ b/llvm/lib/Target/NVPTX/NVPTXTargetMachine.cpp
@@ -14,6 +14,7 @@
 #include "NVPTX.h"
 #include "NVPTXAliasAnalysis.h"
 #include "NVPTXAllocaHoisting.h"
+#include "NVPTXAsmPrinter.h"
 #include "NVPTXAtomicLower.h"
 #include "NVPTXCtorDtorLowering.h"
 #include "NVPTXLowerAggrCopies.h"
@@ -212,6 +213,16 @@ void NVPTXTargetMachine::registerPassBuilderCallbacks(PassBuilder &PB) {
 #define GET_PASS_REGISTRY "NVPTXPassRegistry.def"
 #include "llvm/Passes/TargetPassRegistry.inc"
 
+  // TODO: Move this into the base CodeGenPassBuilder once all targets that
+  // currently implement it have a ported asm-printer pass.
+  if (PIC) {
+    PIC->addClassToPassName(NVPTXAsmPrinterBeginPass::name(),
+                            "nvptx-asm-printer-begin");
+    PIC->addClassToPassName(NVPTXAsmPrinterPass::name(), "nvptx-asm-printer");
+    PIC->addClassToPassName(NVPTXAsmPrinterEndPass::name(),
+                            "nvptx-asm-printer-end");
+  }
+
   PB.registerPipelineStartEPCallback(
       [this](ModulePassManager &PM, OptimizationLevel Level) {
         // We do not want to fold out calls to nvvm.reflect early if the user



More information about the llvm-commits mailing list