[llvm] [SimplifyCFG] Remove all incoming values from OtherDest if OtherDest is unreachable (PR #162677)

via llvm-commits llvm-commits at lists.llvm.org
Thu Oct 9 08:28:07 PDT 2025


https://github.com/dianqk created https://github.com/llvm/llvm-project/pull/162677

Fixes #162585.

#161000 changed `br i1 true, label %if, label %else` to `br label %if`, so we should remove one more incoming value.

>From b5817fb7833d02450c409ee5af8a805b57c71905 Mon Sep 17 00:00:00 2001
From: dianqk <dianqk at dianqk.net>
Date: Thu, 9 Oct 2025 23:12:32 +0800
Subject: [PATCH] [SimplifyCFG] Remove all incoming values from OtherDest if
 OtherDest is unreachable

---
 llvm/lib/Transforms/Utils/SimplifyCFG.cpp     |  6 ++++-
 .../SimplifyCFG/switch-range-to-icmp.ll       | 23 +++++++++++++++++++
 2 files changed, 28 insertions(+), 1 deletion(-)

diff --git a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
index 155fcc50bdebf..9ac3be1e1206a 100644
--- a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
+++ b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
@@ -5959,7 +5959,11 @@ bool SimplifyCFGOpt::turnSwitchRangeIntoICmp(SwitchInst *SI,
     unsigned PreviousEdges = OtherCases->size();
     if (OtherDest == SI->getDefaultDest())
       ++PreviousEdges;
-    for (unsigned I = 0, E = PreviousEdges - 1; I != E; ++I)
+    unsigned E = PreviousEdges - 1;
+    // Remove all incoming values from OtherDest if OtherDest is unreachable.
+    if (NewBI->isUnconditional())
+      ++E;
+    for (unsigned I = 0; I != E; ++I)
       cast<PHINode>(BBI)->removeIncomingValue(SI->getParent());
   }
 
diff --git a/llvm/test/Transforms/SimplifyCFG/switch-range-to-icmp.ll b/llvm/test/Transforms/SimplifyCFG/switch-range-to-icmp.ll
index 0fc3c19edd1f3..a43e7625e6736 100644
--- a/llvm/test/Transforms/SimplifyCFG/switch-range-to-icmp.ll
+++ b/llvm/test/Transforms/SimplifyCFG/switch-range-to-icmp.ll
@@ -401,4 +401,27 @@ b:
   ret i32 %1
 }
 
+define i32 @else_will_be_unreachable(i1 %arg) {
+; CHECK-LABEL: @else_will_be_unreachable(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[I:%.*]] = select i1 [[ARG:%.*]], i32 0, i32 1
+; CHECK-NEXT:    ret i32 [[I]]
+;
+entry:
+  switch i1 %arg, label %else [
+  i1 false, label %if
+  i1 true, label %if
+  ]
+
+if:
+  br i1 %arg, label %else, label %bb
+
+bb:
+  br label %else
+
+else:
+  %i = phi i32 [ 0, %entry ], [ 0, %if ], [ 1, %bb ]
+  ret i32 %i
+}
+
 declare void @bar(ptr nonnull dereferenceable(4))



More information about the llvm-commits mailing list