[llvm] [LV] Avoid repeatedly expanding ignored operand graphs. (NFC) (PR #228944)
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Sun Oct 4 15:18:09 PDT 2026
https://github.com/fhahn created https://github.com/llvm/llvm-project/pull/228944
Add a set to track the already processed operations in DeadOps, to avoid repeatedly processing the same instruction chains for ops with shared operands.
Without the fix, the newly added test takes a long time to compile.
Addresses part of https://github.com/llvm/llvm-project/issues/228403.
>From 67054cae08601df8528c1e57faf09a92fb4b157e Mon Sep 17 00:00:00 2001
From: Florian Hahn <flo at fhahn.com>
Date: Sun, 4 Oct 2026 17:55:40 +0000
Subject: [PATCH] [LV] Avoid repeatedly expanding ignored operand graphs. (NFC)
Add a set to track the already processed operations in DeadOps, to avoid
repeatedly processing the same instruction chains for ops with shared
operands.
Without the fix, the newly added test takes a long time to compile.
Addresses part of https://github.com/llvm/llvm-project/issues/228403.
---
.../Transforms/Vectorize/LoopVectorize.cpp | 10 +-
.../dead-interleaved-pointer-ops.ll | 39 ++++
.../LoopVectorize/dead-ops-shared-operands.ll | 178 ++++++++++++++++++
3 files changed, 225 insertions(+), 2 deletions(-)
create mode 100644 llvm/test/Transforms/LoopVectorize/dead-interleaved-pointer-ops.ll
create mode 100644 llvm/test/Transforms/LoopVectorize/dead-ops-shared-operands.ll
diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
index 45fcdff01a6d0..47c8838fa41b8 100644
--- a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
+++ b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
@@ -5280,6 +5280,7 @@ void LoopVectorizationCostModel::collectValuesToIgnore() {
isa<UncondBrInst>(&I);
});
};
+ SmallPtrSet<Instruction *, 16> ProcessedDeadOps;
for (unsigned I = 0; I != DeadOps.size(); ++I) {
auto *Op = dyn_cast<Instruction>(DeadOps[I]);
@@ -5316,12 +5317,17 @@ void LoopVectorizationCostModel::collectValuesToIgnore() {
// If all of Op's users are in ValuesToIgnore, add it to ValuesToIgnore
// which applies for both scalar and vector versions. Otherwise it is only
// dead in vector versions, so only add it to VecValuesToIgnore.
+ bool BecameScalarDead = false;
if (all_of(Op->users(),
[this](User *U) { return ValuesToIgnore.contains(U); }))
- ValuesToIgnore.insert(Op);
+ BecameScalarDead = ValuesToIgnore.insert(Op).second;
VecValuesToIgnore.insert(Op);
- append_range(DeadOps, Op->operands());
+ // Shared operands may be queued more than once. Propagate deadness once,
+ // and again if an instruction previously dead only in the vector loop
+ // becomes dead in the scalar loop too.
+ if (ProcessedDeadOps.insert(Op).second || BecameScalarDead)
+ append_range(DeadOps, Op->operands());
}
// Ignore type-promoting instructions we identified during reduction
diff --git a/llvm/test/Transforms/LoopVectorize/dead-interleaved-pointer-ops.ll b/llvm/test/Transforms/LoopVectorize/dead-interleaved-pointer-ops.ll
new file mode 100644
index 0000000000000..64a82f3519bbb
--- /dev/null
+++ b/llvm/test/Transforms/LoopVectorize/dead-interleaved-pointer-ops.ll
@@ -0,0 +1,39 @@
+; REQUIRES: asserts
+; RUN: opt -passes=loop-vectorize -enable-interleaved-mem-accesses=true -debug-only=loop-vectorize -disable-output %s 2>&1 | FileCheck %s
+
+; %offset.1 is first found to be dead only in the vector loop, as %gep.1
+; is initially only ignored as pointer of an interleave group member. Once
+; %l.1 and %gep.1 are ignored, %offset.1 becomes dead in the scalar loop too.
+; This must also be propagated to its already visited operand %index.1.
+
+; CHECK-LABEL: LV: Checking a loop in 'interleave_pointer_becomes_scalar_dead'
+; CHECK: LV: Found an estimated cost of 1 for VF 1 For instruction: %iv = phi i64
+; CHECK-NEXT: LV: Found an estimated cost of 1 for VF 1 For instruction: %iv.next = add nuw i64 %iv, 1
+; CHECK-NEXT: LV: Found an estimated cost of 1 for VF 1 For instruction: %ec = icmp eq i64 %iv.next, %n
+; CHECK-NEXT: LV: Found an estimated cost of 1 for VF 1 For instruction: br i1 %ec, label %exit, label %loop
+; CHECK-NEXT: LV: Scalar loop costs: 4.
+
+define void @interleave_pointer_becomes_scalar_dead(ptr noalias %src, i64 %n) {
+entry:
+ br label %loop
+
+loop:
+ %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
+ %index.0 = mul i64 %iv, 3
+ %gep.0 = getelementptr i32, ptr %src, i64 %index.0
+ %l.0 = load i32, ptr %gep.0
+ %index.1 = mul i64 %iv, 3
+ %offset.1 = add i64 %index.1, 1
+ %gep.1 = getelementptr i32, ptr %src, i64 %offset.1
+ %l.1 = load i32, ptr %gep.1
+ %offset.2 = add i64 %index.0, 2
+ %gep.2 = getelementptr i32, ptr %src, i64 %offset.2
+ %l.2 = load i32, ptr %gep.2
+ %dead.user = add i64 %offset.1, 7
+ %iv.next = add nuw i64 %iv, 1
+ %ec = icmp eq i64 %iv.next, %n
+ br i1 %ec, label %exit, label %loop
+
+exit:
+ ret void
+}
diff --git a/llvm/test/Transforms/LoopVectorize/dead-ops-shared-operands.ll b/llvm/test/Transforms/LoopVectorize/dead-ops-shared-operands.ll
new file mode 100644
index 0000000000000..447fca19a0758
--- /dev/null
+++ b/llvm/test/Transforms/LoopVectorize/dead-ops-shared-operands.ll
@@ -0,0 +1,178 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 --check-globals=none
+; RUN: opt -passes=loop-vectorize -S %s | FileCheck %s
+; RUN: opt -passes=loop-vectorize -force-vector-width=4 -force-vector-interleave=1 -S %s | FileCheck %s --check-prefix=FORCED
+
+; Repeated diamonds in a dead expression must not cause excessive compile-time.
+
+define void @shared_dead_operands(ptr %dst) {
+; CHECK-LABEL: define void @shared_dead_operands(
+; CHECK-SAME: ptr [[DST:%.*]]) {
+; CHECK-NEXT: [[ENTRY:.*]]:
+; CHECK-NEXT: br label %[[LOOP:.*]]
+; CHECK: [[LOOP]]:
+; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]
+; CHECK-NEXT: [[ITER:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[ITER_NEXT:%.*]], %[[LOOP]] ]
+; CHECK-NEXT: [[ITER_FP:%.*]] = uitofp nneg i64 [[ITER]] to float
+; CHECK-NEXT: [[ANGLE_SCALED:%.*]] = fmul nnan float [[ITER_FP]], f0x40C90FDB
+; CHECK-NEXT: [[ANGLE:%.*]] = fmul nnan float [[ANGLE_SCALED]], 3.125000e-02
+; CHECK-NEXT: [[CMP_0:%.*]] = fcmp ogt float [[ANGLE]], f0x40490FDB
+; CHECK-NEXT: [[ANGLE_ADJUSTED_0:%.*]] = fadd float [[ANGLE]], f0xC0C90FDB
+; CHECK-NEXT: [[SEL_0:%.*]] = select i1 [[CMP_0]], float [[ANGLE_ADJUSTED_0]], float [[ANGLE]]
+; CHECK-NEXT: [[ANGLE_SUM_1:%.*]] = fadd float [[ANGLE]], [[SEL_0]]
+; CHECK-NEXT: [[CMP_1:%.*]] = fcmp ogt float [[ANGLE_SUM_1]], f0x40490FDB
+; CHECK-NEXT: [[ANGLE_ADJUSTED_1:%.*]] = fadd float [[ANGLE_SUM_1]], f0xC0C90FDB
+; CHECK-NEXT: [[SEL_1:%.*]] = select i1 [[CMP_1]], float [[ANGLE_ADJUSTED_1]], float [[ANGLE_SUM_1]]
+; CHECK-NEXT: [[ANGLE_SUM_2:%.*]] = fadd float [[ANGLE]], [[SEL_1]]
+; CHECK-NEXT: [[CMP_2:%.*]] = fcmp ogt float [[ANGLE_SUM_2]], f0x40490FDB
+; CHECK-NEXT: [[ANGLE_ADJUSTED_2:%.*]] = fadd float [[ANGLE_SUM_2]], f0xC0C90FDB
+; CHECK-NEXT: [[SEL_2:%.*]] = select i1 [[CMP_2]], float [[ANGLE_ADJUSTED_2]], float [[ANGLE_SUM_2]]
+; CHECK-NEXT: [[ANGLE_SUM_3:%.*]] = fadd float [[ANGLE]], [[SEL_2]]
+; CHECK-NEXT: [[CMP_3:%.*]] = fcmp ogt float [[ANGLE_SUM_3]], f0x40490FDB
+; CHECK-NEXT: [[ANGLE_ADJUSTED_3:%.*]] = fadd float [[ANGLE_SUM_3]], f0xC0C90FDB
+; CHECK-NEXT: [[SEL_3:%.*]] = select i1 [[CMP_3]], float [[ANGLE_ADJUSTED_3]], float [[ANGLE_SUM_3]]
+; CHECK-NEXT: [[ANGLE_SUM_4:%.*]] = fadd float [[ANGLE]], [[SEL_3]]
+; CHECK-NEXT: [[CMP_4:%.*]] = fcmp ogt float [[ANGLE_SUM_4]], f0x40490FDB
+; CHECK-NEXT: [[ANGLE_ADJUSTED_4:%.*]] = fadd float [[ANGLE_SUM_4]], f0xC0C90FDB
+; CHECK-NEXT: [[SEL_4:%.*]] = select i1 [[CMP_4]], float [[ANGLE_ADJUSTED_4]], float [[ANGLE_SUM_4]]
+; CHECK-NEXT: store float 0.000000e+00, ptr [[DST]], align 4
+; CHECK-NEXT: [[ANGLE_SUM_5:%.*]] = fadd float [[ANGLE]], [[SEL_4]]
+; CHECK-NEXT: [[CMP_5:%.*]] = fcmp ogt float [[ANGLE_SUM_5]], f0x40490FDB
+; CHECK-NEXT: [[ANGLE_ADJUSTED_5:%.*]] = fadd float [[ANGLE_SUM_5]], f0xC0C90FDB
+; CHECK-NEXT: [[SEL_5:%.*]] = select i1 [[CMP_5]], float [[ANGLE_ADJUSTED_5]], float [[ANGLE_SUM_5]]
+; CHECK-NEXT: [[ANGLE_SUM_6:%.*]] = fadd float [[ANGLE]], [[SEL_5]]
+; CHECK-NEXT: [[CMP_6:%.*]] = fcmp ogt float [[ANGLE_SUM_6]], f0x40490FDB
+; CHECK-NEXT: [[ANGLE_ADJUSTED_6:%.*]] = fadd float [[ANGLE_SUM_6]], f0xC0C90FDB
+; CHECK-NEXT: [[SEL_6:%.*]] = select i1 [[CMP_6]], float [[ANGLE_ADJUSTED_6]], float [[ANGLE_SUM_6]]
+; CHECK-NEXT: [[ANGLE_SUM_7:%.*]] = fadd float [[ANGLE]], [[SEL_6]]
+; CHECK-NEXT: [[CMP_7:%.*]] = fcmp ogt float [[ANGLE_SUM_7]], f0x40490FDB
+; CHECK-NEXT: [[ANGLE_ADJUSTED_7:%.*]] = fadd float [[ANGLE_SUM_7]], f0xC0C90FDB
+; CHECK-NEXT: [[SEL_7:%.*]] = select i1 [[CMP_7]], float [[ANGLE_ADJUSTED_7]], float [[ANGLE_SUM_7]]
+; CHECK-NEXT: [[ANGLE_SUM_8:%.*]] = fadd float [[ANGLE]], [[SEL_7]]
+; CHECK-NEXT: [[CMP_8:%.*]] = fcmp ogt float [[ANGLE_SUM_8]], f0x40490FDB
+; CHECK-NEXT: [[ANGLE_ADJUSTED_8:%.*]] = fadd float [[ANGLE_SUM_8]], f0xC0C90FDB
+; CHECK-NEXT: [[SEL_8:%.*]] = select i1 [[CMP_8]], float [[ANGLE_ADJUSTED_8]], float [[ANGLE_SUM_8]]
+; CHECK-NEXT: [[ANGLE_SUM_9:%.*]] = fadd float [[ANGLE]], [[SEL_8]]
+; CHECK-NEXT: [[CMP_9:%.*]] = fcmp ogt float [[ANGLE_SUM_9]], f0x40490FDB
+; CHECK-NEXT: [[ANGLE_ADJUSTED_9:%.*]] = fadd float [[ANGLE_SUM_9]], f0xC0C90FDB
+; CHECK-NEXT: [[SEL_9:%.*]] = select i1 [[CMP_9]], float [[ANGLE_ADJUSTED_9]], float [[ANGLE_SUM_9]]
+; CHECK-NEXT: [[ANGLE_SUM_10:%.*]] = fadd float [[ANGLE]], [[SEL_9]]
+; CHECK-NEXT: [[CMP_10:%.*]] = fcmp ogt float [[ANGLE_SUM_10]], f0x40490FDB
+; CHECK-NEXT: [[ANGLE_ADJUSTED_10:%.*]] = fadd float [[ANGLE_SUM_10]], f0xC0C90FDB
+; CHECK-NEXT: [[SEL_10:%.*]] = select i1 [[CMP_10]], float [[ANGLE_ADJUSTED_10]], float [[ANGLE_SUM_10]]
+; CHECK-NEXT: [[ANGLE_SUM_11:%.*]] = fadd float [[ANGLE]], [[SEL_10]]
+; CHECK-NEXT: [[CMP_11:%.*]] = fcmp ogt float [[ANGLE_SUM_11]], f0x40490FDB
+; CHECK-NEXT: [[ANGLE_ADJUSTED_11:%.*]] = fadd float [[ANGLE_SUM_11]], f0xC0C90FDB
+; CHECK-NEXT: [[SEL_11:%.*]] = select i1 [[CMP_11]], float [[ANGLE_ADJUSTED_11]], float [[ANGLE_SUM_11]]
+; CHECK-NEXT: [[ANGLE_SUM_12:%.*]] = fadd float [[ANGLE]], [[SEL_11]]
+; CHECK-NEXT: [[CMP_12:%.*]] = fcmp ogt float [[ANGLE_SUM_12]], f0x40490FDB
+; CHECK-NEXT: [[ANGLE_ADJUSTED_12:%.*]] = fadd float [[ANGLE_SUM_12]], f0xC0C90FDB
+; CHECK-NEXT: [[SEL_12:%.*]] = select i1 [[CMP_12]], float [[ANGLE_ADJUSTED_12]], float [[ANGLE_SUM_12]]
+; CHECK-NEXT: [[ANGLE_SUM_13:%.*]] = fadd float [[ANGLE]], [[SEL_12]]
+; CHECK-NEXT: [[CMP_13:%.*]] = fcmp ogt float [[ANGLE_SUM_13]], f0x40490FDB
+; CHECK-NEXT: [[ANGLE_ADJUSTED_13:%.*]] = fadd float [[ANGLE_SUM_13]], f0xC0C90FDB
+; CHECK-NEXT: [[SEL_13:%.*]] = select i1 [[CMP_13]], float [[ANGLE_ADJUSTED_13]], float [[ANGLE_SUM_13]]
+; CHECK-NEXT: [[ANGLE_SUM_14:%.*]] = fadd float [[ANGLE]], [[SEL_13]]
+; CHECK-NEXT: [[CMP_14:%.*]] = fcmp ogt float [[ANGLE_SUM_14]], f0x40490FDB
+; CHECK-NEXT: [[ANGLE_ADJUSTED_14:%.*]] = fadd float [[ANGLE_SUM_14]], f0xC0C90FDB
+; CHECK-NEXT: [[SEL_14:%.*]] = select i1 [[CMP_14]], float [[ANGLE_ADJUSTED_14]], float [[ANGLE_SUM_14]]
+; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 256
+; CHECK-NEXT: [[ITER_NEXT]] = add nuw nsw i64 [[ITER]], 1
+; CHECK-NEXT: [[EC:%.*]] = icmp eq i64 [[IV_NEXT]], 2048
+; CHECK-NEXT: br i1 [[EC]], label %[[EXIT:.*]], label %[[LOOP]]
+; CHECK: [[EXIT]]:
+; CHECK-NEXT: ret void
+;
+; FORCED-LABEL: define void @shared_dead_operands(
+; FORCED-SAME: ptr [[DST:%.*]]) {
+; FORCED-NEXT: [[ENTRY:.*:]]
+; FORCED-NEXT: br label %[[VECTOR_PH:.*]]
+; FORCED: [[VECTOR_PH]]:
+; FORCED-NEXT: br label %[[VECTOR_BODY:.*]]
+; FORCED: [[VECTOR_BODY]]:
+; FORCED-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
+; FORCED-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4
+; FORCED-NEXT: [[TMP0:%.*]] = icmp eq i64 [[INDEX_NEXT]], 8
+; FORCED-NEXT: br i1 [[TMP0]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
+; FORCED: [[MIDDLE_BLOCK]]:
+; FORCED-NEXT: store float 0.000000e+00, ptr [[DST]], align 4
+; FORCED-NEXT: br label %[[EXIT:.*]]
+; FORCED: [[EXIT]]:
+; FORCED-NEXT: ret void
+;
+entry:
+ br label %loop
+
+loop:
+ %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
+ %iter = phi i64 [ 0, %entry ], [ %iter.next, %loop ]
+ %iter.fp = uitofp nneg i64 %iter to float
+ %angle.scaled = fmul nnan float %iter.fp, f0x40C90FDB
+ %angle = fmul nnan float %angle.scaled, 3.125000e-02
+ %cmp.0 = fcmp ogt float %angle, f0x40490FDB
+ %angle.adjusted.0 = fadd float %angle, f0xC0C90FDB
+ %sel.0 = select i1 %cmp.0, float %angle.adjusted.0, float %angle
+ %angle.sum.1 = fadd float %angle, %sel.0
+ %cmp.1 = fcmp ogt float %angle.sum.1, f0x40490FDB
+ %angle.adjusted.1 = fadd float %angle.sum.1, f0xC0C90FDB
+ %sel.1 = select i1 %cmp.1, float %angle.adjusted.1, float %angle.sum.1
+ %angle.sum.2 = fadd float %angle, %sel.1
+ %cmp.2 = fcmp ogt float %angle.sum.2, f0x40490FDB
+ %angle.adjusted.2 = fadd float %angle.sum.2, f0xC0C90FDB
+ %sel.2 = select i1 %cmp.2, float %angle.adjusted.2, float %angle.sum.2
+ %angle.sum.3 = fadd float %angle, %sel.2
+ %cmp.3 = fcmp ogt float %angle.sum.3, f0x40490FDB
+ %angle.adjusted.3 = fadd float %angle.sum.3, f0xC0C90FDB
+ %sel.3 = select i1 %cmp.3, float %angle.adjusted.3, float %angle.sum.3
+ %angle.sum.4 = fadd float %angle, %sel.3
+ %cmp.4 = fcmp ogt float %angle.sum.4, f0x40490FDB
+ %angle.adjusted.4 = fadd float %angle.sum.4, f0xC0C90FDB
+ %sel.4 = select i1 %cmp.4, float %angle.adjusted.4, float %angle.sum.4
+ store float 0.000000e+00, ptr %dst, align 4
+ %angle.sum.5 = fadd float %angle, %sel.4
+ %cmp.5 = fcmp ogt float %angle.sum.5, f0x40490FDB
+ %angle.adjusted.5 = fadd float %angle.sum.5, f0xC0C90FDB
+ %sel.5 = select i1 %cmp.5, float %angle.adjusted.5, float %angle.sum.5
+ %angle.sum.6 = fadd float %angle, %sel.5
+ %cmp.6 = fcmp ogt float %angle.sum.6, f0x40490FDB
+ %angle.adjusted.6 = fadd float %angle.sum.6, f0xC0C90FDB
+ %sel.6 = select i1 %cmp.6, float %angle.adjusted.6, float %angle.sum.6
+ %angle.sum.7 = fadd float %angle, %sel.6
+ %cmp.7 = fcmp ogt float %angle.sum.7, f0x40490FDB
+ %angle.adjusted.7 = fadd float %angle.sum.7, f0xC0C90FDB
+ %sel.7 = select i1 %cmp.7, float %angle.adjusted.7, float %angle.sum.7
+ %angle.sum.8 = fadd float %angle, %sel.7
+ %cmp.8 = fcmp ogt float %angle.sum.8, f0x40490FDB
+ %angle.adjusted.8 = fadd float %angle.sum.8, f0xC0C90FDB
+ %sel.8 = select i1 %cmp.8, float %angle.adjusted.8, float %angle.sum.8
+ %angle.sum.9 = fadd float %angle, %sel.8
+ %cmp.9 = fcmp ogt float %angle.sum.9, f0x40490FDB
+ %angle.adjusted.9 = fadd float %angle.sum.9, f0xC0C90FDB
+ %sel.9 = select i1 %cmp.9, float %angle.adjusted.9, float %angle.sum.9
+ %angle.sum.10 = fadd float %angle, %sel.9
+ %cmp.10 = fcmp ogt float %angle.sum.10, f0x40490FDB
+ %angle.adjusted.10 = fadd float %angle.sum.10, f0xC0C90FDB
+ %sel.10 = select i1 %cmp.10, float %angle.adjusted.10, float %angle.sum.10
+ %angle.sum.11 = fadd float %angle, %sel.10
+ %cmp.11 = fcmp ogt float %angle.sum.11, f0x40490FDB
+ %angle.adjusted.11 = fadd float %angle.sum.11, f0xC0C90FDB
+ %sel.11 = select i1 %cmp.11, float %angle.adjusted.11, float %angle.sum.11
+ %angle.sum.12 = fadd float %angle, %sel.11
+ %cmp.12 = fcmp ogt float %angle.sum.12, f0x40490FDB
+ %angle.adjusted.12 = fadd float %angle.sum.12, f0xC0C90FDB
+ %sel.12 = select i1 %cmp.12, float %angle.adjusted.12, float %angle.sum.12
+ %angle.sum.13 = fadd float %angle, %sel.12
+ %cmp.13 = fcmp ogt float %angle.sum.13, f0x40490FDB
+ %angle.adjusted.13 = fadd float %angle.sum.13, f0xC0C90FDB
+ %sel.13 = select i1 %cmp.13, float %angle.adjusted.13, float %angle.sum.13
+ %angle.sum.14 = fadd float %angle, %sel.13
+ %cmp.14 = fcmp ogt float %angle.sum.14, f0x40490FDB
+ %angle.adjusted.14 = fadd float %angle.sum.14, f0xC0C90FDB
+ %sel.14 = select i1 %cmp.14, float %angle.adjusted.14, float %angle.sum.14
+ %iv.next = add nuw nsw i64 %iv, 256
+ %iter.next = add nuw nsw i64 %iter, 1
+ %ec = icmp eq i64 %iv.next, 2048
+ br i1 %ec, label %exit, label %loop
+
+exit:
+ ret void
+}
More information about the llvm-commits
mailing list