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

via llvm-commits llvm-commits at lists.llvm.org
Fri Apr 10 16:21:01 PDT 2026


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-backend-risc-v

Author: Ryan Buchner (bababuck)

<details>
<summary>Changes</summary>



---
Full diff: https://github.com/llvm/llvm-project/pull/191569.diff


1 Files Affected:

- (added) llvm/test/Transforms/SLPVectorizer/RISCV/revec-strided-store.ll (+107) 


``````````diff
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
+}

``````````

</details>


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


More information about the llvm-commits mailing list