[llvm] [DFAJumpThreading] Add MaxOuterUseBlocks threshold (PR #163428)

Nikita Popov via llvm-commits llvm-commits at lists.llvm.org
Wed Oct 29 03:24:52 PDT 2025


================
@@ -0,0 +1,253 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
+; RUN: opt -S -passes=dfa-jump-threading -dfa-max-out-use-blocks=5 %s | FileCheck %s
+
+define void @max_outer_uses_by_switch(i32 %cond) {
----------------
nikic wrote:

Hm, it seems like this doesn't really demonstrate the phi explosion issue. Without the limit you get:
```diff
diff --git a/llvm/test/Transforms/DFAJumpThreading/max-outer-uses.ll b/llvm/test/Transforms/DFAJumpThreading/max-outer-uses.ll
index f059754b8221..24f06c77614c 100644
--- a/llvm/test/Transforms/DFAJumpThreading/max-outer-uses.ll
+++ b/llvm/test/Transforms/DFAJumpThreading/max-outer-uses.ll
@@ -1,5 +1,5 @@
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
-; RUN: opt -S -passes=dfa-jump-threading -dfa-max-out-use-blocks=5 %s | FileCheck %s
+; RUN: opt -S -passes=dfa-jump-threading -dfa-max-out-use-blocks=10 %s | FileCheck %s
 
 define void @max_outer_uses_by_switch(i32 %cond) {
 ; CHECK-LABEL: define void @max_outer_uses_by_switch(
@@ -7,23 +7,36 @@ define void @max_outer_uses_by_switch(i32 %cond) {
 ; CHECK-NEXT:  [[ENTRY:.*]]:
 ; CHECK-NEXT:    br label %[[SWITCH_BB:.*]]
 ; CHECK:       [[SWITCH_BB]]:
-; CHECK-NEXT:    [[PHI:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[ONE:%.*]], %[[CASE1_SUCC:.*]] ], [ 2, %[[CASE2:.*]] ]
+; CHECK-NEXT:    [[PHI:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ poison, %[[CASE1_SUCC:.*]] ]
 ; CHECK-NEXT:    switch i32 [[PHI]], label %[[DEFAULT_DEST:.*]] [
 ; CHECK-NEXT:      i32 0, label %[[CASE1:.*]]
-; CHECK-NEXT:      i32 1, label %[[CASE2]]
+; CHECK-NEXT:      i32 1, label %[[CASE2:.*]]
 ; CHECK-NEXT:    ]
+; CHECK:       [[SWITCH_BB_JT2:.*]]:
+; CHECK-NEXT:    [[PHI_JT2:%.*]] = phi i32 [ 2, %[[CASE2]] ]
+; CHECK-NEXT:    br label %[[DEFAULT_DEST]]
+; CHECK:       [[SWITCH_BB_JT1:.*]]:
+; CHECK-NEXT:    [[PHI_JT1:%.*]] = phi i32 [ [[ONE_JT1:%.*]], %[[CASE1_SUCC_JT1:.*]] ]
+; CHECK-NEXT:    br label %[[CASE2]]
 ; CHECK:       [[CASE1]]:
-; CHECK-NEXT:    br label %[[CASE1_SUCC]]
+; CHECK-NEXT:    br label %[[CASE1_SUCC_JT1]]
 ; CHECK:       [[CASE1_SUCC]]:
-; CHECK-NEXT:    [[ONE]] = phi i32 [ 1, %[[CASE1]] ]
 ; CHECK-NEXT:    switch i32 [[COND]], label %[[SWITCH_BB]] [
 ; CHECK-NEXT:      i32 0, label %[[OUTER1:.*]]
 ; CHECK-NEXT:      i32 1, label %[[OUTER2:.*]]
 ; CHECK-NEXT:      i32 2, label %[[OUTER3:.*]]
 ; CHECK-NEXT:      i32 3, label %[[OUTER4:.*]]
 ; CHECK-NEXT:    ]
+; CHECK:       [[CASE1_SUCC_JT1]]:
+; CHECK-NEXT:    [[ONE_JT1]] = phi i32 [ 1, %[[CASE1]] ]
+; CHECK-NEXT:    switch i32 [[COND]], label %[[SWITCH_BB_JT1]] [
+; CHECK-NEXT:      i32 0, label %[[OUTER1]]
+; CHECK-NEXT:      i32 1, label %[[OUTER2]]
+; CHECK-NEXT:      i32 2, label %[[OUTER3]]
+; CHECK-NEXT:      i32 3, label %[[OUTER4]]
+; CHECK-NEXT:    ]
 ; CHECK:       [[CASE2]]:
-; CHECK-NEXT:    br label %[[SWITCH_BB]]
+; CHECK-NEXT:    br label %[[SWITCH_BB_JT2]]
 ; CHECK:       [[OUTER1]]:
 ; CHECK-NEXT:    ret void
 ; CHECK:       [[OUTER2]]:
```
which does not introduce any new (multi-operand) phis.

https://github.com/llvm/llvm-project/pull/163428


More information about the llvm-commits mailing list