[llvm] [NewPM] Port MachineDominanceFrontierAnalysis (PR #177709)

Anshul Nigham via llvm-commits llvm-commits at lists.llvm.org
Sat Jan 31 09:05:12 PST 2026


https://github.com/nigham updated https://github.com/llvm/llvm-project/pull/177709

>From b1edf0ba71aed499b4964cdc82dca804a6379471 Mon Sep 17 00:00:00 2001
From: Anshul Nigham <nigham at google.com>
Date: Fri, 23 Jan 2026 16:25:52 -0800
Subject: [PATCH 1/9] [NewPM] Port MachineDominanceFrontierAnalysis

---
 .../include/llvm/CodeGen/MachineDominanceFrontier.h | 13 +++++++++++++
 llvm/include/llvm/Passes/MachinePassRegistry.def    |  3 +--
 llvm/lib/CodeGen/MachineDominanceFrontier.cpp       |  9 +++++++++
 llvm/lib/Passes/PassBuilder.cpp                     |  1 +
 4 files changed, 24 insertions(+), 2 deletions(-)

diff --git a/llvm/include/llvm/CodeGen/MachineDominanceFrontier.h b/llvm/include/llvm/CodeGen/MachineDominanceFrontier.h
index 7df060a3f5b1a..ac56361827507 100644
--- a/llvm/include/llvm/CodeGen/MachineDominanceFrontier.h
+++ b/llvm/include/llvm/CodeGen/MachineDominanceFrontier.h
@@ -13,6 +13,7 @@
 #include "llvm/Analysis/DominanceFrontierImpl.h"
 #include "llvm/CodeGen/MachineBasicBlock.h"
 #include "llvm/CodeGen/MachineFunctionPass.h"
+#include "llvm/CodeGen/MachinePassManager.h"
 #include "llvm/Support/GenericDomTree.h"
 
 namespace llvm {
@@ -80,6 +81,18 @@ class MachineDominanceFrontier : public MachineFunctionPass {
   void getAnalysisUsage(AnalysisUsage &AU) const override;
 };
 
+class MachineDominanceFrontierAnalysis
+    : public AnalysisInfoMixin<MachineDominanceFrontierAnalysis> {
+  friend AnalysisInfoMixin<MachineDominanceFrontierAnalysis>;
+  static AnalysisKey Key;
+  MachineDominanceFrontier MDF;
+
+public:
+  using Result = const MachineDominanceFrontier &;
+
+  Result run(MachineFunction &MF, MachineFunctionAnalysisManager &);
+};
+
 } // end namespace llvm
 
 #endif // LLVM_CODEGEN_MACHINEDOMINANCEFRONTIER_H
diff --git a/llvm/include/llvm/Passes/MachinePassRegistry.def b/llvm/include/llvm/Passes/MachinePassRegistry.def
index 20b066a2ead6d..52931fda29f34 100644
--- a/llvm/include/llvm/Passes/MachinePassRegistry.def
+++ b/llvm/include/llvm/Passes/MachinePassRegistry.def
@@ -73,6 +73,7 @@ MACHINE_FUNCTION_ANALYSIS("machine-block-freq", MachineBlockFrequencyAnalysis())
 MACHINE_FUNCTION_ANALYSIS("machine-branch-prob",
                           MachineBranchProbabilityAnalysis())
 MACHINE_FUNCTION_ANALYSIS("machine-cycles", MachineCycleAnalysis())
+MACHINE_FUNCTION_ANALYSIS("machine-dom-frontier", MachineDominanceFrontierAnalysis())
 MACHINE_FUNCTION_ANALYSIS("machine-dom-tree", MachineDominatorTreeAnalysis())
 MACHINE_FUNCTION_ANALYSIS("machine-loops", MachineLoopAnalysis())
 MACHINE_FUNCTION_ANALYSIS("machine-opt-remark-emitter",
@@ -91,8 +92,6 @@ MACHINE_FUNCTION_ANALYSIS("virtregmap", VirtRegMapAnalysis())
 // MACHINE_FUNCTION_ANALYSIS("lazy-machine-bfi",
 // LazyMachineBlockFrequencyInfoAnalysis())
 // MACHINE_FUNCTION_ANALYSIS("machine-loops", MachineLoopInfoAnalysis())
-// MACHINE_FUNCTION_ANALYSIS("machine-dom-frontier",
-// MachineDominanceFrontierAnalysis())
 // MACHINE_FUNCTION_ANALYSIS("machine-post-dom-tree",
 // MachinePostDominatorTreeAnalysis())
 // MACHINE_FUNCTION_ANALYSIS("machine-region-info",
diff --git a/llvm/lib/CodeGen/MachineDominanceFrontier.cpp b/llvm/lib/CodeGen/MachineDominanceFrontier.cpp
index 4d35ba89afe31..8e2cdd76b21af 100644
--- a/llvm/lib/CodeGen/MachineDominanceFrontier.cpp
+++ b/llvm/lib/CodeGen/MachineDominanceFrontier.cpp
@@ -50,3 +50,12 @@ void MachineDominanceFrontier::getAnalysisUsage(AnalysisUsage &AU) const {
   AU.addRequired<MachineDominatorTreeWrapperPass>();
   MachineFunctionPass::getAnalysisUsage(AU);
 }
+
+AnalysisKey MachineDominanceFrontierAnalysis::Key;
+
+MachineDominanceFrontierAnalysis::Result
+MachineDominanceFrontierAnalysis::run(MachineFunction &MF,
+                                      MachineFunctionAnalysisManager &) {
+  MDF.runOnMachineFunction(MF);
+  return MDF;
+}
diff --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp
index 8bb78c8c7df63..45955426d66a0 100644
--- a/llvm/lib/Passes/PassBuilder.cpp
+++ b/llvm/lib/Passes/PassBuilder.cpp
@@ -123,6 +123,7 @@
 #include "llvm/CodeGen/MachineBranchProbabilityInfo.h"
 #include "llvm/CodeGen/MachineCSE.h"
 #include "llvm/CodeGen/MachineCopyPropagation.h"
+#include "llvm/CodeGen/MachineDominanceFrontier.h"
 #include "llvm/CodeGen/MachineDominators.h"
 #include "llvm/CodeGen/MachineFunctionAnalysis.h"
 #include "llvm/CodeGen/MachineLICM.h"

>From f124e6b7261c4f051f37849f5da54de093dd4273 Mon Sep 17 00:00:00 2001
From: Anshul Nigham <nigham at google.com>
Date: Tue, 27 Jan 2026 14:42:40 -0800
Subject: [PATCH 2/9] Extract MDF from wrapper pass

---
 .../llvm/CodeGen/MachineDominanceFrontier.h   | 33 ++++++++++++++-----
 llvm/include/llvm/InitializePasses.h          |  2 +-
 llvm/lib/CodeGen/CodeGen.cpp                  |  2 +-
 llvm/lib/CodeGen/MachineDominanceFrontier.cpp | 30 +++++++++++------
 llvm/lib/CodeGen/MachineRegionInfo.cpp        |  6 ++--
 .../X86LoadValueInjectionLoadHardening.cpp    |  6 ++--
 6 files changed, 52 insertions(+), 27 deletions(-)

diff --git a/llvm/include/llvm/CodeGen/MachineDominanceFrontier.h b/llvm/include/llvm/CodeGen/MachineDominanceFrontier.h
index ac56361827507..4556d64b617c2 100644
--- a/llvm/include/llvm/CodeGen/MachineDominanceFrontier.h
+++ b/llvm/include/llvm/CodeGen/MachineDominanceFrontier.h
@@ -12,13 +12,14 @@
 #include "llvm/Analysis/DominanceFrontier.h"
 #include "llvm/Analysis/DominanceFrontierImpl.h"
 #include "llvm/CodeGen/MachineBasicBlock.h"
+#include "llvm/CodeGen/MachineDominators.h"
 #include "llvm/CodeGen/MachineFunctionPass.h"
 #include "llvm/CodeGen/MachinePassManager.h"
 #include "llvm/Support/GenericDomTree.h"
 
 namespace llvm {
 
-class MachineDominanceFrontier : public MachineFunctionPass {
+class MachineDominanceFrontier {
   ForwardDominanceFrontierBase<MachineBasicBlock> Base;
 
 public:
@@ -29,11 +30,6 @@ class MachineDominanceFrontier : public MachineFunctionPass {
  using const_iterator =
      DominanceFrontierBase<MachineBasicBlock, false>::const_iterator;
 
- MachineDominanceFrontier(const MachineDominanceFrontier &) = delete;
- MachineDominanceFrontier &operator=(const MachineDominanceFrontier &) = delete;
-
- static char ID;
-
  MachineDominanceFrontier();
 
  ForwardDominanceFrontierBase<MachineBasicBlock> &getBase() { return Base; }
@@ -74,11 +70,30 @@ class MachineDominanceFrontier : public MachineFunctionPass {
     return Base.find(B);
   }
 
+  bool analyze(MachineDominatorTree &MDT);
+
+  void releaseMemory();
+};
+
+class MachineDominanceFrontierWrapperPass : public MachineFunctionPass {
+private:
+  MachineDominanceFrontier MDF;
+
+public:
+  MachineDominanceFrontierWrapperPass();
+
+  MachineDominanceFrontierWrapperPass(const MachineDominanceFrontier &) = delete;
+  MachineDominanceFrontierWrapperPass &operator=(const MachineDominanceFrontier &) = delete;
+
+  static char ID;
+
   bool runOnMachineFunction(MachineFunction &F) override;
 
+  void getAnalysisUsage(AnalysisUsage &AU) const override;
+
   void releaseMemory() override;
 
-  void getAnalysisUsage(AnalysisUsage &AU) const override;
+  MachineDominanceFrontier &getMDF() { return MDF; }
 };
 
 class MachineDominanceFrontierAnalysis
@@ -88,9 +103,9 @@ class MachineDominanceFrontierAnalysis
   MachineDominanceFrontier MDF;
 
 public:
-  using Result = const MachineDominanceFrontier &;
+  using Result = MachineDominanceFrontier;
 
-  Result run(MachineFunction &MF, MachineFunctionAnalysisManager &);
+  Result run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM);
 };
 
 } // end namespace llvm
diff --git a/llvm/include/llvm/InitializePasses.h b/llvm/include/llvm/InitializePasses.h
index 0531dd85bace0..80ec83a58c3ac 100644
--- a/llvm/include/llvm/InitializePasses.h
+++ b/llvm/include/llvm/InitializePasses.h
@@ -205,7 +205,7 @@ LLVM_ABI void initializeMachineCombinerPass(PassRegistry &);
 LLVM_ABI void initializeMachineCopyPropagationLegacyPass(PassRegistry &);
 LLVM_ABI void initializeMachineCycleInfoPrinterLegacyPass(PassRegistry &);
 LLVM_ABI void initializeMachineCycleInfoWrapperPassPass(PassRegistry &);
-LLVM_ABI void initializeMachineDominanceFrontierPass(PassRegistry &);
+LLVM_ABI void initializeMachineDominanceFrontierWrapperPassPass(PassRegistry &);
 LLVM_ABI void initializeMachineDominatorTreeWrapperPassPass(PassRegistry &);
 LLVM_ABI void initializeMachineFunctionPrinterPassPass(PassRegistry &);
 LLVM_ABI void initializeMachineFunctionSplitterPass(PassRegistry &);
diff --git a/llvm/lib/CodeGen/CodeGen.cpp b/llvm/lib/CodeGen/CodeGen.cpp
index 29b76129200f7..b6b907df31cfe 100644
--- a/llvm/lib/CodeGen/CodeGen.cpp
+++ b/llvm/lib/CodeGen/CodeGen.cpp
@@ -87,7 +87,7 @@ void llvm::initializeCodeGen(PassRegistry &Registry) {
   initializeMachineCFGPrinterPass(Registry);
   initializeMachineCSELegacyPass(Registry);
   initializeMachineCombinerPass(Registry);
-  initializeMachineDominanceFrontierPass(Registry);
+  initializeMachineDominanceFrontierWrapperPassPass(Registry);
   initializeMachineCopyPropagationLegacyPass(Registry);
   initializeMachineCycleInfoPrinterLegacyPass(Registry);
   initializeMachineCycleInfoWrapperPassPass(Registry);
diff --git a/llvm/lib/CodeGen/MachineDominanceFrontier.cpp b/llvm/lib/CodeGen/MachineDominanceFrontier.cpp
index 8e2cdd76b21af..be09b3856caff 100644
--- a/llvm/lib/CodeGen/MachineDominanceFrontier.cpp
+++ b/llvm/lib/CodeGen/MachineDominanceFrontier.cpp
@@ -22,30 +22,39 @@ template class ForwardDominanceFrontierBase<MachineBasicBlock>;
 }
 
 
-char MachineDominanceFrontier::ID = 0;
+char MachineDominanceFrontierWrapperPass::ID = 0;
 
-INITIALIZE_PASS_BEGIN(MachineDominanceFrontier, "machine-domfrontier",
+INITIALIZE_PASS_BEGIN(MachineDominanceFrontierWrapperPass, "machine-domfrontier",
                 "Machine Dominance Frontier Construction", true, true)
 INITIALIZE_PASS_DEPENDENCY(MachineDominatorTreeWrapperPass)
-INITIALIZE_PASS_END(MachineDominanceFrontier, "machine-domfrontier",
+INITIALIZE_PASS_END(MachineDominanceFrontierWrapperPass, "machine-domfrontier",
                 "Machine Dominance Frontier Construction", true, true)
 
-MachineDominanceFrontier::MachineDominanceFrontier()
+MachineDominanceFrontierWrapperPass::MachineDominanceFrontierWrapperPass()
     : MachineFunctionPass(ID) {}
 
-char &llvm::MachineDominanceFrontierID = MachineDominanceFrontier::ID;
+char &llvm::MachineDominanceFrontierID = MachineDominanceFrontierWrapperPass::ID;
 
-bool MachineDominanceFrontier::runOnMachineFunction(MachineFunction &) {
+bool MachineDominanceFrontierWrapperPass::runOnMachineFunction(MachineFunction &) {
+  auto& MDT = getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree();
+  return MDF.analyze(MDT);
+}
+
+bool MachineDominanceFrontier::analyze(MachineDominatorTree &MDT) {
   releaseMemory();
-  Base.analyze(getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree());
+  Base.analyze(MDT);
   return false;
 }
 
+void MachineDominanceFrontierWrapperPass::releaseMemory() {
+  MDF.releaseMemory();
+}
+
 void MachineDominanceFrontier::releaseMemory() {
   Base.releaseMemory();
 }
 
-void MachineDominanceFrontier::getAnalysisUsage(AnalysisUsage &AU) const {
+void MachineDominanceFrontierWrapperPass::getAnalysisUsage(AnalysisUsage &AU) const {
   AU.setPreservesAll();
   AU.addRequired<MachineDominatorTreeWrapperPass>();
   MachineFunctionPass::getAnalysisUsage(AU);
@@ -55,7 +64,8 @@ AnalysisKey MachineDominanceFrontierAnalysis::Key;
 
 MachineDominanceFrontierAnalysis::Result
 MachineDominanceFrontierAnalysis::run(MachineFunction &MF,
-                                      MachineFunctionAnalysisManager &) {
-  MDF.runOnMachineFunction(MF);
+                                      MachineFunctionAnalysisManager &MFAM) {
+  auto& MDT = MFAM.getResult<MachineDominatorTreeAnalysis>(MF);
+  MDF.analyze(MDT);
   return MDF;
 }
diff --git a/llvm/lib/CodeGen/MachineRegionInfo.cpp b/llvm/lib/CodeGen/MachineRegionInfo.cpp
index d522d5b76a222..9f90bfe15ecd8 100644
--- a/llvm/lib/CodeGen/MachineRegionInfo.cpp
+++ b/llvm/lib/CodeGen/MachineRegionInfo.cpp
@@ -86,7 +86,7 @@ bool MachineRegionInfoPass::runOnMachineFunction(MachineFunction &F) {
   auto DT = &getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree();
   auto PDT =
       &getAnalysis<MachinePostDominatorTreeWrapperPass>().getPostDomTree();
-  auto DF = &getAnalysis<MachineDominanceFrontier>();
+  auto DF = &getAnalysis<MachineDominanceFrontierWrapperPass>().getMDF();
 
   RI.recalculate(F, DT, PDT, DF);
 
@@ -111,7 +111,7 @@ void MachineRegionInfoPass::getAnalysisUsage(AnalysisUsage &AU) const {
   AU.setPreservesAll();
   AU.addRequired<MachineDominatorTreeWrapperPass>();
   AU.addRequired<MachinePostDominatorTreeWrapperPass>();
-  AU.addRequired<MachineDominanceFrontier>();
+  AU.addRequired<MachineDominanceFrontierWrapperPass>();
   MachineFunctionPass::getAnalysisUsage(AU);
 }
 
@@ -132,7 +132,7 @@ INITIALIZE_PASS_BEGIN(MachineRegionInfoPass, DEBUG_TYPE,
                       "Detect single entry single exit regions", true, true)
 INITIALIZE_PASS_DEPENDENCY(MachineDominatorTreeWrapperPass)
 INITIALIZE_PASS_DEPENDENCY(MachinePostDominatorTreeWrapperPass)
-INITIALIZE_PASS_DEPENDENCY(MachineDominanceFrontier)
+INITIALIZE_PASS_DEPENDENCY(MachineDominanceFrontierWrapperPass)
 INITIALIZE_PASS_END(MachineRegionInfoPass, DEBUG_TYPE,
                     "Detect single entry single exit regions", true, true)
 
diff --git a/llvm/lib/Target/X86/X86LoadValueInjectionLoadHardening.cpp b/llvm/lib/Target/X86/X86LoadValueInjectionLoadHardening.cpp
index 3b96e706fb607..9f797f4d6d5f3 100644
--- a/llvm/lib/Target/X86/X86LoadValueInjectionLoadHardening.cpp
+++ b/llvm/lib/Target/X86/X86LoadValueInjectionLoadHardening.cpp
@@ -234,7 +234,7 @@ void X86LoadValueInjectionLoadHardeningPass::getAnalysisUsage(
   MachineFunctionPass::getAnalysisUsage(AU);
   AU.addRequired<MachineLoopInfoWrapperPass>();
   AU.addRequired<MachineDominatorTreeWrapperPass>();
-  AU.addRequired<MachineDominanceFrontier>();
+  AU.addRequired<MachineDominanceFrontierWrapperPass>();
   AU.setPreservesCFG();
 }
 
@@ -267,7 +267,7 @@ bool X86LoadValueInjectionLoadHardeningPass::runOnMachineFunction(
   LLVM_DEBUG(dbgs() << "Building gadget graph...\n");
   const auto &MLI = getAnalysis<MachineLoopInfoWrapperPass>().getLI();
   const auto &MDT = getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree();
-  const auto &MDF = getAnalysis<MachineDominanceFrontier>();
+  const auto &MDF = getAnalysis<MachineDominanceFrontierWrapperPass>().getMDF();
   std::unique_ptr<MachineGadgetGraph> Graph = getGadgetGraph(MF, MLI, MDT, MDF);
   LLVM_DEBUG(dbgs() << "Building gadget graph... Done\n");
   if (Graph == nullptr)
@@ -796,7 +796,7 @@ INITIALIZE_PASS_BEGIN(X86LoadValueInjectionLoadHardeningPass, PASS_KEY,
                       "X86 LVI load hardening", false, false)
 INITIALIZE_PASS_DEPENDENCY(MachineLoopInfoWrapperPass)
 INITIALIZE_PASS_DEPENDENCY(MachineDominatorTreeWrapperPass)
-INITIALIZE_PASS_DEPENDENCY(MachineDominanceFrontier)
+INITIALIZE_PASS_DEPENDENCY(MachineDominanceFrontierWrapperPass)
 INITIALIZE_PASS_END(X86LoadValueInjectionLoadHardeningPass, PASS_KEY,
                     "X86 LVI load hardening", false, false)
 

>From c9912f7304befd5d816986b0ce2a0819231fe250 Mon Sep 17 00:00:00 2001
From: Anshul Nigham <nigham at google.com>
Date: Tue, 27 Jan 2026 14:45:16 -0800
Subject: [PATCH 3/9] Formatting

---
 .../llvm/CodeGen/MachineDominanceFrontier.h   |  6 ++++--
 llvm/lib/CodeGen/MachineDominanceFrontier.cpp | 21 +++++++++++--------
 2 files changed, 16 insertions(+), 11 deletions(-)

diff --git a/llvm/include/llvm/CodeGen/MachineDominanceFrontier.h b/llvm/include/llvm/CodeGen/MachineDominanceFrontier.h
index 4556d64b617c2..97951f9a90243 100644
--- a/llvm/include/llvm/CodeGen/MachineDominanceFrontier.h
+++ b/llvm/include/llvm/CodeGen/MachineDominanceFrontier.h
@@ -82,8 +82,10 @@ class MachineDominanceFrontierWrapperPass : public MachineFunctionPass {
 public:
   MachineDominanceFrontierWrapperPass();
 
-  MachineDominanceFrontierWrapperPass(const MachineDominanceFrontier &) = delete;
-  MachineDominanceFrontierWrapperPass &operator=(const MachineDominanceFrontier &) = delete;
+  MachineDominanceFrontierWrapperPass(const MachineDominanceFrontier &) =
+      delete;
+  MachineDominanceFrontierWrapperPass &
+  operator=(const MachineDominanceFrontier &) = delete;
 
   static char ID;
 
diff --git a/llvm/lib/CodeGen/MachineDominanceFrontier.cpp b/llvm/lib/CodeGen/MachineDominanceFrontier.cpp
index be09b3856caff..0afa9b5a850dd 100644
--- a/llvm/lib/CodeGen/MachineDominanceFrontier.cpp
+++ b/llvm/lib/CodeGen/MachineDominanceFrontier.cpp
@@ -21,22 +21,24 @@ template class DominanceFrontierBase<MachineBasicBlock, true>;
 template class ForwardDominanceFrontierBase<MachineBasicBlock>;
 }
 
-
 char MachineDominanceFrontierWrapperPass::ID = 0;
 
-INITIALIZE_PASS_BEGIN(MachineDominanceFrontierWrapperPass, "machine-domfrontier",
-                "Machine Dominance Frontier Construction", true, true)
+INITIALIZE_PASS_BEGIN(MachineDominanceFrontierWrapperPass,
+                      "machine-domfrontier",
+                      "Machine Dominance Frontier Construction", true, true)
 INITIALIZE_PASS_DEPENDENCY(MachineDominatorTreeWrapperPass)
 INITIALIZE_PASS_END(MachineDominanceFrontierWrapperPass, "machine-domfrontier",
-                "Machine Dominance Frontier Construction", true, true)
+                    "Machine Dominance Frontier Construction", true, true)
 
 MachineDominanceFrontierWrapperPass::MachineDominanceFrontierWrapperPass()
     : MachineFunctionPass(ID) {}
 
-char &llvm::MachineDominanceFrontierID = MachineDominanceFrontierWrapperPass::ID;
+char &llvm::MachineDominanceFrontierID =
+    MachineDominanceFrontierWrapperPass::ID;
 
-bool MachineDominanceFrontierWrapperPass::runOnMachineFunction(MachineFunction &) {
-  auto& MDT = getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree();
+bool MachineDominanceFrontierWrapperPass::runOnMachineFunction(
+    MachineFunction &) {
+  auto &MDT = getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree();
   return MDF.analyze(MDT);
 }
 
@@ -54,7 +56,8 @@ void MachineDominanceFrontier::releaseMemory() {
   Base.releaseMemory();
 }
 
-void MachineDominanceFrontierWrapperPass::getAnalysisUsage(AnalysisUsage &AU) const {
+void MachineDominanceFrontierWrapperPass::getAnalysisUsage(
+    AnalysisUsage &AU) const {
   AU.setPreservesAll();
   AU.addRequired<MachineDominatorTreeWrapperPass>();
   MachineFunctionPass::getAnalysisUsage(AU);
@@ -65,7 +68,7 @@ AnalysisKey MachineDominanceFrontierAnalysis::Key;
 MachineDominanceFrontierAnalysis::Result
 MachineDominanceFrontierAnalysis::run(MachineFunction &MF,
                                       MachineFunctionAnalysisManager &MFAM) {
-  auto& MDT = MFAM.getResult<MachineDominatorTreeAnalysis>(MF);
+  auto &MDT = MFAM.getResult<MachineDominatorTreeAnalysis>(MF);
   MDF.analyze(MDT);
   return MDF;
 }

>From 9fdf59715ceb127b2a20730b2e602ca0c3702942 Mon Sep 17 00:00:00 2001
From: Anshul Nigham <nigham at google.com>
Date: Tue, 27 Jan 2026 15:11:54 -0800
Subject: [PATCH 4/9] Update callsites

---
 llvm/include/llvm/CodeGen/MachineDominanceFrontier.h     | 2 +-
 llvm/lib/Target/Hexagon/HexagonOptAddrMode.cpp           | 6 +++---
 llvm/lib/Target/Hexagon/HexagonRDFOpt.cpp                | 6 +++---
 llvm/lib/Target/WebAssembly/WebAssemblyExceptionInfo.cpp | 6 +++---
 4 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/llvm/include/llvm/CodeGen/MachineDominanceFrontier.h b/llvm/include/llvm/CodeGen/MachineDominanceFrontier.h
index 97951f9a90243..ed8af63d717ee 100644
--- a/llvm/include/llvm/CodeGen/MachineDominanceFrontier.h
+++ b/llvm/include/llvm/CodeGen/MachineDominanceFrontier.h
@@ -30,7 +30,7 @@ class MachineDominanceFrontier {
  using const_iterator =
      DominanceFrontierBase<MachineBasicBlock, false>::const_iterator;
 
- MachineDominanceFrontier();
+ MachineDominanceFrontier() = default;
 
  ForwardDominanceFrontierBase<MachineBasicBlock> &getBase() { return Base; }
 
diff --git a/llvm/lib/Target/Hexagon/HexagonOptAddrMode.cpp b/llvm/lib/Target/Hexagon/HexagonOptAddrMode.cpp
index 53afbc433c933..f266678071b5b 100644
--- a/llvm/lib/Target/Hexagon/HexagonOptAddrMode.cpp
+++ b/llvm/lib/Target/Hexagon/HexagonOptAddrMode.cpp
@@ -65,7 +65,7 @@ class HexagonOptAddrMode : public MachineFunctionPass {
   void getAnalysisUsage(AnalysisUsage &AU) const override {
     MachineFunctionPass::getAnalysisUsage(AU);
     AU.addRequired<MachineDominatorTreeWrapperPass>();
-    AU.addRequired<MachineDominanceFrontier>();
+    AU.addRequired<MachineDominanceFrontierWrapperPass>();
     AU.setPreservesAll();
   }
 
@@ -128,7 +128,7 @@ char HexagonOptAddrMode::ID = 0;
 INITIALIZE_PASS_BEGIN(HexagonOptAddrMode, "amode-opt",
                       "Optimize addressing mode", false, false)
 INITIALIZE_PASS_DEPENDENCY(MachineDominatorTreeWrapperPass)
-INITIALIZE_PASS_DEPENDENCY(MachineDominanceFrontier)
+INITIALIZE_PASS_DEPENDENCY(MachineDominanceFrontierWrapperPass)
 INITIALIZE_PASS_END(HexagonOptAddrMode, "amode-opt", "Optimize addressing mode",
                     false, false)
 
@@ -1155,7 +1155,7 @@ bool HexagonOptAddrMode::runOnMachineFunction(MachineFunction &MF) {
   TRI = MF.getSubtarget().getRegisterInfo();
   HII = HST.getInstrInfo();
   HRI = HST.getRegisterInfo();
-  const auto &MDF = getAnalysis<MachineDominanceFrontier>();
+  const auto &MDF = getAnalysis<MachineDominanceFrontierWrapperPass>().getMDF();
   MDT = &getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree();
 
   DataFlowGraph G(MF, *HII, *HRI, *MDT, MDF);
diff --git a/llvm/lib/Target/Hexagon/HexagonRDFOpt.cpp b/llvm/lib/Target/Hexagon/HexagonRDFOpt.cpp
index f375b25e4ceb8..9e8ab8392e3af 100644
--- a/llvm/lib/Target/Hexagon/HexagonRDFOpt.cpp
+++ b/llvm/lib/Target/Hexagon/HexagonRDFOpt.cpp
@@ -57,7 +57,7 @@ namespace {
 
     void getAnalysisUsage(AnalysisUsage &AU) const override {
       AU.addRequired<MachineDominatorTreeWrapperPass>();
-      AU.addRequired<MachineDominanceFrontier>();
+      AU.addRequired<MachineDominanceFrontierWrapperPass>();
       AU.setPreservesAll();
       MachineFunctionPass::getAnalysisUsage(AU);
     }
@@ -102,7 +102,7 @@ char HexagonRDFOpt::ID = 0;
 INITIALIZE_PASS_BEGIN(HexagonRDFOpt, "hexagon-rdf-opt",
       "Hexagon RDF optimizations", false, false)
 INITIALIZE_PASS_DEPENDENCY(MachineDominatorTreeWrapperPass)
-INITIALIZE_PASS_DEPENDENCY(MachineDominanceFrontier)
+INITIALIZE_PASS_DEPENDENCY(MachineDominanceFrontierWrapperPass)
 INITIALIZE_PASS_END(HexagonRDFOpt, "hexagon-rdf-opt",
       "Hexagon RDF optimizations", false, false)
 
@@ -295,7 +295,7 @@ bool HexagonRDFOpt::runOnMachineFunction(MachineFunction &MF) {
   }
 
   MDT = &getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree();
-  const auto &MDF = getAnalysis<MachineDominanceFrontier>();
+  const auto &MDF = getAnalysis<MachineDominanceFrontierWrapperPass>().getMDF();
   const auto &HII = *MF.getSubtarget<HexagonSubtarget>().getInstrInfo();
   const auto &HRI = *MF.getSubtarget<HexagonSubtarget>().getRegisterInfo();
   MRI = &MF.getRegInfo();
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyExceptionInfo.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyExceptionInfo.cpp
index f0b2e915e5760..a8a2454cd14ca 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyExceptionInfo.cpp
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyExceptionInfo.cpp
@@ -32,7 +32,7 @@ char WebAssemblyExceptionInfo::ID = 0;
 INITIALIZE_PASS_BEGIN(WebAssemblyExceptionInfo, DEBUG_TYPE,
                       "WebAssembly Exception Information", true, true)
 INITIALIZE_PASS_DEPENDENCY(MachineDominatorTreeWrapperPass)
-INITIALIZE_PASS_DEPENDENCY(MachineDominanceFrontier)
+INITIALIZE_PASS_DEPENDENCY(MachineDominanceFrontierWrapperPass)
 INITIALIZE_PASS_END(WebAssemblyExceptionInfo, DEBUG_TYPE,
                     "WebAssembly Exception Information", true, true)
 
@@ -46,7 +46,7 @@ bool WebAssemblyExceptionInfo::runOnMachineFunction(MachineFunction &MF) {
       !MF.getFunction().hasPersonalityFn())
     return false;
   auto &MDT = getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree();
-  auto &MDF = getAnalysis<MachineDominanceFrontier>();
+  auto &MDF = getAnalysis<MachineDominanceFrontierWrapperPass>().getMDF();
   recalculate(MF, MDT, MDF);
   LLVM_DEBUG(dump());
   return false;
@@ -275,7 +275,7 @@ void WebAssemblyExceptionInfo::releaseMemory() {
 void WebAssemblyExceptionInfo::getAnalysisUsage(AnalysisUsage &AU) const {
   AU.setPreservesAll();
   AU.addRequired<MachineDominatorTreeWrapperPass>();
-  AU.addRequired<MachineDominanceFrontier>();
+  AU.addRequired<MachineDominanceFrontierWrapperPass>();
   MachineFunctionPass::getAnalysisUsage(AU);
 }
 

>From ecefffbbbb21c8d2258c34a082f403fa2cbed87f Mon Sep 17 00:00:00 2001
From: Anshul Nigham <nigham at google.com>
Date: Tue, 27 Jan 2026 17:12:16 -0800
Subject: [PATCH 5/9] Fix dtor arg

---
 llvm/include/llvm/CodeGen/MachineDominanceFrontier.h | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/llvm/include/llvm/CodeGen/MachineDominanceFrontier.h b/llvm/include/llvm/CodeGen/MachineDominanceFrontier.h
index ed8af63d717ee..11d3c8b4ff949 100644
--- a/llvm/include/llvm/CodeGen/MachineDominanceFrontier.h
+++ b/llvm/include/llvm/CodeGen/MachineDominanceFrontier.h
@@ -82,10 +82,10 @@ class MachineDominanceFrontierWrapperPass : public MachineFunctionPass {
 public:
   MachineDominanceFrontierWrapperPass();
 
-  MachineDominanceFrontierWrapperPass(const MachineDominanceFrontier &) =
-      delete;
+  MachineDominanceFrontierWrapperPass(
+      const MachineDominanceFrontierWrapperPass &) = delete;
   MachineDominanceFrontierWrapperPass &
-  operator=(const MachineDominanceFrontier &) = delete;
+  operator=(const MachineDominanceFrontierWrapperPass &) = delete;
 
   static char ID;
 

>From 9182fba16dbf47d1322fa677783b67c435a1b7c3 Mon Sep 17 00:00:00 2001
From: Anshul Nigham <nigham at google.com>
Date: Tue, 27 Jan 2026 17:23:10 -0800
Subject: [PATCH 6/9] Update MachineDominanceFrontierAnalysis to be stateless.

---
 llvm/include/llvm/CodeGen/MachineDominanceFrontier.h | 1 -
 llvm/lib/CodeGen/MachineDominanceFrontier.cpp        | 1 +
 2 files changed, 1 insertion(+), 1 deletion(-)

diff --git a/llvm/include/llvm/CodeGen/MachineDominanceFrontier.h b/llvm/include/llvm/CodeGen/MachineDominanceFrontier.h
index 11d3c8b4ff949..ceb49294adc73 100644
--- a/llvm/include/llvm/CodeGen/MachineDominanceFrontier.h
+++ b/llvm/include/llvm/CodeGen/MachineDominanceFrontier.h
@@ -102,7 +102,6 @@ class MachineDominanceFrontierAnalysis
     : public AnalysisInfoMixin<MachineDominanceFrontierAnalysis> {
   friend AnalysisInfoMixin<MachineDominanceFrontierAnalysis>;
   static AnalysisKey Key;
-  MachineDominanceFrontier MDF;
 
 public:
   using Result = MachineDominanceFrontier;
diff --git a/llvm/lib/CodeGen/MachineDominanceFrontier.cpp b/llvm/lib/CodeGen/MachineDominanceFrontier.cpp
index 0afa9b5a850dd..b99c34014c64f 100644
--- a/llvm/lib/CodeGen/MachineDominanceFrontier.cpp
+++ b/llvm/lib/CodeGen/MachineDominanceFrontier.cpp
@@ -68,6 +68,7 @@ AnalysisKey MachineDominanceFrontierAnalysis::Key;
 MachineDominanceFrontierAnalysis::Result
 MachineDominanceFrontierAnalysis::run(MachineFunction &MF,
                                       MachineFunctionAnalysisManager &MFAM) {
+  MachineDominanceFrontier MDF;
   auto &MDT = MFAM.getResult<MachineDominatorTreeAnalysis>(MF);
   MDF.analyze(MDT);
   return MDF;

>From 5748d5074218e42ed79f90188054d1a2e33b0c1f Mon Sep 17 00:00:00 2001
From: Anshul Nigham <nigham at google.com>
Date: Fri, 30 Jan 2026 22:34:18 -0800
Subject: [PATCH 7/9] Update MachineDominanceFrontier to inherit from
 ForwardDominanceFrontierBase<MachineBasicBlock>

---
 .../llvm/CodeGen/MachineDominanceFrontier.h   | 48 ++-----------------
 llvm/lib/CodeGen/MachineDominanceFrontier.cpp | 21 ++++----
 2 files changed, 15 insertions(+), 54 deletions(-)

diff --git a/llvm/include/llvm/CodeGen/MachineDominanceFrontier.h b/llvm/include/llvm/CodeGen/MachineDominanceFrontier.h
index ceb49294adc73..ea55a2beea4c6 100644
--- a/llvm/include/llvm/CodeGen/MachineDominanceFrontier.h
+++ b/llvm/include/llvm/CodeGen/MachineDominanceFrontier.h
@@ -19,9 +19,8 @@
 
 namespace llvm {
 
-class MachineDominanceFrontier {
-  ForwardDominanceFrontierBase<MachineBasicBlock> Base;
-
+class MachineDominanceFrontier
+    : public ForwardDominanceFrontierBase<MachineBasicBlock> {
 public:
  using DomTreeT = DomTreeBase<MachineBasicBlock>;
  using DomTreeNodeT = DomTreeNodeBase<MachineBasicBlock>;
@@ -32,47 +31,8 @@ class MachineDominanceFrontier {
 
  MachineDominanceFrontier() = default;
 
- ForwardDominanceFrontierBase<MachineBasicBlock> &getBase() { return Base; }
-
- const SmallVectorImpl<MachineBasicBlock *> &getRoots() const {
-   return Base.getRoots();
-  }
-
-  MachineBasicBlock *getRoot() const {
-    return Base.getRoot();
-  }
-
-  bool isPostDominator() const {
-    return Base.isPostDominator();
-  }
-
-  iterator begin() {
-    return Base.begin();
-  }
-
-  const_iterator begin() const {
-    return Base.begin();
-  }
-
-  iterator end() {
-    return Base.end();
-  }
-
-  const_iterator end() const {
-    return Base.end();
-  }
-
-  iterator find(MachineBasicBlock *B) {
-    return Base.find(B);
-  }
-
-  const_iterator find(MachineBasicBlock *B) const {
-    return Base.find(B);
-  }
-
-  bool analyze(MachineDominatorTree &MDT);
-
-  void releaseMemory();
+ bool invalidate(Function &F, const PreservedAnalyses &PA,
+                 FunctionAnalysisManager::Invalidator &);
 };
 
 class MachineDominanceFrontierWrapperPass : public MachineFunctionPass {
diff --git a/llvm/lib/CodeGen/MachineDominanceFrontier.cpp b/llvm/lib/CodeGen/MachineDominanceFrontier.cpp
index b99c34014c64f..06447e622a493 100644
--- a/llvm/lib/CodeGen/MachineDominanceFrontier.cpp
+++ b/llvm/lib/CodeGen/MachineDominanceFrontier.cpp
@@ -36,15 +36,20 @@ MachineDominanceFrontierWrapperPass::MachineDominanceFrontierWrapperPass()
 char &llvm::MachineDominanceFrontierID =
     MachineDominanceFrontierWrapperPass::ID;
 
+bool MachineDominanceFrontier::invalidate(
+    Function &F, const PreservedAnalyses &PA,
+    FunctionAnalysisManager::Invalidator &) {
+  auto PAC = PA.getChecker<MachineDominanceFrontierAnalysis>();
+  return !(PAC.preserved() ||
+           PAC.preservedSet<AllAnalysesOn<MachineFunction>>() ||
+           PAC.preservedSet<CFGAnalyses>());
+}
+
 bool MachineDominanceFrontierWrapperPass::runOnMachineFunction(
     MachineFunction &) {
+  MDF.releaseMemory();
   auto &MDT = getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree();
-  return MDF.analyze(MDT);
-}
-
-bool MachineDominanceFrontier::analyze(MachineDominatorTree &MDT) {
-  releaseMemory();
-  Base.analyze(MDT);
+  MDF.analyze(MDT);
   return false;
 }
 
@@ -52,10 +57,6 @@ void MachineDominanceFrontierWrapperPass::releaseMemory() {
   MDF.releaseMemory();
 }
 
-void MachineDominanceFrontier::releaseMemory() {
-  Base.releaseMemory();
-}
-
 void MachineDominanceFrontierWrapperPass::getAnalysisUsage(
     AnalysisUsage &AU) const {
   AU.setPreservesAll();

>From 3246064ba02b6e7833562c945debe4ac2fece3ad Mon Sep 17 00:00:00 2001
From: Anshul Nigham <nigham at google.com>
Date: Fri, 30 Jan 2026 22:46:43 -0800
Subject: [PATCH 8/9] Fix types for invalidate arg

---
 llvm/include/llvm/CodeGen/MachineDominanceFrontier.h | 4 ++--
 llvm/lib/CodeGen/MachineDominanceFrontier.cpp        | 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/llvm/include/llvm/CodeGen/MachineDominanceFrontier.h b/llvm/include/llvm/CodeGen/MachineDominanceFrontier.h
index ea55a2beea4c6..bbbd1a546a573 100644
--- a/llvm/include/llvm/CodeGen/MachineDominanceFrontier.h
+++ b/llvm/include/llvm/CodeGen/MachineDominanceFrontier.h
@@ -31,8 +31,8 @@ class MachineDominanceFrontier
 
  MachineDominanceFrontier() = default;
 
- bool invalidate(Function &F, const PreservedAnalyses &PA,
-                 FunctionAnalysisManager::Invalidator &);
+ bool invalidate(MachineFunction &F, const PreservedAnalyses &PA,
+                 MachineFunctionAnalysisManager::Invalidator &);
 };
 
 class MachineDominanceFrontierWrapperPass : public MachineFunctionPass {
diff --git a/llvm/lib/CodeGen/MachineDominanceFrontier.cpp b/llvm/lib/CodeGen/MachineDominanceFrontier.cpp
index 06447e622a493..b229106fdc7ea 100644
--- a/llvm/lib/CodeGen/MachineDominanceFrontier.cpp
+++ b/llvm/lib/CodeGen/MachineDominanceFrontier.cpp
@@ -37,8 +37,8 @@ char &llvm::MachineDominanceFrontierID =
     MachineDominanceFrontierWrapperPass::ID;
 
 bool MachineDominanceFrontier::invalidate(
-    Function &F, const PreservedAnalyses &PA,
-    FunctionAnalysisManager::Invalidator &) {
+    MachineFunction &F, const PreservedAnalyses &PA,
+    MachineFunctionAnalysisManager::Invalidator &) {
   auto PAC = PA.getChecker<MachineDominanceFrontierAnalysis>();
   return !(PAC.preserved() ||
            PAC.preservedSet<AllAnalysesOn<MachineFunction>>() ||

>From fe2e5802ceb4d5c202ae2293c416562fcaf964c8 Mon Sep 17 00:00:00 2001
From: Anshul Nigham <nigham at google.com>
Date: Sat, 31 Jan 2026 09:04:46 -0800
Subject: [PATCH 9/9] Fix WebAssemblyExceptionInfoTest

---
 .../Target/WebAssembly/WebAssemblyExceptionInfoTest.cpp       | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/llvm/unittests/Target/WebAssembly/WebAssemblyExceptionInfoTest.cpp b/llvm/unittests/Target/WebAssembly/WebAssemblyExceptionInfoTest.cpp
index c36ed93a20cef..84c49eb2c8d09 100644
--- a/llvm/unittests/Target/WebAssembly/WebAssemblyExceptionInfoTest.cpp
+++ b/llvm/unittests/Target/WebAssembly/WebAssemblyExceptionInfoTest.cpp
@@ -168,7 +168,7 @@ body: |
   MachineDominatorTree MDT;
   MachineDominanceFrontier MDF;
   MDT.recalculate(*MF);
-  MDF.getBase().analyze(MDT);
+  MDF.analyze(MDT);
   WEI.recalculate(*MF, MDT, MDF);
 
   // Exception info structure:
@@ -342,7 +342,7 @@ body: |
   MachineDominatorTree MDT;
   MachineDominanceFrontier MDF;
   MDT.recalculate(*MF);
-  MDF.getBase().analyze(MDT);
+  MDF.analyze(MDT);
   WEI.recalculate(*MF, MDT, MDF);
 
   // Exception info structure:



More information about the llvm-commits mailing list