[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