[llvm] [GVN] Track visited nodes in equality propagation to avoid OOM (PR #212265)

Sven van Haastregt via llvm-commits llvm-commits at lists.llvm.org
Mon Aug 3 04:53:05 PDT 2026


https://github.com/svenvh updated https://github.com/llvm/llvm-project/pull/212265

>From ef71392c994223c340d1dc3ab77f6700cb20626e Mon Sep 17 00:00:00 2001
From: Katy Thackray <katy.thackray2 at arm.com>
Date: Mon, 27 Jul 2026 13:45:13 +0100
Subject: [PATCH 1/2] [GVN] Track visited nodes in equality propagation to
 avoid OOM

The added test ended up being out-of-memory (OOM) killed, because GVN
computed the same equality facts through exponentially many paths.
---
 llvm/lib/Transforms/Scalar/GVN.cpp            |   4 +
 .../GVN/select_exponential_blowup.ll          | 295 ++++++++++++++++++
 2 files changed, 299 insertions(+)
 create mode 100644 llvm/test/Transforms/GVN/select_exponential_blowup.ll

diff --git a/llvm/lib/Transforms/Scalar/GVN.cpp b/llvm/lib/Transforms/Scalar/GVN.cpp
index 42fd413423129..c84e2e3235cd6 100644
--- a/llvm/lib/Transforms/Scalar/GVN.cpp
+++ b/llvm/lib/Transforms/Scalar/GVN.cpp
@@ -3092,6 +3092,7 @@ bool GVNPass::propagateEquality(
     Value *LHS, Value *RHS,
     const std::variant<BasicBlockEdge, Instruction *> &Root) {
   SmallVector<std::pair<Value*, Value*>, 4> Worklist;
+  llvm::DenseSet<std::pair<Value *, Value *>> Visited;
   Worklist.push_back(std::make_pair(LHS, RHS));
   bool Changed = false;
   SmallVector<const BasicBlock *> DominatedBlocks;
@@ -3118,6 +3119,9 @@ bool GVNPass::propagateEquality(
     if (isa<Constant>(LHS) && isa<Constant>(RHS))
       continue;
 
+    if (!Visited.insert(std::make_pair(LHS, RHS)).second)
+      continue;
+
     // Prefer a constant on the right-hand side, or an Argument if no constants.
     if (isa<Constant>(LHS) || (isa<Argument>(LHS) && !isa<Constant>(RHS)))
       std::swap(LHS, RHS);
diff --git a/llvm/test/Transforms/GVN/select_exponential_blowup.ll b/llvm/test/Transforms/GVN/select_exponential_blowup.ll
new file mode 100644
index 0000000000000..3332ba2caffb7
--- /dev/null
+++ b/llvm/test/Transforms/GVN/select_exponential_blowup.ll
@@ -0,0 +1,295 @@
+; RUN: opt < %s -passes=gvn -disable-output
+
+; Repeated logical-or selects used to cause GVN equality propagation to
+; rediscover the same equality facts through exponentially many paths.
+
+define void @logical_select_or_worklist_dedup(i1 %c0, ptr %p) {
+entry:
+  br label %bb0
+
+bb0:
+  %p0_0 = getelementptr i1, ptr %p, i64 0
+  %p0_1 = getelementptr i1, ptr %p, i64 1
+  %p0_2 = getelementptr i1, ptr %p, i64 2
+  %x0_0 = load i1, ptr %p0_0
+  %x0_1 = load i1, ptr %p0_1
+  %x0_2 = load i1, ptr %p0_2
+  %s0_0 = select i1 %c0, i1 true, i1 %x0_0
+  %s0_1 = select i1 %c0, i1 true, i1 %x0_1
+  %s0_2 = select i1 %c0, i1 true, i1 %x0_2
+  %o0 = or i1 %s0_0, %s0_1
+  %b0 = or i1 %o0, %s0_2
+  br label %bb1
+
+bb1:
+  %p1_0 = getelementptr i1, ptr %p, i64 3
+  %p1_1 = getelementptr i1, ptr %p, i64 4
+  %p1_2 = getelementptr i1, ptr %p, i64 5
+  %x1_0 = load i1, ptr %p1_0
+  %x1_1 = load i1, ptr %p1_1
+  %x1_2 = load i1, ptr %p1_2
+  %s1_0 = select i1 %b0, i1 true, i1 %x1_0
+  %s1_1 = select i1 %b0, i1 true, i1 %x1_1
+  %s1_2 = select i1 %b0, i1 true, i1 %x1_2
+  %o1 = or i1 %s1_0, %s1_1
+  %b1 = or i1 %o1, %s1_2
+  br label %bb2
+
+bb2:
+  %p2_0 = getelementptr i1, ptr %p, i64 6
+  %p2_1 = getelementptr i1, ptr %p, i64 7
+  %p2_2 = getelementptr i1, ptr %p, i64 8
+  %x2_0 = load i1, ptr %p2_0
+  %x2_1 = load i1, ptr %p2_1
+  %x2_2 = load i1, ptr %p2_2
+  %s2_0 = select i1 %b1, i1 true, i1 %x2_0
+  %s2_1 = select i1 %b1, i1 true, i1 %x2_1
+  %s2_2 = select i1 %b1, i1 true, i1 %x2_2
+  %o2 = or i1 %s2_0, %s2_1
+  %b2 = or i1 %o2, %s2_2
+  br label %bb3
+
+bb3:
+  %p3_0 = getelementptr i1, ptr %p, i64 9
+  %p3_1 = getelementptr i1, ptr %p, i64 10
+  %p3_2 = getelementptr i1, ptr %p, i64 11
+  %x3_0 = load i1, ptr %p3_0
+  %x3_1 = load i1, ptr %p3_1
+  %x3_2 = load i1, ptr %p3_2
+  %s3_0 = select i1 %b2, i1 true, i1 %x3_0
+  %s3_1 = select i1 %b2, i1 true, i1 %x3_1
+  %s3_2 = select i1 %b2, i1 true, i1 %x3_2
+  %o3 = or i1 %s3_0, %s3_1
+  %b3 = or i1 %o3, %s3_2
+  br label %bb4
+
+bb4:
+  %p4_0 = getelementptr i1, ptr %p, i64 12
+  %p4_1 = getelementptr i1, ptr %p, i64 13
+  %p4_2 = getelementptr i1, ptr %p, i64 14
+  %x4_0 = load i1, ptr %p4_0
+  %x4_1 = load i1, ptr %p4_1
+  %x4_2 = load i1, ptr %p4_2
+  %s4_0 = select i1 %b3, i1 true, i1 %x4_0
+  %s4_1 = select i1 %b3, i1 true, i1 %x4_1
+  %s4_2 = select i1 %b3, i1 true, i1 %x4_2
+  %o4 = or i1 %s4_0, %s4_1
+  %b4 = or i1 %o4, %s4_2
+  br label %bb5
+
+bb5:
+  %p5_0 = getelementptr i1, ptr %p, i64 15
+  %p5_1 = getelementptr i1, ptr %p, i64 16
+  %p5_2 = getelementptr i1, ptr %p, i64 17
+  %x5_0 = load i1, ptr %p5_0
+  %x5_1 = load i1, ptr %p5_1
+  %x5_2 = load i1, ptr %p5_2
+  %s5_0 = select i1 %b4, i1 true, i1 %x5_0
+  %s5_1 = select i1 %b4, i1 true, i1 %x5_1
+  %s5_2 = select i1 %b4, i1 true, i1 %x5_2
+  %o5 = or i1 %s5_0, %s5_1
+  %b5 = or i1 %o5, %s5_2
+  br label %bb6
+
+bb6:
+  %p6_0 = getelementptr i1, ptr %p, i64 18
+  %p6_1 = getelementptr i1, ptr %p, i64 19
+  %p6_2 = getelementptr i1, ptr %p, i64 20
+  %x6_0 = load i1, ptr %p6_0
+  %x6_1 = load i1, ptr %p6_1
+  %x6_2 = load i1, ptr %p6_2
+  %s6_0 = select i1 %b5, i1 true, i1 %x6_0
+  %s6_1 = select i1 %b5, i1 true, i1 %x6_1
+  %s6_2 = select i1 %b5, i1 true, i1 %x6_2
+  %o6 = or i1 %s6_0, %s6_1
+  %b6 = or i1 %o6, %s6_2
+  br label %bb7
+
+bb7:
+  %p7_0 = getelementptr i1, ptr %p, i64 21
+  %p7_1 = getelementptr i1, ptr %p, i64 22
+  %p7_2 = getelementptr i1, ptr %p, i64 23
+  %x7_0 = load i1, ptr %p7_0
+  %x7_1 = load i1, ptr %p7_1
+  %x7_2 = load i1, ptr %p7_2
+  %s7_0 = select i1 %b6, i1 true, i1 %x7_0
+  %s7_1 = select i1 %b6, i1 true, i1 %x7_1
+  %s7_2 = select i1 %b6, i1 true, i1 %x7_2
+  %o7 = or i1 %s7_0, %s7_1
+  %b7 = or i1 %o7, %s7_2
+  br label %bb8
+
+bb8:
+  %p8_0 = getelementptr i1, ptr %p, i64 24
+  %p8_1 = getelementptr i1, ptr %p, i64 25
+  %p8_2 = getelementptr i1, ptr %p, i64 26
+  %x8_0 = load i1, ptr %p8_0
+  %x8_1 = load i1, ptr %p8_1
+  %x8_2 = load i1, ptr %p8_2
+  %s8_0 = select i1 %b7, i1 true, i1 %x8_0
+  %s8_1 = select i1 %b7, i1 true, i1 %x8_1
+  %s8_2 = select i1 %b7, i1 true, i1 %x8_2
+  %o8 = or i1 %s8_0, %s8_1
+  %b8 = or i1 %o8, %s8_2
+  br label %bb9
+
+bb9:
+  %p9_0 = getelementptr i1, ptr %p, i64 27
+  %p9_1 = getelementptr i1, ptr %p, i64 28
+  %p9_2 = getelementptr i1, ptr %p, i64 29
+  %x9_0 = load i1, ptr %p9_0
+  %x9_1 = load i1, ptr %p9_1
+  %x9_2 = load i1, ptr %p9_2
+  %s9_0 = select i1 %b8, i1 true, i1 %x9_0
+  %s9_1 = select i1 %b8, i1 true, i1 %x9_1
+  %s9_2 = select i1 %b8, i1 true, i1 %x9_2
+  %o9 = or i1 %s9_0, %s9_1
+  %b9 = or i1 %o9, %s9_2
+  br label %bb10
+
+bb10:
+  %p10_0 = getelementptr i1, ptr %p, i64 30
+  %p10_1 = getelementptr i1, ptr %p, i64 31
+  %p10_2 = getelementptr i1, ptr %p, i64 32
+  %x10_0 = load i1, ptr %p10_0
+  %x10_1 = load i1, ptr %p10_1
+  %x10_2 = load i1, ptr %p10_2
+  %s10_0 = select i1 %b9, i1 true, i1 %x10_0
+  %s10_1 = select i1 %b9, i1 true, i1 %x10_1
+  %s10_2 = select i1 %b9, i1 true, i1 %x10_2
+  %o10 = or i1 %s10_0, %s10_1
+  %b10 = or i1 %o10, %s10_2
+  br label %bb11
+
+bb11:
+  %p11_0 = getelementptr i1, ptr %p, i64 33
+  %p11_1 = getelementptr i1, ptr %p, i64 34
+  %p11_2 = getelementptr i1, ptr %p, i64 35
+  %x11_0 = load i1, ptr %p11_0
+  %x11_1 = load i1, ptr %p11_1
+  %x11_2 = load i1, ptr %p11_2
+  %s11_0 = select i1 %b10, i1 true, i1 %x11_0
+  %s11_1 = select i1 %b10, i1 true, i1 %x11_1
+  %s11_2 = select i1 %b10, i1 true, i1 %x11_2
+  %o11 = or i1 %s11_0, %s11_1
+  %b11 = or i1 %o11, %s11_2
+  br label %bb12
+
+bb12:
+  %p12_0 = getelementptr i1, ptr %p, i64 36
+  %p12_1 = getelementptr i1, ptr %p, i64 37
+  %p12_2 = getelementptr i1, ptr %p, i64 38
+  %x12_0 = load i1, ptr %p12_0
+  %x12_1 = load i1, ptr %p12_1
+  %x12_2 = load i1, ptr %p12_2
+  %s12_0 = select i1 %b11, i1 true, i1 %x12_0
+  %s12_1 = select i1 %b11, i1 true, i1 %x12_1
+  %s12_2 = select i1 %b11, i1 true, i1 %x12_2
+  %o12 = or i1 %s12_0, %s12_1
+  %b12 = or i1 %o12, %s12_2
+  br label %bb13
+
+bb13:
+  %p13_0 = getelementptr i1, ptr %p, i64 39
+  %p13_1 = getelementptr i1, ptr %p, i64 40
+  %p13_2 = getelementptr i1, ptr %p, i64 41
+  %x13_0 = load i1, ptr %p13_0
+  %x13_1 = load i1, ptr %p13_1
+  %x13_2 = load i1, ptr %p13_2
+  %s13_0 = select i1 %b12, i1 true, i1 %x13_0
+  %s13_1 = select i1 %b12, i1 true, i1 %x13_1
+  %s13_2 = select i1 %b12, i1 true, i1 %x13_2
+  %o13 = or i1 %s13_0, %s13_1
+  %b13 = or i1 %o13, %s13_2
+  br label %bb14
+
+bb14:
+  %p14_0 = getelementptr i1, ptr %p, i64 42
+  %p14_1 = getelementptr i1, ptr %p, i64 43
+  %p14_2 = getelementptr i1, ptr %p, i64 44
+  %x14_0 = load i1, ptr %p14_0
+  %x14_1 = load i1, ptr %p14_1
+  %x14_2 = load i1, ptr %p14_2
+  %s14_0 = select i1 %b13, i1 true, i1 %x14_0
+  %s14_1 = select i1 %b13, i1 true, i1 %x14_1
+  %s14_2 = select i1 %b13, i1 true, i1 %x14_2
+  %o14 = or i1 %s14_0, %s14_1
+  %b14 = or i1 %o14, %s14_2
+  br label %bb15
+
+bb15:
+  %p15_0 = getelementptr i1, ptr %p, i64 45
+  %p15_1 = getelementptr i1, ptr %p, i64 46
+  %p15_2 = getelementptr i1, ptr %p, i64 47
+  %x15_0 = load i1, ptr %p15_0
+  %x15_1 = load i1, ptr %p15_1
+  %x15_2 = load i1, ptr %p15_2
+  %s15_0 = select i1 %b14, i1 true, i1 %x15_0
+  %s15_1 = select i1 %b14, i1 true, i1 %x15_1
+  %s15_2 = select i1 %b14, i1 true, i1 %x15_2
+  %o15 = or i1 %s15_0, %s15_1
+  %b15 = or i1 %o15, %s15_2
+  br label %bb16
+
+bb16:
+  %p16_0 = getelementptr i1, ptr %p, i64 48
+  %p16_1 = getelementptr i1, ptr %p, i64 49
+  %p16_2 = getelementptr i1, ptr %p, i64 50
+  %x16_0 = load i1, ptr %p16_0
+  %x16_1 = load i1, ptr %p16_1
+  %x16_2 = load i1, ptr %p16_2
+  %s16_0 = select i1 %b15, i1 true, i1 %x16_0
+  %s16_1 = select i1 %b15, i1 true, i1 %x16_1
+  %s16_2 = select i1 %b15, i1 true, i1 %x16_2
+  %o16 = or i1 %s16_0, %s16_1
+  %b16 = or i1 %o16, %s16_2
+  br label %bb17
+
+bb17:
+  %p17_0 = getelementptr i1, ptr %p, i64 51
+  %p17_1 = getelementptr i1, ptr %p, i64 52
+  %p17_2 = getelementptr i1, ptr %p, i64 53
+  %x17_0 = load i1, ptr %p17_0
+  %x17_1 = load i1, ptr %p17_1
+  %x17_2 = load i1, ptr %p17_2
+  %s17_0 = select i1 %b16, i1 true, i1 %x17_0
+  %s17_1 = select i1 %b16, i1 true, i1 %x17_1
+  %s17_2 = select i1 %b16, i1 true, i1 %x17_2
+  %o17 = or i1 %s17_0, %s17_1
+  %b17 = or i1 %o17, %s17_2
+  br label %bb18
+
+bb18:
+  %p18_0 = getelementptr i1, ptr %p, i64 54
+  %p18_1 = getelementptr i1, ptr %p, i64 55
+  %p18_2 = getelementptr i1, ptr %p, i64 56
+  %x18_0 = load i1, ptr %p18_0
+  %x18_1 = load i1, ptr %p18_1
+  %x18_2 = load i1, ptr %p18_2
+  %s18_0 = select i1 %b17, i1 true, i1 %x18_0
+  %s18_1 = select i1 %b17, i1 true, i1 %x18_1
+  %s18_2 = select i1 %b17, i1 true, i1 %x18_2
+  %o18 = or i1 %s18_0, %s18_1
+  %b18 = or i1 %o18, %s18_2
+  br label %bb19
+
+bb19:
+  %p19_0 = getelementptr i1, ptr %p, i64 57
+  %p19_1 = getelementptr i1, ptr %p, i64 58
+  %p19_2 = getelementptr i1, ptr %p, i64 59
+  %x19_0 = load i1, ptr %p19_0
+  %x19_1 = load i1, ptr %p19_1
+  %x19_2 = load i1, ptr %p19_2
+  %s19_0 = select i1 %b18, i1 true, i1 %x19_0
+  %s19_1 = select i1 %b18, i1 true, i1 %x19_1
+  %s19_2 = select i1 %b18, i1 true, i1 %x19_2
+  %o19 = or i1 %s19_0, %s19_1
+  %b19 = or i1 %o19, %s19_2
+  br i1 %b19, label %true_block, label %false_block
+
+true_block:
+  ret void
+
+false_block:
+  ret void
+}

>From f596a3985f2b49ac4c18d785a673d02693d6d242 Mon Sep 17 00:00:00 2001
From: Katy Thackray <katy.thackray2 at arm.com>
Date: Mon, 3 Aug 2026 11:53:51 +0100
Subject: [PATCH 2/2] Alter test and add autogenerated check lines

---
 llvm/lib/Transforms/Scalar/GVN.cpp            |   4 +-
 .../GVN/select_exponential_blowup.ll          | 521 +++++++++---------
 2 files changed, 255 insertions(+), 270 deletions(-)

diff --git a/llvm/lib/Transforms/Scalar/GVN.cpp b/llvm/lib/Transforms/Scalar/GVN.cpp
index c84e2e3235cd6..8620a9e0c3865 100644
--- a/llvm/lib/Transforms/Scalar/GVN.cpp
+++ b/llvm/lib/Transforms/Scalar/GVN.cpp
@@ -3092,7 +3092,7 @@ bool GVNPass::propagateEquality(
     Value *LHS, Value *RHS,
     const std::variant<BasicBlockEdge, Instruction *> &Root) {
   SmallVector<std::pair<Value*, Value*>, 4> Worklist;
-  llvm::DenseSet<std::pair<Value *, Value *>> Visited;
+  DenseSet<std::pair<Value *, Value *>> Visited;
   Worklist.push_back(std::make_pair(LHS, RHS));
   bool Changed = false;
   SmallVector<const BasicBlock *> DominatedBlocks;
@@ -3119,7 +3119,7 @@ bool GVNPass::propagateEquality(
     if (isa<Constant>(LHS) && isa<Constant>(RHS))
       continue;
 
-    if (!Visited.insert(std::make_pair(LHS, RHS)).second)
+    if (!Visited.insert({LHS, RHS}).second)
       continue;
 
     // Prefer a constant on the right-hand side, or an Argument if no constants.
diff --git a/llvm/test/Transforms/GVN/select_exponential_blowup.ll b/llvm/test/Transforms/GVN/select_exponential_blowup.ll
index 3332ba2caffb7..7538482f9b060 100644
--- a/llvm/test/Transforms/GVN/select_exponential_blowup.ll
+++ b/llvm/test/Transforms/GVN/select_exponential_blowup.ll
@@ -1,291 +1,276 @@
-; RUN: opt < %s -passes=gvn -disable-output
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
+; RUN: opt < %s -passes=gvn -S | FileCheck %s
 
 ; Repeated logical-or selects used to cause GVN equality propagation to
 ; rediscover the same equality facts through exponentially many paths.
 
-define void @logical_select_or_worklist_dedup(i1 %c0, ptr %p) {
+define void @logical_select_or_worklist_dedup(i1 %initial_cond, i1 %leaf_a, i1 %leaf_b, i1 %leaf_c, i1 %leaf_d) {
+; CHECK-LABEL: define void @logical_select_or_worklist_dedup(
+; CHECK-SAME: i1 [[INITIAL_COND:%.*]], i1 [[LEAF_A:%.*]], i1 [[LEAF_B:%.*]], i1 [[LEAF_C:%.*]], i1 [[LEAF_D:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    [[STAGE0_SELECT_A:%.*]] = select i1 [[INITIAL_COND]], i1 true, i1 [[LEAF_A]]
+; CHECK-NEXT:    [[STAGE0_SELECT_B:%.*]] = select i1 [[INITIAL_COND]], i1 true, i1 [[LEAF_B]]
+; CHECK-NEXT:    [[STAGE0_SELECT_C:%.*]] = select i1 [[INITIAL_COND]], i1 true, i1 [[LEAF_C]]
+; CHECK-NEXT:    [[STAGE0_SELECT_D:%.*]] = select i1 [[INITIAL_COND]], i1 true, i1 [[LEAF_D]]
+; CHECK-NEXT:    [[STAGE0_OR_AB:%.*]] = or i1 [[STAGE0_SELECT_A]], [[STAGE0_SELECT_B]]
+; CHECK-NEXT:    [[STAGE0_OR_CD:%.*]] = or i1 [[STAGE0_SELECT_C]], [[STAGE0_SELECT_D]]
+; CHECK-NEXT:    [[STAGE0_RESULT:%.*]] = or i1 [[STAGE0_OR_AB]], [[STAGE0_OR_CD]]
+; CHECK-NEXT:    [[STAGE1_SELECT_A:%.*]] = select i1 [[STAGE0_RESULT]], i1 true, i1 [[LEAF_A]]
+; CHECK-NEXT:    [[STAGE1_SELECT_B:%.*]] = select i1 [[STAGE0_RESULT]], i1 true, i1 [[LEAF_B]]
+; CHECK-NEXT:    [[STAGE1_SELECT_C:%.*]] = select i1 [[STAGE0_RESULT]], i1 true, i1 [[LEAF_C]]
+; CHECK-NEXT:    [[STAGE1_SELECT_D:%.*]] = select i1 [[STAGE0_RESULT]], i1 true, i1 [[LEAF_D]]
+; CHECK-NEXT:    [[STAGE1_OR_AB:%.*]] = or i1 [[STAGE1_SELECT_A]], [[STAGE1_SELECT_B]]
+; CHECK-NEXT:    [[STAGE1_OR_CD:%.*]] = or i1 [[STAGE1_SELECT_C]], [[STAGE1_SELECT_D]]
+; CHECK-NEXT:    [[STAGE1_RESULT:%.*]] = or i1 [[STAGE1_OR_AB]], [[STAGE1_OR_CD]]
+; CHECK-NEXT:    [[STAGE2_SELECT_A:%.*]] = select i1 [[STAGE1_RESULT]], i1 true, i1 [[LEAF_A]]
+; CHECK-NEXT:    [[STAGE2_SELECT_B:%.*]] = select i1 [[STAGE1_RESULT]], i1 true, i1 [[LEAF_B]]
+; CHECK-NEXT:    [[STAGE2_SELECT_C:%.*]] = select i1 [[STAGE1_RESULT]], i1 true, i1 [[LEAF_C]]
+; CHECK-NEXT:    [[STAGE2_SELECT_D:%.*]] = select i1 [[STAGE1_RESULT]], i1 true, i1 [[LEAF_D]]
+; CHECK-NEXT:    [[STAGE2_OR_AB:%.*]] = or i1 [[STAGE2_SELECT_A]], [[STAGE2_SELECT_B]]
+; CHECK-NEXT:    [[STAGE2_OR_CD:%.*]] = or i1 [[STAGE2_SELECT_C]], [[STAGE2_SELECT_D]]
+; CHECK-NEXT:    [[STAGE2_RESULT:%.*]] = or i1 [[STAGE2_OR_AB]], [[STAGE2_OR_CD]]
+; CHECK-NEXT:    [[STAGE3_SELECT_A:%.*]] = select i1 [[STAGE2_RESULT]], i1 true, i1 [[LEAF_A]]
+; CHECK-NEXT:    [[STAGE3_SELECT_B:%.*]] = select i1 [[STAGE2_RESULT]], i1 true, i1 [[LEAF_B]]
+; CHECK-NEXT:    [[STAGE3_SELECT_C:%.*]] = select i1 [[STAGE2_RESULT]], i1 true, i1 [[LEAF_C]]
+; CHECK-NEXT:    [[STAGE3_SELECT_D:%.*]] = select i1 [[STAGE2_RESULT]], i1 true, i1 [[LEAF_D]]
+; CHECK-NEXT:    [[STAGE3_OR_AB:%.*]] = or i1 [[STAGE3_SELECT_A]], [[STAGE3_SELECT_B]]
+; CHECK-NEXT:    [[STAGE3_OR_CD:%.*]] = or i1 [[STAGE3_SELECT_C]], [[STAGE3_SELECT_D]]
+; CHECK-NEXT:    [[STAGE3_RESULT:%.*]] = or i1 [[STAGE3_OR_AB]], [[STAGE3_OR_CD]]
+; CHECK-NEXT:    [[STAGE4_SELECT_A:%.*]] = select i1 [[STAGE3_RESULT]], i1 true, i1 [[LEAF_A]]
+; CHECK-NEXT:    [[STAGE4_SELECT_B:%.*]] = select i1 [[STAGE3_RESULT]], i1 true, i1 [[LEAF_B]]
+; CHECK-NEXT:    [[STAGE4_SELECT_C:%.*]] = select i1 [[STAGE3_RESULT]], i1 true, i1 [[LEAF_C]]
+; CHECK-NEXT:    [[STAGE4_SELECT_D:%.*]] = select i1 [[STAGE3_RESULT]], i1 true, i1 [[LEAF_D]]
+; CHECK-NEXT:    [[STAGE4_OR_AB:%.*]] = or i1 [[STAGE4_SELECT_A]], [[STAGE4_SELECT_B]]
+; CHECK-NEXT:    [[STAGE4_OR_CD:%.*]] = or i1 [[STAGE4_SELECT_C]], [[STAGE4_SELECT_D]]
+; CHECK-NEXT:    [[STAGE4_RESULT:%.*]] = or i1 [[STAGE4_OR_AB]], [[STAGE4_OR_CD]]
+; CHECK-NEXT:    [[STAGE5_SELECT_A:%.*]] = select i1 [[STAGE4_RESULT]], i1 true, i1 [[LEAF_A]]
+; CHECK-NEXT:    [[STAGE5_SELECT_B:%.*]] = select i1 [[STAGE4_RESULT]], i1 true, i1 [[LEAF_B]]
+; CHECK-NEXT:    [[STAGE5_SELECT_C:%.*]] = select i1 [[STAGE4_RESULT]], i1 true, i1 [[LEAF_C]]
+; CHECK-NEXT:    [[STAGE5_SELECT_D:%.*]] = select i1 [[STAGE4_RESULT]], i1 true, i1 [[LEAF_D]]
+; CHECK-NEXT:    [[STAGE5_OR_AB:%.*]] = or i1 [[STAGE5_SELECT_A]], [[STAGE5_SELECT_B]]
+; CHECK-NEXT:    [[STAGE5_OR_CD:%.*]] = or i1 [[STAGE5_SELECT_C]], [[STAGE5_SELECT_D]]
+; CHECK-NEXT:    [[STAGE5_RESULT:%.*]] = or i1 [[STAGE5_OR_AB]], [[STAGE5_OR_CD]]
+; CHECK-NEXT:    [[STAGE6_SELECT_A:%.*]] = select i1 [[STAGE5_RESULT]], i1 true, i1 [[LEAF_A]]
+; CHECK-NEXT:    [[STAGE6_SELECT_B:%.*]] = select i1 [[STAGE5_RESULT]], i1 true, i1 [[LEAF_B]]
+; CHECK-NEXT:    [[STAGE6_SELECT_C:%.*]] = select i1 [[STAGE5_RESULT]], i1 true, i1 [[LEAF_C]]
+; CHECK-NEXT:    [[STAGE6_SELECT_D:%.*]] = select i1 [[STAGE5_RESULT]], i1 true, i1 [[LEAF_D]]
+; CHECK-NEXT:    [[STAGE6_OR_AB:%.*]] = or i1 [[STAGE6_SELECT_A]], [[STAGE6_SELECT_B]]
+; CHECK-NEXT:    [[STAGE6_OR_CD:%.*]] = or i1 [[STAGE6_SELECT_C]], [[STAGE6_SELECT_D]]
+; CHECK-NEXT:    [[STAGE6_RESULT:%.*]] = or i1 [[STAGE6_OR_AB]], [[STAGE6_OR_CD]]
+; CHECK-NEXT:    [[STAGE7_SELECT_A:%.*]] = select i1 [[STAGE6_RESULT]], i1 true, i1 [[LEAF_A]]
+; CHECK-NEXT:    [[STAGE7_SELECT_B:%.*]] = select i1 [[STAGE6_RESULT]], i1 true, i1 [[LEAF_B]]
+; CHECK-NEXT:    [[STAGE7_SELECT_C:%.*]] = select i1 [[STAGE6_RESULT]], i1 true, i1 [[LEAF_C]]
+; CHECK-NEXT:    [[STAGE7_SELECT_D:%.*]] = select i1 [[STAGE6_RESULT]], i1 true, i1 [[LEAF_D]]
+; CHECK-NEXT:    [[STAGE7_OR_AB:%.*]] = or i1 [[STAGE7_SELECT_A]], [[STAGE7_SELECT_B]]
+; CHECK-NEXT:    [[STAGE7_OR_CD:%.*]] = or i1 [[STAGE7_SELECT_C]], [[STAGE7_SELECT_D]]
+; CHECK-NEXT:    [[STAGE7_RESULT:%.*]] = or i1 [[STAGE7_OR_AB]], [[STAGE7_OR_CD]]
+; CHECK-NEXT:    [[STAGE8_SELECT_A:%.*]] = select i1 [[STAGE7_RESULT]], i1 true, i1 [[LEAF_A]]
+; CHECK-NEXT:    [[STAGE8_SELECT_B:%.*]] = select i1 [[STAGE7_RESULT]], i1 true, i1 [[LEAF_B]]
+; CHECK-NEXT:    [[STAGE8_SELECT_C:%.*]] = select i1 [[STAGE7_RESULT]], i1 true, i1 [[LEAF_C]]
+; CHECK-NEXT:    [[STAGE8_SELECT_D:%.*]] = select i1 [[STAGE7_RESULT]], i1 true, i1 [[LEAF_D]]
+; CHECK-NEXT:    [[STAGE8_OR_AB:%.*]] = or i1 [[STAGE8_SELECT_A]], [[STAGE8_SELECT_B]]
+; CHECK-NEXT:    [[STAGE8_OR_CD:%.*]] = or i1 [[STAGE8_SELECT_C]], [[STAGE8_SELECT_D]]
+; CHECK-NEXT:    [[STAGE8_RESULT:%.*]] = or i1 [[STAGE8_OR_AB]], [[STAGE8_OR_CD]]
+; CHECK-NEXT:    [[STAGE9_SELECT_A:%.*]] = select i1 [[STAGE8_RESULT]], i1 true, i1 [[LEAF_A]]
+; CHECK-NEXT:    [[STAGE9_SELECT_B:%.*]] = select i1 [[STAGE8_RESULT]], i1 true, i1 [[LEAF_B]]
+; CHECK-NEXT:    [[STAGE9_SELECT_C:%.*]] = select i1 [[STAGE8_RESULT]], i1 true, i1 [[LEAF_C]]
+; CHECK-NEXT:    [[STAGE9_SELECT_D:%.*]] = select i1 [[STAGE8_RESULT]], i1 true, i1 [[LEAF_D]]
+; CHECK-NEXT:    [[STAGE9_OR_AB:%.*]] = or i1 [[STAGE9_SELECT_A]], [[STAGE9_SELECT_B]]
+; CHECK-NEXT:    [[STAGE9_OR_CD:%.*]] = or i1 [[STAGE9_SELECT_C]], [[STAGE9_SELECT_D]]
+; CHECK-NEXT:    [[STAGE9_RESULT:%.*]] = or i1 [[STAGE9_OR_AB]], [[STAGE9_OR_CD]]
+; CHECK-NEXT:    [[STAGE10_SELECT_A:%.*]] = select i1 [[STAGE9_RESULT]], i1 true, i1 [[LEAF_A]]
+; CHECK-NEXT:    [[STAGE10_SELECT_B:%.*]] = select i1 [[STAGE9_RESULT]], i1 true, i1 [[LEAF_B]]
+; CHECK-NEXT:    [[STAGE10_SELECT_C:%.*]] = select i1 [[STAGE9_RESULT]], i1 true, i1 [[LEAF_C]]
+; CHECK-NEXT:    [[STAGE10_SELECT_D:%.*]] = select i1 [[STAGE9_RESULT]], i1 true, i1 [[LEAF_D]]
+; CHECK-NEXT:    [[STAGE10_OR_AB:%.*]] = or i1 [[STAGE10_SELECT_A]], [[STAGE10_SELECT_B]]
+; CHECK-NEXT:    [[STAGE10_OR_CD:%.*]] = or i1 [[STAGE10_SELECT_C]], [[STAGE10_SELECT_D]]
+; CHECK-NEXT:    [[STAGE10_RESULT:%.*]] = or i1 [[STAGE10_OR_AB]], [[STAGE10_OR_CD]]
+; CHECK-NEXT:    [[STAGE11_SELECT_A:%.*]] = select i1 [[STAGE10_RESULT]], i1 true, i1 [[LEAF_A]]
+; CHECK-NEXT:    [[STAGE11_SELECT_B:%.*]] = select i1 [[STAGE10_RESULT]], i1 true, i1 [[LEAF_B]]
+; CHECK-NEXT:    [[STAGE11_SELECT_C:%.*]] = select i1 [[STAGE10_RESULT]], i1 true, i1 [[LEAF_C]]
+; CHECK-NEXT:    [[STAGE11_SELECT_D:%.*]] = select i1 [[STAGE10_RESULT]], i1 true, i1 [[LEAF_D]]
+; CHECK-NEXT:    [[STAGE11_OR_AB:%.*]] = or i1 [[STAGE11_SELECT_A]], [[STAGE11_SELECT_B]]
+; CHECK-NEXT:    [[STAGE11_OR_CD:%.*]] = or i1 [[STAGE11_SELECT_C]], [[STAGE11_SELECT_D]]
+; CHECK-NEXT:    [[STAGE11_RESULT:%.*]] = or i1 [[STAGE11_OR_AB]], [[STAGE11_OR_CD]]
+; CHECK-NEXT:    [[STAGE12_SELECT_A:%.*]] = select i1 [[STAGE11_RESULT]], i1 true, i1 [[LEAF_A]]
+; CHECK-NEXT:    [[STAGE12_SELECT_B:%.*]] = select i1 [[STAGE11_RESULT]], i1 true, i1 [[LEAF_B]]
+; CHECK-NEXT:    [[STAGE12_SELECT_C:%.*]] = select i1 [[STAGE11_RESULT]], i1 true, i1 [[LEAF_C]]
+; CHECK-NEXT:    [[STAGE12_SELECT_D:%.*]] = select i1 [[STAGE11_RESULT]], i1 true, i1 [[LEAF_D]]
+; CHECK-NEXT:    [[STAGE12_OR_AB:%.*]] = or i1 [[STAGE12_SELECT_A]], [[STAGE12_SELECT_B]]
+; CHECK-NEXT:    [[STAGE12_OR_CD:%.*]] = or i1 [[STAGE12_SELECT_C]], [[STAGE12_SELECT_D]]
+; CHECK-NEXT:    [[STAGE12_RESULT:%.*]] = or i1 [[STAGE12_OR_AB]], [[STAGE12_OR_CD]]
+; CHECK-NEXT:    [[STAGE13_SELECT_A:%.*]] = select i1 [[STAGE12_RESULT]], i1 true, i1 [[LEAF_A]]
+; CHECK-NEXT:    [[STAGE13_SELECT_B:%.*]] = select i1 [[STAGE12_RESULT]], i1 true, i1 [[LEAF_B]]
+; CHECK-NEXT:    [[STAGE13_SELECT_C:%.*]] = select i1 [[STAGE12_RESULT]], i1 true, i1 [[LEAF_C]]
+; CHECK-NEXT:    [[STAGE13_SELECT_D:%.*]] = select i1 [[STAGE12_RESULT]], i1 true, i1 [[LEAF_D]]
+; CHECK-NEXT:    [[STAGE13_OR_AB:%.*]] = or i1 [[STAGE13_SELECT_A]], [[STAGE13_SELECT_B]]
+; CHECK-NEXT:    [[STAGE13_OR_CD:%.*]] = or i1 [[STAGE13_SELECT_C]], [[STAGE13_SELECT_D]]
+; CHECK-NEXT:    [[STAGE13_RESULT:%.*]] = or i1 [[STAGE13_OR_AB]], [[STAGE13_OR_CD]]
+; CHECK-NEXT:    [[STAGE14_SELECT_A:%.*]] = select i1 [[STAGE13_RESULT]], i1 true, i1 [[LEAF_A]]
+; CHECK-NEXT:    [[STAGE14_SELECT_B:%.*]] = select i1 [[STAGE13_RESULT]], i1 true, i1 [[LEAF_B]]
+; CHECK-NEXT:    [[STAGE14_SELECT_C:%.*]] = select i1 [[STAGE13_RESULT]], i1 true, i1 [[LEAF_C]]
+; CHECK-NEXT:    [[STAGE14_SELECT_D:%.*]] = select i1 [[STAGE13_RESULT]], i1 true, i1 [[LEAF_D]]
+; CHECK-NEXT:    [[STAGE14_OR_AB:%.*]] = or i1 [[STAGE14_SELECT_A]], [[STAGE14_SELECT_B]]
+; CHECK-NEXT:    [[STAGE14_OR_CD:%.*]] = or i1 [[STAGE14_SELECT_C]], [[STAGE14_SELECT_D]]
+; CHECK-NEXT:    [[STAGE14_RESULT:%.*]] = or i1 [[STAGE14_OR_AB]], [[STAGE14_OR_CD]]
+; CHECK-NEXT:    br i1 [[STAGE14_RESULT]], label %[[TRUE_BLOCK:.*]], label %[[FALSE_BLOCK:.*]]
+; CHECK:       [[TRUE_BLOCK]]:
+; CHECK-NEXT:    ret void
+; CHECK:       [[FALSE_BLOCK]]:
+; CHECK-NEXT:    ret void
+;
 entry:
-  br label %bb0
+  br label %stage0
 
-bb0:
-  %p0_0 = getelementptr i1, ptr %p, i64 0
-  %p0_1 = getelementptr i1, ptr %p, i64 1
-  %p0_2 = getelementptr i1, ptr %p, i64 2
-  %x0_0 = load i1, ptr %p0_0
-  %x0_1 = load i1, ptr %p0_1
-  %x0_2 = load i1, ptr %p0_2
-  %s0_0 = select i1 %c0, i1 true, i1 %x0_0
-  %s0_1 = select i1 %c0, i1 true, i1 %x0_1
-  %s0_2 = select i1 %c0, i1 true, i1 %x0_2
-  %o0 = or i1 %s0_0, %s0_1
-  %b0 = or i1 %o0, %s0_2
-  br label %bb1
+stage0:
+  %stage0_select_a = select i1 %initial_cond, i1 true, i1 %leaf_a
+  %stage0_select_b = select i1 %initial_cond, i1 true, i1 %leaf_b
+  %stage0_select_c = select i1 %initial_cond, i1 true, i1 %leaf_c
+  %stage0_select_d = select i1 %initial_cond, i1 true, i1 %leaf_d
+  %stage0_or_ab = or i1 %stage0_select_a, %stage0_select_b
+  %stage0_or_cd = or i1 %stage0_select_c, %stage0_select_d
+  %stage0_result = or i1 %stage0_or_ab, %stage0_or_cd
+  br label %stage1
 
-bb1:
-  %p1_0 = getelementptr i1, ptr %p, i64 3
-  %p1_1 = getelementptr i1, ptr %p, i64 4
-  %p1_2 = getelementptr i1, ptr %p, i64 5
-  %x1_0 = load i1, ptr %p1_0
-  %x1_1 = load i1, ptr %p1_1
-  %x1_2 = load i1, ptr %p1_2
-  %s1_0 = select i1 %b0, i1 true, i1 %x1_0
-  %s1_1 = select i1 %b0, i1 true, i1 %x1_1
-  %s1_2 = select i1 %b0, i1 true, i1 %x1_2
-  %o1 = or i1 %s1_0, %s1_1
-  %b1 = or i1 %o1, %s1_2
-  br label %bb2
+stage1:
+  %stage1_select_a = select i1 %stage0_result, i1 true, i1 %leaf_a
+  %stage1_select_b = select i1 %stage0_result, i1 true, i1 %leaf_b
+  %stage1_select_c = select i1 %stage0_result, i1 true, i1 %leaf_c
+  %stage1_select_d = select i1 %stage0_result, i1 true, i1 %leaf_d
+  %stage1_or_ab = or i1 %stage1_select_a, %stage1_select_b
+  %stage1_or_cd = or i1 %stage1_select_c, %stage1_select_d
+  %stage1_result = or i1 %stage1_or_ab, %stage1_or_cd
+  br label %stage2
 
-bb2:
-  %p2_0 = getelementptr i1, ptr %p, i64 6
-  %p2_1 = getelementptr i1, ptr %p, i64 7
-  %p2_2 = getelementptr i1, ptr %p, i64 8
-  %x2_0 = load i1, ptr %p2_0
-  %x2_1 = load i1, ptr %p2_1
-  %x2_2 = load i1, ptr %p2_2
-  %s2_0 = select i1 %b1, i1 true, i1 %x2_0
-  %s2_1 = select i1 %b1, i1 true, i1 %x2_1
-  %s2_2 = select i1 %b1, i1 true, i1 %x2_2
-  %o2 = or i1 %s2_0, %s2_1
-  %b2 = or i1 %o2, %s2_2
-  br label %bb3
+stage2:
+  %stage2_select_a = select i1 %stage1_result, i1 true, i1 %leaf_a
+  %stage2_select_b = select i1 %stage1_result, i1 true, i1 %leaf_b
+  %stage2_select_c = select i1 %stage1_result, i1 true, i1 %leaf_c
+  %stage2_select_d = select i1 %stage1_result, i1 true, i1 %leaf_d
+  %stage2_or_ab = or i1 %stage2_select_a, %stage2_select_b
+  %stage2_or_cd = or i1 %stage2_select_c, %stage2_select_d
+  %stage2_result = or i1 %stage2_or_ab, %stage2_or_cd
+  br label %stage3
 
-bb3:
-  %p3_0 = getelementptr i1, ptr %p, i64 9
-  %p3_1 = getelementptr i1, ptr %p, i64 10
-  %p3_2 = getelementptr i1, ptr %p, i64 11
-  %x3_0 = load i1, ptr %p3_0
-  %x3_1 = load i1, ptr %p3_1
-  %x3_2 = load i1, ptr %p3_2
-  %s3_0 = select i1 %b2, i1 true, i1 %x3_0
-  %s3_1 = select i1 %b2, i1 true, i1 %x3_1
-  %s3_2 = select i1 %b2, i1 true, i1 %x3_2
-  %o3 = or i1 %s3_0, %s3_1
-  %b3 = or i1 %o3, %s3_2
-  br label %bb4
+stage3:
+  %stage3_select_a = select i1 %stage2_result, i1 true, i1 %leaf_a
+  %stage3_select_b = select i1 %stage2_result, i1 true, i1 %leaf_b
+  %stage3_select_c = select i1 %stage2_result, i1 true, i1 %leaf_c
+  %stage3_select_d = select i1 %stage2_result, i1 true, i1 %leaf_d
+  %stage3_or_ab = or i1 %stage3_select_a, %stage3_select_b
+  %stage3_or_cd = or i1 %stage3_select_c, %stage3_select_d
+  %stage3_result = or i1 %stage3_or_ab, %stage3_or_cd
+  br label %stage4
 
-bb4:
-  %p4_0 = getelementptr i1, ptr %p, i64 12
-  %p4_1 = getelementptr i1, ptr %p, i64 13
-  %p4_2 = getelementptr i1, ptr %p, i64 14
-  %x4_0 = load i1, ptr %p4_0
-  %x4_1 = load i1, ptr %p4_1
-  %x4_2 = load i1, ptr %p4_2
-  %s4_0 = select i1 %b3, i1 true, i1 %x4_0
-  %s4_1 = select i1 %b3, i1 true, i1 %x4_1
-  %s4_2 = select i1 %b3, i1 true, i1 %x4_2
-  %o4 = or i1 %s4_0, %s4_1
-  %b4 = or i1 %o4, %s4_2
-  br label %bb5
+stage4:
+  %stage4_select_a = select i1 %stage3_result, i1 true, i1 %leaf_a
+  %stage4_select_b = select i1 %stage3_result, i1 true, i1 %leaf_b
+  %stage4_select_c = select i1 %stage3_result, i1 true, i1 %leaf_c
+  %stage4_select_d = select i1 %stage3_result, i1 true, i1 %leaf_d
+  %stage4_or_ab = or i1 %stage4_select_a, %stage4_select_b
+  %stage4_or_cd = or i1 %stage4_select_c, %stage4_select_d
+  %stage4_result = or i1 %stage4_or_ab, %stage4_or_cd
+  br label %stage5
 
-bb5:
-  %p5_0 = getelementptr i1, ptr %p, i64 15
-  %p5_1 = getelementptr i1, ptr %p, i64 16
-  %p5_2 = getelementptr i1, ptr %p, i64 17
-  %x5_0 = load i1, ptr %p5_0
-  %x5_1 = load i1, ptr %p5_1
-  %x5_2 = load i1, ptr %p5_2
-  %s5_0 = select i1 %b4, i1 true, i1 %x5_0
-  %s5_1 = select i1 %b4, i1 true, i1 %x5_1
-  %s5_2 = select i1 %b4, i1 true, i1 %x5_2
-  %o5 = or i1 %s5_0, %s5_1
-  %b5 = or i1 %o5, %s5_2
-  br label %bb6
+stage5:
+  %stage5_select_a = select i1 %stage4_result, i1 true, i1 %leaf_a
+  %stage5_select_b = select i1 %stage4_result, i1 true, i1 %leaf_b
+  %stage5_select_c = select i1 %stage4_result, i1 true, i1 %leaf_c
+  %stage5_select_d = select i1 %stage4_result, i1 true, i1 %leaf_d
+  %stage5_or_ab = or i1 %stage5_select_a, %stage5_select_b
+  %stage5_or_cd = or i1 %stage5_select_c, %stage5_select_d
+  %stage5_result = or i1 %stage5_or_ab, %stage5_or_cd
+  br label %stage6
 
-bb6:
-  %p6_0 = getelementptr i1, ptr %p, i64 18
-  %p6_1 = getelementptr i1, ptr %p, i64 19
-  %p6_2 = getelementptr i1, ptr %p, i64 20
-  %x6_0 = load i1, ptr %p6_0
-  %x6_1 = load i1, ptr %p6_1
-  %x6_2 = load i1, ptr %p6_2
-  %s6_0 = select i1 %b5, i1 true, i1 %x6_0
-  %s6_1 = select i1 %b5, i1 true, i1 %x6_1
-  %s6_2 = select i1 %b5, i1 true, i1 %x6_2
-  %o6 = or i1 %s6_0, %s6_1
-  %b6 = or i1 %o6, %s6_2
-  br label %bb7
+stage6:
+  %stage6_select_a = select i1 %stage5_result, i1 true, i1 %leaf_a
+  %stage6_select_b = select i1 %stage5_result, i1 true, i1 %leaf_b
+  %stage6_select_c = select i1 %stage5_result, i1 true, i1 %leaf_c
+  %stage6_select_d = select i1 %stage5_result, i1 true, i1 %leaf_d
+  %stage6_or_ab = or i1 %stage6_select_a, %stage6_select_b
+  %stage6_or_cd = or i1 %stage6_select_c, %stage6_select_d
+  %stage6_result = or i1 %stage6_or_ab, %stage6_or_cd
+  br label %stage7
 
-bb7:
-  %p7_0 = getelementptr i1, ptr %p, i64 21
-  %p7_1 = getelementptr i1, ptr %p, i64 22
-  %p7_2 = getelementptr i1, ptr %p, i64 23
-  %x7_0 = load i1, ptr %p7_0
-  %x7_1 = load i1, ptr %p7_1
-  %x7_2 = load i1, ptr %p7_2
-  %s7_0 = select i1 %b6, i1 true, i1 %x7_0
-  %s7_1 = select i1 %b6, i1 true, i1 %x7_1
-  %s7_2 = select i1 %b6, i1 true, i1 %x7_2
-  %o7 = or i1 %s7_0, %s7_1
-  %b7 = or i1 %o7, %s7_2
-  br label %bb8
+stage7:
+  %stage7_select_a = select i1 %stage6_result, i1 true, i1 %leaf_a
+  %stage7_select_b = select i1 %stage6_result, i1 true, i1 %leaf_b
+  %stage7_select_c = select i1 %stage6_result, i1 true, i1 %leaf_c
+  %stage7_select_d = select i1 %stage6_result, i1 true, i1 %leaf_d
+  %stage7_or_ab = or i1 %stage7_select_a, %stage7_select_b
+  %stage7_or_cd = or i1 %stage7_select_c, %stage7_select_d
+  %stage7_result = or i1 %stage7_or_ab, %stage7_or_cd
+  br label %stage8
 
-bb8:
-  %p8_0 = getelementptr i1, ptr %p, i64 24
-  %p8_1 = getelementptr i1, ptr %p, i64 25
-  %p8_2 = getelementptr i1, ptr %p, i64 26
-  %x8_0 = load i1, ptr %p8_0
-  %x8_1 = load i1, ptr %p8_1
-  %x8_2 = load i1, ptr %p8_2
-  %s8_0 = select i1 %b7, i1 true, i1 %x8_0
-  %s8_1 = select i1 %b7, i1 true, i1 %x8_1
-  %s8_2 = select i1 %b7, i1 true, i1 %x8_2
-  %o8 = or i1 %s8_0, %s8_1
-  %b8 = or i1 %o8, %s8_2
-  br label %bb9
+stage8:
+  %stage8_select_a = select i1 %stage7_result, i1 true, i1 %leaf_a
+  %stage8_select_b = select i1 %stage7_result, i1 true, i1 %leaf_b
+  %stage8_select_c = select i1 %stage7_result, i1 true, i1 %leaf_c
+  %stage8_select_d = select i1 %stage7_result, i1 true, i1 %leaf_d
+  %stage8_or_ab = or i1 %stage8_select_a, %stage8_select_b
+  %stage8_or_cd = or i1 %stage8_select_c, %stage8_select_d
+  %stage8_result = or i1 %stage8_or_ab, %stage8_or_cd
+  br label %stage9
 
-bb9:
-  %p9_0 = getelementptr i1, ptr %p, i64 27
-  %p9_1 = getelementptr i1, ptr %p, i64 28
-  %p9_2 = getelementptr i1, ptr %p, i64 29
-  %x9_0 = load i1, ptr %p9_0
-  %x9_1 = load i1, ptr %p9_1
-  %x9_2 = load i1, ptr %p9_2
-  %s9_0 = select i1 %b8, i1 true, i1 %x9_0
-  %s9_1 = select i1 %b8, i1 true, i1 %x9_1
-  %s9_2 = select i1 %b8, i1 true, i1 %x9_2
-  %o9 = or i1 %s9_0, %s9_1
-  %b9 = or i1 %o9, %s9_2
-  br label %bb10
+stage9:
+  %stage9_select_a = select i1 %stage8_result, i1 true, i1 %leaf_a
+  %stage9_select_b = select i1 %stage8_result, i1 true, i1 %leaf_b
+  %stage9_select_c = select i1 %stage8_result, i1 true, i1 %leaf_c
+  %stage9_select_d = select i1 %stage8_result, i1 true, i1 %leaf_d
+  %stage9_or_ab = or i1 %stage9_select_a, %stage9_select_b
+  %stage9_or_cd = or i1 %stage9_select_c, %stage9_select_d
+  %stage9_result = or i1 %stage9_or_ab, %stage9_or_cd
+  br label %stage10
 
-bb10:
-  %p10_0 = getelementptr i1, ptr %p, i64 30
-  %p10_1 = getelementptr i1, ptr %p, i64 31
-  %p10_2 = getelementptr i1, ptr %p, i64 32
-  %x10_0 = load i1, ptr %p10_0
-  %x10_1 = load i1, ptr %p10_1
-  %x10_2 = load i1, ptr %p10_2
-  %s10_0 = select i1 %b9, i1 true, i1 %x10_0
-  %s10_1 = select i1 %b9, i1 true, i1 %x10_1
-  %s10_2 = select i1 %b9, i1 true, i1 %x10_2
-  %o10 = or i1 %s10_0, %s10_1
-  %b10 = or i1 %o10, %s10_2
-  br label %bb11
+stage10:
+  %stage10_select_a = select i1 %stage9_result, i1 true, i1 %leaf_a
+  %stage10_select_b = select i1 %stage9_result, i1 true, i1 %leaf_b
+  %stage10_select_c = select i1 %stage9_result, i1 true, i1 %leaf_c
+  %stage10_select_d = select i1 %stage9_result, i1 true, i1 %leaf_d
+  %stage10_or_ab = or i1 %stage10_select_a, %stage10_select_b
+  %stage10_or_cd = or i1 %stage10_select_c, %stage10_select_d
+  %stage10_result = or i1 %stage10_or_ab, %stage10_or_cd
+  br label %stage11
 
-bb11:
-  %p11_0 = getelementptr i1, ptr %p, i64 33
-  %p11_1 = getelementptr i1, ptr %p, i64 34
-  %p11_2 = getelementptr i1, ptr %p, i64 35
-  %x11_0 = load i1, ptr %p11_0
-  %x11_1 = load i1, ptr %p11_1
-  %x11_2 = load i1, ptr %p11_2
-  %s11_0 = select i1 %b10, i1 true, i1 %x11_0
-  %s11_1 = select i1 %b10, i1 true, i1 %x11_1
-  %s11_2 = select i1 %b10, i1 true, i1 %x11_2
-  %o11 = or i1 %s11_0, %s11_1
-  %b11 = or i1 %o11, %s11_2
-  br label %bb12
+stage11:
+  %stage11_select_a = select i1 %stage10_result, i1 true, i1 %leaf_a
+  %stage11_select_b = select i1 %stage10_result, i1 true, i1 %leaf_b
+  %stage11_select_c = select i1 %stage10_result, i1 true, i1 %leaf_c
+  %stage11_select_d = select i1 %stage10_result, i1 true, i1 %leaf_d
+  %stage11_or_ab = or i1 %stage11_select_a, %stage11_select_b
+  %stage11_or_cd = or i1 %stage11_select_c, %stage11_select_d
+  %stage11_result = or i1 %stage11_or_ab, %stage11_or_cd
+  br label %stage12
 
-bb12:
-  %p12_0 = getelementptr i1, ptr %p, i64 36
-  %p12_1 = getelementptr i1, ptr %p, i64 37
-  %p12_2 = getelementptr i1, ptr %p, i64 38
-  %x12_0 = load i1, ptr %p12_0
-  %x12_1 = load i1, ptr %p12_1
-  %x12_2 = load i1, ptr %p12_2
-  %s12_0 = select i1 %b11, i1 true, i1 %x12_0
-  %s12_1 = select i1 %b11, i1 true, i1 %x12_1
-  %s12_2 = select i1 %b11, i1 true, i1 %x12_2
-  %o12 = or i1 %s12_0, %s12_1
-  %b12 = or i1 %o12, %s12_2
-  br label %bb13
+stage12:
+  %stage12_select_a = select i1 %stage11_result, i1 true, i1 %leaf_a
+  %stage12_select_b = select i1 %stage11_result, i1 true, i1 %leaf_b
+  %stage12_select_c = select i1 %stage11_result, i1 true, i1 %leaf_c
+  %stage12_select_d = select i1 %stage11_result, i1 true, i1 %leaf_d
+  %stage12_or_ab = or i1 %stage12_select_a, %stage12_select_b
+  %stage12_or_cd = or i1 %stage12_select_c, %stage12_select_d
+  %stage12_result = or i1 %stage12_or_ab, %stage12_or_cd
+  br label %stage13
 
-bb13:
-  %p13_0 = getelementptr i1, ptr %p, i64 39
-  %p13_1 = getelementptr i1, ptr %p, i64 40
-  %p13_2 = getelementptr i1, ptr %p, i64 41
-  %x13_0 = load i1, ptr %p13_0
-  %x13_1 = load i1, ptr %p13_1
-  %x13_2 = load i1, ptr %p13_2
-  %s13_0 = select i1 %b12, i1 true, i1 %x13_0
-  %s13_1 = select i1 %b12, i1 true, i1 %x13_1
-  %s13_2 = select i1 %b12, i1 true, i1 %x13_2
-  %o13 = or i1 %s13_0, %s13_1
-  %b13 = or i1 %o13, %s13_2
-  br label %bb14
+stage13:
+  %stage13_select_a = select i1 %stage12_result, i1 true, i1 %leaf_a
+  %stage13_select_b = select i1 %stage12_result, i1 true, i1 %leaf_b
+  %stage13_select_c = select i1 %stage12_result, i1 true, i1 %leaf_c
+  %stage13_select_d = select i1 %stage12_result, i1 true, i1 %leaf_d
+  %stage13_or_ab = or i1 %stage13_select_a, %stage13_select_b
+  %stage13_or_cd = or i1 %stage13_select_c, %stage13_select_d
+  %stage13_result = or i1 %stage13_or_ab, %stage13_or_cd
+  br label %stage14
 
-bb14:
-  %p14_0 = getelementptr i1, ptr %p, i64 42
-  %p14_1 = getelementptr i1, ptr %p, i64 43
-  %p14_2 = getelementptr i1, ptr %p, i64 44
-  %x14_0 = load i1, ptr %p14_0
-  %x14_1 = load i1, ptr %p14_1
-  %x14_2 = load i1, ptr %p14_2
-  %s14_0 = select i1 %b13, i1 true, i1 %x14_0
-  %s14_1 = select i1 %b13, i1 true, i1 %x14_1
-  %s14_2 = select i1 %b13, i1 true, i1 %x14_2
-  %o14 = or i1 %s14_0, %s14_1
-  %b14 = or i1 %o14, %s14_2
-  br label %bb15
-
-bb15:
-  %p15_0 = getelementptr i1, ptr %p, i64 45
-  %p15_1 = getelementptr i1, ptr %p, i64 46
-  %p15_2 = getelementptr i1, ptr %p, i64 47
-  %x15_0 = load i1, ptr %p15_0
-  %x15_1 = load i1, ptr %p15_1
-  %x15_2 = load i1, ptr %p15_2
-  %s15_0 = select i1 %b14, i1 true, i1 %x15_0
-  %s15_1 = select i1 %b14, i1 true, i1 %x15_1
-  %s15_2 = select i1 %b14, i1 true, i1 %x15_2
-  %o15 = or i1 %s15_0, %s15_1
-  %b15 = or i1 %o15, %s15_2
-  br label %bb16
-
-bb16:
-  %p16_0 = getelementptr i1, ptr %p, i64 48
-  %p16_1 = getelementptr i1, ptr %p, i64 49
-  %p16_2 = getelementptr i1, ptr %p, i64 50
-  %x16_0 = load i1, ptr %p16_0
-  %x16_1 = load i1, ptr %p16_1
-  %x16_2 = load i1, ptr %p16_2
-  %s16_0 = select i1 %b15, i1 true, i1 %x16_0
-  %s16_1 = select i1 %b15, i1 true, i1 %x16_1
-  %s16_2 = select i1 %b15, i1 true, i1 %x16_2
-  %o16 = or i1 %s16_0, %s16_1
-  %b16 = or i1 %o16, %s16_2
-  br label %bb17
-
-bb17:
-  %p17_0 = getelementptr i1, ptr %p, i64 51
-  %p17_1 = getelementptr i1, ptr %p, i64 52
-  %p17_2 = getelementptr i1, ptr %p, i64 53
-  %x17_0 = load i1, ptr %p17_0
-  %x17_1 = load i1, ptr %p17_1
-  %x17_2 = load i1, ptr %p17_2
-  %s17_0 = select i1 %b16, i1 true, i1 %x17_0
-  %s17_1 = select i1 %b16, i1 true, i1 %x17_1
-  %s17_2 = select i1 %b16, i1 true, i1 %x17_2
-  %o17 = or i1 %s17_0, %s17_1
-  %b17 = or i1 %o17, %s17_2
-  br label %bb18
-
-bb18:
-  %p18_0 = getelementptr i1, ptr %p, i64 54
-  %p18_1 = getelementptr i1, ptr %p, i64 55
-  %p18_2 = getelementptr i1, ptr %p, i64 56
-  %x18_0 = load i1, ptr %p18_0
-  %x18_1 = load i1, ptr %p18_1
-  %x18_2 = load i1, ptr %p18_2
-  %s18_0 = select i1 %b17, i1 true, i1 %x18_0
-  %s18_1 = select i1 %b17, i1 true, i1 %x18_1
-  %s18_2 = select i1 %b17, i1 true, i1 %x18_2
-  %o18 = or i1 %s18_0, %s18_1
-  %b18 = or i1 %o18, %s18_2
-  br label %bb19
-
-bb19:
-  %p19_0 = getelementptr i1, ptr %p, i64 57
-  %p19_1 = getelementptr i1, ptr %p, i64 58
-  %p19_2 = getelementptr i1, ptr %p, i64 59
-  %x19_0 = load i1, ptr %p19_0
-  %x19_1 = load i1, ptr %p19_1
-  %x19_2 = load i1, ptr %p19_2
-  %s19_0 = select i1 %b18, i1 true, i1 %x19_0
-  %s19_1 = select i1 %b18, i1 true, i1 %x19_1
-  %s19_2 = select i1 %b18, i1 true, i1 %x19_2
-  %o19 = or i1 %s19_0, %s19_1
-  %b19 = or i1 %o19, %s19_2
-  br i1 %b19, label %true_block, label %false_block
+stage14:
+  %stage14_select_a = select i1 %stage13_result, i1 true, i1 %leaf_a
+  %stage14_select_b = select i1 %stage13_result, i1 true, i1 %leaf_b
+  %stage14_select_c = select i1 %stage13_result, i1 true, i1 %leaf_c
+  %stage14_select_d = select i1 %stage13_result, i1 true, i1 %leaf_d
+  %stage14_or_ab = or i1 %stage14_select_a, %stage14_select_b
+  %stage14_or_cd = or i1 %stage14_select_c, %stage14_select_d
+  %stage14_result = or i1 %stage14_or_ab, %stage14_or_cd
+  br i1 %stage14_result, label %true_block, label %false_block
 
 true_block:
   ret void



More information about the llvm-commits mailing list