[llvm] [CodeGen][NPM] Fix analysis preservation in UnreachableBlockElim and CodeGenPrepare (PR #171249)

Teja Alaghari via llvm-commits llvm-commits at lists.llvm.org
Mon Dec 8 19:47:08 PST 2025


https://github.com/TejaX-Alaghari updated https://github.com/llvm/llvm-project/pull/171249

>From c173b857a6bb51648faa718d7a1a9f611646c3cd Mon Sep 17 00:00:00 2001
From: Teja Alaghari <teja.alaghari at amd.com>
Date: Mon, 8 Dec 2025 11:43:09 +0530
Subject: [PATCH 1/3] 1. Update MPDT block numbers after removing blocks 2.
 Don't preserve LoopAnalysis in CodeGenPrepare

---
 llvm/lib/CodeGen/CodeGenPrepare.cpp       |  1 -
 llvm/lib/CodeGen/UnreachableBlockElim.cpp | 20 ++++++++++++++++----
 2 files changed, 16 insertions(+), 5 deletions(-)

diff --git a/llvm/lib/CodeGen/CodeGenPrepare.cpp b/llvm/lib/CodeGen/CodeGenPrepare.cpp
index 587c1372b19cb..01f49b8ecccff 100644
--- a/llvm/lib/CodeGen/CodeGenPrepare.cpp
+++ b/llvm/lib/CodeGen/CodeGenPrepare.cpp
@@ -556,7 +556,6 @@ PreservedAnalyses CodeGenPreparePass::run(Function &F,
   PreservedAnalyses PA;
   PA.preserve<TargetLibraryAnalysis>();
   PA.preserve<TargetIRAnalysis>();
-  PA.preserve<LoopAnalysis>();
   return PA;
 }
 
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 3226ec991ed19d081ae1ac43dcb7a38178a075a1 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/3] Remove dead blocks from MPDT as well, along with MDT

---
 llvm/lib/CodeGen/UnreachableBlockElim.cpp | 1 +
 1 file changed, 1 insertion(+)

diff --git a/llvm/lib/CodeGen/UnreachableBlockElim.cpp b/llvm/lib/CodeGen/UnreachableBlockElim.cpp
index 2ef402f0d4f82..2cfcb3cadb318 100644
--- a/llvm/lib/CodeGen/UnreachableBlockElim.cpp
+++ b/llvm/lib/CodeGen/UnreachableBlockElim.cpp
@@ -163,6 +163,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);

>From 536dbd787ffe00c36d914c19c4c2c2a0741f15a6 Mon Sep 17 00:00:00 2001
From: Teja Alaghari <teja.alaghari at amd.com>
Date: Mon, 8 Dec 2025 14:45:48 +0530
Subject: [PATCH 3/3] Declare MPDT as preserved in getAnalysisUsage for legacy
 PM and preserve MPDT in new PM

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

diff --git a/llvm/lib/CodeGen/UnreachableBlockElim.cpp b/llvm/lib/CodeGen/UnreachableBlockElim.cpp
index 2cfcb3cadb318..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(



More information about the llvm-commits mailing list