[llvm] [CodeGen][NPM] Update MPDT similar to MDT after unreachable BB elimination (PR #172421)

Teja Alaghari via llvm-commits llvm-commits at lists.llvm.org
Mon Dec 15 21:10:23 PST 2025


https://github.com/TejaX-Alaghari created https://github.com/llvm/llvm-project/pull/172421

After unreachable machine basic blocks are removed, MPDT should also be updated with the latest block numbers alongside MDT.

>From 6b37746e5c59ef953fe4f198c5ba2250c3bb89ab Mon Sep 17 00:00:00 2001
From: Teja Alaghari <teja.alaghari at amd.com>
Date: Tue, 16 Dec 2025 10:04:06 +0530
Subject: [PATCH 1/2] Update MPDT block numbers after removing unreachable
 blocks

---
 llvm/lib/CodeGen/UnreachableBlockElim.cpp | 20 ++++++++++++++++----
 1 file changed, 16 insertions(+), 4 deletions(-)

diff --git a/llvm/lib/CodeGen/UnreachableBlockElim.cpp b/llvm/lib/CodeGen/UnreachableBlockElim.cpp
index cf8c1a7bd08d0..2ef402f0d4f82 100644
--- a/llvm/lib/CodeGen/UnreachableBlockElim.cpp
+++ b/llvm/lib/CodeGen/UnreachableBlockElim.cpp
@@ -27,6 +27,7 @@
 #include "llvm/CodeGen/MachineFunctionPass.h"
 #include "llvm/CodeGen/MachineInstrBuilder.h"
 #include "llvm/CodeGen/MachineLoopInfo.h"
+#include "llvm/CodeGen/MachinePostDominators.h"
 #include "llvm/CodeGen/MachineRegisterInfo.h"
 #include "llvm/CodeGen/Passes.h"
 #include "llvm/CodeGen/TargetInstrInfo.h"
@@ -75,11 +76,14 @@ PreservedAnalyses UnreachableBlockElimPass::run(Function &F,
 namespace {
 class UnreachableMachineBlockElim {
   MachineDominatorTree *MDT;
+  MachinePostDominatorTree *MPDT;
   MachineLoopInfo *MLI;
 
 public:
-  UnreachableMachineBlockElim(MachineDominatorTree *MDT, MachineLoopInfo *MLI)
-      : MDT(MDT), MLI(MLI) {}
+  UnreachableMachineBlockElim(MachineDominatorTree *MDT,
+                              MachinePostDominatorTree *MPDT,
+                              MachineLoopInfo *MLI)
+      : MDT(MDT), MPDT(MPDT), MLI(MLI) {}
   bool run(MachineFunction &MF);
 };
 
@@ -113,9 +117,10 @@ PreservedAnalyses
 UnreachableMachineBlockElimPass::run(MachineFunction &MF,
                                      MachineFunctionAnalysisManager &AM) {
   auto *MDT = AM.getCachedResult<MachineDominatorTreeAnalysis>(MF);
+  auto *MPDT = AM.getCachedResult<MachinePostDominatorTreeAnalysis>(MF);
   auto *MLI = AM.getCachedResult<MachineLoopAnalysis>(MF);
 
-  if (!UnreachableMachineBlockElim(MDT, MLI).run(MF))
+  if (!UnreachableMachineBlockElim(MDT, MPDT, MLI).run(MF))
     return PreservedAnalyses::all();
 
   return getMachineFunctionPassPreservedAnalyses()
@@ -127,12 +132,16 @@ bool UnreachableMachineBlockElimLegacy::runOnMachineFunction(
     MachineFunction &MF) {
   MachineDominatorTreeWrapperPass *MDTWrapper =
       getAnalysisIfAvailable<MachineDominatorTreeWrapperPass>();
+  MachinePostDominatorTreeWrapperPass *MPDTWrapper =
+      getAnalysisIfAvailable<MachinePostDominatorTreeWrapperPass>();
   MachineDominatorTree *MDT = MDTWrapper ? &MDTWrapper->getDomTree() : nullptr;
+  MachinePostDominatorTree *MPDT =
+      MPDTWrapper ? &MPDTWrapper->getPostDomTree() : nullptr;
   MachineLoopInfoWrapperPass *MLIWrapper =
       getAnalysisIfAvailable<MachineLoopInfoWrapperPass>();
   MachineLoopInfo *MLI = MLIWrapper ? &MLIWrapper->getLI() : nullptr;
 
-  return UnreachableMachineBlockElim(MDT, MLI).run(MF);
+  return UnreachableMachineBlockElim(MDT, MPDT, MLI).run(MF);
 }
 
 bool UnreachableMachineBlockElim::run(MachineFunction &F) {
@@ -221,5 +230,8 @@ bool UnreachableMachineBlockElim::run(MachineFunction &F) {
   if (MDT)
     MDT->updateBlockNumbers();
 
+  if (MPDT)
+    MPDT->updateBlockNumbers();
+
   return (!DeadBlocks.empty() || ModifiedPHI);
 }

>From cd6e00b68cda3e7ff2187e68e95a9970260b1dde Mon Sep 17 00:00:00 2001
From: Teja Alaghari <teja.alaghari at amd.com>
Date: Mon, 8 Dec 2025 14:09:16 +0530
Subject: [PATCH 2/2] Remove dead blocks from MPDT as well as MDT. And declare
 MPDT as preserved for both LPM and NPM.

---
 llvm/lib/CodeGen/UnreachableBlockElim.cpp | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/llvm/lib/CodeGen/UnreachableBlockElim.cpp b/llvm/lib/CodeGen/UnreachableBlockElim.cpp
index 2ef402f0d4f82..73908b4b222ca 100644
--- a/llvm/lib/CodeGen/UnreachableBlockElim.cpp
+++ b/llvm/lib/CodeGen/UnreachableBlockElim.cpp
@@ -110,6 +110,7 @@ void UnreachableMachineBlockElimLegacy::getAnalysisUsage(
     AnalysisUsage &AU) const {
   AU.addPreserved<MachineLoopInfoWrapperPass>();
   AU.addPreserved<MachineDominatorTreeWrapperPass>();
+  AU.addPreserved<MachinePostDominatorTreeWrapperPass>();
   MachineFunctionPass::getAnalysisUsage(AU);
 }
 
@@ -125,7 +126,8 @@ UnreachableMachineBlockElimPass::run(MachineFunction &MF,
 
   return getMachineFunctionPassPreservedAnalyses()
       .preserve<MachineLoopAnalysis>()
-      .preserve<MachineDominatorTreeAnalysis>();
+      .preserve<MachineDominatorTreeAnalysis>()
+      .preserve<MachinePostDominatorTreeAnalysis>();
 }
 
 bool UnreachableMachineBlockElimLegacy::runOnMachineFunction(
@@ -163,6 +165,7 @@ bool UnreachableMachineBlockElim::run(MachineFunction &F) {
       // Update dominator and loop info.
       if (MLI) MLI->removeBlock(&BB);
       if (MDT && MDT->getNode(&BB)) MDT->eraseNode(&BB);
+      if (MPDT && MPDT->getNode(&BB)) MPDT->eraseNode(&BB);
 
       while (!BB.succ_empty()) {
         (*BB.succ_begin())->removePHIsIncomingValuesForPredecessor(BB);



More information about the llvm-commits mailing list