[llvm] d8b718a - [SLP]Match the mask size, when copying mask for full match
Alexey Bataev via llvm-commits
llvm-commits at lists.llvm.org
Sun Mar 8 05:33:42 PDT 2026
Author: Alexey Bataev
Date: 2026-03-08T05:33:30-07:00
New Revision: d8b718a3fa540827a7c1bf250fd55cfa0d029e0f
URL: https://github.com/llvm/llvm-project/commit/d8b718a3fa540827a7c1bf250fd55cfa0d029e0f
DIFF: https://github.com/llvm/llvm-project/commit/d8b718a3fa540827a7c1bf250fd55cfa0d029e0f.diff
LOG: [SLP]Match the mask size, when copying mask for full match
Need to be careful, when filling the mask for fully matched nodes, the
masks may differ in sizes
Fixes a crash reported in test/Transforms/SLPVectorizer/X86/mask-size-less-common-mask.ll
Added:
llvm/test/Transforms/SLPVectorizer/X86/mask-size-less-common-mask.ll
Modified:
llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
index 8bc16972beddc..591ee2fea3148 100644
--- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
+++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
@@ -18496,7 +18496,7 @@ BoUpSLP::isGatherShuffledSingleRegisterEntry(
TE->ReuseShuffleIndices.size() == VL.size() &&
(*It)->isSame(TE->Scalars)))) {
Entries.push_back(*It);
- if ((*It)->getVectorFactor() == VL.size()) {
+ if (IsReusedNodeFound || (*It)->getVectorFactor() == VL.size()) {
std::iota(std::next(Mask.begin(), Part * VL.size()),
std::next(Mask.begin(), (Part + 1) * VL.size()), 0);
} else {
diff --git a/llvm/test/Transforms/SLPVectorizer/X86/mask-size-less-common-mask.ll b/llvm/test/Transforms/SLPVectorizer/X86/mask-size-less-common-mask.ll
new file mode 100644
index 0000000000000..3db2925ad1b50
--- /dev/null
+++ b/llvm/test/Transforms/SLPVectorizer/X86/mask-size-less-common-mask.ll
@@ -0,0 +1,187 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
+; RUN: opt -passes=slp-vectorizer -S -mtriple=x86_64-unknown-linux-gnu < %s | FileCheck %s
+
+define void @test() {
+; CHECK-LABEL: define void @test() {
+; CHECK-NEXT: [[ENTRY:.*:]]
+; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr null, align 1
+; CHECK-NEXT: [[CMP8_8_I:%.*]] = icmp ult i8 [[TMP0]], 0
+; CHECK-NEXT: [[TMP1:%.*]] = lshr i8 [[TMP0]], 0
+; CHECK-NEXT: [[NARROW_8_I:%.*]] = select i1 [[CMP8_8_I]], i8 0, i8 [[TMP1]]
+; CHECK-NEXT: [[ARRAYIDX13_8_I:%.*]] = getelementptr i8, ptr null, i64 16
+; CHECK-NEXT: store i8 [[NARROW_8_I]], ptr [[ARRAYIDX13_8_I]], align 1
+; CHECK-NEXT: [[CMP15_8_I:%.*]] = icmp ult i8 [[TMP0]], 0
+; CHECK-NEXT: [[TMP2:%.*]] = and i8 [[TMP0]], 0
+; CHECK-NEXT: [[NARROW31_8_I:%.*]] = select i1 [[CMP15_8_I]], i8 0, i8 [[TMP2]]
+; CHECK-NEXT: [[ARRAYIDX25_8_I:%.*]] = getelementptr i8, ptr null, i64 17
+; CHECK-NEXT: store i8 [[NARROW31_8_I]], ptr [[ARRAYIDX25_8_I]], align 1
+; CHECK-NEXT: [[TMP3:%.*]] = load i8, ptr null, align 1
+; CHECK-NEXT: [[CMP8_9_I:%.*]] = icmp ult i8 [[TMP3]], 0
+; CHECK-NEXT: [[TMP4:%.*]] = lshr i8 [[TMP3]], 0
+; CHECK-NEXT: [[NARROW_9_I:%.*]] = select i1 [[CMP8_9_I]], i8 0, i8 [[TMP4]]
+; CHECK-NEXT: [[ARRAYIDX13_9_I:%.*]] = getelementptr i8, ptr null, i64 18
+; CHECK-NEXT: store i8 [[NARROW_9_I]], ptr [[ARRAYIDX13_9_I]], align 1
+; CHECK-NEXT: [[CMP15_9_I:%.*]] = icmp ult i8 [[TMP3]], 0
+; CHECK-NEXT: [[TMP5:%.*]] = and i8 [[TMP3]], 0
+; CHECK-NEXT: [[NARROW31_9_I:%.*]] = select i1 [[CMP15_9_I]], i8 0, i8 [[TMP5]]
+; CHECK-NEXT: [[ARRAYIDX25_9_I:%.*]] = getelementptr i8, ptr null, i64 19
+; CHECK-NEXT: store i8 [[NARROW31_9_I]], ptr [[ARRAYIDX25_9_I]], align 1
+; CHECK-NEXT: [[TMP6:%.*]] = load i8, ptr null, align 1
+; CHECK-NEXT: [[CMP8_10_I:%.*]] = icmp ult i8 [[TMP6]], 0
+; CHECK-NEXT: [[TMP7:%.*]] = lshr i8 [[TMP6]], 0
+; CHECK-NEXT: [[NARROW_10_I:%.*]] = select i1 [[CMP8_10_I]], i8 0, i8 [[TMP7]]
+; CHECK-NEXT: [[ARRAYIDX13_10_I:%.*]] = getelementptr i8, ptr null, i64 20
+; CHECK-NEXT: store i8 [[NARROW_10_I]], ptr [[ARRAYIDX13_10_I]], align 1
+; CHECK-NEXT: [[CMP15_10_I:%.*]] = icmp ult i8 [[TMP6]], 0
+; CHECK-NEXT: [[TMP8:%.*]] = and i8 [[TMP6]], 0
+; CHECK-NEXT: [[NARROW31_10_I:%.*]] = select i1 [[CMP15_10_I]], i8 0, i8 [[TMP8]]
+; CHECK-NEXT: [[ARRAYIDX25_10_I:%.*]] = getelementptr i8, ptr null, i64 21
+; CHECK-NEXT: store i8 [[NARROW31_10_I]], ptr [[ARRAYIDX25_10_I]], align 1
+; CHECK-NEXT: [[TMP9:%.*]] = load i8, ptr null, align 1
+; CHECK-NEXT: [[CMP8_11_I:%.*]] = icmp ult i8 [[TMP9]], 0
+; CHECK-NEXT: [[TMP10:%.*]] = lshr i8 [[TMP9]], 0
+; CHECK-NEXT: [[NARROW_11_I:%.*]] = select i1 [[CMP8_11_I]], i8 0, i8 [[TMP10]]
+; CHECK-NEXT: [[ARRAYIDX13_11_I:%.*]] = getelementptr i8, ptr null, i64 22
+; CHECK-NEXT: store i8 [[NARROW_11_I]], ptr [[ARRAYIDX13_11_I]], align 1
+; CHECK-NEXT: [[CMP15_11_I:%.*]] = icmp ult i8 [[TMP9]], 0
+; CHECK-NEXT: [[TMP11:%.*]] = and i8 [[TMP9]], 0
+; CHECK-NEXT: [[NARROW31_11_I:%.*]] = select i1 [[CMP15_11_I]], i8 0, i8 [[TMP11]]
+; CHECK-NEXT: [[ARRAYIDX25_11_I:%.*]] = getelementptr i8, ptr null, i64 23
+; CHECK-NEXT: store i8 [[NARROW31_11_I]], ptr [[ARRAYIDX25_11_I]], align 1
+; CHECK-NEXT: [[TMP12:%.*]] = load i8, ptr null, align 1
+; CHECK-NEXT: [[CMP8_12_I:%.*]] = icmp ult i8 [[TMP12]], 0
+; CHECK-NEXT: [[TMP13:%.*]] = lshr i8 [[TMP12]], 0
+; CHECK-NEXT: [[NARROW_12_I:%.*]] = select i1 [[CMP8_12_I]], i8 0, i8 [[TMP13]]
+; CHECK-NEXT: [[ARRAYIDX13_12_I:%.*]] = getelementptr i8, ptr null, i64 24
+; CHECK-NEXT: store i8 [[NARROW_12_I]], ptr [[ARRAYIDX13_12_I]], align 1
+; CHECK-NEXT: [[CMP15_12_I:%.*]] = icmp ult i8 [[TMP12]], 0
+; CHECK-NEXT: [[TMP14:%.*]] = and i8 [[TMP12]], 0
+; CHECK-NEXT: [[NARROW31_12_I:%.*]] = select i1 [[CMP15_12_I]], i8 0, i8 [[TMP14]]
+; CHECK-NEXT: [[ARRAYIDX25_12_I:%.*]] = getelementptr i8, ptr null, i64 25
+; CHECK-NEXT: store i8 [[NARROW31_12_I]], ptr [[ARRAYIDX25_12_I]], align 1
+; CHECK-NEXT: [[TMP15:%.*]] = load i8, ptr null, align 1
+; CHECK-NEXT: [[CMP8_13_I:%.*]] = icmp ult i8 [[TMP15]], 0
+; CHECK-NEXT: [[TMP16:%.*]] = lshr i8 [[TMP15]], 0
+; CHECK-NEXT: [[NARROW_13_I:%.*]] = select i1 [[CMP8_13_I]], i8 0, i8 [[TMP16]]
+; CHECK-NEXT: [[ARRAYIDX13_13_I:%.*]] = getelementptr i8, ptr null, i64 26
+; CHECK-NEXT: store i8 [[NARROW_13_I]], ptr [[ARRAYIDX13_13_I]], align 1
+; CHECK-NEXT: [[CMP15_13_I:%.*]] = icmp ult i8 [[TMP15]], 0
+; CHECK-NEXT: [[TMP17:%.*]] = and i8 [[TMP15]], 0
+; CHECK-NEXT: [[NARROW31_13_I:%.*]] = select i1 [[CMP15_13_I]], i8 0, i8 [[TMP17]]
+; CHECK-NEXT: [[ARRAYIDX25_13_I:%.*]] = getelementptr i8, ptr null, i64 27
+; CHECK-NEXT: store i8 [[NARROW31_13_I]], ptr [[ARRAYIDX25_13_I]], align 1
+; CHECK-NEXT: [[TMP18:%.*]] = load i8, ptr null, align 1
+; CHECK-NEXT: [[CMP8_14_I:%.*]] = icmp ult i8 [[TMP18]], 0
+; CHECK-NEXT: [[TMP19:%.*]] = lshr i8 [[TMP18]], 0
+; CHECK-NEXT: [[NARROW_14_I:%.*]] = select i1 [[CMP8_14_I]], i8 0, i8 [[TMP19]]
+; CHECK-NEXT: [[ARRAYIDX13_14_I:%.*]] = getelementptr i8, ptr null, i64 28
+; CHECK-NEXT: store i8 [[NARROW_14_I]], ptr [[ARRAYIDX13_14_I]], align 1
+; CHECK-NEXT: [[CMP15_14_I:%.*]] = icmp ult i8 [[TMP18]], 0
+; CHECK-NEXT: [[TMP20:%.*]] = and i8 [[TMP18]], 0
+; CHECK-NEXT: [[NARROW31_14_I:%.*]] = select i1 [[CMP15_14_I]], i8 0, i8 [[TMP20]]
+; CHECK-NEXT: [[ARRAYIDX25_14_I:%.*]] = getelementptr i8, ptr null, i64 29
+; CHECK-NEXT: store i8 [[NARROW31_14_I]], ptr [[ARRAYIDX25_14_I]], align 1
+; CHECK-NEXT: [[TMP21:%.*]] = load i8, ptr null, align 1
+; CHECK-NEXT: [[CMP8_15_I:%.*]] = icmp ult i8 [[TMP21]], 0
+; CHECK-NEXT: [[TMP22:%.*]] = lshr i8 [[TMP21]], 0
+; CHECK-NEXT: [[NARROW_15_I:%.*]] = select i1 [[CMP8_15_I]], i8 0, i8 [[TMP22]]
+; CHECK-NEXT: [[ARRAYIDX13_15_I:%.*]] = getelementptr i8, ptr null, i64 30
+; CHECK-NEXT: store i8 [[NARROW_15_I]], ptr [[ARRAYIDX13_15_I]], align 1
+; CHECK-NEXT: [[CMP15_15_I:%.*]] = icmp ult i8 [[TMP21]], 0
+; CHECK-NEXT: [[TMP23:%.*]] = and i8 [[TMP21]], 0
+; CHECK-NEXT: [[NARROW31_15_I:%.*]] = select i1 [[CMP15_15_I]], i8 0, i8 [[TMP23]]
+; CHECK-NEXT: [[ARRAYIDX25_15_I:%.*]] = getelementptr i8, ptr null, i64 31
+; CHECK-NEXT: store i8 [[NARROW31_15_I]], ptr [[ARRAYIDX25_15_I]], align 1
+; CHECK-NEXT: ret void
+;
+entry:
+ %0 = load i8, ptr null, align 1
+ %cmp8.8.i = icmp ult i8 %0, 0
+ %1 = lshr i8 %0, 0
+ %narrow.8.i = select i1 %cmp8.8.i, i8 0, i8 %1
+ %arrayidx13.8.i = getelementptr i8, ptr null, i64 16
+ store i8 %narrow.8.i, ptr %arrayidx13.8.i, align 1
+ %cmp15.8.i = icmp ult i8 %0, 0
+ %2 = and i8 %0, 0
+ %narrow31.8.i = select i1 %cmp15.8.i, i8 0, i8 %2
+ %arrayidx25.8.i = getelementptr i8, ptr null, i64 17
+ store i8 %narrow31.8.i, ptr %arrayidx25.8.i, align 1
+ %3 = load i8, ptr null, align 1
+ %cmp8.9.i = icmp ult i8 %3, 0
+ %4 = lshr i8 %3, 0
+ %narrow.9.i = select i1 %cmp8.9.i, i8 0, i8 %4
+ %arrayidx13.9.i = getelementptr i8, ptr null, i64 18
+ store i8 %narrow.9.i, ptr %arrayidx13.9.i, align 1
+ %cmp15.9.i = icmp ult i8 %3, 0
+ %5 = and i8 %3, 0
+ %narrow31.9.i = select i1 %cmp15.9.i, i8 0, i8 %5
+ %arrayidx25.9.i = getelementptr i8, ptr null, i64 19
+ store i8 %narrow31.9.i, ptr %arrayidx25.9.i, align 1
+ %6 = load i8, ptr null, align 1
+ %cmp8.10.i = icmp ult i8 %6, 0
+ %7 = lshr i8 %6, 0
+ %narrow.10.i = select i1 %cmp8.10.i, i8 0, i8 %7
+ %arrayidx13.10.i = getelementptr i8, ptr null, i64 20
+ store i8 %narrow.10.i, ptr %arrayidx13.10.i, align 1
+ %cmp15.10.i = icmp ult i8 %6, 0
+ %8 = and i8 %6, 0
+ %narrow31.10.i = select i1 %cmp15.10.i, i8 0, i8 %8
+ %arrayidx25.10.i = getelementptr i8, ptr null, i64 21
+ store i8 %narrow31.10.i, ptr %arrayidx25.10.i, align 1
+ %9 = load i8, ptr null, align 1
+ %cmp8.11.i = icmp ult i8 %9, 0
+ %10 = lshr i8 %9, 0
+ %narrow.11.i = select i1 %cmp8.11.i, i8 0, i8 %10
+ %arrayidx13.11.i = getelementptr i8, ptr null, i64 22
+ store i8 %narrow.11.i, ptr %arrayidx13.11.i, align 1
+ %cmp15.11.i = icmp ult i8 %9, 0
+ %11 = and i8 %9, 0
+ %narrow31.11.i = select i1 %cmp15.11.i, i8 0, i8 %11
+ %arrayidx25.11.i = getelementptr i8, ptr null, i64 23
+ store i8 %narrow31.11.i, ptr %arrayidx25.11.i, align 1
+ %12 = load i8, ptr null, align 1
+ %cmp8.12.i = icmp ult i8 %12, 0
+ %13 = lshr i8 %12, 0
+ %narrow.12.i = select i1 %cmp8.12.i, i8 0, i8 %13
+ %arrayidx13.12.i = getelementptr i8, ptr null, i64 24
+ store i8 %narrow.12.i, ptr %arrayidx13.12.i, align 1
+ %cmp15.12.i = icmp ult i8 %12, 0
+ %14 = and i8 %12, 0
+ %narrow31.12.i = select i1 %cmp15.12.i, i8 0, i8 %14
+ %arrayidx25.12.i = getelementptr i8, ptr null, i64 25
+ store i8 %narrow31.12.i, ptr %arrayidx25.12.i, align 1
+ %15 = load i8, ptr null, align 1
+ %cmp8.13.i = icmp ult i8 %15, 0
+ %16 = lshr i8 %15, 0
+ %narrow.13.i = select i1 %cmp8.13.i, i8 0, i8 %16
+ %arrayidx13.13.i = getelementptr i8, ptr null, i64 26
+ store i8 %narrow.13.i, ptr %arrayidx13.13.i, align 1
+ %cmp15.13.i = icmp ult i8 %15, 0
+ %17 = and i8 %15, 0
+ %narrow31.13.i = select i1 %cmp15.13.i, i8 0, i8 %17
+ %arrayidx25.13.i = getelementptr i8, ptr null, i64 27
+ store i8 %narrow31.13.i, ptr %arrayidx25.13.i, align 1
+ %18 = load i8, ptr null, align 1
+ %cmp8.14.i = icmp ult i8 %18, 0
+ %19 = lshr i8 %18, 0
+ %narrow.14.i = select i1 %cmp8.14.i, i8 0, i8 %19
+ %arrayidx13.14.i = getelementptr i8, ptr null, i64 28
+ store i8 %narrow.14.i, ptr %arrayidx13.14.i, align 1
+ %cmp15.14.i = icmp ult i8 %18, 0
+ %20 = and i8 %18, 0
+ %narrow31.14.i = select i1 %cmp15.14.i, i8 0, i8 %20
+ %arrayidx25.14.i = getelementptr i8, ptr null, i64 29
+ store i8 %narrow31.14.i, ptr %arrayidx25.14.i, align 1
+ %21 = load i8, ptr null, align 1
+ %cmp8.15.i = icmp ult i8 %21, 0
+ %22 = lshr i8 %21, 0
+ %narrow.15.i = select i1 %cmp8.15.i, i8 0, i8 %22
+ %arrayidx13.15.i = getelementptr i8, ptr null, i64 30
+ store i8 %narrow.15.i, ptr %arrayidx13.15.i, align 1
+ %cmp15.15.i = icmp ult i8 %21, 0
+ %23 = and i8 %21, 0
+ %narrow31.15.i = select i1 %cmp15.15.i, i8 0, i8 %23
+ %arrayidx25.15.i = getelementptr i8, ptr null, i64 31
+ store i8 %narrow31.15.i, ptr %arrayidx25.15.i, align 1
+ ret void
+}
More information about the llvm-commits
mailing list