[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