[llvm] [CodeGen] Port mir-debugify to new pass manager (PR #193201)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Apr 27 07:52:27 PDT 2026
https://github.com/juanvazquez updated https://github.com/llvm/llvm-project/pull/193201
>From d5aa10139cd94bf850856d4c6d86f108ae4602f2 Mon Sep 17 00:00:00 2001
From: Juan Vazquez <juvazq at google.com>
Date: Mon, 20 Apr 2026 16:52:31 +0200
Subject: [PATCH] [CodeGen] Port mir-debugify to new pass manager
---
llvm/include/llvm/CodeGen/MachineDebugify.h | 33 ++++++++++++++
llvm/include/llvm/CodeGen/Passes.h | 2 +-
.../llvm/Passes/MachinePassRegistry.def | 2 +-
llvm/lib/CodeGen/MachineDebugify.cpp | 43 ++++++++++++++++---
llvm/lib/CodeGen/TargetPassConfig.cpp | 2 +-
llvm/lib/Passes/PassBuilder.cpp | 1 +
llvm/lib/Passes/PassRegistry.def | 1 +
.../GlobalISel/constant-mir-debugify.mir | 2 +
.../AArch64/GlobalISel/phi-mir-debugify.mir | 2 +
.../MIRDebugify/locations-and-values.mir | 5 +++
.../CodeGen/Generic/MIRStripDebug/all.mir | 3 ++
.../CodeGen/Generic/MIRStripDebug/bundles.mir | 3 ++
.../dont-strip-real-debug-info.mir | 3 ++
.../MIRStripDebug/multiple-moduleflags.mir | 3 ++
.../CodeGen/X86/machinesink-debug-inv-0.mir | 2 +-
15 files changed, 98 insertions(+), 9 deletions(-)
create mode 100644 llvm/include/llvm/CodeGen/MachineDebugify.h
diff --git a/llvm/include/llvm/CodeGen/MachineDebugify.h b/llvm/include/llvm/CodeGen/MachineDebugify.h
new file mode 100644
index 0000000000000..b11d054cd3abd
--- /dev/null
+++ b/llvm/include/llvm/CodeGen/MachineDebugify.h
@@ -0,0 +1,33 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+//
+// This pass attaches synthetic debug info to everything. It can be used to
+// create targeted tests for debug info preservation, or test for CodeGen
+// differences with vs. without debug info.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_CODEGEN_MACHINEDEBUGIFY_H_
+#define LLVM_CODEGEN_MACHINEDEBUGIFY_H_
+
+#include "llvm/IR/Analysis.h"
+#include "llvm/IR/Module.h"
+#include "llvm/IR/PassManager.h"
+#include "llvm/Support/Compiler.h"
+
+namespace llvm {
+
+class DebugifyMachineModulePass
+ : public PassInfoMixin<DebugifyMachineModulePass> {
+public:
+ LLVM_ABI PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
+};
+
+} // namespace llvm
+
+#endif // LLVM_CODEGEN_MACHINEDEBUGIFY_H_
diff --git a/llvm/include/llvm/CodeGen/Passes.h b/llvm/include/llvm/CodeGen/Passes.h
index be344c6aaf40e..7dcd97a1b26b0 100644
--- a/llvm/include/llvm/CodeGen/Passes.h
+++ b/llvm/include/llvm/CodeGen/Passes.h
@@ -596,7 +596,7 @@ createMIRProfileLoaderPass(std::string File, std::string RemappingFile,
IntrusiveRefCntPtr<vfs::FileSystem> FS);
/// Creates MIR Debugify pass. \see MachineDebugify.cpp
-LLVM_ABI ModulePass *createDebugifyMachineModulePass();
+LLVM_ABI ModulePass *createDebugifyMachineModuleLegacyPass();
/// Creates MIR Strip Debug pass. \see MachineStripDebug.cpp
/// If OnlyDebugified is true then it will only strip debug info if it was
diff --git a/llvm/include/llvm/Passes/MachinePassRegistry.def b/llvm/include/llvm/Passes/MachinePassRegistry.def
index fd5d4a39a5915..f5626967979c5 100644
--- a/llvm/include/llvm/Passes/MachinePassRegistry.def
+++ b/llvm/include/llvm/Passes/MachinePassRegistry.def
@@ -27,6 +27,7 @@ MODULE_ANALYSIS("pass-instrumentation", PassInstrumentationAnalysis(PIC))
MODULE_PASS("global-merge", GlobalMergePass(TM, GlobalMergeOptions()))
MODULE_PASS("jmc-instrumenter", JMCInstrumenterPass())
MODULE_PASS("lower-emutls", LowerEmuTLSPass())
+MODULE_PASS("mir-debugify", DebugifyMachineModule())
MODULE_PASS("mir-strip-debug", StripDebugMachineModulePass())
MODULE_PASS("pre-isel-intrinsic-lowering", PreISelIntrinsicLoweringPass())
MODULE_PASS("print<regusage>", PhysicalRegisterUsageInfoPrinterPass(errs()))
@@ -263,7 +264,6 @@ MACHINE_FUNCTION_PASS_WITH_PARAMS(
DUMMY_MACHINE_MODULE_PASS("machine-outliner", MachineOutlinerPass)
DUMMY_MACHINE_MODULE_PASS("static-data-annotator", StaticDataAnnotator)
DUMMY_MACHINE_MODULE_PASS("pseudo-probe-inserter", PseudoProbeInserterPass)
-DUMMY_MACHINE_MODULE_PASS("mir-debugify", DebugifyMachineModule)
DUMMY_MACHINE_MODULE_PASS("mir-check-debugify", CheckDebugMachineModulePass)
#undef DUMMY_MACHINE_MODULE_PASS
diff --git a/llvm/lib/CodeGen/MachineDebugify.cpp b/llvm/lib/CodeGen/MachineDebugify.cpp
index c3d436ded60a8..8152db089c4f9 100644
--- a/llvm/lib/CodeGen/MachineDebugify.cpp
+++ b/llvm/lib/CodeGen/MachineDebugify.cpp
@@ -13,8 +13,10 @@
/// This isn't intended to have feature parity with Debugify.
//===----------------------------------------------------------------------===//
+#include "llvm/CodeGen/MachineDebugify.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/SmallVector.h"
+#include "llvm/CodeGen/MachineFunctionAnalysis.h"
#include "llvm/CodeGen/MachineInstrBuilder.h"
#include "llvm/CodeGen/MachineModuleInfo.h"
#include "llvm/CodeGen/Passes.h"
@@ -29,9 +31,10 @@
using namespace llvm;
namespace {
-bool applyDebugifyMetadataToMachineFunction(MachineModuleInfo &MMI,
- DIBuilder &DIB, Function &F) {
- MachineFunction *MaybeMF = MMI.getMachineFunction(F);
+bool applyDebugifyMetadataToMachineFunction(
+ DIBuilder &DIB, Function &F,
+ llvm::function_ref<MachineFunction *(Function &)> GetMF) {
+ MachineFunction *MaybeMF = GetMF(F);
if (!MaybeMF)
return false;
MachineFunction &MF = *MaybeMF;
@@ -182,7 +185,10 @@ struct DebugifyMachineModule : public ModulePass {
return applyDebugifyMetadata(
M, M.functions(),
"ModuleDebugify: ", [&](DIBuilder &DIB, Function &F) -> bool {
- return applyDebugifyMetadataToMachineFunction(MMI, DIB, F);
+ return applyDebugifyMetadataToMachineFunction(
+ DIB, F, [&MMI](Function &F) -> MachineFunction * {
+ return MMI.getMachineFunction(F);
+ });
});
}
@@ -205,6 +211,33 @@ INITIALIZE_PASS_BEGIN(DebugifyMachineModule, DEBUG_TYPE,
INITIALIZE_PASS_END(DebugifyMachineModule, DEBUG_TYPE,
"Machine Debugify Module", false, false)
-ModulePass *llvm::createDebugifyMachineModulePass() {
+ModulePass *llvm::createDebugifyMachineModuleLegacyPass() {
return new DebugifyMachineModule();
}
+
+PreservedAnalyses DebugifyMachineModulePass::run(Module &M,
+ ModuleAnalysisManager &AM) {
+ FunctionAnalysisManager &FAM =
+ AM.getResult<FunctionAnalysisManagerModuleProxy>(M).getManager();
+ const bool Changed = applyDebugifyMetadata(
+ M, M.functions(),
+ "ModuleDebugify: ", [&](DIBuilder &DIB, Function &F) -> bool {
+ return applyDebugifyMetadataToMachineFunction(
+ DIB, F, [&FAM](Function &F) -> MachineFunction * {
+ MachineFunctionAnalysis::Result *MFA =
+ FAM.getCachedResult<MachineFunctionAnalysis>(F);
+ if (MFA == nullptr) {
+ return nullptr;
+ }
+ return &MFA->getMF();
+ });
+ });
+ if (!Changed)
+ return PreservedAnalyses::all();
+
+ PreservedAnalyses PA;
+ PA.preserve<MachineModuleAnalysis>();
+ PA.preserve<FunctionAnalysisManagerModuleProxy>();
+ PA.preserveSet<CFGAnalyses>();
+ return PA;
+}
diff --git a/llvm/lib/CodeGen/TargetPassConfig.cpp b/llvm/lib/CodeGen/TargetPassConfig.cpp
index 8e5b0f0d4221e..451b63f2283ec 100644
--- a/llvm/lib/CodeGen/TargetPassConfig.cpp
+++ b/llvm/lib/CodeGen/TargetPassConfig.cpp
@@ -806,7 +806,7 @@ void TargetPassConfig::addVerifyPass(const std::string &Banner) {
}
void TargetPassConfig::addDebugifyPass() {
- PM->add(createDebugifyMachineModulePass());
+ PM->add(createDebugifyMachineModuleLegacyPass());
}
void TargetPassConfig::addStripDebugPass() {
diff --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp
index c3f9f1261ab0a..45bfed225ec14 100644
--- a/llvm/lib/Passes/PassBuilder.cpp
+++ b/llvm/lib/Passes/PassBuilder.cpp
@@ -124,6 +124,7 @@
#include "llvm/CodeGen/MachineBranchProbabilityInfo.h"
#include "llvm/CodeGen/MachineCSE.h"
#include "llvm/CodeGen/MachineCopyPropagation.h"
+#include "llvm/CodeGen/MachineDebugify.h"
#include "llvm/CodeGen/MachineDominanceFrontier.h"
#include "llvm/CodeGen/MachineDominators.h"
#include "llvm/CodeGen/MachineFunctionAnalysis.h"
diff --git a/llvm/lib/Passes/PassRegistry.def b/llvm/lib/Passes/PassRegistry.def
index bde6d0b3e5106..501a8646a52c7 100644
--- a/llvm/lib/Passes/PassRegistry.def
+++ b/llvm/lib/Passes/PassRegistry.def
@@ -119,6 +119,7 @@ MODULE_PASS("memprof-remove-attributes", MemProfRemoveInfo())
MODULE_PASS("memprof-module", ModuleMemProfilerPass())
MODULE_PASS("mergefunc", MergeFunctionsPass())
MODULE_PASS("metarenamer", MetaRenamerPass())
+MODULE_PASS("mir-debugify", DebugifyMachineModulePass())
MODULE_PASS("mir-strip-debug", StripDebugMachineModulePass())
MODULE_PASS("module-inline", ModuleInlinerPass())
MODULE_PASS("name-anon-globals", NameAnonGlobalPass())
diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/constant-mir-debugify.mir b/llvm/test/CodeGen/AArch64/GlobalISel/constant-mir-debugify.mir
index c05ddf98640f8..304b2ac3becee 100644
--- a/llvm/test/CodeGen/AArch64/GlobalISel/constant-mir-debugify.mir
+++ b/llvm/test/CodeGen/AArch64/GlobalISel/constant-mir-debugify.mir
@@ -1,5 +1,7 @@
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
# RUN: llc -debugify-and-strip-all-safe=0 -run-pass=mir-debugify -verify-machineinstrs -mtriple aarch64-unknown-unknown %s -o - | FileCheck %s
+
+# RUN: llc -debugify-and-strip-all-safe=0 -passes=mir-debugify -verify-machineinstrs -mtriple aarch64-unknown-unknown %s -o - | FileCheck %s
...
---
name: fconstant_to_constant_s32
diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/phi-mir-debugify.mir b/llvm/test/CodeGen/AArch64/GlobalISel/phi-mir-debugify.mir
index 7968c7be5d308..9fbdc331fadb6 100644
--- a/llvm/test/CodeGen/AArch64/GlobalISel/phi-mir-debugify.mir
+++ b/llvm/test/CodeGen/AArch64/GlobalISel/phi-mir-debugify.mir
@@ -1,5 +1,7 @@
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
# RUN: llc -debugify-and-strip-all-safe=0 -run-pass=mir-debugify -verify-machineinstrs %s -o - | FileCheck %s
+
+# RUN: llc -debugify-and-strip-all-safe=0 -passes=mir-debugify -verify-machineinstrs %s -o - | FileCheck %s
--- |
target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
target triple = "aarch64-unknown-unknown"
diff --git a/llvm/test/CodeGen/Generic/MIRDebugify/locations-and-values.mir b/llvm/test/CodeGen/Generic/MIRDebugify/locations-and-values.mir
index f96d83fede40f..009dd5c249b9d 100644
--- a/llvm/test/CodeGen/Generic/MIRDebugify/locations-and-values.mir
+++ b/llvm/test/CodeGen/Generic/MIRDebugify/locations-and-values.mir
@@ -3,6 +3,11 @@
# RUN: llc -run-pass=mir-debugify,mir-strip-debug,mir-debugify -o - %s | FileCheck --check-prefixes=ALL,VALUE %s
# RUN: llc -run-pass=mir-debugify,mir-strip-debug -o - %s | FileCheck --check-prefix=STRIP %s
+# RUN: llc -passes=mir-debugify -o - %s | FileCheck --check-prefixes=ALL,VALUE %s
+# RUN: llc -passes=mir-debugify -debugify-level=locations -o - %s | FileCheck --check-prefixes=ALL --implicit-check-not=dbg_value %s
+# RUN: llc -passes=mir-debugify,mir-strip-debug,mir-debugify -o - %s | FileCheck --check-prefixes=ALL,VALUE %s
+# RUN: llc -passes=mir-debugify,mir-strip-debug -o - %s | FileCheck --check-prefix=STRIP %s
+
--- |
; ModuleID = 'loc-only.ll'
source_filename = "loc-only.ll"
diff --git a/llvm/test/CodeGen/Generic/MIRStripDebug/all.mir b/llvm/test/CodeGen/Generic/MIRStripDebug/all.mir
index 0404b991779a5..760f7c3655a68 100644
--- a/llvm/test/CodeGen/Generic/MIRStripDebug/all.mir
+++ b/llvm/test/CodeGen/Generic/MIRStripDebug/all.mir
@@ -1,5 +1,8 @@
# RUN: llc -run-pass=mir-strip-debug -o - %s | FileCheck %s
# RUN: llc -run-pass=mir-strip-debug,mir-debugify,mir-strip-debug -o - %s | FileCheck %s
+
+# RUN: llc -passes=mir-strip-debug -o - %s | FileCheck %s
+# RUN: llc -passes=mir-strip-debug,mir-debugify,mir-strip-debug -o - %s | FileCheck %s
--- |
; ModuleID = 'loc-only.ll'
source_filename = "loc-only.ll"
diff --git a/llvm/test/CodeGen/Generic/MIRStripDebug/bundles.mir b/llvm/test/CodeGen/Generic/MIRStripDebug/bundles.mir
index 111c886f585cf..917fa54e18cdf 100644
--- a/llvm/test/CodeGen/Generic/MIRStripDebug/bundles.mir
+++ b/llvm/test/CodeGen/Generic/MIRStripDebug/bundles.mir
@@ -1,6 +1,9 @@
# RUN: llc -run-pass=mir-strip-debug -o - %s | FileCheck %s
# RUN: llc -run-pass=mir-strip-debug,mir-debugify,mir-strip-debug -o - %s | FileCheck %s
+# RUN: llc -passes=mir-strip-debug -o - %s | FileCheck %s
+# RUN: llc -passes=mir-strip-debug,mir-debugify,mir-strip-debug -o - %s | FileCheck %s
+
--- |
source_filename = "loc-only.ll"
diff --git a/llvm/test/CodeGen/Generic/MIRStripDebug/dont-strip-real-debug-info.mir b/llvm/test/CodeGen/Generic/MIRStripDebug/dont-strip-real-debug-info.mir
index a085462b8e8f9..f241396648f2b 100644
--- a/llvm/test/CodeGen/Generic/MIRStripDebug/dont-strip-real-debug-info.mir
+++ b/llvm/test/CodeGen/Generic/MIRStripDebug/dont-strip-real-debug-info.mir
@@ -1,5 +1,8 @@
# RUN: llc -run-pass=mir-strip-debug -o - %s | FileCheck %s
# RUN: llc -run-pass=mir-strip-debug,mir-debugify,mir-strip-debug -o - %s | FileCheck %s
+
+# RUN: llc -passes=mir-strip-debug -o - %s | FileCheck %s
+# RUN: llc -passes=mir-strip-debug,mir-debugify,mir-strip-debug -o - %s | FileCheck %s
--- |
; ModuleID = 'loc-only.ll'
source_filename = "loc-only.ll"
diff --git a/llvm/test/CodeGen/Generic/MIRStripDebug/multiple-moduleflags.mir b/llvm/test/CodeGen/Generic/MIRStripDebug/multiple-moduleflags.mir
index 9240c1a56eb9b..408616e546d6e 100644
--- a/llvm/test/CodeGen/Generic/MIRStripDebug/multiple-moduleflags.mir
+++ b/llvm/test/CodeGen/Generic/MIRStripDebug/multiple-moduleflags.mir
@@ -1,5 +1,8 @@
# RUN: llc -run-pass=mir-strip-debug -o - %s | FileCheck %s
# RUN: llc -run-pass=mir-strip-debug,mir-debugify,mir-strip-debug -o - %s | FileCheck %s
+
+# RUN: llc -passes=mir-strip-debug -o - %s | FileCheck %s
+# RUN: llc -passes=mir-strip-debug,mir-debugify,mir-strip-debug -o - %s | FileCheck %s
--- |
; ModuleID = 'loc-only.ll'
source_filename = "loc-only.ll"
diff --git a/llvm/test/CodeGen/X86/machinesink-debug-inv-0.mir b/llvm/test/CodeGen/X86/machinesink-debug-inv-0.mir
index 20207311e66cd..242fbfb11785d 100644
--- a/llvm/test/CodeGen/X86/machinesink-debug-inv-0.mir
+++ b/llvm/test/CodeGen/X86/machinesink-debug-inv-0.mir
@@ -3,7 +3,7 @@
# RUN: llc -mtriple=x86_64 -machine-sink-load-instrs-threshold=2 -run-pass=mir-debugify,machine-sink,mir-strip-debug %s -o - | FileCheck %s
# RUN: llc -mtriple=x86_64 -machine-sink-load-instrs-threshold=2 -passes=machine-sink %s -o - | FileCheck %s
-# TODO: add test with mir-debugify once it is ported
+# RUN: llc -mtriple=x86_64 -machine-sink-load-instrs-threshold=2 -passes=mir-debugify,function(machine-function(machine-sink)),mir-strip-debug %s -o - | FileCheck %s
# Verify that machine-sink pass is debug invariant wrt to given input. Since
# the pass examines MemOperands the IR is required for the original bug to
More information about the llvm-commits
mailing list