[llvm] [SLP][NFC] Add sibling loop test (PR #216013)
Hari Limaye via llvm-commits
llvm-commits at lists.llvm.org
Thu Aug 13 04:30:29 PDT 2026
https://github.com/hazzlim created https://github.com/llvm/llvm-project/pull/216013
None
>From e43ed5faa309e614482b55a516d604339f4d4e3a Mon Sep 17 00:00:00 2001
From: Hari Limaye <hari.limaye at arm.com>
Date: Wed, 12 Aug 2026 15:24:16 +0000
Subject: [PATCH] [SLP][NFC] Add sibling loop test
---
.../SLPVectorizer/AArch64/sibling-loops.ll | 98 +++++++++++++++++++
1 file changed, 98 insertions(+)
create mode 100644 llvm/test/Transforms/SLPVectorizer/AArch64/sibling-loops.ll
diff --git a/llvm/test/Transforms/SLPVectorizer/AArch64/sibling-loops.ll b/llvm/test/Transforms/SLPVectorizer/AArch64/sibling-loops.ll
new file mode 100644
index 0000000000000..d99dfac6ad252
--- /dev/null
+++ b/llvm/test/Transforms/SLPVectorizer/AArch64/sibling-loops.ll
@@ -0,0 +1,98 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
+; RUN: opt < %s -S -mtriple=aarch64 -passes=slp-vectorizer | FileCheck %s
+
+define void @nested_sibling_producer_consumer(ptr %out, ptr %a, ptr %b, i64 %count, i64 %n, i64 %m) {
+; CHECK-LABEL: define void @nested_sibling_producer_consumer(
+; CHECK-SAME: ptr [[OUT:%.*]], ptr [[A:%.*]], ptr [[B:%.*]], i64 [[COUNT:%.*]], i64 [[N:%.*]], i64 [[M:%.*]]) {
+; CHECK-NEXT: [[ENTRY:.*]]:
+; CHECK-NEXT: br label %[[OUTER:.*]]
+; CHECK: [[OUTER]]:
+; CHECK-NEXT: [[K:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[K_NEXT:%.*]], %[[INNER_EXIT:.*]] ]
+; CHECK-NEXT: br label %[[FIRST:.*]]
+; CHECK: [[FIRST]]:
+; CHECK-NEXT: [[I:%.*]] = phi i64 [ 0, %[[OUTER]] ], [ [[I_NEXT:%.*]], %[[FIRST]] ]
+; CHECK-NEXT: [[A_SUM:%.*]] = phi double [ 0.000000e+00, %[[OUTER]] ], [ [[A_SUM_NEXT:%.*]], %[[FIRST]] ]
+; CHECK-NEXT: [[B_SUM:%.*]] = phi double [ 0.000000e+00, %[[OUTER]] ], [ [[B_SUM_NEXT:%.*]], %[[FIRST]] ]
+; CHECK-NEXT: [[A_PTR:%.*]] = getelementptr double, ptr [[A]], i64 [[I]]
+; CHECK-NEXT: [[B_PTR:%.*]] = getelementptr double, ptr [[B]], i64 [[I]]
+; CHECK-NEXT: [[A_VALUE:%.*]] = load double, ptr [[A_PTR]], align 8
+; CHECK-NEXT: [[B_VALUE:%.*]] = load double, ptr [[B_PTR]], align 8
+; CHECK-NEXT: [[A_SUM_NEXT]] = fadd fast double [[A_SUM]], [[A_VALUE]]
+; CHECK-NEXT: [[B_SUM_NEXT]] = fadd fast double [[B_SUM]], [[B_VALUE]]
+; CHECK-NEXT: [[I_NEXT]] = add nuw i64 [[I]], 1
+; CHECK-NEXT: [[FIRST_MORE:%.*]] = icmp ult i64 [[I_NEXT]], [[N]]
+; CHECK-NEXT: br i1 [[FIRST_MORE]], label %[[FIRST]], label %[[BETWEEN:.*]]
+; CHECK: [[BETWEEN]]:
+; CHECK-NEXT: [[SKIP:%.*]] = icmp eq i64 [[M]], 0
+; CHECK-NEXT: br i1 [[SKIP]], label %[[INNER_EXIT]], label %[[SECOND:.*]]
+; CHECK: [[SECOND]]:
+; CHECK-NEXT: [[J:%.*]] = phi i64 [ 0, %[[BETWEEN]] ], [ [[J_NEXT:%.*]], %[[SECOND]] ]
+; CHECK-NEXT: [[A_ACC:%.*]] = phi double [ [[A_SUM_NEXT]], %[[BETWEEN]] ], [ [[A_ACC_NEXT:%.*]], %[[SECOND]] ]
+; CHECK-NEXT: [[B_ACC:%.*]] = phi double [ [[B_SUM_NEXT]], %[[BETWEEN]] ], [ [[B_ACC_NEXT:%.*]], %[[SECOND]] ]
+; CHECK-NEXT: [[A_ACC_NEXT]] = fmul fast double [[A_ACC]], 3.000000e+00
+; CHECK-NEXT: [[B_ACC_NEXT]] = fmul fast double [[B_ACC]], 4.000000e+00
+; CHECK-NEXT: [[J_NEXT]] = add nuw i64 [[J]], 1
+; CHECK-NEXT: [[SECOND_MORE:%.*]] = icmp ult i64 [[J_NEXT]], [[M]]
+; CHECK-NEXT: br i1 [[SECOND_MORE]], label %[[SECOND]], label %[[INNER_EXIT]]
+; CHECK: [[INNER_EXIT]]:
+; CHECK-NEXT: [[A_RESULT:%.*]] = phi double [ [[A_SUM_NEXT]], %[[BETWEEN]] ], [ [[A_ACC_NEXT]], %[[SECOND]] ]
+; CHECK-NEXT: [[B_RESULT:%.*]] = phi double [ [[B_SUM_NEXT]], %[[BETWEEN]] ], [ [[B_ACC_NEXT]], %[[SECOND]] ]
+; CHECK-NEXT: [[OUT_BASE:%.*]] = getelementptr [2 x double], ptr [[OUT]], i64 [[K]]
+; CHECK-NEXT: store double [[A_RESULT]], ptr [[OUT_BASE]], align 8
+; CHECK-NEXT: [[OUT1:%.*]] = getelementptr double, ptr [[OUT_BASE]], i64 1
+; CHECK-NEXT: store double [[B_RESULT]], ptr [[OUT1]], align 8
+; CHECK-NEXT: [[K_NEXT]] = add nuw i64 [[K]], 1
+; CHECK-NEXT: [[OUTER_MORE:%.*]] = icmp ult i64 [[K_NEXT]], [[COUNT]]
+; CHECK-NEXT: br i1 [[OUTER_MORE]], label %[[OUTER]], label %[[EXIT:.*]]
+; CHECK: [[EXIT]]:
+; CHECK-NEXT: ret void
+;
+entry:
+ br label %outer
+
+outer: ; preds = %inner.exit, %entry
+ %k = phi i64 [ 0, %entry ], [ %k.next, %inner.exit ]
+ br label %first
+
+first: ; preds = %first, %outer
+ %i = phi i64 [ 0, %outer ], [ %i.next, %first ]
+ %a.sum = phi double [ 0.000000e+00, %outer ], [ %a.sum.next, %first ]
+ %b.sum = phi double [ 0.000000e+00, %outer ], [ %b.sum.next, %first ]
+ %a.ptr = getelementptr double, ptr %a, i64 %i
+ %b.ptr = getelementptr double, ptr %b, i64 %i
+ %a.value = load double, ptr %a.ptr, align 8
+ %b.value = load double, ptr %b.ptr, align 8
+ %a.sum.next = fadd fast double %a.sum, %a.value
+ %b.sum.next = fadd fast double %b.sum, %b.value
+ %i.next = add nuw i64 %i, 1
+ %first.more = icmp ult i64 %i.next, %n
+ br i1 %first.more, label %first, label %between
+
+between: ; preds = %first
+ %skip = icmp eq i64 %m, 0
+ br i1 %skip, label %inner.exit, label %second
+
+second: ; preds = %second, %between
+ %j = phi i64 [ 0, %between ], [ %j.next, %second ]
+ %a.acc = phi double [ %a.sum.next, %between ], [ %a.acc.next, %second ]
+ %b.acc = phi double [ %b.sum.next, %between ], [ %b.acc.next, %second ]
+ %a.acc.next = fmul fast double %a.acc, 3.000000e+00
+ %b.acc.next = fmul fast double %b.acc, 4.000000e+00
+ %j.next = add nuw i64 %j, 1
+ %second.more = icmp ult i64 %j.next, %m
+ br i1 %second.more, label %second, label %inner.exit
+
+inner.exit: ; preds = %second, %between
+ %a.result = phi double [ %a.sum.next, %between ], [ %a.acc.next, %second ]
+ %b.result = phi double [ %b.sum.next, %between ], [ %b.acc.next, %second ]
+ %out.base = getelementptr [2 x double], ptr %out, i64 %k
+ store double %a.result, ptr %out.base, align 8
+ %out1 = getelementptr double, ptr %out.base, i64 1
+ store double %b.result, ptr %out1, align 8
+ %k.next = add nuw i64 %k, 1
+ %outer.more = icmp ult i64 %k.next, %count
+ br i1 %outer.more, label %outer, label %exit
+
+exit: ; preds = %inner.exit
+ ret void
+}
More information about the llvm-commits
mailing list