[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