[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