[llvm] [X86][NewPM] Port X86FixupLEAs to NPM (PR #173744)
Aiden Grossman via llvm-commits
llvm-commits at lists.llvm.org
Wed Dec 31 10:37:14 PST 2025
https://github.com/boomanaiden154 updated https://github.com/llvm/llvm-project/pull/173744
>From 9d90e1a403fab01b17a0b14ed401070320c34929 Mon Sep 17 00:00:00 2001
From: Aiden Grossman <aidengrossman at google.com>
Date: Sat, 27 Dec 2025 22:31:51 +0000
Subject: [PATCH 1/4] =?UTF-8?q?[=F0=9D=98=80=F0=9D=97=BD=F0=9D=97=BF]=20ch?=
=?UTF-8?q?anges=20to=20main=20this=20commit=20is=20based=20on?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Created using spr 1.3.7
[skip ci]
---
llvm/include/llvm/CodeGen/AsmPrinter.h | 64 ++++++++++++-
llvm/include/llvm/Passes/CodeGenPassBuilder.h | 15 +--
llvm/include/llvm/Target/TargetMachine.h | 2 +-
llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp | 96 +++++++++++--------
.../lib/Target/AMDGPU/AMDGPUTargetMachine.cpp | 4 +-
llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.h | 2 +-
llvm/lib/Target/AMDGPU/R600TargetMachine.cpp | 4 +-
llvm/lib/Target/AMDGPU/R600TargetMachine.h | 2 +-
llvm/lib/Target/X86/X86AsmPrinter.cpp | 20 +++-
llvm/lib/Target/X86/X86AsmPrinter.h | 38 +++++++-
llvm/lib/Target/X86/X86CodeGenPassBuilder.cpp | 18 +++-
llvm/lib/Target/X86/X86TargetMachine.h | 2 +-
.../X86/align-basic-block-sections.mir | 1 +
.../X86/basic-block-sections-mir-parse.mir | 1 +
llvm/tools/llc/NewPMDriver.cpp | 5 +-
15 files changed, 204 insertions(+), 70 deletions(-)
diff --git a/llvm/include/llvm/CodeGen/AsmPrinter.h b/llvm/include/llvm/CodeGen/AsmPrinter.h
index 7f99e81e7d1a0..c3dd985a1de8c 100644
--- a/llvm/include/llvm/CodeGen/AsmPrinter.h
+++ b/llvm/include/llvm/CodeGen/AsmPrinter.h
@@ -23,10 +23,19 @@
#include "llvm/Analysis/StaticDataProfileInfo.h"
#include "llvm/BinaryFormat/Dwarf.h"
#include "llvm/CodeGen/DwarfStringPoolEntry.h"
+#include "llvm/CodeGen/MachineDominators.h"
+#include "llvm/CodeGen/MachineFunctionAnalysis.h"
#include "llvm/CodeGen/MachineFunctionPass.h"
+#include "llvm/CodeGen/MachineLoopInfo.h"
+#include "llvm/CodeGen/MachineModuleInfo.h"
+#include "llvm/CodeGen/MachineOptimizationRemarkEmitter.h"
+#include "llvm/CodeGen/MachinePassManager.h"
#include "llvm/CodeGen/StackMaps.h"
#include "llvm/DebugInfo/CodeView/CodeView.h"
+#include "llvm/IR/Analysis.h"
#include "llvm/IR/InlineAsm.h"
+#include "llvm/IR/Module.h"
+#include "llvm/IR/PassManager.h"
#include "llvm/Support/Compiler.h"
#include "llvm/Support/ErrorHandling.h"
#include <cstdint>
@@ -169,6 +178,16 @@ class LLVM_ABI AsmPrinter : public MachineFunctionPass {
Debug = 2 ///< Emit .debug_frame
};
+ // Callbacks to get analyses to allow portability between the new and legacy
+ // pass managers.
+ std::function<MachineModuleInfo *()> GetMMI;
+ std::function<MachineOptimizationRemarkEmitter *(MachineFunction &)> GetORE;
+ std::function<MachineDominatorTree *(MachineFunction &)> GetMDT;
+ std::function<MachineLoopInfo *(MachineFunction &)> GetMLI;
+ std::function<void(Module &)> BeginGCAssembly;
+ std::function<void(Module &)> FinishGCAssembly;
+ std::function<void(Module &)> EmitStackMaps;
+
private:
MCSymbol *CurrentFnEnd = nullptr;
@@ -578,9 +597,6 @@ class LLVM_ABI AsmPrinter : public MachineFunctionPass {
/// emit the proxies we previously omitted in EmitGlobalVariable.
void emitGlobalGOTEquivs();
- /// Emit the stack maps.
- void emitStackMaps();
-
//===------------------------------------------------------------------===//
// Overridable Hooks
//===------------------------------------------------------------------===//
@@ -989,6 +1005,48 @@ class LLVM_ABI AsmPrinter : public MachineFunctionPass {
}
};
+inline MachineFunctionAnalysisManager &
+getMFAM(Module &M, ModuleAnalysisManager &MAM, MachineFunction &MF) {
+ FunctionAnalysisManager &FAM =
+ MAM.getResult<FunctionAnalysisManagerModuleProxy>(M).getManager();
+ MachineFunctionAnalysisManager &MFAM =
+ FAM.getResult<MachineFunctionAnalysisManagerFunctionProxy>(
+ MF.getFunction())
+ .getManager();
+ return MFAM;
+}
+
+template <typename AsmPrinterT>
+PreservedAnalyses runOnModuleNewPM(Module &M, ModuleAnalysisManager &MAM,
+ AsmPrinterT &AsmPrinter) {
+ AsmPrinter.GetMMI = [&MAM, &M]() {
+ return &MAM.getResult<MachineModuleAnalysis>(M).getMMI();
+ };
+ AsmPrinter.GetORE = [&MAM, &M](MachineFunction &MF) {
+ return &getMFAM(M, MAM, MF)
+ .getResult<MachineOptimizationRemarkEmitterAnalysis>(MF);
+ };
+ AsmPrinter.GetMDT = [&MAM, &M](MachineFunction &MF) {
+ return &getMFAM(M, MAM, MF).getResult<MachineDominatorTreeAnalysis>(MF);
+ };
+ AsmPrinter.GetMLI = [&MAM, &M](MachineFunction &MF) {
+ return &getMFAM(M, MAM, MF).getResult<MachineLoopAnalysis>(MF);
+ };
+ // TODO(boomanaiden154): Get GC working with the new pass manager.
+ AsmPrinter.BeginGCAssembly = [](Module &M) {};
+ AsmPrinter.FinishGCAssembly = [](Module &M) {};
+ AsmPrinter.EmitStackMaps = [](Module &M) {};
+ AsmPrinter.doInitialization(M);
+ FunctionAnalysisManager &FAM =
+ MAM.getResult<FunctionAnalysisManagerModuleProxy>(M).getManager();
+ for (Function &F : M) {
+ MachineFunction &MF = FAM.getResult<MachineFunctionAnalysis>(F).getMF();
+ AsmPrinter.runOnMachineFunction(MF);
+ }
+ AsmPrinter.doFinalization(M);
+ 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 2cdf5262fabde..869d673079b78 100644
--- a/llvm/include/llvm/Passes/CodeGenPassBuilder.h
+++ b/llvm/include/llvm/Passes/CodeGenPassBuilder.h
@@ -164,6 +164,9 @@ class PassManagerWrapper {
friend class CodeGenPassBuilder;
};
+using CreateMCStreamer =
+ std::function<Expected<std::unique_ptr<MCStreamer>>(TargetMachine &)>;
+
/// This class provides access to building LLVM's passes.
///
/// Its members provide the baseline state available to passes during their
@@ -196,8 +199,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;
@@ -485,8 +488,6 @@ template <typename DerivedT, typename TargetMachineT> class CodeGenPassBuilder {
/// Add standard basic block placement passes.
void addBlockPlacement(PassManagerWrapper &PMW) const;
- using CreateMCStreamer =
- std::function<Expected<std::unique_ptr<MCStreamer>>(MCContext &)>;
void addAsmPrinter(PassManagerWrapper &PMW, CreateMCStreamer) const {
llvm_unreachable("addAsmPrinter is not overridden");
}
@@ -560,7 +561,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();
@@ -596,8 +597,8 @@ Error CodeGenPassBuilder<Derived, TargetMachineT>::buildPipeline(
if (PrintAsm) {
derived().addAsmPrinter(
- PMW, [this, &Out, DwoOut, FileType](MCContext &Ctx) {
- return this->TM.createMCStreamer(Out, DwoOut, FileType, Ctx);
+ PMW, [&Out, DwoOut, FileType, &Ctx](TargetMachine &TM) {
+ return TM.createMCStreamer(Out, DwoOut, FileType, Ctx);
});
}
diff --git a/llvm/include/llvm/Target/TargetMachine.h b/llvm/include/llvm/Target/TargetMachine.h
index d0fd483a8ddaa..66d7c3b7134ff 100644
--- a/llvm/include/llvm/Target/TargetMachine.h
+++ b/llvm/include/llvm/Target/TargetMachine.h
@@ -487,7 +487,7 @@ class LLVM_ABI 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 4d2992456f6f8..2bb72c88cbe98 100644
--- a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
@@ -419,6 +419,56 @@ AsmPrinter::AsmPrinter(TargetMachine &tm, std::unique_ptr<MCStreamer> Streamer,
VerboseAsm = OutStreamer->isVerboseAsm();
DwarfUsesRelocationsAcrossSections =
MAI->doesDwarfUseRelocationsAcrossSections();
+ GetMMI = [this]() {
+ auto *MMIWP = getAnalysisIfAvailable<MachineModuleInfoWrapperPass>();
+ return MMIWP ? &MMIWP->getMMI() : nullptr;
+ };
+ GetORE = [this](MachineFunction &MF) {
+ return &getAnalysis<MachineOptimizationRemarkEmitterPass>().getORE();
+ };
+ GetMDT = [this](MachineFunction &MF) {
+ auto *MDTWrapper =
+ getAnalysisIfAvailable<MachineDominatorTreeWrapperPass>();
+ return MDTWrapper ? &MDTWrapper->getDomTree() : nullptr;
+ };
+ GetMLI = [this](MachineFunction &MF) {
+ auto *MLIWrapper = getAnalysisIfAvailable<MachineLoopInfoWrapperPass>();
+ return MLIWrapper ? &MLIWrapper->getLI() : nullptr;
+ };
+ BeginGCAssembly = [this](Module &M) {
+ 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);
+ };
+ FinishGCAssembly = [this](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);
+ };
+ EmitStackMaps = [this](Module &M) {
+ GCModuleInfo *MI = getAnalysisIfAvailable<GCModuleInfo>();
+ assert(MI && "AsmPrinter didn't require GCModuleInfo?");
+ 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.
+ NeedsDefault = true;
+ }
+
+ if (NeedsDefault)
+ SM.serializeToStackMapSection();
+ };
}
AsmPrinter::~AsmPrinter() {
@@ -490,8 +540,7 @@ void AsmPrinter::getAnalysisUsage(AnalysisUsage &AU) const {
}
bool AsmPrinter::doInitialization(Module &M) {
- auto *MMIWP = getAnalysisIfAvailable<MachineModuleInfoWrapperPass>();
- MMI = MMIWP ? &MMIWP->getMMI() : nullptr;
+ MMI = GetMMI();
HasSplitStack = false;
HasNoSplitStack = false;
DbgInfoAvailable = !M.debug_compile_units().empty();
@@ -571,11 +620,7 @@ 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);
+ BeginGCAssembly(M);
// Emit module-level inline asm if it exists.
if (!M.getModuleInlineAsm().empty()) {
@@ -1968,8 +2013,7 @@ 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;
+ MDT = GetMDT(*MF);
if (!MDT) {
OwnedMDT = std::make_unique<MachineDominatorTree>();
OwnedMDT->recalculate(*MF);
@@ -1977,8 +2021,7 @@ void AsmPrinter::emitFunctionBody() {
}
// Get MachineLoopInfo or compute it on the fly if it's unavailable
- auto *MLIWrapper = getAnalysisIfAvailable<MachineLoopInfoWrapperPass>();
- MLI = MLIWrapper ? &MLIWrapper->getLI() : nullptr;
+ MLI = GetMLI(*MF);
if (!MLI) {
OwnedMLI = std::make_unique<MachineLoopInfo>();
OwnedMLI->analyze(*MDT);
@@ -2832,7 +2875,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.
@@ -2899,11 +2942,7 @@ 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);
+ FinishGCAssembly(M);
// Emit llvm.ident metadata in an '.ident' directive.
emitModuleIdents(M);
@@ -3043,7 +3082,7 @@ void AsmPrinter::SetupMachineFunction(MachineFunction &MF) {
CurrentFnSymForSize = CurrentFnBegin;
}
- ORE = &getAnalysis<MachineOptimizationRemarkEmitterPass>().getORE();
+ ORE = GetORE(MF);
}
namespace {
@@ -4734,27 +4773,6 @@ 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?");
- 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.
- NeedsDefault = true;
- }
-
- if (NeedsDefault)
- SM.serializeToStackMapSection();
-}
-
void AsmPrinter::addAsmPrinterHandler(
std::unique_ptr<AsmPrinterHandler> Handler) {
Handlers.insert(Handlers.begin(), std::move(Handler));
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp b/llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp
index 309e92a2ee88e..d14c096b9d209 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp
+++ b/llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp
@@ -1160,10 +1160,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 06a3047196b8a..362899bd260eb 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.h
+++ b/llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.h
@@ -100,7 +100,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 47719673a840c..fecf32942bddd 100644
--- a/llvm/lib/Target/AMDGPU/R600TargetMachine.cpp
+++ b/llvm/lib/Target/AMDGPU/R600TargetMachine.cpp
@@ -164,10 +164,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 7985ef136cead..7a240cde5363f 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/X86/X86AsmPrinter.cpp b/llvm/lib/Target/X86/X86AsmPrinter.cpp
index 84b921222a116..9025e9afdb6ef 100644
--- a/llvm/lib/Target/X86/X86AsmPrinter.cpp
+++ b/llvm/lib/Target/X86/X86AsmPrinter.cpp
@@ -55,7 +55,19 @@ using namespace llvm;
X86AsmPrinter::X86AsmPrinter(TargetMachine &TM,
std::unique_ptr<MCStreamer> Streamer)
- : AsmPrinter(TM, std::move(Streamer), ID), FM(*this) {}
+ : AsmPrinter(TM, std::move(Streamer), ID), FM(*this) {
+ GetPSI = [this](Module &M) -> ProfileSummaryInfo * {
+ if (auto *PSIW = getAnalysisIfAvailable<ProfileSummaryInfoWrapperPass>())
+ return &PSIW->getPSI();
+ return nullptr;
+ };
+ GetSDPI = [this](Module &M) -> StaticDataProfileInfo * {
+ if (auto *SDPIW =
+ getAnalysisIfAvailable<StaticDataProfileInfoWrapperPass>())
+ return &SDPIW->getStaticDataProfileInfo();
+ return nullptr;
+ };
+}
//===----------------------------------------------------------------------===//
// Primitive Helper Functions.
@@ -64,10 +76,8 @@ X86AsmPrinter::X86AsmPrinter(TargetMachine &TM,
/// runOnMachineFunction - Emit the function body.
///
bool X86AsmPrinter::runOnMachineFunction(MachineFunction &MF) {
- if (auto *PSIW = getAnalysisIfAvailable<ProfileSummaryInfoWrapperPass>())
- PSI = &PSIW->getPSI();
- if (auto *SDPIW = getAnalysisIfAvailable<StaticDataProfileInfoWrapperPass>())
- SDPI = &SDPIW->getStaticDataProfileInfo();
+ PSI = GetPSI(*MF.getFunction().getParent());
+ SDPI = GetSDPI(*MF.getFunction().getParent());
Subtarget = &MF.getSubtarget<X86Subtarget>();
diff --git a/llvm/lib/Target/X86/X86AsmPrinter.h b/llvm/lib/Target/X86/X86AsmPrinter.h
index e02b5562d3b5e..2637409ebfb17 100644
--- a/llvm/lib/Target/X86/X86AsmPrinter.h
+++ b/llvm/lib/Target/X86/X86AsmPrinter.h
@@ -9,9 +9,22 @@
#ifndef LLVM_LIB_TARGET_X86_X86ASMPRINTER_H
#define LLVM_LIB_TARGET_X86_X86ASMPRINTER_H
+#include "X86TargetMachine.h"
+#include "llvm/Analysis/ProfileSummaryInfo.h"
+#include "llvm/Analysis/StaticDataProfileInfo.h"
#include "llvm/CodeGen/AsmPrinter.h"
#include "llvm/CodeGen/FaultMaps.h"
+#include "llvm/CodeGen/MachineDominators.h"
+#include "llvm/CodeGen/MachineFunctionAnalysis.h"
+#include "llvm/CodeGen/MachineLoopInfo.h"
+#include "llvm/CodeGen/MachineModuleInfo.h"
+#include "llvm/CodeGen/MachineOptimizationRemarkEmitter.h"
+#include "llvm/CodeGen/MachinePassManager.h"
#include "llvm/CodeGen/StackMaps.h"
+#include "llvm/IR/Module.h"
+#include "llvm/IR/PassManager.h"
+#include "llvm/MC/MCCodeEmitter.h"
+#include "llvm/Passes/CodeGenPassBuilder.h"
// Implemented in X86MCInstLower.cpp
namespace {
@@ -19,7 +32,6 @@ namespace {
}
namespace llvm {
-class MCCodeEmitter;
class MCStreamer;
class X86Subtarget;
class TargetMachine;
@@ -194,6 +206,30 @@ class LLVM_LIBRARY_VISIBILITY X86AsmPrinter : public AsmPrinter {
bool shouldEmitWeakSwiftAsyncExtendedFramePointerFlags() const override {
return ShouldEmitWeakSwiftAsyncExtendedFramePointerFlags;
}
+
+ std::function<ProfileSummaryInfo *(Module &)> GetPSI;
+ std::function<StaticDataProfileInfo *(Module &)> GetSDPI;
+};
+
+class X86AsmPrinterPass : public PassInfoMixin<X86AsmPrinterPass> {
+public:
+ X86AsmPrinterPass(TargetMachine &TM, CreateMCStreamer CreateAsmStreamer)
+ : TM(TM), CreateAsmStreamer(CreateAsmStreamer) {};
+
+ PreservedAnalyses run(Module &M, ModuleAnalysisManager &MAM) {
+ std::unique_ptr<MCStreamer> AsmStreamer = cantFail(CreateAsmStreamer(TM));
+ X86AsmPrinter AsmPrinter(TM, std::move(AsmStreamer));
+ AsmPrinter.GetPSI = [&MAM](Module &M) {
+ return &MAM.getResult<ProfileSummaryAnalysis>(M);
+ };
+ // TODO(boomanaiden154): Port the SDPI analysis to the new pass manager.
+ AsmPrinter.GetSDPI = [](Module &M) { return nullptr; };
+ return runOnModuleNewPM(M, MAM, AsmPrinter);
+ }
+
+private:
+ TargetMachine &TM;
+ CreateMCStreamer CreateAsmStreamer;
};
} // end namespace llvm
diff --git a/llvm/lib/Target/X86/X86CodeGenPassBuilder.cpp b/llvm/lib/Target/X86/X86CodeGenPassBuilder.cpp
index a82ea07f5e013..2745eb592b95b 100644
--- a/llvm/lib/Target/X86/X86CodeGenPassBuilder.cpp
+++ b/llvm/lib/Target/X86/X86CodeGenPassBuilder.cpp
@@ -11,9 +11,12 @@
//===----------------------------------------------------------------------===//
#include "X86.h"
+#include "X86AsmPrinter.h"
#include "X86ISelDAGToDAG.h"
#include "X86TargetMachine.h"
+#include "llvm/CodeGen/MachineModuleInfo.h"
+#include "llvm/MC/MCContext.h"
#include "llvm/MC/MCStreamer.h"
#include "llvm/Passes/CodeGenPassBuilder.h"
#include "llvm/Passes/PassBuilder.h"
@@ -39,9 +42,10 @@ void X86CodeGenPassBuilder::addPreISel(PassManagerWrapper &PMW) const {
// TODO: Add passes pre instruction selection.
}
-void X86CodeGenPassBuilder::addAsmPrinter(PassManagerWrapper &PMW,
- CreateMCStreamer) const {
- // TODO: Add AsmPrinter.
+void X86CodeGenPassBuilder::addAsmPrinter(
+ PassManagerWrapper &PMW, CreateMCStreamer CreateAsmStreamer) const {
+ flushFPMsToMPM(PMW);
+ addModulePass(X86AsmPrinterPass(TM, CreateAsmStreamer), PMW);
}
Error X86CodeGenPassBuilder::addInstSelector(PassManagerWrapper &PMW) const {
@@ -59,12 +63,16 @@ void X86CodeGenPassBuilder::addPreSched2(PassManagerWrapper &PMW) const {
void X86TargetMachine::registerPassBuilderCallbacks(PassBuilder &PB) {
#define GET_PASS_REGISTRY "X86PassRegistry.def"
#include "llvm/Passes/TargetPassRegistry.inc"
+ // TODO(boomanaiden154): Move this into the subclass once all targets that
+ // currently implement it have a ported asm-printer pass.
+ if (PIC)
+ PIC->addClassToPassName(X86AsmPrinterPass::name(), "x86-asm-printer");
}
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/X86TargetMachine.h b/llvm/lib/Target/X86/X86TargetMachine.h
index ced0a9c71fdd8..e2f3fbb5d1ebd 100644
--- a/llvm/lib/Target/X86/X86TargetMachine.h
+++ b/llvm/lib/Target/X86/X86TargetMachine.h
@@ -73,7 +73,7 @@ class X86TargetMachine final : public CodeGenTargetMachineImpl {
Error buildCodeGenPipeline(ModulePassManager &, raw_pwrite_stream &,
raw_pwrite_stream *, CodeGenFileType,
- const CGPassBuilderOption &,
+ const CGPassBuilderOption &, MCContext &,
PassInstrumentationCallbacks *) override;
bool isJIT() const { return IsJIT; }
diff --git a/llvm/test/CodeGen/X86/align-basic-block-sections.mir b/llvm/test/CodeGen/X86/align-basic-block-sections.mir
index 1bf39ec39b2a0..20d04f69afe6a 100644
--- a/llvm/test/CodeGen/X86/align-basic-block-sections.mir
+++ b/llvm/test/CodeGen/X86/align-basic-block-sections.mir
@@ -1,5 +1,6 @@
# Check if the alignment directive is put on the correct place when the basic block section option is used.
# RUN: llc -mtriple x86_64-unknown-linux-gnu -start-before=x86-asm-printer %s -o - | FileCheck %s -check-prefix=CHECK
+# RUN: llc -mtriple x86_64-unknown-linux-gnu -enable-new-pm -start-before=x86-asm-printer %s -o - | FileCheck %s -check-prefix=CHECK
# How to generate the input:
# foo.c
diff --git a/llvm/test/CodeGen/X86/basic-block-sections-mir-parse.mir b/llvm/test/CodeGen/X86/basic-block-sections-mir-parse.mir
index b71ccc5eb89d2..a720b51d93f26 100644
--- a/llvm/test/CodeGen/X86/basic-block-sections-mir-parse.mir
+++ b/llvm/test/CodeGen/X86/basic-block-sections-mir-parse.mir
@@ -1,5 +1,6 @@
# Start after bbsections0-prepare and check if the right code is generated.
# RUN: llc -mtriple x86_64-unknown-linux-gnu -start-before=x86-asm-printer %s -o - | FileCheck %s -check-prefix=CHECK
+# RUN: llc -mtriple x86_64-unknown-linux-gnu -enable-new-pm -start-before=x86-asm-printer %s -o /tmp/test.s
# How to generate the input:
diff --git a/llvm/tools/llc/NewPMDriver.cpp b/llvm/tools/llc/NewPMDriver.cpp
index ebb478992326c..fe5e762e36dcf 100644
--- a/llvm/tools/llc/NewPMDriver.cpp
+++ b/llvm/tools/llc/NewPMDriver.cpp
@@ -173,8 +173,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 e020d402b58fbb19139517659085069d1be23325 Mon Sep 17 00:00:00 2001
From: Aiden Grossman <aidengrossman at google.com>
Date: Sat, 27 Dec 2025 22:37:38 +0000
Subject: [PATCH 2/4] =?UTF-8?q?[=F0=9D=98=80=F0=9D=97=BD=F0=9D=97=BF]=20ch?=
=?UTF-8?q?anges=20introduced=20through=20rebase?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Created using spr 1.3.7
[skip ci]
---
llvm/test/CodeGen/X86/basic-block-sections-mir-parse.mir | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/llvm/test/CodeGen/X86/basic-block-sections-mir-parse.mir b/llvm/test/CodeGen/X86/basic-block-sections-mir-parse.mir
index a720b51d93f26..9ced404f21e85 100644
--- a/llvm/test/CodeGen/X86/basic-block-sections-mir-parse.mir
+++ b/llvm/test/CodeGen/X86/basic-block-sections-mir-parse.mir
@@ -1,6 +1,6 @@
# Start after bbsections0-prepare and check if the right code is generated.
# RUN: llc -mtriple x86_64-unknown-linux-gnu -start-before=x86-asm-printer %s -o - | FileCheck %s -check-prefix=CHECK
-# RUN: llc -mtriple x86_64-unknown-linux-gnu -enable-new-pm -start-before=x86-asm-printer %s -o /tmp/test.s
+# RUN: llc -mtriple x86_64-unknown-linux-gnu -enable-new-pm -start-before=x86-asm-printer %s -o - | FileCheck %s -check-prefix=CHECK
# How to generate the input:
>From a27090769e8579b7fd7d58a7de4a3be15cf3b8e3 Mon Sep 17 00:00:00 2001
From: Aiden Grossman <aidengrossman at google.com>
Date: Sat, 27 Dec 2025 23:27:24 +0000
Subject: [PATCH 3/4] fix
Created using spr 1.3.7
---
llvm/test/DebugInfo/MIR/InstrRef/x86-lea-fixup-2.mir | 2 +-
llvm/test/DebugInfo/MIR/InstrRef/x86-lea-fixup.mir | 6 +++---
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/llvm/test/DebugInfo/MIR/InstrRef/x86-lea-fixup-2.mir b/llvm/test/DebugInfo/MIR/InstrRef/x86-lea-fixup-2.mir
index 5e088d3f46007..828c4cafca9b3 100644
--- a/llvm/test/DebugInfo/MIR/InstrRef/x86-lea-fixup-2.mir
+++ b/llvm/test/DebugInfo/MIR/InstrRef/x86-lea-fixup-2.mir
@@ -1,4 +1,4 @@
-# RUN: llc -run-pass x86-fixup-LEAs -mtriple=i386 -verify-machineinstrs -mcpu=corei7-avx -o - %s | FileCheck %s
+# RUN: llc -run-pass x86-fixup-leas -mtriple=i386 -verify-machineinstrs -mcpu=corei7-avx -o - %s | FileCheck %s
#
# Test that several LEA => ADD transforms get substitutions applied to them,
# for corner cases that we can only hit with -mtriple=i386.
diff --git a/llvm/test/DebugInfo/MIR/InstrRef/x86-lea-fixup.mir b/llvm/test/DebugInfo/MIR/InstrRef/x86-lea-fixup.mir
index 2e28804682ba9..cf06fd4ee2bdc 100644
--- a/llvm/test/DebugInfo/MIR/InstrRef/x86-lea-fixup.mir
+++ b/llvm/test/DebugInfo/MIR/InstrRef/x86-lea-fixup.mir
@@ -1,6 +1,6 @@
-# RUN: llc -run-pass x86-fixup-LEAs -mtriple=x86_64-gnu-unknown -verify-machineinstrs -mcpu=corei7-avx -o - %s | FileCheck %s --check-prefixes=COREI7,CHECK
-# RUN: llc -run-pass x86-fixup-LEAs -mtriple=x86_64-gnu-unknown -verify-machineinstrs -mcpu=haswell -o - %s | FileCheck %s --check-prefixes=HASWELL,CHECK
-# RUN: llc -run-pass x86-fixup-LEAs -mtriple=x86_64-unknown-unknown -verify-machineinstrs -mcpu=atom -o - %s | FileCheck %s --check-prefixes=ATOM,CHECK
+# RUN: llc -run-pass x86-fixup-leas -mtriple=x86_64-gnu-unknown -verify-machineinstrs -mcpu=corei7-avx -o - %s | FileCheck %s --check-prefixes=COREI7,CHECK
+# RUN: llc -run-pass x86-fixup-leas -mtriple=x86_64-gnu-unknown -verify-machineinstrs -mcpu=haswell -o - %s | FileCheck %s --check-prefixes=HASWELL,CHECK
+# RUN: llc -run-pass x86-fixup-leas -mtriple=x86_64-unknown-unknown -verify-machineinstrs -mcpu=atom -o - %s | FileCheck %s --check-prefixes=ATOM,CHECK
#
# Test several LEA <=> ADD transformations that the fixup-leas pass performs,
# and check that any debug-instr-number attached to the original instruction
>From dd4083a92d24a37a38f3e4276c38fc7d79025a26 Mon Sep 17 00:00:00 2001
From: Aiden Grossman <aidengrossman at google.com>
Date: Sun, 28 Dec 2025 03:19:13 +0000
Subject: [PATCH 4/4] fix
Created using spr 1.3.7
---
llvm/lib/Target/X86/X86FixupLEAs.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/llvm/lib/Target/X86/X86FixupLEAs.cpp b/llvm/lib/Target/X86/X86FixupLEAs.cpp
index d13be9d3e6c8c..6bc8dc8b83145 100644
--- a/llvm/lib/Target/X86/X86FixupLEAs.cpp
+++ b/llvm/lib/Target/X86/X86FixupLEAs.cpp
@@ -943,7 +943,7 @@ PreservedAnalyses X86FixupLEAsPass::run(MachineFunction &MF,
bool Changed = PassImpl.runOnMachineFunction(MF);
if (!Changed)
return PreservedAnalyses::all();
- PreservedAnalyses PA = PreservedAnalyses::none();
+ PreservedAnalyses PA = getMachineFunctionPassPreservedAnalyses();
PA.preserveSet<CFGAnalyses>();
return PA;
}
\ No newline at end of file
More information about the llvm-commits
mailing list