[llvm] [JumpThreading] Add fast path for single-pred blocks in redirectValuesFromPredecessorsToPhi (PR #173596)

via llvm-commits llvm-commits at lists.llvm.org
Sun Dec 28 22:19:58 PST 2025


https://github.com/int-zjt updated https://github.com/llvm/llvm-project/pull/173596

>From 9958963e59d13b90179c87151d3ef23c3ab3a465 Mon Sep 17 00:00:00 2001
From: "zhangjiatong.0" <zhangjiatong.0 at bytedance.com>
Date: Thu, 11 Dec 2025 19:48:27 +0800
Subject: [PATCH 1/2] [JumpThreading] Add fast path for single-pred blocks in
 redirectValuesFromPredecessorsToPhi

---
 llvm/lib/Transforms/Utils/Local.cpp | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/llvm/lib/Transforms/Utils/Local.cpp b/llvm/lib/Transforms/Utils/Local.cpp
index f7842a235b20d..9e5115d0b0795 100644
--- a/llvm/lib/Transforms/Utils/Local.cpp
+++ b/llvm/lib/Transforms/Utils/Local.cpp
@@ -1077,6 +1077,19 @@ static void redirectValuesFromPredecessorsToPhi(BasicBlock *BB,
   Value *OldVal = PN->removeIncomingValue(BB, false);
   assert(OldVal && "No entry in PHI for Pred BB!");
 
+  // Fast path: If BB has a single predecessor and the incoming value is not
+  // defined in BB itself, we can directly redirect the edge.
+  //
+  // Note: We rely on TryToSimplifyUncondBranchFromEmptyBlock (the caller) to
+  // have already verified via CanPropagatePredecessorsForPHIs that merging
+  // blocks won't introduce value conflicts for any common predecessors.
+  auto *BBSinglePred = BB->getSinglePredecessor();
+  Instruction *OldInst = dyn_cast<Instruction>(OldVal);
+  if (BBSinglePred && OldInst && OldInst->getParent() != BB) {
+    PN->addIncoming(OldVal, BBSinglePred);
+    return;
+  }
+
   IncomingValueMap IncomingValues;
 
   // We are merging two blocks - BB, and the block containing PN - and

>From efc76213c515606b1264094132eccb22694c9635 Mon Sep 17 00:00:00 2001
From: "zhangjiatong.0" <zhangjiatong.0bytedance.com>
Date: Mon, 29 Dec 2025 14:19:30 +0800
Subject: [PATCH 2/2] Replace IncomingValues by a known value

---
 llvm/lib/Transforms/Utils/Local.cpp | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/llvm/lib/Transforms/Utils/Local.cpp b/llvm/lib/Transforms/Utils/Local.cpp
index 9e5115d0b0795..60e89932ae1a7 100644
--- a/llvm/lib/Transforms/Utils/Local.cpp
+++ b/llvm/lib/Transforms/Utils/Local.cpp
@@ -1087,6 +1087,14 @@ static void redirectValuesFromPredecessorsToPhi(BasicBlock *BB,
   Instruction *OldInst = dyn_cast<Instruction>(OldVal);
   if (BBSinglePred && OldInst && OldInst->getParent() != BB) {
     PN->addIncoming(OldVal, BBSinglePred);
+    
+    auto *knownDefine = OldVal;
+    for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i)
+      if (PN->getIncomingBlock(i) == BBSinglePred && !isa<UndefValue>(PN->getIncomingValue(i)))
+        knownDefine = PN->getIncomingValue(i);
+    for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i)
+      if (PN->getIncomingBlock(i) == BBSinglePred)
+        PN->setIncomingValue(i, knownDefine);
     return;
   }
 



More information about the llvm-commits mailing list