Skip to content

Commit 206799f

Browse files
committed
[SLP]Fix PR72524: "Out-of-bounds shuffle mask element" failed.
Need to check if we ran into subvector extract pattern before checking for identity vector to avoid compiler crash.
1 parent 59b2301 commit 206799f

File tree

2 files changed

+91
-2
lines changed

2 files changed

+91
-2
lines changed

llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10569,8 +10569,12 @@ ResTy BoUpSLP::processBuildVector(const TreeEntry *E, Args &...Params) {
1056910569
});
1057010570
if (It == VectorizableTree.end())
1057110571
return false;
10572-
if (Mask.size() <= InputVF &&
10573-
ShuffleVectorInst::isIdentityMask(Mask, Mask.size())) {
10572+
int Idx;
10573+
if ((Mask.size() < InputVF &&
10574+
ShuffleVectorInst::isExtractSubvectorMask(Mask, InputVF, Idx) &&
10575+
Idx == 0) ||
10576+
(Mask.size() == InputVF &&
10577+
ShuffleVectorInst::isIdentityMask(Mask, Mask.size()))) {
1057410578
std::iota(Mask.begin(), Mask.end(), 0);
1057510579
} else {
1057610580
unsigned I =
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
2+
; RUN: opt -passes=slp-vectorizer -S -slp-threshold=-99999 -mtriple=x86_64-unknown-linux-gnu < %s | FileCheck %s
3+
4+
define void @test() {
5+
; CHECK-LABEL: define void @test() {
6+
; CHECK-NEXT: bb:
7+
; CHECK-NEXT: br label [[BB1:%.*]]
8+
; CHECK: bb1:
9+
; CHECK-NEXT: [[TMP0:%.*]] = phi <8 x i32> [ poison, [[BB10:%.*]] ], [ zeroinitializer, [[BB:%.*]] ]
10+
; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <2 x i32> <i32 6, i32 6>
11+
; CHECK-NEXT: switch i32 0, label [[BB16:%.*]] [
12+
; CHECK-NEXT: i32 0, label [[BB14:%.*]]
13+
; CHECK-NEXT: i32 1, label [[BB11:%.*]]
14+
; CHECK-NEXT: ]
15+
; CHECK: bb9:
16+
; CHECK-NEXT: br label [[BB11]]
17+
; CHECK: bb10:
18+
; CHECK-NEXT: br label [[BB1]]
19+
; CHECK: bb11:
20+
; CHECK-NEXT: [[TMP2:%.*]] = phi <2 x i32> [ poison, [[BB9:%.*]] ], [ [[TMP1]], [[BB1]] ]
21+
; CHECK-NEXT: ret void
22+
; CHECK: bb14:
23+
; CHECK-NEXT: ret void
24+
; CHECK: bb15:
25+
; CHECK-NEXT: ret void
26+
; CHECK: bb16:
27+
; CHECK-NEXT: [[TMP3:%.*]] = phi <8 x i32> [ [[TMP0]], [[BB1]] ], [ poison, [[BB25:%.*]] ]
28+
; CHECK-NEXT: ret void
29+
; CHECK: bb25:
30+
; CHECK-NEXT: switch i32 0, label [[BB16]] [
31+
; CHECK-NEXT: i32 0, label [[BB14]]
32+
; CHECK-NEXT: i32 1, label [[BB15:%.*]]
33+
; CHECK-NEXT: ]
34+
;
35+
bb:
36+
br label %bb1
37+
38+
bb1:
39+
%phi = phi i32 [ 0, %bb10 ], [ 0, %bb ]
40+
%phi2 = phi i32 [ 0, %bb10 ], [ 0, %bb ]
41+
%phi3 = phi i32 [ 0, %bb10 ], [ 0, %bb ]
42+
%phi4 = phi i32 [ 0, %bb10 ], [ 0, %bb ]
43+
%phi5 = phi i32 [ 0, %bb10 ], [ 0, %bb ]
44+
%phi6 = phi i32 [ 0, %bb10 ], [ 0, %bb ]
45+
%phi7 = phi i32 [ 0, %bb10 ], [ 0, %bb ]
46+
%phi8 = phi i32 [ 0, %bb10 ], [ 0, %bb ]
47+
switch i32 0, label %bb16 [
48+
i32 0, label %bb14
49+
i32 1, label %bb11
50+
]
51+
52+
bb9:
53+
br label %bb11
54+
55+
bb10:
56+
br label %bb1
57+
58+
bb11:
59+
%phi12 = phi i32 [ 0, %bb9 ], [ %phi7, %bb1 ]
60+
%phi13 = phi i32 [ 0, %bb9 ], [ undef, %bb1 ]
61+
ret void
62+
63+
bb14:
64+
ret void
65+
66+
bb15:
67+
ret void
68+
69+
bb16:
70+
%phi17 = phi i32 [ %phi, %bb1 ], [ 0, %bb25 ]
71+
%phi18 = phi i32 [ %phi2, %bb1 ], [ 0, %bb25 ]
72+
%phi19 = phi i32 [ %phi3, %bb1 ], [ 0, %bb25 ]
73+
%phi20 = phi i32 [ %phi4, %bb1 ], [ 0, %bb25 ]
74+
%phi21 = phi i32 [ %phi5, %bb1 ], [ 0, %bb25 ]
75+
%phi22 = phi i32 [ %phi6, %bb1 ], [ 0, %bb25 ]
76+
%phi23 = phi i32 [ %phi7, %bb1 ], [ 0, %bb25 ]
77+
%phi24 = phi i32 [ %phi8, %bb1 ], [ 0, %bb25 ]
78+
ret void
79+
80+
bb25:
81+
switch i32 0, label %bb16 [
82+
i32 0, label %bb14
83+
i32 1, label %bb15
84+
]
85+
}

0 commit comments

Comments
 (0)