[llvm] [WinEH] Remove incoming values in the reverse order in UpdatePHIOnClonedBlock (NFC) (PR #171962)
Mingjie Xu via llvm-commits
llvm-commits at lists.llvm.org
Fri Dec 12 05:52:58 PST 2025
https://github.com/Enna1 updated https://github.com/llvm/llvm-project/pull/171962
>From e7c9924a1dcd8935cc754aa64f49ac570c3eef7e Mon Sep 17 00:00:00 2001
From: "xumingjie.enna1" <xumingjie.enna1 at bytedance.com>
Date: Wed, 10 Dec 2025 16:51:58 +0800
Subject: [PATCH 1/2] [WinEH] Remove incoming values in the reverse order in
UpdatePHIOnClonedBlock (NFC)
---
llvm/lib/CodeGen/WinEHPrepare.cpp | 12 +++++-------
1 file changed, 5 insertions(+), 7 deletions(-)
diff --git a/llvm/lib/CodeGen/WinEHPrepare.cpp b/llvm/lib/CodeGen/WinEHPrepare.cpp
index 66d29cb5d65e4..dfaa8ac98bc2f 100644
--- a/llvm/lib/CodeGen/WinEHPrepare.cpp
+++ b/llvm/lib/CodeGen/WinEHPrepare.cpp
@@ -1014,9 +1014,10 @@ bool WinEHPrepareImpl::cloneCommonBlocks(Function &F) {
}
auto UpdatePHIOnClonedBlock = [&](PHINode *PN, bool IsForOldBlock) {
- unsigned NumPreds = PN->getNumIncomingValues();
- for (unsigned PredIdx = 0, PredEnd = NumPreds; PredIdx != PredEnd;
- ++PredIdx) {
+ // Remove incoming values in the reverse order to prevent invalidating
+ // index for the incoming values.
+ for (int64_t PredIdx = PN->getNumIncomingValues() - 1; PredIdx >= 0;
+ --PredIdx) {
BasicBlock *IncomingBlock = PN->getIncomingBlock(PredIdx);
bool EdgeTargetsFunclet;
if (auto *CRI =
@@ -1032,10 +1033,7 @@ bool WinEHPrepareImpl::cloneCommonBlocks(Function &F) {
}
if (IsForOldBlock != EdgeTargetsFunclet)
continue;
- PN->removeIncomingValue(IncomingBlock, /*DeletePHIIfEmpty=*/false);
- // Revisit the next entry.
- --PredIdx;
- --PredEnd;
+ PN->removeIncomingValue(PredIdx, /*DeletePHIIfEmpty=*/false);
}
};
>From cd8bcfbecaba1e37a195fafdf24b92113ef06a28 Mon Sep 17 00:00:00 2001
From: "xumingjie.enna1" <xumingjie.enna1 at bytedance.com>
Date: Fri, 12 Dec 2025 21:33:50 +0800
Subject: [PATCH 2/2] use removeIncomingValueIf() as suggested
---
llvm/lib/CodeGen/WinEHPrepare.cpp | 41 +++++++++++++++----------------
1 file changed, 20 insertions(+), 21 deletions(-)
diff --git a/llvm/lib/CodeGen/WinEHPrepare.cpp b/llvm/lib/CodeGen/WinEHPrepare.cpp
index dfaa8ac98bc2f..372fc50eb546e 100644
--- a/llvm/lib/CodeGen/WinEHPrepare.cpp
+++ b/llvm/lib/CodeGen/WinEHPrepare.cpp
@@ -1014,27 +1014,26 @@ bool WinEHPrepareImpl::cloneCommonBlocks(Function &F) {
}
auto UpdatePHIOnClonedBlock = [&](PHINode *PN, bool IsForOldBlock) {
- // Remove incoming values in the reverse order to prevent invalidating
- // index for the incoming values.
- for (int64_t PredIdx = PN->getNumIncomingValues() - 1; PredIdx >= 0;
- --PredIdx) {
- BasicBlock *IncomingBlock = PN->getIncomingBlock(PredIdx);
- bool EdgeTargetsFunclet;
- if (auto *CRI =
- dyn_cast<CatchReturnInst>(IncomingBlock->getTerminator())) {
- EdgeTargetsFunclet = (CRI->getCatchSwitchParentPad() == FuncletToken);
- } else {
- ColorVector &IncomingColors = BlockColors[IncomingBlock];
- assert(!IncomingColors.empty() && "Block not colored!");
- assert((IncomingColors.size() == 1 ||
- !llvm::is_contained(IncomingColors, FuncletPadBB)) &&
- "Cloning should leave this funclet's blocks monochromatic");
- EdgeTargetsFunclet = (IncomingColors.front() == FuncletPadBB);
- }
- if (IsForOldBlock != EdgeTargetsFunclet)
- continue;
- PN->removeIncomingValue(PredIdx, /*DeletePHIIfEmpty=*/false);
- }
+ PN->removeIncomingValueIf(
+ [&](unsigned Idx) {
+ BasicBlock *IncomingBlock = PN->getIncomingBlock(Idx);
+ bool EdgeTargetsFunclet;
+ if (auto *CRI =
+ dyn_cast<CatchReturnInst>(IncomingBlock->getTerminator())) {
+ EdgeTargetsFunclet =
+ (CRI->getCatchSwitchParentPad() == FuncletToken);
+ } else {
+ ColorVector &IncomingColors = BlockColors[IncomingBlock];
+ assert(!IncomingColors.empty() && "Block not colored!");
+ assert(
+ (IncomingColors.size() == 1 ||
+ !llvm::is_contained(IncomingColors, FuncletPadBB)) &&
+ "Cloning should leave this funclet's blocks monochromatic");
+ EdgeTargetsFunclet = (IncomingColors.front() == FuncletPadBB);
+ }
+ return IsForOldBlock == EdgeTargetsFunclet;
+ },
+ /*DeletePHIIfEmpty=*/false);
};
for (auto &BBMapping : Orig2Clone) {
More information about the llvm-commits
mailing list