[llvm] [SSAUpdater][NFC] Limit search for matching phi-node (PR #195744)
via llvm-commits
llvm-commits at lists.llvm.org
Wed May 13 12:05:04 PDT 2026
https://github.com/LU-JOHN updated https://github.com/llvm/llvm-project/pull/195744
>From 96058ad3f2f0d84569f00ccd14e5ee62a98b0162 Mon Sep 17 00:00:00 2001
From: John Lu <John.Lu at amd.com>
Date: Mon, 4 May 2026 16:04:39 -0500
Subject: [PATCH 1/4] Limit search for matching phi-node
Signed-off-by: John Lu <John.Lu at amd.com>
---
.../llvm/Transforms/Utils/SSAUpdaterImpl.h | 11 +
llvm/test/CodeGen/AMDGPU/large-phi-search.ll | 748 ++++++++++++++++++
2 files changed, 759 insertions(+)
create mode 100644 llvm/test/CodeGen/AMDGPU/large-phi-search.ll
diff --git a/llvm/include/llvm/Transforms/Utils/SSAUpdaterImpl.h b/llvm/include/llvm/Transforms/Utils/SSAUpdaterImpl.h
index c4aedbf3159db..402873cd05e90 100644
--- a/llvm/include/llvm/Transforms/Utils/SSAUpdaterImpl.h
+++ b/llvm/include/llvm/Transforms/Utils/SSAUpdaterImpl.h
@@ -414,7 +414,18 @@ class SSAUpdaterImpl {
/// them match what is needed.
void FindExistingPHI(BlkT *BB) {
SmallVector<BBInfo *, 20> TaggedBlocks;
+ // SearchLimit is needed to guard against pathological cases (e.g.
+ // AMDGPU/large-phi-search.ll) where a large number of searches are done
+ // which all fail. Each search adds another PHI node to be searched. In a
+ // 3-stage build of LLVM the maximum search length was 53.
+ constexpr unsigned SearchLimit = 80;
+ unsigned Count = 0;
+
for (auto &SomePHI : BB->phis()) {
+ // Abandon search for match. FindAvailableVals will create a new
+ // phi-node.
+ if (++Count > SearchLimit)
+ break;
if (CheckIfPHIMatches(&SomePHI, TaggedBlocks)) {
RecordMatchingPHIs(TaggedBlocks);
break;
diff --git a/llvm/test/CodeGen/AMDGPU/large-phi-search.ll b/llvm/test/CodeGen/AMDGPU/large-phi-search.ll
new file mode 100644
index 0000000000000..abe39033668fa
--- /dev/null
+++ b/llvm/test/CodeGen/AMDGPU/large-phi-search.ll
@@ -0,0 +1,748 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
+; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 < %s | FileCheck %s
+
+; Pathological case causing O(N^2) behavior in FindExistingPHI in
+; include/llvm/Transforms/Utils/SSAUPdaterImpl.h (402 failing linear
+; searches with search lengths from 1 to 402). This testcase is derived
+; from reduce.cu hipcub/warp where N was 26000+.
+
+declare i32 @llvm.amdgcn.update.dpp.i32(i32, i32, i32 immarg, i32 immarg, i32 immarg, i1 immarg) #0
+
+define amdgpu_kernel void @func(i1 %arg1, float %arg2) {
+; CHECK-LABEL: func:
+; CHECK: ; %bb.0: ; %bb5
+; CHECK-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0
+; CHECK-NEXT: s_mov_b64 s[6:7], -1
+; CHECK-NEXT: s_mov_b64 s[4:5], 0
+; CHECK-NEXT: s_mov_b64 s[8:9], 0
+; CHECK-NEXT: s_waitcnt lgkmcnt(0)
+; CHECK-NEXT: s_bitcmp1_b32 s0, 0
+; CHECK-NEXT: s_cselect_b64 s[0:1], -1, 0
+; CHECK-NEXT: s_xor_b64 s[2:3], s[0:1], -1
+; CHECK-NEXT: s_and_b64 vcc, exec, s[2:3]
+; CHECK-NEXT: s_cbranch_vccz .LBB0_2
+; CHECK-NEXT: ; %bb.1: ; %bb9
+; CHECK-NEXT: s_mov_b64 s[6:7], 0
+; CHECK-NEXT: s_mov_b64 s[8:9], -1
+; CHECK-NEXT: .LBB0_2: ; %Flow
+; CHECK-NEXT: s_andn2_b64 vcc, exec, s[6:7]
+; CHECK-NEXT: s_cbranch_vccnz .LBB0_5
+; CHECK-NEXT: ; %bb.3: ; %bb1
+; CHECK-NEXT: s_mov_b64 s[4:5], -1
+; CHECK-NEXT: s_and_b64 vcc, exec, s[0:1]
+; CHECK-NEXT: s_cbranch_vccz .LBB0_5
+; CHECK-NEXT: ; %bb.4: ; %bb3
+; CHECK-NEXT: s_mov_b64 s[8:9], -1
+; CHECK-NEXT: s_mov_b64 s[4:5], 0
+; CHECK-NEXT: .LBB0_5: ; %Flow3
+; CHECK-NEXT: s_mov_b64 s[6:7], 0
+; CHECK-NEXT: s_and_b64 vcc, exec, s[8:9]
+; CHECK-NEXT: s_cbranch_vccz .LBB0_8
+; CHECK-NEXT: ; %bb.6: ; %bb10
+; CHECK-NEXT: s_mov_b64 s[8:9], -1
+; CHECK-NEXT: s_and_b64 vcc, exec, s[0:1]
+; CHECK-NEXT: s_cbranch_vccz .LBB0_9
+; CHECK-NEXT: ; %bb.7: ; %bb4
+; CHECK-NEXT: s_mov_b64 s[4:5], -1
+; CHECK-NEXT: .LBB0_8:
+; CHECK-NEXT: s_mov_b64 s[8:9], 0
+; CHECK-NEXT: .LBB0_9: ; %Flow5
+; CHECK-NEXT: s_and_b64 vcc, exec, s[4:5]
+; CHECK-NEXT: s_cbranch_vccz .LBB0_11
+; CHECK-NEXT: ; %bb.10: ; %bb11
+; CHECK-NEXT: s_mov_b64 s[6:7], s[2:3]
+; CHECK-NEXT: s_mov_b64 s[8:9], s[0:1]
+; CHECK-NEXT: .LBB0_11: ; %Flow7
+; CHECK-NEXT: s_mov_b64 s[4:5], 0
+; CHECK-NEXT: s_andn2_b64 vcc, exec, s[8:9]
+; CHECK-NEXT: s_mov_b64 s[8:9], 0
+; CHECK-NEXT: s_cbranch_vccnz .LBB0_13
+; CHECK-NEXT: ; %bb.12: ; %bb12
+; CHECK-NEXT: s_mov_b64 s[8:9], s[2:3]
+; CHECK-NEXT: s_mov_b64 s[6:7], s[0:1]
+; CHECK-NEXT: .LBB0_13: ; %Flow8
+; CHECK-NEXT: s_andn2_b64 vcc, exec, s[6:7]
+; CHECK-NEXT: s_cbranch_vccnz .LBB0_15
+; CHECK-NEXT: ; %bb.14: ; %bb13
+; CHECK-NEXT: s_mov_b64 s[4:5], s[2:3]
+; CHECK-NEXT: s_mov_b64 s[8:9], s[0:1]
+; CHECK-NEXT: .LBB0_15: ; %Flow9
+; CHECK-NEXT: s_mov_b64 s[6:7], 0
+; CHECK-NEXT: s_andn2_b64 vcc, exec, s[8:9]
+; CHECK-NEXT: s_mov_b64 s[8:9], 0
+; CHECK-NEXT: s_cbranch_vccnz .LBB0_17
+; CHECK-NEXT: ; %bb.16: ; %bb14
+; CHECK-NEXT: s_mov_b64 s[8:9], s[2:3]
+; CHECK-NEXT: s_mov_b64 s[4:5], s[0:1]
+; CHECK-NEXT: .LBB0_17: ; %Flow10
+; CHECK-NEXT: s_andn2_b64 vcc, exec, s[4:5]
+; CHECK-NEXT: s_cbranch_vccnz .LBB0_19
+; CHECK-NEXT: ; %bb.18: ; %bb15
+; CHECK-NEXT: s_mov_b64 s[6:7], s[2:3]
+; CHECK-NEXT: s_mov_b64 s[8:9], s[0:1]
+; CHECK-NEXT: .LBB0_19: ; %Flow11
+; CHECK-NEXT: s_mov_b64 s[4:5], 0
+; CHECK-NEXT: s_andn2_b64 vcc, exec, s[8:9]
+; CHECK-NEXT: s_mov_b64 s[8:9], 0
+; CHECK-NEXT: s_cbranch_vccnz .LBB0_21
+; CHECK-NEXT: ; %bb.20: ; %bb16
+; CHECK-NEXT: s_mov_b64 s[8:9], s[2:3]
+; CHECK-NEXT: s_mov_b64 s[6:7], s[0:1]
+; CHECK-NEXT: .LBB0_21: ; %Flow12
+; CHECK-NEXT: s_andn2_b64 vcc, exec, s[6:7]
+; CHECK-NEXT: s_cbranch_vccnz .LBB0_23
+; CHECK-NEXT: ; %bb.22: ; %bb17
+; CHECK-NEXT: s_mov_b64 s[4:5], s[2:3]
+; CHECK-NEXT: s_mov_b64 s[8:9], s[0:1]
+; CHECK-NEXT: .LBB0_23: ; %Flow13
+; CHECK-NEXT: s_mov_b64 s[6:7], 0
+; CHECK-NEXT: s_andn2_b64 vcc, exec, s[8:9]
+; CHECK-NEXT: s_mov_b64 s[8:9], 0
+; CHECK-NEXT: s_cbranch_vccnz .LBB0_25
+; CHECK-NEXT: ; %bb.24: ; %bb18
+; CHECK-NEXT: s_mov_b64 s[8:9], s[2:3]
+; CHECK-NEXT: s_mov_b64 s[4:5], s[0:1]
+; CHECK-NEXT: .LBB0_25: ; %Flow14
+; CHECK-NEXT: s_andn2_b64 vcc, exec, s[4:5]
+; CHECK-NEXT: s_cbranch_vccnz .LBB0_27
+; CHECK-NEXT: ; %bb.26: ; %bb19
+; CHECK-NEXT: s_mov_b64 s[6:7], s[2:3]
+; CHECK-NEXT: s_mov_b64 s[8:9], s[0:1]
+; CHECK-NEXT: .LBB0_27: ; %Flow15
+; CHECK-NEXT: s_mov_b64 s[4:5], 0
+; CHECK-NEXT: s_andn2_b64 vcc, exec, s[8:9]
+; CHECK-NEXT: s_mov_b64 s[8:9], 0
+; CHECK-NEXT: s_cbranch_vccnz .LBB0_29
+; CHECK-NEXT: ; %bb.28: ; %bb20
+; CHECK-NEXT: s_mov_b64 s[8:9], s[2:3]
+; CHECK-NEXT: s_mov_b64 s[6:7], s[0:1]
+; CHECK-NEXT: .LBB0_29: ; %Flow16
+; CHECK-NEXT: s_andn2_b64 vcc, exec, s[6:7]
+; CHECK-NEXT: s_cbranch_vccnz .LBB0_31
+; CHECK-NEXT: ; %bb.30: ; %bb21
+; CHECK-NEXT: s_mov_b64 s[4:5], s[2:3]
+; CHECK-NEXT: s_mov_b64 s[8:9], s[0:1]
+; CHECK-NEXT: .LBB0_31: ; %Flow17
+; CHECK-NEXT: s_mov_b64 s[6:7], 0
+; CHECK-NEXT: s_andn2_b64 vcc, exec, s[8:9]
+; CHECK-NEXT: s_mov_b64 s[8:9], 0
+; CHECK-NEXT: s_cbranch_vccnz .LBB0_33
+; CHECK-NEXT: ; %bb.32: ; %bb22
+; CHECK-NEXT: s_mov_b64 s[8:9], s[2:3]
+; CHECK-NEXT: s_mov_b64 s[4:5], s[0:1]
+; CHECK-NEXT: .LBB0_33: ; %Flow18
+; CHECK-NEXT: s_andn2_b64 vcc, exec, s[4:5]
+; CHECK-NEXT: s_cbranch_vccnz .LBB0_35
+; CHECK-NEXT: ; %bb.34: ; %bb23
+; CHECK-NEXT: s_mov_b64 s[6:7], s[2:3]
+; CHECK-NEXT: s_mov_b64 s[8:9], s[0:1]
+; CHECK-NEXT: .LBB0_35: ; %Flow19
+; CHECK-NEXT: s_mov_b64 s[4:5], 0
+; CHECK-NEXT: s_andn2_b64 vcc, exec, s[8:9]
+; CHECK-NEXT: s_mov_b64 s[8:9], 0
+; CHECK-NEXT: s_cbranch_vccnz .LBB0_37
+; CHECK-NEXT: ; %bb.36: ; %bb24
+; CHECK-NEXT: s_mov_b64 s[8:9], s[2:3]
+; CHECK-NEXT: s_mov_b64 s[6:7], s[0:1]
+; CHECK-NEXT: .LBB0_37: ; %Flow20
+; CHECK-NEXT: s_andn2_b64 vcc, exec, s[6:7]
+; CHECK-NEXT: s_cbranch_vccnz .LBB0_39
+; CHECK-NEXT: ; %bb.38: ; %bb25
+; CHECK-NEXT: s_mov_b64 s[4:5], s[2:3]
+; CHECK-NEXT: s_mov_b64 s[8:9], s[0:1]
+; CHECK-NEXT: .LBB0_39: ; %Flow21
+; CHECK-NEXT: s_mov_b64 s[6:7], 0
+; CHECK-NEXT: s_andn2_b64 vcc, exec, s[8:9]
+; CHECK-NEXT: s_mov_b64 s[10:11], 0
+; CHECK-NEXT: s_cbranch_vccnz .LBB0_41
+; CHECK-NEXT: ; %bb.40: ; %bb26
+; CHECK-NEXT: s_mov_b64 s[10:11], s[2:3]
+; CHECK-NEXT: s_mov_b64 s[4:5], s[0:1]
+; CHECK-NEXT: .LBB0_41: ; %Flow22
+; CHECK-NEXT: s_andn2_b64 vcc, exec, s[4:5]
+; CHECK-NEXT: s_cbranch_vccnz .LBB0_43
+; CHECK-NEXT: ; %bb.42: ; %bb27
+; CHECK-NEXT: s_mov_b64 s[6:7], s[2:3]
+; CHECK-NEXT: s_mov_b64 s[10:11], s[0:1]
+; CHECK-NEXT: .LBB0_43: ; %Flow23
+; CHECK-NEXT: s_mov_b64 s[8:9], 0
+; CHECK-NEXT: s_andn2_b64 vcc, exec, s[10:11]
+; CHECK-NEXT: s_mov_b64 s[10:11], 0
+; CHECK-NEXT: s_cbranch_vccnz .LBB0_45
+; CHECK-NEXT: ; %bb.44: ; %bb28
+; CHECK-NEXT: s_mov_b64 s[10:11], s[2:3]
+; CHECK-NEXT: s_mov_b64 s[6:7], s[0:1]
+; CHECK-NEXT: .LBB0_45: ; %Flow24
+; CHECK-NEXT: s_andn2_b64 vcc, exec, s[6:7]
+; CHECK-NEXT: s_cbranch_vccnz .LBB0_47
+; CHECK-NEXT: ; %bb.46: ; %bb29
+; CHECK-NEXT: s_mov_b64 s[8:9], s[2:3]
+; CHECK-NEXT: s_mov_b64 s[10:11], s[0:1]
+; CHECK-NEXT: .LBB0_47: ; %Flow25
+; CHECK-NEXT: s_mov_b64 s[4:5], 0
+; CHECK-NEXT: s_andn2_b64 vcc, exec, s[10:11]
+; CHECK-NEXT: s_mov_b64 s[6:7], 0
+; CHECK-NEXT: s_cbranch_vccnz .LBB0_49
+; CHECK-NEXT: ; %bb.48: ; %bb30
+; CHECK-NEXT: s_mov_b64 s[6:7], s[2:3]
+; CHECK-NEXT: s_mov_b64 s[8:9], s[0:1]
+; CHECK-NEXT: .LBB0_49: ; %Flow26
+; CHECK-NEXT: s_andn2_b64 vcc, exec, s[8:9]
+; CHECK-NEXT: s_cbranch_vccnz .LBB0_51
+; CHECK-NEXT: ; %bb.50: ; %bb31
+; CHECK-NEXT: s_mov_b64 s[4:5], s[2:3]
+; CHECK-NEXT: s_mov_b64 s[6:7], s[0:1]
+; CHECK-NEXT: .LBB0_51: ; %Flow27
+; CHECK-NEXT: s_andn2_b64 vcc, exec, s[6:7]
+; CHECK-NEXT: s_mov_b64 s[6:7], 0
+; CHECK-NEXT: s_cbranch_vccz .LBB0_54
+; CHECK-NEXT: ; %bb.52: ; %Flow28
+; CHECK-NEXT: s_andn2_b64 vcc, exec, s[4:5]
+; CHECK-NEXT: s_cbranch_vccz .LBB0_55
+; CHECK-NEXT: .LBB0_53: ; %Flow29
+; CHECK-NEXT: s_andn2_b64 vcc, exec, s[6:7]
+; CHECK-NEXT: s_endpgm
+; CHECK-NEXT: .LBB0_54: ; %bb32
+; CHECK-NEXT: s_mov_b64 s[6:7], s[2:3]
+; CHECK-NEXT: s_mov_b64 s[4:5], s[0:1]
+; CHECK-NEXT: s_andn2_b64 vcc, exec, s[4:5]
+; CHECK-NEXT: s_cbranch_vccnz .LBB0_53
+; CHECK-NEXT: .LBB0_55: ; %bb33
+; CHECK-NEXT: s_mov_b64 s[6:7], s[0:1]
+; CHECK-NEXT: s_andn2_b64 vcc, exec, s[6:7]
+; CHECK-NEXT: s_endpgm
+bb5:
+ br i1 %arg1, label %bb1, label %bb9
+
+bb1:
+ br i1 %arg1, label %bb3, label %bb11
+
+bb9:
+ br i1 false, label %bb2, label %bb10
+
+bb2:
+ ret void
+
+bb3:
+ %var2 = fadd float 0.000000e+00, %arg2
+ br label %bb10
+
+bb10:
+ %var411 = phi float [ 0.000000e+00, %bb9 ], [ %var2, %bb3 ]
+ br i1 %arg1, label %bb4, label %bb12
+
+bb4:
+ %var3 = fadd float 0.000000e+00, %arg2
+ br label %bb11
+
+bb11:
+ %var4 = phi float [ 0.000000e+00, %bb1 ], [ %var411, %bb4 ]
+ %var5 = phi float [ 1.000000e+00, %bb1 ], [ 0.000000e+00, %bb4 ]
+ %var6 = phi float [ 1.000000e+00, %bb1 ], [ 0.000000e+00, %bb4 ]
+ %var412 = phi float [ 0.000000e+00, %bb1 ], [ %var3, %bb4 ]
+ br i1 %arg1, label %bb12, label %bb13
+
+bb12:
+ %var7 = phi float [ 0.000000e+00, %bb10 ], [ %var412, %bb11 ]
+ %var8 = phi float [ %var411, %bb10 ], [ %var4, %bb11 ]
+ %var9 = phi float [ 0.000000e+00, %bb10 ], [ %var5, %bb11 ]
+ %arg10 = phi float [ 0.000000e+00, %bb10 ], [ %var6, %bb11 ]
+ %var413 = phi float [ 0.000000e+00, %bb10 ], [ 1.000000e+00, %bb11 ]
+ br i1 %arg1, label %bb13, label %bb14
+
+bb13:
+ %arg11 = phi float [ 0.000000e+00, %bb11 ], [ 1.000000e+00, %bb12 ]
+ %arg12 = phi float [ 1.000000e+00, %bb11 ], [ 0.000000e+00, %bb12 ]
+ %arg13 = phi float [ 0.000000e+00, %bb11 ], [ 1.000000e+00, %bb12 ]
+ %arg14 = phi float [ 1.000000e+00, %bb11 ], [ 0.000000e+00, %bb12 ]
+ %arg15 = phi float [ 0.000000e+00, %bb11 ], [ %arg10, %bb12 ]
+ %var414 = phi float [ 0.000000e+00, %bb11 ], [ 1.000000e+00, %bb12 ]
+ br i1 %arg1, label %bb14, label %bb15
+
+bb14:
+ %arg16 = phi float [ 0.000000e+00, %bb12 ], [ %var414, %bb13 ]
+ %arg17 = phi float [ %var413, %bb12 ], [ 0.000000e+00, %bb13 ]
+ %arg18 = phi float [ %var7, %bb12 ], [ 0.000000e+00, %bb13 ]
+ %arg19 = phi float [ %var8, %bb12 ], [ 0.000000e+00, %bb13 ]
+ %var20 = phi float [ %var9, %bb12 ], [ %arg14, %bb13 ]
+ %var21 = phi float [ 0.000000e+00, %bb12 ], [ %arg15, %bb13 ]
+ %var415 = phi float [ 0.000000e+00, %bb12 ], [ 1.000000e+00, %bb13 ]
+ br i1 %arg1, label %bb15, label %bb16
+
+bb15:
+ %var22 = phi float [ 0.000000e+00, %bb13 ], [ %var415, %bb14 ]
+ %var23 = phi float [ 0.000000e+00, %bb13 ], [ %arg16, %bb14 ]
+ %var24 = phi float [ %arg11, %bb13 ], [ 0.000000e+00, %bb14 ]
+ %var25 = phi float [ %arg12, %bb13 ], [ %arg18, %bb14 ]
+ %var26 = phi float [ %arg13, %bb13 ], [ 0.000000e+00, %bb14 ]
+ %var27 = phi float [ 0.000000e+00, %bb13 ], [ %var20, %bb14 ]
+ %var28 = phi float [ 0.000000e+00, %bb13 ], [ %var21, %bb14 ]
+ %var416 = phi float [ 0.000000e+00, %bb13 ], [ 1.000000e+00, %bb14 ]
+ br i1 %arg1, label %bb16, label %bb17
+
+bb16:
+ %var29 = phi float [ 0.000000e+00, %bb14 ], [ 1.000000e+00, %bb15 ]
+ %var30 = phi float [ 1.000000e+00, %bb14 ], [ 0.000000e+00, %bb15 ]
+ %var31 = phi float [ 0.000000e+00, %bb14 ], [ %var23, %bb15 ]
+ %var32 = phi float [ %arg17, %bb14 ], [ 0.000000e+00, %bb15 ]
+ %var33 = phi float [ 0.000000e+00, %bb14 ], [ %var25, %bb15 ]
+ %var34 = phi float [ %arg19, %bb14 ], [ 0.000000e+00, %bb15 ]
+ %var35 = phi float [ 0.000000e+00, %bb14 ], [ %var27, %bb15 ]
+ %var36 = phi float [ 1.000000e+00, %bb14 ], [ 0.000000e+00, %bb15 ]
+ %var417 = phi float [ 0.000000e+00, %bb14 ], [ 1.000000e+00, %bb15 ]
+ br i1 %arg1, label %bb17, label %bb18
+
+bb17:
+ %var37 = phi float [ 0.000000e+00, %bb15 ], [ %var417, %bb16 ]
+ %var38 = phi float [ %var416, %bb15 ], [ 0.000000e+00, %bb16 ]
+ %var39 = phi float [ %var22, %bb15 ], [ 0.000000e+00, %bb16 ]
+ %var40 = phi float [ 0.000000e+00, %bb15 ], [ %var31, %bb16 ]
+ %var41 = phi float [ %var24, %bb15 ], [ 0.000000e+00, %bb16 ]
+ %var42 = phi float [ 0.000000e+00, %bb15 ], [ %var33, %bb16 ]
+ %var43 = phi float [ %var26, %bb15 ], [ 0.000000e+00, %bb16 ]
+ %var44 = phi float [ 0.000000e+00, %bb15 ], [ %var35, %bb16 ]
+ %var45 = phi float [ %var28, %bb15 ], [ 0.000000e+00, %bb16 ]
+ %var418 = phi float [ 0.000000e+00, %bb15 ], [ 1.000000e+00, %bb16 ]
+ br i1 %arg1, label %bb18, label %bb19
+
+bb18:
+ %var46 = phi float [ 0.000000e+00, %bb16 ], [ 1.000000e+00, %bb17 ]
+ %var47 = phi float [ 0.000000e+00, %bb16 ], [ %var37, %bb17 ]
+ %var48 = phi float [ %var29, %bb16 ], [ 0.000000e+00, %bb17 ]
+ %var49 = phi float [ %var30, %bb16 ], [ %var39, %bb17 ]
+ %var50 = phi float [ 0.000000e+00, %bb16 ], [ %var40, %bb17 ]
+ %var51 = phi float [ %var32, %bb16 ], [ 0.000000e+00, %bb17 ]
+ %var52 = phi float [ 0.000000e+00, %bb16 ], [ %var42, %bb17 ]
+ %var53 = phi float [ %var34, %bb16 ], [ 0.000000e+00, %bb17 ]
+ %var54 = phi float [ 0.000000e+00, %bb16 ], [ 1.000000e+00, %bb17 ]
+ %var55 = phi float [ %var36, %bb16 ], [ 0.000000e+00, %bb17 ]
+ %var419 = phi float [ 0.000000e+00, %bb16 ], [ 1.000000e+00, %bb17 ]
+ br i1 %arg1, label %bb19, label %bb20
+
+bb19:
+ %var56 = phi float [ 0.000000e+00, %bb17 ], [ %var419, %bb18 ]
+ %var57 = phi float [ %var418, %bb17 ], [ 0.000000e+00, %bb18 ]
+ %var58 = phi float [ 0.000000e+00, %bb17 ], [ %var47, %bb18 ]
+ %var59 = phi float [ %var38, %bb17 ], [ 0.000000e+00, %bb18 ]
+ %var60 = phi float [ 0.000000e+00, %bb17 ], [ %var49, %bb18 ]
+ %var61 = phi float [ 0.000000e+00, %bb17 ], [ %var50, %bb18 ]
+ %var62 = phi float [ %var41, %bb17 ], [ 0.000000e+00, %bb18 ]
+ %var63 = phi float [ 0.000000e+00, %bb17 ], [ %var52, %bb18 ]
+ %var64 = phi float [ %var43, %bb17 ], [ 0.000000e+00, %bb18 ]
+ %var65 = phi float [ %var44, %bb17 ], [ 0.000000e+00, %bb18 ]
+ %var66 = phi float [ %var45, %bb17 ], [ %var55, %bb18 ]
+ %var420 = phi float [ 0.000000e+00, %bb17 ], [ 1.000000e+00, %bb18 ]
+ br i1 %arg1, label %bb20, label %bb21
+
+bb20:
+ %var67 = phi float [ 0.000000e+00, %bb18 ], [ %var420, %bb19 ]
+ %var68 = phi float [ 0.000000e+00, %bb18 ], [ %var56, %bb19 ]
+ %var69 = phi float [ %var46, %bb18 ], [ 0.000000e+00, %bb19 ]
+ %var70 = phi float [ 0.000000e+00, %bb18 ], [ %var58, %bb19 ]
+ %var71 = phi float [ %var48, %bb18 ], [ 0.000000e+00, %bb19 ]
+ %var72 = phi float [ 0.000000e+00, %bb18 ], [ %var60, %bb19 ]
+ %var73 = phi float [ 1.000000e+00, %bb18 ], [ 0.000000e+00, %bb19 ]
+ %var74 = phi float [ %var51, %bb18 ], [ %var62, %bb19 ]
+ %var75 = phi float [ 1.000000e+00, %bb18 ], [ 0.000000e+00, %bb19 ]
+ %var76 = phi float [ %var53, %bb18 ], [ 0.000000e+00, %bb19 ]
+ %var77 = phi float [ %var54, %bb18 ], [ 0.000000e+00, %bb19 ]
+ %var78 = phi float [ 0.000000e+00, %bb18 ], [ %var66, %bb19 ]
+ %var421 = phi float [ 0.000000e+00, %bb18 ], [ 1.000000e+00, %bb19 ]
+ br i1 %arg1, label %bb21, label %bb22
+
+bb21:
+ %var79 = phi float [ 0.000000e+00, %bb19 ], [ 1.000000e+00, %bb20 ]
+ %var80 = phi float [ 1.000000e+00, %bb19 ], [ 0.000000e+00, %bb20 ]
+ %var81 = phi float [ 0.000000e+00, %bb19 ], [ %var68, %bb20 ]
+ %var82 = phi float [ %var57, %bb19 ], [ 0.000000e+00, %bb20 ]
+ %var83 = phi float [ 0.000000e+00, %bb19 ], [ %var70, %bb20 ]
+ %var84 = phi float [ %var59, %bb19 ], [ 0.000000e+00, %bb20 ]
+ %var85 = phi float [ 0.000000e+00, %bb19 ], [ %var72, %bb20 ]
+ %var86 = phi float [ %var61, %bb19 ], [ 0.000000e+00, %bb20 ]
+ %var87 = phi float [ 0.000000e+00, %bb19 ], [ %var74, %bb20 ]
+ %var88 = phi float [ %var63, %bb19 ], [ 0.000000e+00, %bb20 ]
+ %var89 = phi float [ %var64, %bb19 ], [ 0.000000e+00, %bb20 ]
+ %var90 = phi float [ %var65, %bb19 ], [ 0.000000e+00, %bb20 ]
+ %var91 = phi float [ 0.000000e+00, %bb19 ], [ %var78, %bb20 ]
+ %var422 = phi float [ 0.000000e+00, %bb19 ], [ 1.000000e+00, %bb20 ]
+ br i1 %arg1, label %bb22, label %bb23
+
+bb22:
+ %var92 = phi float [ 0.000000e+00, %bb20 ], [ %var422, %bb21 ]
+ %var93 = phi float [ %var421, %bb20 ], [ 0.000000e+00, %bb21 ]
+ %var94 = phi float [ %var67, %bb20 ], [ %var80, %bb21 ]
+ %var95 = phi float [ 0.000000e+00, %bb20 ], [ %var81, %bb21 ]
+ %var96 = phi float [ %var69, %bb20 ], [ 0.000000e+00, %bb21 ]
+ %var97 = phi float [ 0.000000e+00, %bb20 ], [ %var83, %bb21 ]
+ %var98 = phi float [ %var71, %bb20 ], [ 0.000000e+00, %bb21 ]
+ %var99 = phi float [ 0.000000e+00, %bb20 ], [ %var85, %bb21 ]
+ %arg100 = phi float [ %var73, %bb20 ], [ 0.000000e+00, %bb21 ]
+ %arg101 = phi float [ 0.000000e+00, %bb20 ], [ %var87, %bb21 ]
+ %arg102 = phi float [ %var75, %bb20 ], [ 0.000000e+00, %bb21 ]
+ %arg103 = phi float [ %var76, %bb20 ], [ %var89, %bb21 ]
+ %arg104 = phi float [ %var77, %bb20 ], [ 0.000000e+00, %bb21 ]
+ %arg105 = phi float [ 0.000000e+00, %bb20 ], [ %var91, %bb21 ]
+ %var423 = phi float [ 0.000000e+00, %bb20 ], [ 1.000000e+00, %bb21 ]
+ br i1 %arg1, label %bb23, label %bb24
+
+bb23:
+ %arg106 = phi float [ 0.000000e+00, %bb21 ], [ %var423, %bb22 ]
+ %arg107 = phi float [ 0.000000e+00, %bb21 ], [ %var92, %bb22 ]
+ %arg108 = phi float [ %var79, %bb21 ], [ 0.000000e+00, %bb22 ]
+ %arg109 = phi float [ 0.000000e+00, %bb21 ], [ %var94, %bb22 ]
+ %arg110 = phi float [ 1.000000e+00, %bb21 ], [ 0.000000e+00, %bb22 ]
+ %arg111 = phi float [ %var82, %bb21 ], [ 0.000000e+00, %bb22 ]
+ %arg112 = phi float [ 1.000000e+00, %bb21 ], [ 0.000000e+00, %bb22 ]
+ %arg113 = phi float [ %var84, %bb21 ], [ %var98, %bb22 ]
+ %arg114 = phi float [ 0.000000e+00, %bb21 ], [ %var99, %bb22 ]
+ %arg115 = phi float [ %var86, %bb21 ], [ 0.000000e+00, %bb22 ]
+ %arg116 = phi float [ 0.000000e+00, %bb21 ], [ %arg101, %bb22 ]
+ %arg117 = phi float [ %var88, %bb21 ], [ 0.000000e+00, %bb22 ]
+ %arg118 = phi float [ 0.000000e+00, %bb21 ], [ %arg103, %bb22 ]
+ %arg119 = phi float [ %var90, %bb21 ], [ 0.000000e+00, %bb22 ]
+ %arg120 = phi float [ 0.000000e+00, %bb21 ], [ %arg105, %bb22 ]
+ %var424 = phi float [ 0.000000e+00, %bb21 ], [ 1.000000e+00, %bb22 ]
+ br i1 %arg1, label %bb24, label %bb25
+
+bb24:
+ %arg121 = phi float [ 0.000000e+00, %bb22 ], [ %var424, %bb23 ]
+ %arg122 = phi float [ 0.000000e+00, %bb22 ], [ %arg106, %bb23 ]
+ %arg123 = phi float [ 0.000000e+00, %bb22 ], [ %arg107, %bb23 ]
+ %arg124 = phi float [ %var93, %bb22 ], [ 0.000000e+00, %bb23 ]
+ %arg125 = phi float [ 0.000000e+00, %bb22 ], [ %arg109, %bb23 ]
+ %arg126 = phi float [ %var95, %bb22 ], [ 0.000000e+00, %bb23 ]
+ %arg127 = phi float [ %var96, %bb22 ], [ 0.000000e+00, %bb23 ]
+ %arg128 = phi float [ %var97, %bb22 ], [ 0.000000e+00, %bb23 ]
+ %arg129 = phi float [ 0.000000e+00, %bb22 ], [ %arg113, %bb23 ]
+ %arg130 = phi float [ 0.000000e+00, %bb22 ], [ %arg114, %bb23 ]
+ %arg131 = phi float [ %arg100, %bb22 ], [ 0.000000e+00, %bb23 ]
+ %arg132 = phi float [ 0.000000e+00, %bb22 ], [ %arg116, %bb23 ]
+ %arg133 = phi float [ %arg102, %bb22 ], [ 0.000000e+00, %bb23 ]
+ %arg134 = phi float [ 0.000000e+00, %bb22 ], [ %arg118, %bb23 ]
+ %arg135 = phi float [ %arg104, %bb22 ], [ 0.000000e+00, %bb23 ]
+ %arg136 = phi float [ 0.000000e+00, %bb22 ], [ %arg120, %bb23 ]
+ %var425 = phi float [ 0.000000e+00, %bb22 ], [ 1.000000e+00, %bb23 ]
+ br i1 %arg1, label %bb25, label %bb26
+
+bb25:
+ %arg137 = phi float [ 0.000000e+00, %bb23 ], [ 1.000000e+00, %bb24 ]
+ %arg138 = phi float [ 1.000000e+00, %bb23 ], [ 0.000000e+00, %bb24 ]
+ %arg139 = phi float [ 0.000000e+00, %bb23 ], [ %arg122, %bb24 ]
+ %arg140 = phi float [ 0.000000e+00, %bb23 ], [ 1.000000e+00, %bb24 ]
+ %arg141 = phi float [ %arg108, %bb23 ], [ 0.000000e+00, %bb24 ]
+ %arg142 = phi float [ 0.000000e+00, %bb23 ], [ %arg125, %bb24 ]
+ %arg143 = phi float [ %arg110, %bb23 ], [ 0.000000e+00, %bb24 ]
+ %arg144 = phi float [ %arg111, %bb23 ], [ %arg127, %bb24 ]
+ %arg145 = phi float [ %arg112, %bb23 ], [ 0.000000e+00, %bb24 ]
+ %arg146 = phi float [ 0.000000e+00, %bb23 ], [ %arg129, %bb24 ]
+ %arg147 = phi float [ 0.000000e+00, %bb23 ], [ %arg130, %bb24 ]
+ %arg148 = phi float [ %arg115, %bb23 ], [ 0.000000e+00, %bb24 ]
+ %arg149 = phi float [ 0.000000e+00, %bb23 ], [ %arg132, %bb24 ]
+ %arg150 = phi float [ %arg117, %bb23 ], [ 0.000000e+00, %bb24 ]
+ %arg151 = phi float [ 0.000000e+00, %bb23 ], [ %arg134, %bb24 ]
+ %arg152 = phi float [ %arg119, %bb23 ], [ 0.000000e+00, %bb24 ]
+ %arg153 = phi float [ 0.000000e+00, %bb23 ], [ %arg136, %bb24 ]
+ %var426 = phi float [ 0.000000e+00, %bb23 ], [ 1.000000e+00, %bb24 ]
+ br i1 %arg1, label %bb26, label %bb27
+
+bb26:
+ %arg154 = phi float [ 0.000000e+00, %bb24 ], [ %var426, %bb25 ]
+ %arg155 = phi float [ %var425, %bb24 ], [ 0.000000e+00, %bb25 ]
+ %arg156 = phi float [ %arg121, %bb24 ], [ 0.000000e+00, %bb25 ]
+ %arg157 = phi float [ 0.000000e+00, %bb24 ], [ %arg139, %bb25 ]
+ %arg158 = phi float [ %arg123, %bb24 ], [ 0.000000e+00, %bb25 ]
+ %arg159 = phi float [ %arg124, %bb24 ], [ %arg141, %bb25 ]
+ %arg160 = phi float [ 0.000000e+00, %bb24 ], [ 1.000000e+00, %bb25 ]
+ %arg161 = phi float [ %arg126, %bb24 ], [ 0.000000e+00, %bb25 ]
+ %arg162 = phi float [ 0.000000e+00, %bb24 ], [ %arg144, %bb25 ]
+ %arg163 = phi float [ %arg128, %bb24 ], [ 0.000000e+00, %bb25 ]
+ %arg164 = phi float [ 0.000000e+00, %bb24 ], [ %arg146, %bb25 ]
+ %arg165 = phi float [ 1.000000e+00, %bb24 ], [ 0.000000e+00, %bb25 ]
+ %arg166 = phi float [ %arg131, %bb24 ], [ %arg148, %bb25 ]
+ %arg167 = phi float [ 0.000000e+00, %bb24 ], [ %arg149, %bb25 ]
+ %arg168 = phi float [ %arg133, %bb24 ], [ 0.000000e+00, %bb25 ]
+ %arg169 = phi float [ 0.000000e+00, %bb24 ], [ %arg151, %bb25 ]
+ %arg170 = phi float [ %arg135, %bb24 ], [ 0.000000e+00, %bb25 ]
+ %arg171 = phi float [ 0.000000e+00, %bb24 ], [ %arg153, %bb25 ]
+ %var427 = phi float [ 0.000000e+00, %bb24 ], [ 1.000000e+00, %bb25 ]
+ br i1 %arg1, label %bb27, label %bb28
+
+bb27:
+ %arg172 = phi float [ 0.000000e+00, %bb25 ], [ 1.000000e+00, %bb26 ]
+ %arg173 = phi float [ 0.000000e+00, %bb25 ], [ %arg154, %bb26 ]
+ %arg174 = phi float [ %arg137, %bb25 ], [ 0.000000e+00, %bb26 ]
+ %arg175 = phi float [ %arg138, %bb25 ], [ 0.000000e+00, %bb26 ]
+ %arg176 = phi float [ 0.000000e+00, %bb25 ], [ %arg157, %bb26 ]
+ %arg177 = phi float [ %arg140, %bb25 ], [ 0.000000e+00, %bb26 ]
+ %arg178 = phi float [ 0.000000e+00, %bb25 ], [ %arg159, %bb26 ]
+ %arg179 = phi float [ %arg142, %bb25 ], [ 0.000000e+00, %bb26 ]
+ %arg180 = phi float [ %arg143, %bb25 ], [ %arg161, %bb26 ]
+ %arg181 = phi float [ 1.000000e+00, %bb25 ], [ 0.000000e+00, %bb26 ]
+ %arg182 = phi float [ %arg145, %bb25 ], [ 0.000000e+00, %bb26 ]
+ %arg183 = phi float [ 0.000000e+00, %bb25 ], [ %arg164, %bb26 ]
+ %arg184 = phi float [ %arg147, %bb25 ], [ 0.000000e+00, %bb26 ]
+ %arg185 = phi float [ 0.000000e+00, %bb25 ], [ %arg166, %bb26 ]
+ %arg186 = phi float [ 1.000000e+00, %bb25 ], [ 0.000000e+00, %bb26 ]
+ %arg187 = phi float [ %arg150, %bb25 ], [ 0.000000e+00, %bb26 ]
+ %arg188 = phi float [ 0.000000e+00, %bb25 ], [ %arg169, %bb26 ]
+ %arg189 = phi float [ %arg152, %bb25 ], [ 0.000000e+00, %bb26 ]
+ %arg190 = phi float [ 0.000000e+00, %bb25 ], [ %arg171, %bb26 ]
+ %var428 = phi float [ 0.000000e+00, %bb25 ], [ 1.000000e+00, %bb26 ]
+ br i1 %arg1, label %bb28, label %bb29
+
+bb28:
+ %arg191 = phi float [ 0.000000e+00, %bb26 ], [ %var428, %bb27 ]
+ %arg192 = phi float [ %var427, %bb26 ], [ 0.000000e+00, %bb27 ]
+ %arg193 = phi float [ 0.000000e+00, %bb26 ], [ %arg173, %bb27 ]
+ %arg194 = phi float [ %arg155, %bb26 ], [ 0.000000e+00, %bb27 ]
+ %arg195 = phi float [ %arg156, %bb26 ], [ 0.000000e+00, %bb27 ]
+ %arg196 = phi float [ 0.000000e+00, %bb26 ], [ %arg176, %bb27 ]
+ %arg197 = phi float [ %arg158, %bb26 ], [ 0.000000e+00, %bb27 ]
+ %arg198 = phi float [ 0.000000e+00, %bb26 ], [ %arg178, %bb27 ]
+ %arg199 = phi float [ %arg160, %bb26 ], [ 0.000000e+00, %bb27 ]
+ %var200 = phi float [ 0.000000e+00, %bb26 ], [ %arg180, %bb27 ]
+ %var201 = phi float [ %arg162, %bb26 ], [ 0.000000e+00, %bb27 ]
+ %var202 = phi float [ %arg163, %bb26 ], [ 0.000000e+00, %bb27 ]
+ %var203 = phi float [ 0.000000e+00, %bb26 ], [ %arg183, %bb27 ]
+ %var204 = phi float [ %arg165, %bb26 ], [ 0.000000e+00, %bb27 ]
+ %var205 = phi float [ 0.000000e+00, %bb26 ], [ %arg185, %bb27 ]
+ %var206 = phi float [ %arg167, %bb26 ], [ 0.000000e+00, %bb27 ]
+ %var207 = phi float [ %arg168, %bb26 ], [ 0.000000e+00, %bb27 ]
+ %var208 = phi float [ 0.000000e+00, %bb26 ], [ %arg188, %bb27 ]
+ %var209 = phi float [ %arg170, %bb26 ], [ 0.000000e+00, %bb27 ]
+ %var210 = phi float [ 0.000000e+00, %bb26 ], [ %arg190, %bb27 ]
+ %var429 = phi float [ 0.000000e+00, %bb26 ], [ 1.000000e+00, %bb27 ]
+ br i1 %arg1, label %bb29, label %bb30
+
+bb29:
+ %var211 = phi float [ 0.000000e+00, %bb27 ], [ 1.000000e+00, %bb28 ]
+ %var212 = phi float [ 0.000000e+00, %bb27 ], [ %arg191, %bb28 ]
+ %var213 = phi float [ %arg172, %bb27 ], [ 0.000000e+00, %bb28 ]
+ %var214 = phi float [ 0.000000e+00, %bb27 ], [ %arg193, %bb28 ]
+ %var215 = phi float [ %arg174, %bb27 ], [ 0.000000e+00, %bb28 ]
+ %var216 = phi float [ %arg175, %bb27 ], [ %arg195, %bb28 ]
+ %var217 = phi float [ 0.000000e+00, %bb27 ], [ %arg196, %bb28 ]
+ %var218 = phi float [ %arg177, %bb27 ], [ 0.000000e+00, %bb28 ]
+ %var219 = phi float [ 0.000000e+00, %bb27 ], [ %arg198, %bb28 ]
+ %var220 = phi float [ %arg179, %bb27 ], [ 0.000000e+00, %bb28 ]
+ %var221 = phi float [ 0.000000e+00, %bb27 ], [ %var200, %bb28 ]
+ %var222 = phi float [ %arg181, %bb27 ], [ 0.000000e+00, %bb28 ]
+ %var223 = phi float [ %arg182, %bb27 ], [ 0.000000e+00, %bb28 ]
+ %var224 = phi float [ 0.000000e+00, %bb27 ], [ %var203, %bb28 ]
+ %var225 = phi float [ %arg184, %bb27 ], [ 0.000000e+00, %bb28 ]
+ %var226 = phi float [ 0.000000e+00, %bb27 ], [ %var205, %bb28 ]
+ %var227 = phi float [ %arg186, %bb27 ], [ 0.000000e+00, %bb28 ]
+ %var228 = phi float [ %arg187, %bb27 ], [ 0.000000e+00, %bb28 ]
+ %var229 = phi float [ 0.000000e+00, %bb27 ], [ %var208, %bb28 ]
+ %var230 = phi float [ %arg189, %bb27 ], [ 0.000000e+00, %bb28 ]
+ %var231 = phi float [ 0.000000e+00, %bb27 ], [ %var210, %bb28 ]
+ %var430 = phi float [ 0.000000e+00, %bb27 ], [ 1.000000e+00, %bb28 ]
+ br i1 %arg1, label %bb30, label %bb31
+
+bb30:
+ %var232 = phi float [ 0.000000e+00, %bb28 ], [ %var430, %bb29 ]
+ %var233 = phi float [ %var429, %bb28 ], [ 0.000000e+00, %bb29 ]
+ %var234 = phi float [ 0.000000e+00, %bb28 ], [ %var212, %bb29 ]
+ %var235 = phi float [ %arg192, %bb28 ], [ 0.000000e+00, %bb29 ]
+ %var236 = phi float [ 0.000000e+00, %bb28 ], [ %var214, %bb29 ]
+ %var237 = phi float [ %arg194, %bb28 ], [ 0.000000e+00, %bb29 ]
+ %var238 = phi float [ 0.000000e+00, %bb28 ], [ %var216, %bb29 ]
+ %var239 = phi float [ 0.000000e+00, %bb28 ], [ %var217, %bb29 ]
+ %var240 = phi float [ %arg197, %bb28 ], [ 0.000000e+00, %bb29 ]
+ %var241 = phi float [ 0.000000e+00, %bb28 ], [ %var219, %bb29 ]
+ %var242 = phi float [ %arg199, %bb28 ], [ 0.000000e+00, %bb29 ]
+ %var243 = phi float [ 1.000000e+00, %bb28 ], [ 0.000000e+00, %bb29 ]
+ %var244 = phi float [ %var201, %bb28 ], [ %var222, %bb29 ]
+ %var245 = phi float [ %var202, %bb28 ], [ 0.000000e+00, %bb29 ]
+ %var246 = phi float [ 0.000000e+00, %bb28 ], [ %var224, %bb29 ]
+ %var247 = phi float [ %var204, %bb28 ], [ 0.000000e+00, %bb29 ]
+ %var248 = phi float [ 0.000000e+00, %bb28 ], [ %var226, %bb29 ]
+ %var249 = phi float [ %var206, %bb28 ], [ 0.000000e+00, %bb29 ]
+ %var250 = phi float [ %var207, %bb28 ], [ 0.000000e+00, %bb29 ]
+ %var251 = phi float [ 0.000000e+00, %bb28 ], [ %var229, %bb29 ]
+ %var252 = phi float [ %var209, %bb28 ], [ 0.000000e+00, %bb29 ]
+ %var253 = phi float [ 0.000000e+00, %bb28 ], [ 1.000000e+00, %bb29 ]
+ %var431 = phi float [ 0.000000e+00, %bb28 ], [ 1.000000e+00, %bb29 ]
+ br i1 %arg1, label %bb31, label %bb32
+
+bb31:
+ %var254 = phi float [ 0.000000e+00, %bb29 ], [ %var431, %bb30 ]
+ %var255 = phi float [ 0.000000e+00, %bb29 ], [ %var232, %bb30 ]
+ %var256 = phi float [ %var211, %bb29 ], [ 0.000000e+00, %bb30 ]
+ %var257 = phi float [ 0.000000e+00, %bb29 ], [ %var234, %bb30 ]
+ %var258 = phi float [ %var213, %bb29 ], [ 0.000000e+00, %bb30 ]
+ %var259 = phi float [ 0.000000e+00, %bb29 ], [ %var236, %bb30 ]
+ %var260 = phi float [ %var215, %bb29 ], [ 0.000000e+00, %bb30 ]
+ %var261 = phi float [ 0.000000e+00, %bb29 ], [ %var238, %bb30 ]
+ %var262 = phi float [ 1.000000e+00, %bb29 ], [ 0.000000e+00, %bb30 ]
+ %var263 = phi float [ %var218, %bb29 ], [ 0.000000e+00, %bb30 ]
+ %var264 = phi float [ 0.000000e+00, %bb29 ], [ %var241, %bb30 ]
+ %var265 = phi float [ %var220, %bb29 ], [ %var242, %bb30 ]
+ %var266 = phi float [ %var221, %bb29 ], [ 0.000000e+00, %bb30 ]
+ %var267 = phi float [ 0.000000e+00, %bb29 ], [ %var244, %bb30 ]
+ %var268 = phi float [ %var223, %bb29 ], [ 0.000000e+00, %bb30 ]
+ %var269 = phi float [ 1.000000e+00, %bb29 ], [ 0.000000e+00, %bb30 ]
+ %var270 = phi float [ %var225, %bb29 ], [ 0.000000e+00, %bb30 ]
+ %var271 = phi float [ 0.000000e+00, %bb29 ], [ %var248, %bb30 ]
+ %var272 = phi float [ %var227, %bb29 ], [ %var249, %bb30 ]
+ %var273 = phi float [ %var228, %bb29 ], [ 0.000000e+00, %bb30 ]
+ %var274 = phi float [ 0.000000e+00, %bb29 ], [ %var251, %bb30 ]
+ %var275 = phi float [ %var230, %bb29 ], [ 0.000000e+00, %bb30 ]
+ %var276 = phi float [ %var231, %bb29 ], [ 0.000000e+00, %bb30 ]
+ %var432 = phi float [ 0.000000e+00, %bb29 ], [ 1.000000e+00, %bb30 ]
+ br i1 %arg1, label %bb32, label %bb33
+
+bb32:
+ %var277 = phi float [ 0.000000e+00, %bb30 ], [ 1.000000e+00, %bb31 ]
+ %var278 = phi float [ 1.000000e+00, %bb30 ], [ 0.000000e+00, %bb31 ]
+ %var279 = phi float [ 0.000000e+00, %bb30 ], [ %var255, %bb31 ]
+ %var280 = phi float [ %var233, %bb30 ], [ 0.000000e+00, %bb31 ]
+ %var281 = phi float [ 0.000000e+00, %bb30 ], [ %var257, %bb31 ]
+ %var282 = phi float [ %var235, %bb30 ], [ 0.000000e+00, %bb31 ]
+ %var283 = phi float [ 0.000000e+00, %bb30 ], [ %var259, %bb31 ]
+ %var284 = phi float [ %var237, %bb30 ], [ 0.000000e+00, %bb31 ]
+ %var285 = phi float [ 1.000000e+00, %bb30 ], [ 0.000000e+00, %bb31 ]
+ %var286 = phi float [ %var239, %bb30 ], [ %var262, %bb31 ]
+ %var287 = phi float [ %var240, %bb30 ], [ 0.000000e+00, %bb31 ]
+ %var288 = phi float [ 0.000000e+00, %bb30 ], [ %var264, %bb31 ]
+ %var289 = phi float [ 0.000000e+00, %bb30 ], [ %var265, %bb31 ]
+ %var290 = phi float [ %var243, %bb30 ], [ 0.000000e+00, %bb31 ]
+ %var291 = phi float [ 0.000000e+00, %bb30 ], [ %var267, %bb31 ]
+ %var292 = phi float [ %var245, %bb30 ], [ 0.000000e+00, %bb31 ]
+ %var293 = phi float [ %var246, %bb30 ], [ %var269, %bb31 ]
+ %var294 = phi float [ %var247, %bb30 ], [ 0.000000e+00, %bb31 ]
+ %var295 = phi float [ 0.000000e+00, %bb30 ], [ %var271, %bb31 ]
+ %var296 = phi float [ 0.000000e+00, %bb30 ], [ %var272, %bb31 ]
+ %var297 = phi float [ %var250, %bb30 ], [ 0.000000e+00, %bb31 ]
+ %var298 = phi float [ 0.000000e+00, %bb30 ], [ %var274, %bb31 ]
+ %var299 = phi float [ %var252, %bb30 ], [ 0.000000e+00, %bb31 ]
+ %var300 = phi float [ %var253, %bb30 ], [ %var276, %bb31 ]
+ %var433 = phi float [ 0.000000e+00, %bb30 ], [ 1.000000e+00, %bb31 ]
+ br i1 %arg1, label %bb33, label %bb34
+
+bb33:
+ %var301 = phi float [ 0.000000e+00, %bb31 ], [ %var433, %bb32 ]
+ %var302 = phi float [ %var432, %bb31 ], [ 0.000000e+00, %bb32 ]
+ %var303 = phi float [ %var254, %bb31 ], [ %var278, %bb32 ]
+ %var304 = phi float [ 0.000000e+00, %bb31 ], [ %var279, %bb32 ]
+ %var305 = phi float [ %var256, %bb31 ], [ 0.000000e+00, %bb32 ]
+ %var306 = phi float [ 0.000000e+00, %bb31 ], [ %var281, %bb32 ]
+ %var307 = phi float [ %var258, %bb31 ], [ 0.000000e+00, %bb32 ]
+ %var308 = phi float [ 0.000000e+00, %bb31 ], [ %var283, %bb32 ]
+ %var309 = phi float [ %var260, %bb31 ], [ 0.000000e+00, %bb32 ]
+ %var310 = phi float [ %var261, %bb31 ], [ 0.000000e+00, %bb32 ]
+ %var311 = phi float [ 0.000000e+00, %bb31 ], [ %var286, %bb32 ]
+ %var312 = phi float [ %var263, %bb31 ], [ 0.000000e+00, %bb32 ]
+ %var313 = phi float [ 0.000000e+00, %bb31 ], [ %var288, %bb32 ]
+ %var314 = phi float [ 1.000000e+00, %bb31 ], [ 0.000000e+00, %bb32 ]
+ %var315 = phi float [ %var266, %bb31 ], [ %var290, %bb32 ]
+ %var316 = phi float [ 0.000000e+00, %bb31 ], [ %var291, %bb32 ]
+ %var317 = phi float [ %var268, %bb31 ], [ 0.000000e+00, %bb32 ]
+ %var318 = phi float [ 0.000000e+00, %bb31 ], [ %var293, %bb32 ]
+ %var319 = phi float [ %var270, %bb31 ], [ 0.000000e+00, %bb32 ]
+ %var320 = phi float [ 0.000000e+00, %bb31 ], [ %var295, %bb32 ]
+ %var321 = phi float [ 1.000000e+00, %bb31 ], [ 0.000000e+00, %bb32 ]
+ %var322 = phi float [ %var273, %bb31 ], [ %var297, %bb32 ]
+ %var323 = phi float [ 0.000000e+00, %bb31 ], [ %var298, %bb32 ]
+ %var324 = phi float [ %var275, %bb31 ], [ 0.000000e+00, %bb32 ]
+ %var325 = phi float [ 0.000000e+00, %bb31 ], [ %var300, %bb32 ]
+ %var434 = phi float [ 0.000000e+00, %bb31 ], [ 1.000000e+00, %bb32 ]
+ br i1 %arg1, label %bb34, label %bb35
+
+bb34:
+ %var326 = phi float [ 0.000000e+00, %bb32 ], [ %var434, %bb33 ]
+ %var327 = phi float [ 0.000000e+00, %bb32 ], [ %var301, %bb33 ]
+ %var328 = phi float [ %var277, %bb32 ], [ 0.000000e+00, %bb33 ]
+ %var329 = phi float [ 0.000000e+00, %bb32 ], [ %var303, %bb33 ]
+ %var330 = phi float [ 0.000000e+00, %bb32 ], [ %var304, %bb33 ]
+ %var331 = phi float [ %var280, %bb32 ], [ %var305, %bb33 ]
+ %var332 = phi float [ 0.000000e+00, %bb32 ], [ %var306, %bb33 ]
+ %var333 = phi float [ %var282, %bb32 ], [ 0.000000e+00, %bb33 ]
+ %var334 = phi float [ 0.000000e+00, %bb32 ], [ %var308, %bb33 ]
+ %var335 = phi float [ %var284, %bb32 ], [ 0.000000e+00, %bb33 ]
+ %var336 = phi float [ %var285, %bb32 ], [ %var310, %bb33 ]
+ %var337 = phi float [ 0.000000e+00, %bb32 ], [ %var311, %bb33 ]
+ %var338 = phi float [ %var287, %bb32 ], [ %var312, %bb33 ]
+ %var339 = phi float [ 0.000000e+00, %bb32 ], [ %var313, %bb33 ]
+ %var340 = phi float [ %var289, %bb32 ], [ 0.000000e+00, %bb33 ]
+ %var341 = phi float [ 0.000000e+00, %bb32 ], [ %var315, %bb33 ]
+ %var342 = phi float [ 1.000000e+00, %bb32 ], [ 0.000000e+00, %bb33 ]
+ %var343 = phi float [ %var292, %bb32 ], [ %var317, %bb33 ]
+ %var344 = phi float [ 0.000000e+00, %bb32 ], [ %var318, %bb33 ]
+ %var345 = phi float [ %var294, %bb32 ], [ %var319, %bb33 ]
+ %var346 = phi float [ 0.000000e+00, %bb32 ], [ %var320, %bb33 ]
+ %var347 = phi float [ %var296, %bb32 ], [ 0.000000e+00, %bb33 ]
+ %var348 = phi float [ 0.000000e+00, %bb32 ], [ %var322, %bb33 ]
+ %var349 = phi float [ 1.000000e+00, %bb32 ], [ 0.000000e+00, %bb33 ]
+ %var350 = phi float [ %var299, %bb32 ], [ %var324, %bb33 ]
+ %var351 = phi float [ 0.000000e+00, %bb32 ], [ %var325, %bb33 ]
+ %var435 = phi float [ 0.000000e+00, %bb32 ], [ 1.000000e+00, %bb33 ]
+ br label %bb35
+
+bb35:
+ %var352 = phi float [ 0.000000e+00, %bb33 ], [ %var435, %bb34 ]
+ %var353 = phi float [ 0.000000e+00, %bb33 ], [ %var326, %bb34 ]
+ %var354 = phi float [ 0.000000e+00, %bb33 ], [ %var327, %bb34 ]
+ %var355 = phi float [ %var302, %bb33 ], [ %var328, %bb34 ]
+ %var356 = phi float [ 0.000000e+00, %bb33 ], [ %var329, %bb34 ]
+ %var357 = phi float [ 0.000000e+00, %bb33 ], [ %var330, %bb34 ]
+ %var358 = phi float [ 0.000000e+00, %bb33 ], [ %var331, %bb34 ]
+ %var359 = phi float [ 0.000000e+00, %bb33 ], [ %var332, %bb34 ]
+ %var360 = phi float [ %var307, %bb33 ], [ %var333, %bb34 ]
+ %var361 = phi float [ 0.000000e+00, %bb33 ], [ %var334, %bb34 ]
+ %var362 = phi float [ %var309, %bb33 ], [ %var335, %bb34 ]
+ %var363 = phi float [ 0.000000e+00, %bb33 ], [ %var336, %bb34 ]
+ %var364 = phi float [ 0.000000e+00, %bb33 ], [ %var337, %bb34 ]
+ %var365 = phi float [ 0.000000e+00, %bb33 ], [ %var338, %bb34 ]
+ %var366 = phi float [ 0.000000e+00, %bb33 ], [ %var339, %bb34 ]
+ %var367 = phi float [ %var314, %bb33 ], [ %var340, %bb34 ]
+ %var368 = phi float [ 0.000000e+00, %bb33 ], [ %var341, %bb34 ]
+ %var369 = phi float [ %var316, %bb33 ], [ %var342, %bb34 ]
+ %var370 = phi float [ 0.000000e+00, %bb33 ], [ %var343, %bb34 ]
+ %var371 = phi float [ 0.000000e+00, %bb33 ], [ %var344, %bb34 ]
+ %var372 = phi float [ 0.000000e+00, %bb33 ], [ %var345, %bb34 ]
+ %var373 = phi float [ 0.000000e+00, %bb33 ], [ %var346, %bb34 ]
+ %var374 = phi float [ %var321, %bb33 ], [ %var347, %bb34 ]
+ %var375 = phi float [ 0.000000e+00, %bb33 ], [ %var348, %bb34 ]
+ %var376 = phi float [ %var323, %bb33 ], [ %var349, %bb34 ]
+ %var377 = phi float [ 0.000000e+00, %bb33 ], [ %var350, %bb34 ]
+ %var378 = phi float [ 0.000000e+00, %bb33 ], [ %var351, %bb34 ]
+ %var436 = phi float [ 0.000000e+00, %bb33 ], [ 1.000000e+00, %bb34 ]
+ %var379 = fadd float %var377, %var378
+ %var380 = fadd float %var376, %var379
+ %var381 = fadd float %var375, %var380
+ %var382 = fadd float %var374, %var381
+ %var383 = fadd float %var373, %var382
+ %var384 = fadd float %var372, %var383
+ %var385 = fadd float %var371, %var384
+ %var386 = fadd float %var370, %var385
+ %var387 = fadd float %var369, %var386
+ %var388 = fadd float %var368, %var387
+ %var389 = fadd float %var367, %var388
+ %var390 = fadd float %var366, %var389
+ %var391 = fadd float %var365, %var390
+ %var392 = fadd float %var364, %var391
+ %var393 = fadd float %var363, %var392
+ %var394 = fadd float %var362, %var393
+ %var395 = fadd float %var361, %var394
+ %var396 = fadd float %var360, %var395
+ %var397 = fadd float %var359, %var396
+ %var398 = fadd float %var358, %var397
+ %var399 = fadd float %var357, %var398
+ %var400 = fadd float %var356, %var399
+ %var401 = fadd float %var355, %var400
+ %var402 = fadd float %var354, %var401
+ %var403 = fadd float %var353, %var402
+ %var404 = fadd float %var352, %var403
+ %var405 = fadd float %var436, %var404
+ %bb6 = bitcast float %var405 to i32
+ %var406 = tail call i32 @llvm.amdgcn.update.dpp.i32(i32 0, i32 %bb6, i32 0, i32 0, i32 0, i1 false)
+ %var407 = bitcast i32 %var406 to float
+ %var408 = fadd float %var405, %var407
+ %bb7 = bitcast float %var408 to i32
+ %var409 = tail call i32 @llvm.amdgcn.update.dpp.i32(i32 0, i32 %bb7, i32 0, i32 0, i32 0, i1 false)
+ %var410 = bitcast i32 %var409 to float
+ ret void
+}
+
+attributes #0 = { convergent nocallback nofree nounwind willreturn memory(none) }
>From d900c94fa052c86776c1f19adaf1bde063a5e23f Mon Sep 17 00:00:00 2001
From: John Lu <John.Lu at amd.com>
Date: Tue, 12 May 2026 11:05:39 -0500
Subject: [PATCH 2/4] Make search limit configurable
Signed-off-by: John Lu <John.Lu at amd.com>
---
llvm/include/llvm/Transforms/Utils/SSAUpdaterImpl.h | 7 ++++---
llvm/lib/Transforms/Utils/SSAUpdater.cpp | 6 ++++++
2 files changed, 10 insertions(+), 3 deletions(-)
diff --git a/llvm/include/llvm/Transforms/Utils/SSAUpdaterImpl.h b/llvm/include/llvm/Transforms/Utils/SSAUpdaterImpl.h
index 402873cd05e90..bfcc579a0eabb 100644
--- a/llvm/include/llvm/Transforms/Utils/SSAUpdaterImpl.h
+++ b/llvm/include/llvm/Transforms/Utils/SSAUpdaterImpl.h
@@ -25,6 +25,8 @@
namespace llvm {
+extern cl::opt<unsigned> PhiSearchLimit;
+
template<typename T> class SSAUpdaterTraits;
template<typename UpdaterT>
@@ -414,17 +416,16 @@ class SSAUpdaterImpl {
/// them match what is needed.
void FindExistingPHI(BlkT *BB) {
SmallVector<BBInfo *, 20> TaggedBlocks;
- // SearchLimit is needed to guard against pathological cases (e.g.
+ // PhiSearchLimit is needed to guard against pathological cases (e.g.
// AMDGPU/large-phi-search.ll) where a large number of searches are done
// which all fail. Each search adds another PHI node to be searched. In a
// 3-stage build of LLVM the maximum search length was 53.
- constexpr unsigned SearchLimit = 80;
unsigned Count = 0;
for (auto &SomePHI : BB->phis()) {
// Abandon search for match. FindAvailableVals will create a new
// phi-node.
- if (++Count > SearchLimit)
+ if (++Count > PhiSearchLimit)
break;
if (CheckIfPHIMatches(&SomePHI, TaggedBlocks)) {
RecordMatchingPHIs(TaggedBlocks);
diff --git a/llvm/lib/Transforms/Utils/SSAUpdater.cpp b/llvm/lib/Transforms/Utils/SSAUpdater.cpp
index 49d0d9584347e..2d60222b172d7 100644
--- a/llvm/lib/Transforms/Utils/SSAUpdater.cpp
+++ b/llvm/lib/Transforms/Utils/SSAUpdater.cpp
@@ -236,6 +236,12 @@ void SSAUpdater::RewriteUseAfterInsertions(Use &U) {
namespace llvm {
+cl::opt<unsigned>
+ PhiSearchLimit("phi-search-limit",
+ cl::desc("Limit number of phi-nodes to be searched when "
+ "looking for an existing duplicate."),
+ cl::init(80), cl::Hidden);
+
template<>
class SSAUpdaterTraits<SSAUpdater> {
public:
>From f6422ae4dcf0cde0a63e746dcc7dca4f52c8b8bf Mon Sep 17 00:00:00 2001
From: John Lu <John.Lu at amd.com>
Date: Tue, 12 May 2026 15:51:15 -0500
Subject: [PATCH 3/4] Update variable name
Signed-off-by: John Lu <John.Lu at amd.com>
---
llvm/include/llvm/Transforms/Utils/SSAUpdaterImpl.h | 12 ++++++------
llvm/lib/Transforms/Utils/SSAUpdater.cpp | 10 +++++-----
2 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/llvm/include/llvm/Transforms/Utils/SSAUpdaterImpl.h b/llvm/include/llvm/Transforms/Utils/SSAUpdaterImpl.h
index bfcc579a0eabb..2263e41817dd5 100644
--- a/llvm/include/llvm/Transforms/Utils/SSAUpdaterImpl.h
+++ b/llvm/include/llvm/Transforms/Utils/SSAUpdaterImpl.h
@@ -25,7 +25,7 @@
namespace llvm {
-extern cl::opt<unsigned> PhiSearchLimit;
+extern cl::opt<unsigned> SSAUpdaterPhiSearchLimit;
template<typename T> class SSAUpdaterTraits;
@@ -416,16 +416,16 @@ class SSAUpdaterImpl {
/// them match what is needed.
void FindExistingPHI(BlkT *BB) {
SmallVector<BBInfo *, 20> TaggedBlocks;
- // PhiSearchLimit is needed to guard against pathological cases (e.g.
- // AMDGPU/large-phi-search.ll) where a large number of searches are done
- // which all fail. Each search adds another PHI node to be searched. In a
- // 3-stage build of LLVM the maximum search length was 53.
+ // SSAUpdaterPhiSearchLimit is needed to guard against pathological cases
+ // (e.g. AMDGPU/large-phi-search.ll) where a large number of searches are
+ // done which all fail. Each search adds another PHI node to be searched.
+ // In a 3-stage build of LLVM the maximum search length was 53.
unsigned Count = 0;
for (auto &SomePHI : BB->phis()) {
// Abandon search for match. FindAvailableVals will create a new
// phi-node.
- if (++Count > PhiSearchLimit)
+ if (++Count > SSAUpdaterPhiSearchLimit)
break;
if (CheckIfPHIMatches(&SomePHI, TaggedBlocks)) {
RecordMatchingPHIs(TaggedBlocks);
diff --git a/llvm/lib/Transforms/Utils/SSAUpdater.cpp b/llvm/lib/Transforms/Utils/SSAUpdater.cpp
index 2d60222b172d7..5eeefef028249 100644
--- a/llvm/lib/Transforms/Utils/SSAUpdater.cpp
+++ b/llvm/lib/Transforms/Utils/SSAUpdater.cpp
@@ -236,11 +236,11 @@ void SSAUpdater::RewriteUseAfterInsertions(Use &U) {
namespace llvm {
-cl::opt<unsigned>
- PhiSearchLimit("phi-search-limit",
- cl::desc("Limit number of phi-nodes to be searched when "
- "looking for an existing duplicate."),
- cl::init(80), cl::Hidden);
+cl::opt<unsigned> SSAUpdaterPhiSearchLimit(
+ "phi-search-limit",
+ cl::desc("Limit number of phi-nodes to be searched when "
+ "looking for an existing duplicate."),
+ cl::init(80), cl::Hidden);
template<>
class SSAUpdaterTraits<SSAUpdater> {
>From 3db4383ef730742e425e4081b2291d9f56c7d4e6 Mon Sep 17 00:00:00 2001
From: John Lu <John.Lu at amd.com>
Date: Wed, 13 May 2026 14:04:48 -0500
Subject: [PATCH 4/4] Update option name and test it
Signed-off-by: John Lu <John.Lu at amd.com>
---
llvm/lib/Transforms/Utils/SSAUpdater.cpp | 2 +-
llvm/test/CodeGen/AMDGPU/large-phi-search.ll | 1 +
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/llvm/lib/Transforms/Utils/SSAUpdater.cpp b/llvm/lib/Transforms/Utils/SSAUpdater.cpp
index 5eeefef028249..d60f429e59d4b 100644
--- a/llvm/lib/Transforms/Utils/SSAUpdater.cpp
+++ b/llvm/lib/Transforms/Utils/SSAUpdater.cpp
@@ -237,7 +237,7 @@ void SSAUpdater::RewriteUseAfterInsertions(Use &U) {
namespace llvm {
cl::opt<unsigned> SSAUpdaterPhiSearchLimit(
- "phi-search-limit",
+ "ssaupdater-phi-search-limit",
cl::desc("Limit number of phi-nodes to be searched when "
"looking for an existing duplicate."),
cl::init(80), cl::Hidden);
diff --git a/llvm/test/CodeGen/AMDGPU/large-phi-search.ll b/llvm/test/CodeGen/AMDGPU/large-phi-search.ll
index abe39033668fa..575d453da3b33 100644
--- a/llvm/test/CodeGen/AMDGPU/large-phi-search.ll
+++ b/llvm/test/CodeGen/AMDGPU/large-phi-search.ll
@@ -1,5 +1,6 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 < %s | FileCheck %s
+; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -ssaupdater-phi-search-limit=0 < %s | FileCheck %s
; Pathological case causing O(N^2) behavior in FindExistingPHI in
; include/llvm/Transforms/Utils/SSAUPdaterImpl.h (402 failing linear
More information about the llvm-commits
mailing list