Skip to content

Commit fbf0276

Browse files
committed
[SLP] Reorder reuses mask, if it is not empty, for subvector operands
If the subvector operands has reuses mask, need to reorder the mask, not the scalars, to prevent compiler crash due to mask/scalars size mismatch. Fixes #131360
1 parent dccc0a8 commit fbf0276

File tree

2 files changed

+155
-0
lines changed

2 files changed

+155
-0
lines changed

llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6665,6 +6665,8 @@ void BoUpSLP::reorderBottomToTop(bool IgnoreReorder) {
66656665
// Clear ordering of the operand.
66666666
if (!OpTE.ReorderIndices.empty()) {
66676667
OpTE.ReorderIndices.clear();
6668+
} else if (!OpTE.ReuseShuffleIndices.empty()) {
6669+
reorderReuses(OpTE.ReuseShuffleIndices, Mask);
66686670
} else {
66696671
assert(OpTE.isGather() && "Expected only gather/buildvector node.");
66706672
reorderScalars(OpTE.Scalars, Mask);
Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2+
; RUN: opt -S --passes=slp-vectorizer -mtriple=x86_64-unknown-linux-gnu -slp-threshold=-100 < %s | FileCheck %s
3+
4+
define void @test(i32 %j.6, i32 %m.4, i8 %v.5, ptr %a, i1 %tobool14.not) {
5+
; CHECK-LABEL: define void @test(
6+
; CHECK-SAME: i32 [[J_6:%.*]], i32 [[M_4:%.*]], i8 [[V_5:%.*]], ptr [[A:%.*]], i1 [[TOBOOL14_NOT:%.*]]) {
7+
; CHECK-NEXT: [[ENTRY:.*]]:
8+
; CHECK-NEXT: [[TMP0:%.*]] = insertelement <2 x i8> <i8 0, i8 poison>, i8 [[V_5]], i32 1
9+
; CHECK-NEXT: [[TMP1:%.*]] = insertelement <4 x i32> <i32 poison, i32 poison, i32 1, i32 poison>, i32 [[M_4]], i32 1
10+
; CHECK-NEXT: [[TMP2:%.*]] = insertelement <4 x i32> [[TMP1]], i32 [[J_6]], i32 3
11+
; CHECK-NEXT: br label %[[N:.*]]
12+
; CHECK: [[ENTRY_O_CRIT_EDGE:.*]]:
13+
; CHECK-NEXT: br label %[[O:.*]]
14+
; CHECK: [[N]]:
15+
; CHECK-NEXT: [[J_0:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[J_6]], %[[IF_END18:.*]] ]
16+
; CHECK-NEXT: [[L_0:%.*]] = phi i8 [ 0, %[[ENTRY]] ], [ [[L_4:%.*]], %[[IF_END18]] ]
17+
; CHECK-NEXT: [[TMP3:%.*]] = phi <4 x i32> [ zeroinitializer, %[[ENTRY]] ], [ [[TMP37:%.*]], %[[IF_END18]] ]
18+
; CHECK-NEXT: store i32 [[J_0]], ptr [[A]], align 4
19+
; CHECK-NEXT: [[CMP_NOT_NOT:%.*]] = icmp eq i8 [[L_0]], 0
20+
; CHECK-NEXT: [[TMP4:%.*]] = shufflevector <4 x i32> [[TMP3]], <4 x i32> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 1, i32 poison, i32 3>
21+
; CHECK-NEXT: [[TMP5:%.*]] = shufflevector <8 x i32> [[TMP4]], <8 x i32> <i32 0, i32 poison, i32 1, i32 0, i32 0, i32 poison, i32 0, i32 poison>, <8 x i32> <i32 8, i32 poison, i32 10, i32 11, i32 12, i32 1, i32 14, i32 3>
22+
; CHECK-NEXT: [[TMP6:%.*]] = shufflevector <8 x i32> [[TMP5]], <8 x i32> [[TMP4]], <8 x i32> <i32 0, i32 10, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
23+
; CHECK-NEXT: br i1 [[CMP_NOT_NOT]], label %[[O_SINK_SPLIT:.*]], label %[[P:.*]]
24+
; CHECK: [[P]]:
25+
; CHECK-NEXT: [[TMP7:%.*]] = phi <2 x i8> [ <i8 1, i8 0>, %[[IF_END18]] ], [ [[TMP0]], %[[N]] ]
26+
; CHECK-NEXT: [[TMP8:%.*]] = phi <8 x i32> [ [[TMP35:%.*]], %[[IF_END18]] ], [ [[TMP6]], %[[N]] ]
27+
; CHECK-NEXT: [[TMP9:%.*]] = extractelement <8 x i32> [[TMP8]], i32 7
28+
; CHECK-NEXT: [[TMP10:%.*]] = shufflevector <8 x i32> [[TMP8]], <8 x i32> poison, <2 x i32> <i32 5, i32 6>
29+
; CHECK-NEXT: [[TMP11:%.*]] = icmp eq <2 x i32> [[TMP10]], zeroinitializer
30+
; CHECK-NEXT: [[TMP12:%.*]] = extractelement <2 x i1> [[TMP11]], i32 0
31+
; CHECK-NEXT: [[SPEC_SELECT:%.*]] = select i1 [[TMP12]], i32 [[TMP9]], i32 0
32+
; CHECK-NEXT: [[TMP13:%.*]] = extractelement <2 x i8> [[TMP7]], i32 0
33+
; CHECK-NEXT: [[TMP14:%.*]] = extractelement <2 x i8> [[TMP7]], i32 1
34+
; CHECK-NEXT: [[TMP15:%.*]] = shufflevector <8 x i32> [[TMP8]], <8 x i32> poison, <2 x i32> <i32 0, i32 3>
35+
; CHECK-NEXT: [[TMP16:%.*]] = shufflevector <8 x i32> [[TMP8]], <8 x i32> poison, <4 x i32> <i32 poison, i32 1, i32 poison, i32 poison>
36+
; CHECK-NEXT: [[TMP17:%.*]] = shufflevector <8 x i32> <i32 1, i32 0, i32 poison, i32 poison, i32 undef, i32 undef, i32 undef, i32 undef>, <8 x i32> [[TMP8]], <4 x i32> <i32 0, i32 1, i32 9, i32 poison>
37+
; CHECK-NEXT: [[TMP18:%.*]] = insertelement <4 x i32> [[TMP17]], i32 [[SPEC_SELECT]], i32 3
38+
; CHECK-NEXT: [[TMP19:%.*]] = extractelement <8 x i32> [[TMP8]], i32 2
39+
; CHECK-NEXT: [[TMP20:%.*]] = extractelement <8 x i32> [[TMP8]], i32 4
40+
; CHECK-NEXT: [[TMP21:%.*]] = extractelement <2 x i1> [[TMP11]], i32 1
41+
; CHECK-NEXT: br i1 [[TMP21]], label %[[O_SINK_SPLIT]], label %[[Q:.*]]
42+
; CHECK: [[O_SINK_SPLIT]]:
43+
; CHECK-NEXT: [[SPEC_SELECT_SINK:%.*]] = phi i32 [ [[J_0]], %[[N]] ], [ [[SPEC_SELECT]], %[[P]] ]
44+
; CHECK-NEXT: [[I_3_PH:%.*]] = phi i32 [ 0, %[[N]] ], [ [[TMP19]], %[[P]] ]
45+
; CHECK-NEXT: [[L_3_PH:%.*]] = phi i8 [ 0, %[[N]] ], [ [[TMP13]], %[[P]] ]
46+
; CHECK-NEXT: [[TMP22:%.*]] = phi <4 x i32> [ [[TMP3]], %[[N]] ], [ [[TMP18]], %[[P]] ]
47+
; CHECK-NEXT: [[CONV10:%.*]] = zext i32 [[SPEC_SELECT_SINK]] to i64
48+
; CHECK-NEXT: [[CALL11:%.*]] = tail call i32 (ptr, ...) @printf(ptr null, i64 [[CONV10]])
49+
; CHECK-NEXT: br label %[[O]]
50+
; CHECK: [[O]]:
51+
; CHECK-NEXT: [[TMP23:%.*]] = phi <4 x i32> [ poison, %[[ENTRY_O_CRIT_EDGE]] ], [ [[TMP22]], %[[O_SINK_SPLIT]] ]
52+
; CHECK-NEXT: [[SUB:%.*]] = sub i32 0, [[J_6]]
53+
; CHECK-NEXT: [[DIV:%.*]] = sdiv i32 [[SUB]], [[I_3_PH]]
54+
; CHECK-NEXT: [[SUB13:%.*]] = sub i32 0, [[DIV]]
55+
; CHECK-NEXT: [[TMP24:%.*]] = insertelement <4 x i32> poison, i32 [[SUB]], i32 0
56+
; CHECK-NEXT: [[TMP25:%.*]] = insertelement <4 x i32> [[TMP24]], i32 [[SUB13]], i32 1
57+
; CHECK-NEXT: [[TMP26:%.*]] = shufflevector <4 x i32> [[TMP25]], <4 x i32> poison, <4 x i32> <i32 0, i32 1, i32 0, i32 1>
58+
; CHECK-NEXT: [[TMP27:%.*]] = shufflevector <4 x i32> [[TMP26]], <4 x i32> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>
59+
; CHECK-NEXT: [[TMP28:%.*]] = call <8 x i32> @llvm.vector.insert.v8i32.v4i32(<8 x i32> [[TMP27]], <4 x i32> [[TMP23]], i64 4)
60+
; CHECK-NEXT: [[TMP29:%.*]] = shufflevector <8 x i32> [[TMP28]], <8 x i32> poison, <2 x i32> <i32 poison, i32 6>
61+
; CHECK-NEXT: [[TMP30:%.*]] = shufflevector <2 x i32> [[TMP29]], <2 x i32> <i32 0, i32 poison>, <2 x i32> <i32 2, i32 1>
62+
; CHECK-NEXT: br i1 [[TOBOOL14_NOT]], label %[[IF_END18]], label %[[Q]]
63+
; CHECK: [[Q]]:
64+
; CHECK-NEXT: [[U_4:%.*]] = phi i32 [ [[TMP20]], %[[P]] ], [ 0, %[[O]] ]
65+
; CHECK-NEXT: [[V_44:%.*]] = phi i8 [ [[TMP14]], %[[P]] ], [ 0, %[[O]] ]
66+
; CHECK-NEXT: [[TMP31:%.*]] = phi <2 x i32> [ [[TMP15]], %[[P]] ], [ [[TMP30]], %[[O]] ]
67+
; CHECK-NEXT: [[TMP32:%.*]] = shufflevector <2 x i32> [[TMP31]], <2 x i32> poison, <4 x i32> <i32 0, i32 1, i32 0, i32 1>
68+
; CHECK-NEXT: [[CONV17:%.*]] = sext i8 [[V_44]] to i32
69+
; CHECK-NEXT: [[REM:%.*]] = mul i32 [[U_4]], [[CONV17]]
70+
; CHECK-NEXT: [[TMP33:%.*]] = insertelement <8 x i32> <i32 poison, i32 poison, i32 poison, i32 poison, i32 0, i32 poison, i32 0, i32 0>, i32 [[REM]], i32 5
71+
; CHECK-NEXT: [[TMP34:%.*]] = call <8 x i32> @llvm.vector.insert.v8i32.v4i32(<8 x i32> [[TMP33]], <4 x i32> [[TMP32]], i64 0)
72+
; CHECK-NEXT: br label %[[IF_END18]]
73+
; CHECK: [[IF_END18]]:
74+
; CHECK-NEXT: [[L_4]] = phi i8 [ 0, %[[Q]] ], [ [[L_3_PH]], %[[O]] ]
75+
; CHECK-NEXT: [[TMP35]] = phi <8 x i32> [ [[TMP34]], %[[Q]] ], [ [[TMP28]], %[[O]] ]
76+
; CHECK-NEXT: [[TMP36:%.*]] = shufflevector <8 x i32> [[TMP35]], <8 x i32> poison, <4 x i32> <i32 4, i32 poison, i32 poison, i32 poison>
77+
; CHECK-NEXT: [[TMP37]] = shufflevector <4 x i32> [[TMP2]], <4 x i32> [[TMP36]], <4 x i32> <i32 4, i32 1, i32 2, i32 3>
78+
; CHECK-NEXT: br i1 [[TOBOOL14_NOT]], label %[[N]], label %[[P]]
79+
;
80+
entry:
81+
br label %n
82+
83+
entry.o_crit_edge:
84+
br label %o
85+
86+
n:
87+
%i.0 = phi i32 [ 0, %entry ], [ 1, %if.end18 ]
88+
%j.0 = phi i32 [ 0, %entry ], [ %j.6, %if.end18 ]
89+
%m.0 = phi i32 [ 0, %entry ], [ %m.4, %if.end18 ]
90+
%l.0 = phi i8 [ 0, %entry ], [ %l.4, %if.end18 ]
91+
%u.0 = phi i32 [ 0, %entry ], [ %u.5, %if.end18 ]
92+
store i32 %j.0, ptr %a, align 4
93+
%cmp.not.not = icmp eq i8 %l.0, 0
94+
br i1 %cmp.not.not, label %o.sink.split, label %p
95+
96+
p:
97+
%0 = phi i32 [ %r.3, %if.end18 ], [ 0, %n ]
98+
%i.1 = phi i32 [ %s.3, %if.end18 ], [ 1, %n ]
99+
%j.1 = phi i32 [ %j.65, %if.end18 ], [ %j.0, %n ]
100+
%k.1 = phi i32 [ %t.3, %if.end18 ], [ %i.0, %n ]
101+
%m.1 = phi i32 [ %m.46, %if.end18 ], [ %m.0, %n ]
102+
%l.1 = phi i8 [ 1, %if.end18 ], [ 0, %n ]
103+
%s.1 = phi i32 [ %s.3, %if.end18 ], [ 0, %n ]
104+
%t.1 = phi i32 [ %t.3, %if.end18 ], [ 0, %n ]
105+
%u.12 = phi i32 [ %u.5, %if.end18 ], [ 0, %n ]
106+
%v.1 = phi i8 [ 0, %if.end18 ], [ %v.5, %n ]
107+
%tobool4.not = icmp eq i32 %m.1, 0
108+
%spec.select = select i1 %tobool4.not, i32 %j.1, i32 0
109+
%tobool7.not = icmp eq i32 %0, 0
110+
br i1 %tobool7.not, label %o.sink.split, label %q
111+
112+
o.sink.split:
113+
%spec.select.sink = phi i32 [ %j.0, %n ], [ %spec.select, %p ]
114+
%i.3.ph = phi i32 [ 0, %n ], [ %i.1, %p ]
115+
%k.3.ph = phi i32 [ %i.0, %n ], [ %k.1, %p ]
116+
%m.3.ph = phi i32 [ %m.0, %n ], [ 0, %p ]
117+
%l.3.ph = phi i8 [ 0, %n ], [ %l.1, %p ]
118+
%u.3.ph = phi i32 [ %u.0, %n ], [ 1, %p ]
119+
%conv10 = zext i32 %spec.select.sink to i64
120+
%call11 = tail call i32 (ptr, ...) @printf(ptr null, i64 %conv10)
121+
br label %o
122+
123+
o:
124+
%j.4 = phi i32 [ 0, %entry.o_crit_edge ], [ %spec.select.sink, %o.sink.split ]
125+
%k.3 = phi i32 [ 0, %entry.o_crit_edge ], [ %k.3.ph, %o.sink.split ]
126+
%m.3 = phi i32 [ 0, %entry.o_crit_edge ], [ %m.3.ph, %o.sink.split ]
127+
%u.3 = phi i32 [ 0, %entry.o_crit_edge ], [ %u.3.ph, %o.sink.split ]
128+
%sub = sub i32 0, %j.6
129+
%div = sdiv i32 %sub, %i.3.ph
130+
%sub13 = sub i32 0, %div
131+
br i1 %tobool14.not, label %if.end18, label %q
132+
133+
q:
134+
%s.2 = phi i32 [ %s.1, %p ], [ 0, %o ]
135+
%t.2 = phi i32 [ %t.1, %p ], [ %k.3, %o ]
136+
%u.4 = phi i32 [ %u.12, %p ], [ 0, %o ]
137+
%v.44 = phi i8 [ %v.1, %p ], [ 0, %o ]
138+
%conv17 = sext i8 %v.44 to i32
139+
%rem = mul i32 %u.4, %conv17
140+
br label %if.end18
141+
142+
if.end18:
143+
%j.65 = phi i32 [ 0, %q ], [ %j.4, %o ]
144+
%m.46 = phi i32 [ %rem, %q ], [ %m.3, %o ]
145+
%l.4 = phi i8 [ 0, %q ], [ %l.3.ph, %o ]
146+
%r.3 = phi i32 [ 0, %q ], [ %k.3, %o ]
147+
%s.3 = phi i32 [ %s.2, %q ], [ %sub, %o ]
148+
%t.3 = phi i32 [ %t.2, %q ], [ %sub13, %o ]
149+
%u.5 = phi i32 [ 0, %q ], [ %u.3, %o ]
150+
br i1 %tobool14.not, label %n, label %p
151+
152+
}
153+
declare i32 @printf(ptr, ...)

0 commit comments

Comments
 (0)