[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