[llvm] [CodeGen][NewPM] Port `AsmPrinter` to new pass manager (PR #99320)
via llvm-commits
llvm-commits at lists.llvm.org
Thu May 15 02:40:37 PDT 2025
https://github.com/paperchalice updated https://github.com/llvm/llvm-project/pull/99320
>From 0716c4a7527c301ac5287f310d89202701ac622d Mon Sep 17 00:00:00 2001
From: PaperChalice <liujunchang97 at outlook.com>
Date: Thu, 15 May 2025 15:35:34 +0800
Subject: [PATCH 1/2] [CodeGen] Port `AsmPrinter` to new pass manager
---
llvm/include/llvm/CodeGen/AsmPrinter.h | 80 ++++++++-
llvm/include/llvm/Passes/CodeGenPassBuilder.h | 63 ++++---
llvm/include/llvm/Target/TargetMachine.h | 2 +-
llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp | 161 ++++++++++++------
llvm/lib/Passes/PassBuilder.cpp | 7 +
llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp | 13 +-
.../lib/Target/AMDGPU/AMDGPUTargetMachine.cpp | 5 +-
llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.h | 2 +-
llvm/lib/Target/AMDGPU/R600TargetMachine.cpp | 5 +-
llvm/lib/Target/AMDGPU/R600TargetMachine.h | 2 +-
llvm/lib/Target/NVPTX/NVPTXAsmPrinter.cpp | 7 +-
llvm/lib/Target/X86/CMakeLists.txt | 1 +
llvm/lib/Target/X86/X86CodeGenPassBuilder.cpp | 12 +-
llvm/lib/Target/X86/X86MCInstLower.cpp | 8 +-
llvm/lib/Target/X86/X86TargetMachine.h | 4 +-
llvm/tools/llc/NewPMDriver.cpp | 5 +-
16 files changed, 277 insertions(+), 100 deletions(-)
diff --git a/llvm/include/llvm/CodeGen/AsmPrinter.h b/llvm/include/llvm/CodeGen/AsmPrinter.h
index 9a8f2d5e398e7..a42e465bb29e1 100644
--- a/llvm/include/llvm/CodeGen/AsmPrinter.h
+++ b/llvm/include/llvm/CodeGen/AsmPrinter.h
@@ -16,6 +16,7 @@
#define LLVM_CODEGEN_ASMPRINTER_H
#include "llvm/ADT/DenseMap.h"
+#include "llvm/ADT/IntrusiveRefCntPtr.h"
#include "llvm/ADT/MapVector.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/Analysis/ProfileSummaryInfo.h"
@@ -23,6 +24,7 @@
#include "llvm/BinaryFormat/Dwarf.h"
#include "llvm/CodeGen/DwarfStringPoolEntry.h"
#include "llvm/CodeGen/MachineFunctionPass.h"
+#include "llvm/CodeGen/MachinePassManager.h"
#include "llvm/CodeGen/StackMaps.h"
#include "llvm/DebugInfo/CodeView/CodeView.h"
#include "llvm/IR/InlineAsm.h"
@@ -86,7 +88,10 @@ class RemarkStreamer;
}
/// This class is intended to be used as a driving class for all asm writers.
-class AsmPrinter : public MachineFunctionPass {
+/// Use lightweight RefCountedBase here because AsmPrinter is shared only in
+/// pass manager.
+class AsmPrinter : public RefCountedBase<AsmPrinter>,
+ public MachineFunctionPass {
public:
/// Target machine description.
TargetMachine &TM;
@@ -209,6 +214,11 @@ class AsmPrinter : public MachineFunctionPass {
StackMaps SM;
+ /// If one of thses pass manager is not null, then it is in new pass manager.
+ ModuleAnalysisManager *MAM = nullptr;
+ MachineFunctionAnalysisManager *MFAM = nullptr;
+ bool inNewPassManager() const { return MAM || MFAM; }
+
private:
/// If generated on the fly this own the instance.
std::unique_ptr<MachineDominatorTree> OwnedMDT;
@@ -244,7 +254,7 @@ class AsmPrinter : public MachineFunctionPass {
char &ID = AsmPrinter::ID);
public:
- ~AsmPrinter() override;
+ virtual ~AsmPrinter();
DwarfDebug *getDwarfDebug() { return DD; }
DwarfDebug *getDwarfDebug() const { return DD; }
@@ -388,23 +398,43 @@ class AsmPrinter : public MachineFunctionPass {
// MachineFunctionPass Implementation.
//===------------------------------------------------------------------===//
+ virtual StringRef getPassName() const override;
+
/// Record analysis usage.
- void getAnalysisUsage(AnalysisUsage &AU) const override;
+ virtual void getAnalysisUsage(AnalysisUsage &AU) const override;
/// Set up the AsmPrinter when we are working on a new module. If your pass
/// overrides this, it must make sure to explicitly call this implementation.
- bool doInitialization(Module &M) override;
+ /// TODO: Keep only the new pass manager doInitialization.
+ virtual bool doInitialization(Module &M) override;
+ virtual void doInitialization(Module &M, ModuleAnalysisManager &MAM) {
+ this->MAM = &MAM;
+ doInitialization(M);
+ this->MAM = nullptr;
+ }
/// Shut down the asmprinter. If you override this in your pass, you must make
/// sure to call it explicitly.
- bool doFinalization(Module &M) override;
+ /// TODO: Keep only the new pass manager doFinalization.
+ virtual bool doFinalization(Module &M) override;
+ virtual void doFinalization(Module &M, ModuleAnalysisManager &MAM) {
+ this->MAM = &MAM;
+ doFinalization(M);
+ this->MAM = nullptr;
+ }
/// Emit the specified function out to the OutStreamer.
- bool runOnMachineFunction(MachineFunction &MF) override {
+ /// TODO: Keep only the new pass manager run.
+ virtual bool runOnMachineFunction(MachineFunction &MF) override {
SetupMachineFunction(MF);
emitFunctionBody();
return false;
}
+ virtual void run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM) {
+ this->MFAM = &MFAM;
+ SetupMachineFunction(MF);
+ emitFunctionBody();
+ }
//===------------------------------------------------------------------===//
// Coarse grained IR lowering routines.
@@ -539,6 +569,7 @@ class AsmPrinter : public MachineFunctionPass {
/// Emit the stack maps.
void emitStackMaps();
+ void emitStackMaps(Module &M); // For new pass manager version.
//===------------------------------------------------------------------===//
// Overridable Hooks
@@ -948,6 +979,43 @@ class AsmPrinter : public MachineFunctionPass {
}
};
+class AsmPrinterInitializePass
+ : public PassInfoMixin<AsmPrinterInitializePass> {
+ IntrusiveRefCntPtr<AsmPrinter> Printer;
+
+public:
+ AsmPrinterInitializePass(IntrusiveRefCntPtr<AsmPrinter> Printer)
+ : Printer(Printer) {}
+ PreservedAnalyses run(Module &M, ModuleAnalysisManager &MAM) {
+ Printer->doInitialization(M, MAM);
+ return PreservedAnalyses::all();
+ }
+};
+
+class AsmPrinterPass : public PassInfoMixin<AsmPrinterPass> {
+ IntrusiveRefCntPtr<AsmPrinter> Printer;
+
+public:
+ AsmPrinterPass(IntrusiveRefCntPtr<AsmPrinter> Printer) : Printer(Printer) {}
+ PreservedAnalyses run(MachineFunction &MF,
+ MachineFunctionAnalysisManager &MFAM) {
+ Printer->run(MF, MFAM);
+ return PreservedAnalyses::all();
+ }
+};
+
+class AsmPrinterFinalizePass : public PassInfoMixin<AsmPrinterFinalizePass> {
+ IntrusiveRefCntPtr<AsmPrinter> Printer;
+
+public:
+ AsmPrinterFinalizePass(IntrusiveRefCntPtr<AsmPrinter> Printer)
+ : Printer(Printer) {}
+ PreservedAnalyses run(Module &M, ModuleAnalysisManager &MAM) {
+ Printer->doFinalization(M, MAM);
+ return PreservedAnalyses::all();
+ }
+};
+
} // end namespace llvm
#endif // LLVM_CODEGEN_ASMPRINTER_H
diff --git a/llvm/include/llvm/Passes/CodeGenPassBuilder.h b/llvm/include/llvm/Passes/CodeGenPassBuilder.h
index 6ed9ac47405d3..8f774bc30552c 100644
--- a/llvm/include/llvm/Passes/CodeGenPassBuilder.h
+++ b/llvm/include/llvm/Passes/CodeGenPassBuilder.h
@@ -22,6 +22,7 @@
#include "llvm/Analysis/ScopedNoAliasAA.h"
#include "llvm/Analysis/TargetTransformInfo.h"
#include "llvm/Analysis/TypeBasedAliasAnalysis.h"
+#include "llvm/CodeGen/AsmPrinter.h"
#include "llvm/CodeGen/AssignmentTrackingAnalysis.h"
#include "llvm/CodeGen/BranchFoldingPass.h"
#include "llvm/CodeGen/CallBrPrepare.h"
@@ -103,6 +104,8 @@
#include "llvm/IRPrinter/IRPrintingPasses.h"
#include "llvm/MC/MCAsmInfo.h"
#include "llvm/MC/MCTargetOptions.h"
+#include "llvm/MC/TargetRegistry.h"
+#include "llvm/Passes/PassBuilder.h"
#include "llvm/Support/CodeGen.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/Error.h"
@@ -179,8 +182,8 @@ template <typename DerivedT, typename TargetMachineT> class CodeGenPassBuilder {
}
Error buildPipeline(ModulePassManager &MPM, raw_pwrite_stream &Out,
- raw_pwrite_stream *DwoOut,
- CodeGenFileType FileType) const;
+ raw_pwrite_stream *DwoOut, CodeGenFileType FileType,
+ MCContext &Ctx) const;
PassInstrumentationCallbacks *getPassInstrumentationCallbacks() const {
return PIC;
@@ -298,6 +301,7 @@ template <typename DerivedT, typename TargetMachineT> class CodeGenPassBuilder {
TargetMachineT &TM;
CGPassBuilderOption Opt;
PassInstrumentationCallbacks *PIC;
+ mutable IntrusiveRefCntPtr<AsmPrinter> PrinterImpl;
template <typename TMC> TMC &getTM() const { return static_cast<TMC &>(TM); }
CodeGenOptLevel getOptLevel() const { return TM.getOptLevel(); }
@@ -560,7 +564,7 @@ template <typename DerivedT, typename TargetMachineT> class CodeGenPassBuilder {
template <typename Derived, typename TargetMachineT>
Error CodeGenPassBuilder<Derived, TargetMachineT>::buildPipeline(
ModulePassManager &MPM, raw_pwrite_stream &Out, raw_pwrite_stream *DwoOut,
- CodeGenFileType FileType) const {
+ CodeGenFileType FileType, MCContext &Ctx) const {
auto StartStopInfo = TargetPassConfig::getStartStopInfo(*PIC);
if (!StartStopInfo)
return StartStopInfo.takeError();
@@ -569,6 +573,17 @@ Error CodeGenPassBuilder<Derived, TargetMachineT>::buildPipeline(
bool PrintAsm = TargetPassConfig::willCompleteCodeGenPipeline();
bool PrintMIR = !PrintAsm && FileType != CodeGenFileType::Null;
+ if (PrintAsm) {
+ AddIRPass addIRPass(MPM, derived());
+ Expected<std::unique_ptr<MCStreamer>> MCStreamerOrErr =
+ TM.createMCStreamer(Out, DwoOut, FileType, Ctx);
+ if (auto Err = MCStreamerOrErr.takeError())
+ return Err;
+ PrinterImpl =
+ TM.getTarget().createAsmPrinter(TM, std::move(*MCStreamerOrErr));
+ addIRPass(AsmPrinterInitializePass(PrinterImpl));
+ }
+
{
AddIRPass addIRPass(MPM, derived());
addIRPass(RequireAnalysisPass<MachineModuleAnalysis, Module>());
@@ -577,29 +592,35 @@ Error CodeGenPassBuilder<Derived, TargetMachineT>::buildPipeline(
addISelPasses(addIRPass);
}
- AddMachinePass addPass(MPM, derived());
+ // Ensure we destruct `addPass`.
+ {
+ AddMachinePass addPass(MPM, derived());
- if (PrintMIR)
- addPass(PrintMIRPreparePass(Out), /*Force=*/true);
+ if (PrintMIR)
+ addPass(PrintMIRPreparePass(Out), /*Force=*/true);
- if (auto Err = addCoreISelPasses(addPass))
- return std::move(Err);
+ if (auto Err = addCoreISelPasses(addPass))
+ return std::move(Err);
- if (auto Err = derived().addMachinePasses(addPass))
- return std::move(Err);
+ if (auto Err = derived().addMachinePasses(addPass))
+ return std::move(Err);
- if (!Opt.DisableVerify)
- addPass(MachineVerifierPass());
+ if (!Opt.DisableVerify)
+ addPass(MachineVerifierPass());
- if (PrintAsm) {
- derived().addAsmPrinter(
- addPass, [this, &Out, DwoOut, FileType](MCContext &Ctx) {
- return this->TM.createMCStreamer(Out, DwoOut, FileType, Ctx);
- });
+ if (PrintAsm)
+ addPass(AsmPrinterPass(PrinterImpl));
+
+ if (PrintMIR)
+ addPass(PrintMIRPass(Out), /*Force=*/true);
}
- if (PrintMIR)
- addPass(PrintMIRPass(Out), /*Force=*/true);
+ {
+ AddIRPass addIRPass(MPM, derived());
+ addIRPass(AsmPrinterFinalizePass(PrinterImpl));
+ }
+
+ PrinterImpl.reset();
return verifyStartStop(*StartStopInfo);
}
@@ -707,6 +728,10 @@ void CodeGenPassBuilder<Derived, TargetMachineT>::addIRPasses(
addPass(ExpandMemCmpPass(&TM));
}
+ // This should be the last IR module pass.
+ // if (TargetPassConfig::willCompleteCodeGenPipeline())
+ // addPass(AsmPrinterInitializePass(PrinterImpl));
+
// Run GC lowering passes for builtin collectors
// TODO: add a pass insertion point here
addPass(GCLoweringPass());
diff --git a/llvm/include/llvm/Target/TargetMachine.h b/llvm/include/llvm/Target/TargetMachine.h
index 906926729ed74..4ec2c9bc9ce88 100644
--- a/llvm/include/llvm/Target/TargetMachine.h
+++ b/llvm/include/llvm/Target/TargetMachine.h
@@ -476,7 +476,7 @@ class TargetMachine {
virtual Error buildCodeGenPipeline(ModulePassManager &, raw_pwrite_stream &,
raw_pwrite_stream *, CodeGenFileType,
- const CGPassBuilderOption &,
+ const CGPassBuilderOption &, MCContext &,
PassInstrumentationCallbacks *) {
return make_error<StringError>("buildCodeGenPipeline is not overridden",
inconvertibleErrorCode());
diff --git a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
index fdb81b05d9490..ac5687ea34f06 100644
--- a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
@@ -356,6 +356,8 @@ void AddrLabelMapCallbackPtr::allUsesReplacedWith(Value *V2) {
Map->UpdateForRAUWBlock(cast<BasicBlock>(getValPtr()), cast<BasicBlock>(V2));
}
+StringRef AsmPrinter::getPassName() const { return "Assembly Printer"; }
+
/// getGVAlignment - Return the alignment to use for the specified global
/// value. This rounds up to the preferred alignment if possible and legal.
Align AsmPrinter::getGVAlignment(const GlobalObject *GV, const DataLayout &DL,
@@ -450,7 +452,6 @@ const MCSection *AsmPrinter::getCurrentSection() const {
void AsmPrinter::getAnalysisUsage(AnalysisUsage &AU) const {
AU.setPreservesAll();
- MachineFunctionPass::getAnalysisUsage(AU);
AU.addRequired<MachineOptimizationRemarkEmitterPass>();
AU.addRequired<GCModuleInfo>();
AU.addRequired<LazyMachineBlockFrequencyInfoPass>();
@@ -458,8 +459,13 @@ void AsmPrinter::getAnalysisUsage(AnalysisUsage &AU) const {
}
bool AsmPrinter::doInitialization(Module &M) {
- auto *MMIWP = getAnalysisIfAvailable<MachineModuleInfoWrapperPass>();
- MMI = MMIWP ? &MMIWP->getMMI() : nullptr;
+ if (!MAM) {
+ MMI = &MAM->getResult<MachineModuleAnalysis>(M).getMMI();
+ } else {
+ auto *MMIWP = getAnalysisIfAvailable<MachineModuleInfoWrapperPass>();
+ MMI = MMIWP ? &MMIWP->getMMI() : nullptr;
+ }
+
HasSplitStack = false;
HasNoSplitStack = false;
DbgInfoAvailable = !M.debug_compile_units().empty();
@@ -541,11 +547,20 @@ bool AsmPrinter::doInitialization(Module &M) {
OutStreamer->emitXCOFFRenameDirective(XSym, XSym->getSymbolTableName());
}
- GCModuleInfo *MI = getAnalysisIfAvailable<GCModuleInfo>();
- assert(MI && "AsmPrinter didn't require GCModuleInfo?");
- for (const auto &I : *MI)
- if (GCMetadataPrinter *MP = getOrCreateGCPrinter(*I))
- MP->beginAssembly(M, *MI, *this);
+ if (inNewPassManager()) {
+ auto &MI = MAM->getResult<CollectorMetadataAnalysis>(M);
+ for (const auto &[Name, Strategy] : MI)
+ if ([[maybe_unused]] GCMetadataPrinter *MP =
+ getOrCreateGCPrinter(*Strategy)) {
+ // TODO: Let GCMetadataPrinter support new pass manager
+ }
+ } else {
+ GCModuleInfo *MI = getAnalysisIfAvailable<GCModuleInfo>();
+ assert(MI && "AsmPrinter didn't require GCModuleInfo?");
+ for (const auto &I : *MI)
+ if (GCMetadataPrinter *MP = getOrCreateGCPrinter(*I))
+ MP->beginAssembly(M, *MI, *this);
+ }
// Emit module-level inline asm if it exists.
if (!M.getModuleInlineAsm().empty()) {
@@ -1513,14 +1528,24 @@ void AsmPrinter::emitBBAddrMapSection(const MachineFunction &MF) {
OutStreamer->emitULEB128IntValue(
MaybeEntryCount ? MaybeEntryCount->getCount() : 0);
}
- const MachineBlockFrequencyInfo *MBFI =
- Features.BBFreq
- ? &getAnalysis<LazyMachineBlockFrequencyInfoPass>().getBFI()
- : nullptr;
- const MachineBranchProbabilityInfo *MBPI =
- Features.BrProb
- ? &getAnalysis<MachineBranchProbabilityInfoWrapperPass>().getMBPI()
- : nullptr;
+ const MachineBlockFrequencyInfo *MBFI = Features.BBFreq ? [this]() {
+ if (!inNewPassManager()) {
+ auto *Wrapper =
+ getAnalysisIfAvailable<LazyMachineBlockFrequencyInfoPass>();
+ return Wrapper ? &Wrapper->getBFI() : nullptr;
+ }
+ return &MFAM->getResult<MachineBlockFrequencyAnalysis>(*this->MF);
+ }()
+ : nullptr;
+ const MachineBranchProbabilityInfo *MBPI = Features.BrProb ? [this]() {
+ if (!inNewPassManager()) {
+ auto *Wrapper =
+ getAnalysisIfAvailable<MachineBranchProbabilityInfoWrapperPass>();
+ return Wrapper ? &Wrapper->getMBPI() : nullptr;
+ }
+ return &MFAM->getResult<MachineBranchProbabilityAnalysis>(*this->MF);
+ }()
+ : nullptr;
if (Features.BBFreq || Features.BrProb) {
for (const MachineBasicBlock &MBB : MF) {
@@ -1782,21 +1807,31 @@ void AsmPrinter::emitFunctionBody() {
if (isVerbose()) {
// Get MachineDominatorTree or compute it on the fly if it's unavailable
- auto MDTWrapper = getAnalysisIfAvailable<MachineDominatorTreeWrapperPass>();
- MDT = MDTWrapper ? &MDTWrapper->getDomTree() : nullptr;
- if (!MDT) {
- OwnedMDT = std::make_unique<MachineDominatorTree>();
- OwnedMDT->recalculate(*MF);
- MDT = OwnedMDT.get();
+ if (!inNewPassManager()) {
+ auto MDTWrapper =
+ getAnalysisIfAvailable<MachineDominatorTreeWrapperPass>();
+ MDT = MDTWrapper ? &MDTWrapper->getDomTree() : nullptr;
+ if (!MDT) {
+ OwnedMDT = std::make_unique<MachineDominatorTree>();
+ OwnedMDT->recalculate(*MF);
+ MDT = OwnedMDT.get();
+ }
+ } else {
+ MDT = &MFAM->getResult<MachineDominatorTreeAnalysis>(*MF);
}
// Get MachineLoopInfo or compute it on the fly if it's unavailable
- auto *MLIWrapper = getAnalysisIfAvailable<MachineLoopInfoWrapperPass>();
- MLI = MLIWrapper ? &MLIWrapper->getLI() : nullptr;
- if (!MLI) {
- OwnedMLI = std::make_unique<MachineLoopInfo>();
- OwnedMLI->analyze(*MDT);
- MLI = OwnedMLI.get();
+ if (!inNewPassManager()) {
+ auto *MLIWrapper = getAnalysisIfAvailable<MachineLoopInfoWrapperPass>();
+ MLI = MLIWrapper ? &MLIWrapper->getLI() : nullptr;
+ if (!MLI) {
+ OwnedMLI = std::make_unique<MachineLoopInfo>();
+ OwnedMLI->analyze(*MDT);
+ MLI = OwnedMLI.get();
+ }
+ } else {
+ MDT = &MFAM->getResult<MachineDominatorTreeAnalysis>(*MF);
+ MLI = &MFAM->getResult<MachineLoopAnalysis>(*MF);
}
}
@@ -2608,7 +2643,7 @@ bool AsmPrinter::doFinalization(Module &M) {
// text sections come after debug info has been emitted. This matters for
// stack maps as they are arbitrary data, and may even have a custom format
// through user plugins.
- emitStackMaps();
+ emitStackMaps(M);
// Print aliases in topological order, that is, for each alias a = b,
// b must be printed before a.
@@ -2675,11 +2710,20 @@ bool AsmPrinter::doFinalization(Module &M) {
}
}
- GCModuleInfo *MI = getAnalysisIfAvailable<GCModuleInfo>();
- assert(MI && "AsmPrinter didn't require GCModuleInfo?");
- for (GCModuleInfo::iterator I = MI->end(), E = MI->begin(); I != E; )
- if (GCMetadataPrinter *MP = getOrCreateGCPrinter(**--I))
- MP->finishAssembly(M, *MI, *this);
+ if (!MAM) {
+ GCModuleInfo *MI = getAnalysisIfAvailable<GCModuleInfo>();
+ assert(MI && "AsmPrinter didn't require GCModuleInfo?");
+ for (GCModuleInfo::iterator I = MI->end(), E = MI->begin(); I != E;)
+ if (GCMetadataPrinter *MP = getOrCreateGCPrinter(**--I))
+ MP->finishAssembly(M, *MI, *this);
+ } else {
+ auto &MI = MAM->getResult<CollectorMetadataAnalysis>(M);
+ for (auto &[Name, Strategy] : llvm::reverse(MI))
+ if ([[maybe_unused]] GCMetadataPrinter *MP =
+ getOrCreateGCPrinter(*Strategy)) {
+ // TODO: Support new pass manager in GCMetadataPrinter.
+ }
+ }
// Emit llvm.ident metadata in an '.ident' directive.
emitModuleIdents(M);
@@ -2807,7 +2851,10 @@ void AsmPrinter::SetupMachineFunction(MachineFunction &MF) {
CurrentFnSymForSize = CurrentFnBegin;
}
- ORE = &getAnalysis<MachineOptimizationRemarkEmitterPass>().getORE();
+ if (inNewPassManager())
+ ORE = &MFAM->getResult<MachineOptimizationRemarkEmitterAnalysis>(MF);
+ else
+ ORE = &getAnalysis<MachineOptimizationRemarkEmitterPass>().getORE();
}
namespace {
@@ -4489,22 +4536,38 @@ GCMetadataPrinter *AsmPrinter::getOrCreateGCPrinter(GCStrategy &S) {
report_fatal_error("no GCMetadataPrinter registered for GC: " + Twine(Name));
}
-void AsmPrinter::emitStackMaps() {
- GCModuleInfo *MI = getAnalysisIfAvailable<GCModuleInfo>();
- assert(MI && "AsmPrinter didn't require GCModuleInfo?");
+void AsmPrinter::emitStackMaps(Module &M) {
bool NeedsDefault = false;
- if (MI->begin() == MI->end())
- // No GC strategy, use the default format.
- NeedsDefault = true;
- else
- for (const auto &I : *MI) {
- if (GCMetadataPrinter *MP = getOrCreateGCPrinter(*I))
- if (MP->emitStackMaps(SM, *this))
- continue;
- // The strategy doesn't have printer or doesn't emit custom stack maps.
- // Use the default format.
+ if (inNewPassManager()) {
+ auto &Map = MAM->getResult<CollectorMetadataAnalysis>(M);
+ if (Map.empty())
+ // No GC strategy, use the default format.
NeedsDefault = true;
- }
+ else
+ for (const auto &[Name, Strategy] : Map) {
+ if (GCMetadataPrinter *MP = getOrCreateGCPrinter(*Strategy))
+ if (MP->emitStackMaps(SM, *this))
+ continue;
+ // The strategy doesn't have printer or doesn't emit custom stack maps.
+ // Use the default format.
+ NeedsDefault = true;
+ }
+ } else {
+ GCModuleInfo *MI = getAnalysisIfAvailable<GCModuleInfo>();
+ assert(MI && "AsmPrinter didn't require GCModuleInfo?");
+ if (MI->begin() == MI->end())
+ // No GC strategy, use the default format.
+ NeedsDefault = true;
+ else
+ for (const auto &I : *MI) {
+ if (GCMetadataPrinter *MP = getOrCreateGCPrinter(*I))
+ if (MP->emitStackMaps(SM, *this))
+ continue;
+ // The strategy doesn't have printer or doesn't emit custom stack maps.
+ // Use the default format.
+ NeedsDefault = true;
+ }
+ }
if (NeedsDefault)
SM.serializeToStackMapSection();
diff --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp
index 56e91703cb019..20f34218700fe 100644
--- a/llvm/lib/Passes/PassBuilder.cpp
+++ b/llvm/lib/Passes/PassBuilder.cpp
@@ -78,6 +78,7 @@
#include "llvm/Analysis/TargetTransformInfo.h"
#include "llvm/Analysis/TypeBasedAliasAnalysis.h"
#include "llvm/Analysis/UniformityAnalysis.h"
+#include "llvm/CodeGen/AsmPrinter.h"
#include "llvm/CodeGen/AssignmentTrackingAnalysis.h"
#include "llvm/CodeGen/AtomicExpand.h"
#include "llvm/CodeGen/BasicBlockSectionsProfileReader.h"
@@ -531,6 +532,12 @@ PassBuilder::PassBuilder(TargetMachine *TM, PipelineTuningOptions PTO,
PARAMS) \
PIC->addClassToPassName(CLASS, NAME);
#include "llvm/Passes/MachinePassRegistry.def"
+
+ PIC->addClassToPassName(AsmPrinterInitializePass::name(),
+ "asm-printer-initialize");
+ PIC->addClassToPassName(AsmPrinterPass::name(), "asm-printer");
+ PIC->addClassToPassName(AsmPrinterFinalizePass::name(),
+ "asm-printer-finalize");
});
}
}
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp b/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp
index 491314daf2d81..2d12b1af591de 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp
+++ b/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp
@@ -440,9 +440,13 @@ void AMDGPUAsmPrinter::validateMCResourceInfo(Function &F) {
RI.getSymbol(FnSym->getName(), RIK::RIK_NumAGPR, OutContext, IsLocal);
uint64_t NumVgpr, NumAgpr;
- MachineModuleInfo &MMI =
- getAnalysis<MachineModuleInfoWrapperPass>().getMMI();
- MachineFunction *MF = MMI.getMachineFunction(F);
+ MachineFunction *MF =
+ !MAM ? MMI->getMachineFunction(F)
+ : &MAM->getResult<FunctionAnalysisManagerModuleProxy>(
+ *F.getParent())
+ .getManager()
+ .getResult<MachineFunctionAnalysis>(F)
+ .getMF();
if (MF && NumVgprSymbol->isVariable() && NumAgprSymbol->isVariable() &&
TryGetMCExprValue(NumVgprSymbol->getVariableValue(), NumVgpr) &&
TryGetMCExprValue(NumAgprSymbol->getVariableValue(), NumAgpr)) {
@@ -642,7 +646,8 @@ bool AMDGPUAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
if (!IsTargetStreamerInitialized)
initTargetStreamer(*MF.getFunction().getParent());
- ResourceUsage = &getAnalysis<AMDGPUResourceUsageAnalysis>();
+ if (!inNewPassManager())
+ ResourceUsage = &getAnalysis<AMDGPUResourceUsageAnalysis>();
CurrentProgramInfo.reset(MF);
const AMDGPUMachineFunction *MFI = MF.getInfo<AMDGPUMachineFunction>();
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp b/llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp
index ccb251b730f16..fa9c082588d3e 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 "AMDGPUCtorDtorLowering.h"
#include "AMDGPUExportClustering.h"
#include "AMDGPUExportKernelRuntimeHandles.h"
@@ -1080,10 +1081,10 @@ GCNTargetMachine::getTargetTransformInfo(const Function &F) const {
Error GCNTargetMachine::buildCodeGenPipeline(
ModulePassManager &MPM, raw_pwrite_stream &Out, raw_pwrite_stream *DwoOut,
- CodeGenFileType FileType, const CGPassBuilderOption &Opts,
+ CodeGenFileType FileType, const CGPassBuilderOption &Opts, MCContext &Ctx,
PassInstrumentationCallbacks *PIC) {
AMDGPUCodeGenPassBuilder CGPB(*this, Opts, PIC);
- return CGPB.buildPipeline(MPM, Out, DwoOut, FileType);
+ return CGPB.buildPipeline(MPM, Out, DwoOut, FileType, Ctx);
}
ScheduleDAGInstrs *
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.h b/llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.h
index 589123274d0f5..eace957eedb31 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.h
+++ b/llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.h
@@ -101,7 +101,7 @@ class GCNTargetMachine final : public AMDGPUTargetMachine {
Error buildCodeGenPipeline(ModulePassManager &MPM, raw_pwrite_stream &Out,
raw_pwrite_stream *DwoOut,
CodeGenFileType FileType,
- const CGPassBuilderOption &Opts,
+ const CGPassBuilderOption &Opts, MCContext &Ctx,
PassInstrumentationCallbacks *PIC) override;
void registerMachineRegisterInfoCallback(MachineFunction &MF) const override;
diff --git a/llvm/lib/Target/AMDGPU/R600TargetMachine.cpp b/llvm/lib/Target/AMDGPU/R600TargetMachine.cpp
index 2a3b42e9453bd..088954bf73ab4 100644
--- a/llvm/lib/Target/AMDGPU/R600TargetMachine.cpp
+++ b/llvm/lib/Target/AMDGPU/R600TargetMachine.cpp
@@ -16,6 +16,7 @@
#include "R600TargetMachine.h"
#include "R600.h"
+#include "R600AsmPrinter.h"
#include "R600MachineFunctionInfo.h"
#include "R600MachineScheduler.h"
#include "R600TargetTransformInfo.h"
@@ -149,10 +150,10 @@ TargetPassConfig *R600TargetMachine::createPassConfig(PassManagerBase &PM) {
Error R600TargetMachine::buildCodeGenPipeline(
ModulePassManager &MPM, raw_pwrite_stream &Out, raw_pwrite_stream *DwoOut,
- CodeGenFileType FileType, const CGPassBuilderOption &Opts,
+ CodeGenFileType FileType, const CGPassBuilderOption &Opts, MCContext &Ctx,
PassInstrumentationCallbacks *PIC) {
R600CodeGenPassBuilder CGPB(*this, Opts, PIC);
- return CGPB.buildPipeline(MPM, Out, DwoOut, FileType);
+ return CGPB.buildPipeline(MPM, Out, DwoOut, FileType, Ctx);
}
MachineFunctionInfo *R600TargetMachine::createMachineFunctionInfo(
diff --git a/llvm/lib/Target/AMDGPU/R600TargetMachine.h b/llvm/lib/Target/AMDGPU/R600TargetMachine.h
index eb4cb91cb704d..06d5ad46f8461 100644
--- a/llvm/lib/Target/AMDGPU/R600TargetMachine.h
+++ b/llvm/lib/Target/AMDGPU/R600TargetMachine.h
@@ -41,7 +41,7 @@ class R600TargetMachine final : public AMDGPUTargetMachine {
Error buildCodeGenPipeline(ModulePassManager &MPM, raw_pwrite_stream &Out,
raw_pwrite_stream *DwoOut,
CodeGenFileType FileType,
- const CGPassBuilderOption &Opt,
+ const CGPassBuilderOption &Opt, MCContext &Ctx,
PassInstrumentationCallbacks *PIC) override;
const TargetSubtargetInfo *getSubtargetImpl(const Function &) const override;
diff --git a/llvm/lib/Target/NVPTX/NVPTXAsmPrinter.cpp b/llvm/lib/Target/NVPTX/NVPTXAsmPrinter.cpp
index 0e5207cf9b04c..07e122d19db2a 100644
--- a/llvm/lib/Target/NVPTX/NVPTXAsmPrinter.cpp
+++ b/llvm/lib/Target/NVPTX/NVPTXAsmPrinter.cpp
@@ -289,7 +289,12 @@ void NVPTXAsmPrinter::printReturnValStr(const MachineFunction &MF,
// llvm.loop.unroll.disable or llvm.loop.unroll.count=1.
bool NVPTXAsmPrinter::isLoopHeaderOfNoUnroll(
const MachineBasicBlock &MBB) const {
- MachineLoopInfo &LI = getAnalysis<MachineLoopInfoWrapperPass>().getLI();
+ MachineLoopInfo *LIPtr = nullptr;
+ if (inNewPassManager())
+ LIPtr = &MFAM->getResult<MachineLoopAnalysis>(*MF);
+ else
+ LIPtr = &getAnalysis<MachineLoopInfoWrapperPass>().getLI();
+ auto &LI = *LIPtr;
// We insert .pragma "nounroll" only to the loop header.
if (!LI.isLoopHeader(&MBB))
return false;
diff --git a/llvm/lib/Target/X86/CMakeLists.txt b/llvm/lib/Target/X86/CMakeLists.txt
index 6627e97dd0943..3102b1f557ef9 100644
--- a/llvm/lib/Target/X86/CMakeLists.txt
+++ b/llvm/lib/Target/X86/CMakeLists.txt
@@ -105,6 +105,7 @@ add_llvm_target(X86CodeGen ${sources}
IRPrinter
Instrumentation
MC
+ Passes
ProfileData
Scalar
SelectionDAG
diff --git a/llvm/lib/Target/X86/X86CodeGenPassBuilder.cpp b/llvm/lib/Target/X86/X86CodeGenPassBuilder.cpp
index d979517e12af6..14ca33bdbf035 100644
--- a/llvm/lib/Target/X86/X86CodeGenPassBuilder.cpp
+++ b/llvm/lib/Target/X86/X86CodeGenPassBuilder.cpp
@@ -10,9 +10,11 @@
/// TODO: Port CodeGen passes to new pass manager.
//===----------------------------------------------------------------------===//
+#include "X86AsmPrinter.h"
#include "X86ISelDAGToDAG.h"
#include "X86TargetMachine.h"
+#include "llvm/MC/MCCodeEmitter.h"
#include "llvm/MC/MCStreamer.h"
#include "llvm/Passes/CodeGenPassBuilder.h"
#include "llvm/Passes/PassBuilder.h"
@@ -29,7 +31,6 @@ class X86CodeGenPassBuilder
PassInstrumentationCallbacks *PIC)
: CodeGenPassBuilder(TM, Opts, PIC) {}
void addPreISel(AddIRPass &addPass) const;
- void addAsmPrinter(AddMachinePass &, CreateMCStreamer) const;
Error addInstSelector(AddMachinePass &) const;
};
@@ -37,11 +38,6 @@ void X86CodeGenPassBuilder::addPreISel(AddIRPass &addPass) const {
// TODO: Add passes pre instruction selection.
}
-void X86CodeGenPassBuilder::addAsmPrinter(AddMachinePass &addPass,
- CreateMCStreamer) const {
- // TODO: Add AsmPrinter.
-}
-
Error X86CodeGenPassBuilder::addInstSelector(AddMachinePass &addPass) const {
// TODO: Add instruction selector related passes.
addPass(X86ISelDAGToDAGPass(TM));
@@ -57,8 +53,8 @@ void X86TargetMachine::registerPassBuilderCallbacks(PassBuilder &PB) {
Error X86TargetMachine::buildCodeGenPipeline(
ModulePassManager &MPM, raw_pwrite_stream &Out, raw_pwrite_stream *DwoOut,
- CodeGenFileType FileType, const CGPassBuilderOption &Opt,
+ CodeGenFileType FileType, const CGPassBuilderOption &Opt, MCContext &Ctx,
PassInstrumentationCallbacks *PIC) {
auto CGPB = X86CodeGenPassBuilder(*this, Opt, PIC);
- return CGPB.buildPipeline(MPM, Out, DwoOut, FileType);
+ return CGPB.buildPipeline(MPM, Out, DwoOut, FileType, Ctx);
}
diff --git a/llvm/lib/Target/X86/X86MCInstLower.cpp b/llvm/lib/Target/X86/X86MCInstLower.cpp
index 165bcb0ba9647..7323b6edd2bd0 100644
--- a/llvm/lib/Target/X86/X86MCInstLower.cpp
+++ b/llvm/lib/Target/X86/X86MCInstLower.cpp
@@ -2498,8 +2498,12 @@ void X86AsmPrinter::emitInstruction(const MachineInstr *MI) {
// taken) are used as branch hints. Here we add branch taken prefix for
// jump instruction with higher probability than threshold.
if (getSubtarget().hasBranchHint() && EnableBranchHint) {
- const MachineBranchProbabilityInfo *MBPI =
- &getAnalysis<MachineBranchProbabilityInfoWrapperPass>().getMBPI();
+ const MachineBranchProbabilityInfo *MBPI = nullptr;
+ if (inNewPassManager())
+ MBPI = &MFAM->getResult<MachineBranchProbabilityAnalysis>(*MF);
+ else
+ MBPI =
+ &getAnalysis<MachineBranchProbabilityInfoWrapperPass>().getMBPI();
MachineBasicBlock *DestBB = MI->getOperand(0).getMBB();
BranchProbability EdgeProb =
MBPI->getEdgeProbability(MI->getParent(), DestBB);
diff --git a/llvm/lib/Target/X86/X86TargetMachine.h b/llvm/lib/Target/X86/X86TargetMachine.h
index ced0a9c71fdd8..4235e9415f4a4 100644
--- a/llvm/lib/Target/X86/X86TargetMachine.h
+++ b/llvm/lib/Target/X86/X86TargetMachine.h
@@ -73,8 +73,8 @@ class X86TargetMachine final : public CodeGenTargetMachineImpl {
Error buildCodeGenPipeline(ModulePassManager &, raw_pwrite_stream &,
raw_pwrite_stream *, CodeGenFileType,
- const CGPassBuilderOption &,
- PassInstrumentationCallbacks *) override;
+ const CGPassBuilderOption &, MCContext &,
+ PassInstrumentationCallbacks *PIC) override;
bool isJIT() const { return IsJIT; }
diff --git a/llvm/tools/llc/NewPMDriver.cpp b/llvm/tools/llc/NewPMDriver.cpp
index fa82689ecf9ae..7dd9a583fbe95 100644
--- a/llvm/tools/llc/NewPMDriver.cpp
+++ b/llvm/tools/llc/NewPMDriver.cpp
@@ -154,8 +154,9 @@ int llvm::compileModuleWithNewPM(
MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM)));
} else {
- ExitOnErr(Target->buildCodeGenPipeline(
- MPM, *OS, DwoOut ? &DwoOut->os() : nullptr, FileType, Opt, &PIC));
+ ExitOnErr(
+ Target->buildCodeGenPipeline(MPM, *OS, DwoOut ? &DwoOut->os() : nullptr,
+ FileType, Opt, MMI.getContext(), &PIC));
}
// If user only wants to print the pipeline, print it before parsing the MIR.
>From a10871510c3ed2d41e7ebc31cc5bf51388769227 Mon Sep 17 00:00:00 2001
From: PaperChalice <liujunchang97 at outlook.com>
Date: Thu, 15 May 2025 17:40:20 +0800
Subject: [PATCH 2/2] use inNewPassManager in more places
---
llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
index ac5687ea34f06..3b4547e3d2375 100644
--- a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
@@ -459,7 +459,7 @@ void AsmPrinter::getAnalysisUsage(AnalysisUsage &AU) const {
}
bool AsmPrinter::doInitialization(Module &M) {
- if (!MAM) {
+ if (inNewPassManager()) {
MMI = &MAM->getResult<MachineModuleAnalysis>(M).getMMI();
} else {
auto *MMIWP = getAnalysisIfAvailable<MachineModuleInfoWrapperPass>();
@@ -2710,7 +2710,7 @@ bool AsmPrinter::doFinalization(Module &M) {
}
}
- if (!MAM) {
+ if (!inNewPassManager()) {
GCModuleInfo *MI = getAnalysisIfAvailable<GCModuleInfo>();
assert(MI && "AsmPrinter didn't require GCModuleInfo?");
for (GCModuleInfo::iterator I = MI->end(), E = MI->begin(); I != E;)
More information about the llvm-commits
mailing list