[llvm] [SLP][NFC] Precommit test for strided store revectorization (PR #191569)

Ryan Buchner via llvm-commits llvm-commits at lists.llvm.org
Fri Apr 10 16:20:30 PDT 2026


https://github.com/bababuck created https://github.com/llvm/llvm-project/pull/191569

None

>From 15813f97781d76b957a40d9340bdbc02935c5661 Mon Sep 17 00:00:00 2001
From: bababuck <buchner.ryan at gmail.com>
Date: Fri, 10 Apr 2026 13:34:20 -0700
Subject: [PATCH] [SLP][NFC] Precommit test for strided store revectorization

---
 .../RISCV/revec-strided-store.ll              | 107 ++++++++++++++++++
 1 file changed, 107 insertions(+)
 create mode 100644 llvm/test/Transforms/SLPVectorizer/RISCV/revec-strided-store.ll

diff --git a/llvm/test/Transforms/SLPVectorizer/RISCV/revec-strided-store.ll b/llvm/test/Transforms/SLPVectorizer/RISCV/revec-strided-store.ll
new file mode 100644
index 0000000000000..be1417d85b6f0
--- /dev/null
+++ b/llvm/test/Transforms/SLPVectorizer/RISCV/revec-strided-store.ll
@@ -0,0 +1,107 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -mtriple=riscv64 -mcpu=sifive-p870 -passes=slp-vectorizer -S -slp-revec -slp-threshold=-100 %s | FileCheck %s
+
+; Strided load into strided store
+define void @strided_load_and_store(ptr %in, ptr %out) {
+; CHECK-LABEL: @strided_load_and_store(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[TMP0:%.*]] = getelementptr i8, ptr [[IN:%.*]], i64 16
+; CHECK-NEXT:    [[TMP1:%.*]] = load <8 x i8>, ptr [[IN]], align 2
+; CHECK-NEXT:    [[TMP2:%.*]] = load <8 x i8>, ptr [[TMP0]], align 2
+; CHECK-NEXT:    [[TMP3:%.*]] = getelementptr i8, ptr [[OUT:%.*]], i64 16
+; CHECK-NEXT:    store <8 x i8> [[TMP1]], ptr [[OUT]], align 2
+; CHECK-NEXT:    store <8 x i8> [[TMP2]], ptr [[TMP3]], align 2
+; CHECK-NEXT:    ret void
+;
+entry:
+  %0 = getelementptr i8, ptr %in, i64 16
+  %1 = load <8 x i8>, ptr %in, align 2
+  %2 = load <8 x i8>, ptr %0, align 2
+  %5 = getelementptr i8, ptr %out, i64 16
+  store <8 x i8> %1, ptr %out, align 2
+  store <8 x i8> %2, ptr %5, align 2
+  ret void
+}
+
+; Base case of strided store, implicitly is widened
+define void @widened_strided_store(ptr %out0) {
+; CHECK-LABEL: @widened_strided_store(
+; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr i16, ptr null, i64 16
+; CHECK-NEXT:    store <4 x i16> zeroinitializer, ptr [[TMP1]], align 2
+; CHECK-NEXT:    store <4 x i16> zeroinitializer, ptr null, align 2
+; CHECK-NEXT:    ret void
+;
+  %1 = getelementptr i16, ptr null, i64 16
+  store <4 x i16> zeroinitializer, ptr %1, align 2
+  store <4 x i16> zeroinitializer, ptr null, align 2
+  ret void
+}
+
+; Widened strided store pattern but vectorized types
+define void @doubly_widened_strided_store(ptr %out0) {
+; CHECK-LABEL: @doubly_widened_strided_store(
+; CHECK-NEXT:    [[OUT2:%.*]] = getelementptr i8, ptr [[OUT0:%.*]], i64 12
+; CHECK-NEXT:    store <4 x i8> zeroinitializer, ptr [[OUT0]], align 2
+; CHECK-NEXT:    store <4 x i8> zeroinitializer, ptr [[OUT2]], align 2
+; CHECK-NEXT:    ret void
+;
+  %out1 = getelementptr i8, ptr %out0, i64 2
+  %out2 = getelementptr i8, ptr %out0, i64 12
+  %out3 = getelementptr i8, ptr %out0, i64 14
+  store <2 x i8> zeroinitializer, ptr %out0, align 2
+  store <2 x i8> zeroinitializer, ptr %out1, align 2
+  store <2 x i8> zeroinitializer, ptr %out2, align 2
+  store <2 x i8> zeroinitializer, ptr %out3, align 2
+  ret void
+}
+
+; The resulting widened type isn't legal
+define void @too_wide(ptr %out0) {
+; CHECK-LABEL: @too_wide(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    store <16 x i16> zeroinitializer, ptr [[OUT0:%.*]], align 2
+; CHECK-NEXT:    ret void
+;
+entry:
+  %out1 = getelementptr i16, ptr %out0, i64 8
+  store <8 x i16> zeroinitializer, ptr %out0, align 2
+  store <8 x i16> zeroinitializer, ptr %out1, align 2
+  ret void
+}
+
+; Stride size isn't aligned to the vector size
+define void @non_aligned_stride(ptr %out0) {
+; CHECK-LABEL: @non_aligned_stride(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[OUT1:%.*]] = getelementptr i8, ptr [[OUT0:%.*]], i64 3
+; CHECK-NEXT:    store <2 x i8> zeroinitializer, ptr [[OUT0]], align 2
+; CHECK-NEXT:    store <2 x i8> zeroinitializer, ptr [[OUT1]], align 2
+; CHECK-NEXT:    ret void
+;
+entry:
+  %out1 = getelementptr i8, ptr %out0, i64 3
+  store <2 x i8> zeroinitializer, ptr %out0, align 2
+  store <2 x i8> zeroinitializer, ptr %out1, align 2
+  ret void
+}
+
+; Stride size isn't aligned to the vector size
+; Scalar version of @non_aligned_stride
+define void @non_aligned_stride_scalar(ptr %out0) {
+; CHECK-LABEL: @non_aligned_stride_scalar(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[OUT2:%.*]] = getelementptr i8, ptr [[OUT0:%.*]], i64 3
+; CHECK-NEXT:    store <2 x i8> zeroinitializer, ptr [[OUT0]], align 2
+; CHECK-NEXT:    store <2 x i8> zeroinitializer, ptr [[OUT2]], align 2
+; CHECK-NEXT:    ret void
+;
+entry:
+  %out1 = getelementptr i8, ptr %out0, i64 1
+  %out2 = getelementptr i8, ptr %out0, i64 3
+  %out3 = getelementptr i8, ptr %out0, i64 4
+  store i8 0, ptr %out0, align 2
+  store i8 0, ptr %out1, align 2
+  store i8 0, ptr %out2, align 2
+  store i8 0, ptr %out3, align 2
+  ret void
+}



More information about the llvm-commits mailing list