[llvm] e5f39fb - [SLP][NFC]Add a test with the regression in SLP perf, NFC
via llvm-commits
llvm-commits at lists.llvm.org
Mon Sep 7 05:36:58 PDT 2026
Author: Alexey Bataev
Date: 2026-09-07T08:36:54-04:00
New Revision: e5f39fb259ea9c6d52fe9b2cd4213c17b7f11a56
URL: https://github.com/llvm/llvm-project/commit/e5f39fb259ea9c6d52fe9b2cd4213c17b7f11a56
DIFF: https://github.com/llvm/llvm-project/commit/e5f39fb259ea9c6d52fe9b2cd4213c17b7f11a56.diff
LOG: [SLP][NFC]Add a test with the regression in SLP perf, NFC
Reviewers:
Pull Request: https://github.com/llvm/llvm-project/pull/221716
Added:
Modified:
llvm/test/Transforms/SLPVectorizer/AArch64/splat-gather-subtree-store-chain.ll
Removed:
################################################################################
diff --git a/llvm/test/Transforms/SLPVectorizer/AArch64/splat-gather-subtree-store-chain.ll b/llvm/test/Transforms/SLPVectorizer/AArch64/splat-gather-subtree-store-chain.ll
index de820b4a0682a..5d7998dd7311d 100644
--- a/llvm/test/Transforms/SLPVectorizer/AArch64/splat-gather-subtree-store-chain.ll
+++ b/llvm/test/Transforms/SLPVectorizer/AArch64/splat-gather-subtree-store-chain.ll
@@ -61,3 +61,110 @@ loop:
}
declare double @llvm.fmuladd.f64(double, double, double)
+
+; The splat subtree for the splatted adds also forces extracts for their
+; scalar store uses; keeping it would reject the whole tree, so it must be
+; dropped and the splat gathers emitted as insertion sequences.
+define void @splat_subtree_with_scalar_uses(ptr noalias %out, ptr noalias %in) {
+; CHECK-LABEL: define void @splat_subtree_with_scalar_uses(
+; CHECK-SAME: ptr noalias [[OUT:%.*]], ptr noalias [[IN:%.*]]) {
+; CHECK-NEXT: [[ENTRY_RTVEC:.*:]]
+; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[IN]], align 4
+; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds nuw i8, ptr [[IN]], i64 4
+; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[ARRAYIDX1]], align 4
+; CHECK-NEXT: [[TMP5:%.*]] = add i32 [[TMP1]], [[TMP0]]
+; CHECK-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds nuw i8, ptr [[IN]], i64 8
+; CHECK-NEXT: [[TMP7:%.*]] = load i32, ptr [[ARRAYIDX2]], align 4
+; CHECK-NEXT: [[ARRAYIDX3:%.*]] = getelementptr inbounds nuw i8, ptr [[IN]], i64 12
+; CHECK-NEXT: [[TMP9:%.*]] = load i32, ptr [[ARRAYIDX3]], align 4
+; CHECK-NEXT: [[ADD5:%.*]] = add i32 [[TMP9]], [[TMP7]]
+; CHECK-NEXT: [[ARRAYIDX5:%.*]] = getelementptr inbounds nuw i8, ptr [[IN]], i64 16
+; CHECK-NEXT: [[TMP10:%.*]] = load i32, ptr [[ARRAYIDX5]], align 4
+; CHECK-NEXT: [[ARRAYIDX7:%.*]] = getelementptr inbounds nuw i8, ptr [[IN]], i64 20
+; CHECK-NEXT: [[TMP11:%.*]] = load i32, ptr [[ARRAYIDX7]], align 4
+; CHECK-NEXT: [[TMP3:%.*]] = add i32 [[TMP11]], [[TMP10]]
+; CHECK-NEXT: [[ARRAYIDX8:%.*]] = getelementptr inbounds nuw i8, ptr [[IN]], i64 24
+; CHECK-NEXT: [[TMP12:%.*]] = load i32, ptr [[ARRAYIDX8]], align 4
+; CHECK-NEXT: [[ADD9:%.*]] = add i32 [[TMP12]], [[TMP5]]
+; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[ADD9]], [[ADD5]]
+; CHECK-NEXT: [[ADD10:%.*]] = add i32 [[XOR]], [[TMP3]]
+; CHECK-NEXT: store i32 [[ADD10]], ptr [[OUT]], align 4
+; CHECK-NEXT: [[ARRAYIDX6:%.*]] = getelementptr inbounds nuw i8, ptr [[IN]], i64 28
+; CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr [[ARRAYIDX6]], align 4
+; CHECK-NEXT: [[ADD13:%.*]] = add i32 [[TMP6]], [[TMP5]]
+; CHECK-NEXT: [[XOR14:%.*]] = xor i32 [[ADD13]], [[ADD5]]
+; CHECK-NEXT: [[ADD15:%.*]] = add i32 [[XOR14]], [[TMP3]]
+; CHECK-NEXT: [[ARRAYIDX16:%.*]] = getelementptr inbounds nuw i8, ptr [[OUT]], i64 4
+; CHECK-NEXT: store i32 [[ADD15]], ptr [[ARRAYIDX16]], align 4
+; CHECK-NEXT: [[ARRAYIDX17:%.*]] = getelementptr inbounds nuw i8, ptr [[IN]], i64 32
+; CHECK-NEXT: [[TMP8:%.*]] = load i32, ptr [[ARRAYIDX17]], align 4
+; CHECK-NEXT: [[ADD18:%.*]] = add i32 [[TMP8]], [[TMP5]]
+; CHECK-NEXT: [[TMP2:%.*]] = xor i32 [[ADD18]], [[ADD5]]
+; CHECK-NEXT: [[ADD4:%.*]] = add i32 [[TMP2]], [[TMP3]]
+; CHECK-NEXT: [[ARRAYIDX21:%.*]] = getelementptr inbounds nuw i8, ptr [[OUT]], i64 8
+; CHECK-NEXT: store i32 [[ADD4]], ptr [[ARRAYIDX21]], align 4
+; CHECK-NEXT: [[ARRAYIDX22:%.*]] = getelementptr inbounds nuw i8, ptr [[IN]], i64 36
+; CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[ARRAYIDX22]], align 4
+; CHECK-NEXT: [[ADD:%.*]] = add i32 [[TMP4]], [[TMP5]]
+; CHECK-NEXT: [[XOR24:%.*]] = xor i32 [[ADD]], [[ADD5]]
+; CHECK-NEXT: [[ADD25:%.*]] = add i32 [[XOR24]], [[TMP3]]
+; CHECK-NEXT: [[ARRAYIDX26:%.*]] = getelementptr inbounds nuw i8, ptr [[OUT]], i64 12
+; CHECK-NEXT: store i32 [[ADD25]], ptr [[ARRAYIDX26]], align 4
+; CHECK-NEXT: [[ARRAYIDX27_SCALAR:%.*]] = getelementptr inbounds nuw i8, ptr [[OUT]], i64 16
+; CHECK-NEXT: store i32 [[TMP5]], ptr [[ARRAYIDX27_SCALAR]], align 4
+; CHECK-NEXT: [[ARRAYIDX28_SCALAR:%.*]] = getelementptr inbounds nuw i8, ptr [[OUT]], i64 24
+; CHECK-NEXT: store i32 [[ADD5]], ptr [[ARRAYIDX28_SCALAR]], align 4
+; CHECK-NEXT: [[ARRAYIDX29_SCALAR:%.*]] = getelementptr inbounds nuw i8, ptr [[OUT]], i64 32
+; CHECK-NEXT: store i32 [[TMP3]], ptr [[ARRAYIDX29_SCALAR]], align 4
+; CHECK-NEXT: ret void
+;
+entry:
+ %0 = load i32, ptr %in, align 4
+ %arrayidx1 = getelementptr inbounds nuw i8, ptr %in, i64 4
+ %1 = load i32, ptr %arrayidx1, align 4
+ %add = add i32 %1, %0
+ %arrayidx2 = getelementptr inbounds nuw i8, ptr %in, i64 8
+ %2 = load i32, ptr %arrayidx2, align 4
+ %arrayidx3 = getelementptr inbounds nuw i8, ptr %in, i64 12
+ %3 = load i32, ptr %arrayidx3, align 4
+ %add4 = add i32 %3, %2
+ %arrayidx5 = getelementptr inbounds nuw i8, ptr %in, i64 16
+ %4 = load i32, ptr %arrayidx5, align 4
+ %arrayidx6 = getelementptr inbounds nuw i8, ptr %in, i64 20
+ %5 = load i32, ptr %arrayidx6, align 4
+ %add7 = add i32 %5, %4
+ %arrayidx8 = getelementptr inbounds nuw i8, ptr %in, i64 24
+ %6 = load i32, ptr %arrayidx8, align 4
+ %add9 = add i32 %6, %add
+ %xor = xor i32 %add9, %add4
+ %add10 = add i32 %xor, %add7
+ store i32 %add10, ptr %out, align 4
+ %arrayidx12 = getelementptr inbounds nuw i8, ptr %in, i64 28
+ %7 = load i32, ptr %arrayidx12, align 4
+ %add13 = add i32 %7, %add
+ %xor14 = xor i32 %add13, %add4
+ %add15 = add i32 %xor14, %add7
+ %arrayidx16 = getelementptr inbounds nuw i8, ptr %out, i64 4
+ store i32 %add15, ptr %arrayidx16, align 4
+ %arrayidx17 = getelementptr inbounds nuw i8, ptr %in, i64 32
+ %8 = load i32, ptr %arrayidx17, align 4
+ %add18 = add i32 %8, %add
+ %xor19 = xor i32 %add18, %add4
+ %add20 = add i32 %xor19, %add7
+ %arrayidx21 = getelementptr inbounds nuw i8, ptr %out, i64 8
+ store i32 %add20, ptr %arrayidx21, align 4
+ %arrayidx22 = getelementptr inbounds nuw i8, ptr %in, i64 36
+ %9 = load i32, ptr %arrayidx22, align 4
+ %add23 = add i32 %9, %add
+ %xor24 = xor i32 %add23, %add4
+ %add25 = add i32 %xor24, %add7
+ %arrayidx26 = getelementptr inbounds nuw i8, ptr %out, i64 12
+ store i32 %add25, ptr %arrayidx26, align 4
+ %arrayidx27 = getelementptr inbounds nuw i8, ptr %out, i64 16
+ store i32 %add, ptr %arrayidx27, align 4
+ %arrayidx28 = getelementptr inbounds nuw i8, ptr %out, i64 24
+ store i32 %add4, ptr %arrayidx28, align 4
+ %arrayidx29 = getelementptr inbounds nuw i8, ptr %out, i64 32
+ store i32 %add7, ptr %arrayidx29, align 4
+ ret void
+}
More information about the llvm-commits
mailing list