[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