xref: /llvm-project/llvm/test/Transforms/SLPVectorizer/AArch64/div.ll (revision c6c647588f911770170d2f7975b325f3d70cf89b)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2; RUN: opt -mtriple=aarch64 -passes=slp-vectorizer -mattr=-sve -S < %s | FileCheck %s --check-prefixes=CHECK,NO-SVE
3; RUN: opt -mtriple=aarch64 -passes=slp-vectorizer -mattr=+sve -S < %s | FileCheck %s --check-prefixes=CHECK,SVE
4
5define <2 x i8> @slp_v2i8_Op1_Op2_unknown(<2 x i8> %a, <2 x i8> %b)
6; NO-SVE-LABEL: define <2 x i8> @slp_v2i8_Op1_Op2_unknown(
7; NO-SVE-SAME: <2 x i8> [[A:%.*]], <2 x i8> [[B:%.*]]) #[[ATTR0:[0-9]+]] {
8; NO-SVE-NEXT:    [[A0:%.*]] = extractelement <2 x i8> [[A]], i32 0
9; NO-SVE-NEXT:    [[A1:%.*]] = extractelement <2 x i8> [[A]], i32 1
10; NO-SVE-NEXT:    [[B0:%.*]] = extractelement <2 x i8> [[B]], i32 0
11; NO-SVE-NEXT:    [[B1:%.*]] = extractelement <2 x i8> [[B]], i32 1
12; NO-SVE-NEXT:    [[TMP1:%.*]] = sdiv i8 [[A0]], [[B0]]
13; NO-SVE-NEXT:    [[TMP2:%.*]] = sdiv i8 [[A1]], [[B1]]
14; NO-SVE-NEXT:    [[R0:%.*]] = insertelement <2 x i8> poison, i8 [[TMP1]], i32 0
15; NO-SVE-NEXT:    [[R1:%.*]] = insertelement <2 x i8> [[R0]], i8 [[TMP2]], i32 1
16; NO-SVE-NEXT:    ret <2 x i8> [[R1]]
17;
18; SVE-LABEL: define <2 x i8> @slp_v2i8_Op1_Op2_unknown(
19; SVE-SAME: <2 x i8> [[A:%.*]], <2 x i8> [[B:%.*]]) #[[ATTR0:[0-9]+]] {
20; SVE-NEXT:    [[TMP1:%.*]] = sdiv <2 x i8> [[A]], [[B]]
21; SVE-NEXT:    ret <2 x i8> [[TMP1]]
22;
23{
24  %a0 = extractelement <2 x i8> %a, i32 0
25  %a1 = extractelement <2 x i8> %a, i32 1
26  %b0 = extractelement <2 x i8> %b, i32 0
27  %b1 = extractelement <2 x i8> %b, i32 1
28  %1 = sdiv i8 %a0, %b0
29  %2 = sdiv i8 %a1, %b1
30  %r0 = insertelement <2 x i8> poison, i8 %1, i32 0
31  %r1 = insertelement <2 x i8> %r0, i8 %2, i32 1
32  ret <2 x i8> %r1
33}
34
35define <2 x i16> @slp_v2i16_Op1_Op2_unknown(<2 x i16> %a, <2 x i16> %b)
36; NO-SVE-LABEL: define <2 x i16> @slp_v2i16_Op1_Op2_unknown(
37; NO-SVE-SAME: <2 x i16> [[A:%.*]], <2 x i16> [[B:%.*]]) #[[ATTR0]] {
38; NO-SVE-NEXT:    [[A0:%.*]] = extractelement <2 x i16> [[A]], i32 0
39; NO-SVE-NEXT:    [[A1:%.*]] = extractelement <2 x i16> [[A]], i32 1
40; NO-SVE-NEXT:    [[B0:%.*]] = extractelement <2 x i16> [[B]], i32 0
41; NO-SVE-NEXT:    [[B1:%.*]] = extractelement <2 x i16> [[B]], i32 1
42; NO-SVE-NEXT:    [[TMP1:%.*]] = sdiv i16 [[A0]], [[B0]]
43; NO-SVE-NEXT:    [[TMP2:%.*]] = sdiv i16 [[A1]], [[B1]]
44; NO-SVE-NEXT:    [[R0:%.*]] = insertelement <2 x i16> poison, i16 [[TMP1]], i32 0
45; NO-SVE-NEXT:    [[R1:%.*]] = insertelement <2 x i16> [[R0]], i16 [[TMP2]], i32 1
46; NO-SVE-NEXT:    ret <2 x i16> [[R1]]
47;
48; SVE-LABEL: define <2 x i16> @slp_v2i16_Op1_Op2_unknown(
49; SVE-SAME: <2 x i16> [[A:%.*]], <2 x i16> [[B:%.*]]) #[[ATTR0]] {
50; SVE-NEXT:    [[TMP1:%.*]] = sdiv <2 x i16> [[A]], [[B]]
51; SVE-NEXT:    ret <2 x i16> [[TMP1]]
52;
53{
54  %a0 = extractelement <2 x i16> %a, i32 0
55  %a1 = extractelement <2 x i16> %a, i32 1
56  %b0 = extractelement <2 x i16> %b, i32 0
57  %b1 = extractelement <2 x i16> %b, i32 1
58  %1 = sdiv i16 %a0, %b0
59  %2 = sdiv i16 %a1, %b1
60  %r0 = insertelement <2 x i16> poison, i16 %1, i32 0
61  %r1 = insertelement <2 x i16> %r0, i16 %2, i32 1
62  ret <2 x i16> %r1
63}
64
65define <2 x i32> @slp_v2i32_Op1_Op2_unknown(<2 x i32> %a, <2 x i32> %b)
66; NO-SVE-LABEL: define <2 x i32> @slp_v2i32_Op1_Op2_unknown(
67; NO-SVE-SAME: <2 x i32> [[A:%.*]], <2 x i32> [[B:%.*]]) #[[ATTR0]] {
68; NO-SVE-NEXT:    [[A0:%.*]] = extractelement <2 x i32> [[A]], i32 0
69; NO-SVE-NEXT:    [[A1:%.*]] = extractelement <2 x i32> [[A]], i32 1
70; NO-SVE-NEXT:    [[B0:%.*]] = extractelement <2 x i32> [[B]], i32 0
71; NO-SVE-NEXT:    [[B1:%.*]] = extractelement <2 x i32> [[B]], i32 1
72; NO-SVE-NEXT:    [[TMP1:%.*]] = sdiv i32 [[A0]], [[B0]]
73; NO-SVE-NEXT:    [[TMP2:%.*]] = sdiv i32 [[A1]], [[B1]]
74; NO-SVE-NEXT:    [[R0:%.*]] = insertelement <2 x i32> poison, i32 [[TMP1]], i32 0
75; NO-SVE-NEXT:    [[R1:%.*]] = insertelement <2 x i32> [[R0]], i32 [[TMP2]], i32 1
76; NO-SVE-NEXT:    ret <2 x i32> [[R1]]
77;
78; SVE-LABEL: define <2 x i32> @slp_v2i32_Op1_Op2_unknown(
79; SVE-SAME: <2 x i32> [[A:%.*]], <2 x i32> [[B:%.*]]) #[[ATTR0]] {
80; SVE-NEXT:    [[TMP1:%.*]] = sdiv <2 x i32> [[A]], [[B]]
81; SVE-NEXT:    ret <2 x i32> [[TMP1]]
82;
83{
84  %a0 = extractelement <2 x i32> %a, i32 0
85  %a1 = extractelement <2 x i32> %a, i32 1
86  %b0 = extractelement <2 x i32> %b, i32 0
87  %b1 = extractelement <2 x i32> %b, i32 1
88  %1 = sdiv i32 %a0, %b0
89  %2 = sdiv i32 %a1, %b1
90  %r0 = insertelement <2 x i32> poison, i32 %1, i32 0
91  %r1 = insertelement <2 x i32> %r0, i32 %2, i32 1
92  ret <2 x i32> %r1
93}
94
95define <2 x i64> @slp_v2i64_Op1_Op2_unknown(<2 x i64> %a, <2 x i64> %b)
96; NO-SVE-LABEL: define <2 x i64> @slp_v2i64_Op1_Op2_unknown(
97; NO-SVE-SAME: <2 x i64> [[A:%.*]], <2 x i64> [[B:%.*]]) #[[ATTR0]] {
98; NO-SVE-NEXT:    [[A0:%.*]] = extractelement <2 x i64> [[A]], i32 0
99; NO-SVE-NEXT:    [[A1:%.*]] = extractelement <2 x i64> [[A]], i32 1
100; NO-SVE-NEXT:    [[B0:%.*]] = extractelement <2 x i64> [[B]], i32 0
101; NO-SVE-NEXT:    [[B1:%.*]] = extractelement <2 x i64> [[B]], i32 1
102; NO-SVE-NEXT:    [[TMP1:%.*]] = sdiv i64 [[A0]], [[B0]]
103; NO-SVE-NEXT:    [[TMP2:%.*]] = sdiv i64 [[A1]], [[B1]]
104; NO-SVE-NEXT:    [[R0:%.*]] = insertelement <2 x i64> poison, i64 [[TMP1]], i32 0
105; NO-SVE-NEXT:    [[R1:%.*]] = insertelement <2 x i64> [[R0]], i64 [[TMP2]], i32 1
106; NO-SVE-NEXT:    ret <2 x i64> [[R1]]
107;
108; SVE-LABEL: define <2 x i64> @slp_v2i64_Op1_Op2_unknown(
109; SVE-SAME: <2 x i64> [[A:%.*]], <2 x i64> [[B:%.*]]) #[[ATTR0]] {
110; SVE-NEXT:    [[TMP1:%.*]] = sdiv <2 x i64> [[A]], [[B]]
111; SVE-NEXT:    ret <2 x i64> [[TMP1]]
112;
113{
114  %a0 = extractelement <2 x i64> %a, i32 0
115  %a1 = extractelement <2 x i64> %a, i32 1
116  %b0 = extractelement <2 x i64> %b, i32 0
117  %b1 = extractelement <2 x i64> %b, i32 1
118  %1 = sdiv i64 %a0, %b0
119  %2 = sdiv i64 %a1, %b1
120  %r0 = insertelement <2 x i64> poison, i64 %1, i32 0
121  %r1 = insertelement <2 x i64> %r0, i64 %2, i32 1
122  ret <2 x i64> %r1
123}
124
125define <4 x i8> @slp_v4i8_Op1_Op2_unknown(<4 x i8> %a, <4 x i8> %b)
126; NO-SVE-LABEL: define <4 x i8> @slp_v4i8_Op1_Op2_unknown(
127; NO-SVE-SAME: <4 x i8> [[A:%.*]], <4 x i8> [[B:%.*]]) #[[ATTR0]] {
128; NO-SVE-NEXT:    [[A0:%.*]] = extractelement <4 x i8> [[A]], i32 0
129; NO-SVE-NEXT:    [[A1:%.*]] = extractelement <4 x i8> [[A]], i32 1
130; NO-SVE-NEXT:    [[A2:%.*]] = extractelement <4 x i8> [[A]], i32 2
131; NO-SVE-NEXT:    [[A3:%.*]] = extractelement <4 x i8> [[A]], i32 3
132; NO-SVE-NEXT:    [[B0:%.*]] = extractelement <4 x i8> [[B]], i32 0
133; NO-SVE-NEXT:    [[B1:%.*]] = extractelement <4 x i8> [[B]], i32 1
134; NO-SVE-NEXT:    [[B2:%.*]] = extractelement <4 x i8> [[B]], i32 2
135; NO-SVE-NEXT:    [[B3:%.*]] = extractelement <4 x i8> [[B]], i32 3
136; NO-SVE-NEXT:    [[TMP1:%.*]] = sdiv i8 [[A0]], [[B0]]
137; NO-SVE-NEXT:    [[TMP2:%.*]] = sdiv i8 [[A1]], [[B1]]
138; NO-SVE-NEXT:    [[TMP3:%.*]] = sdiv i8 [[A2]], [[B2]]
139; NO-SVE-NEXT:    [[TMP4:%.*]] = sdiv i8 [[A3]], [[B3]]
140; NO-SVE-NEXT:    [[R0:%.*]] = insertelement <4 x i8> poison, i8 [[TMP1]], i32 0
141; NO-SVE-NEXT:    [[R1:%.*]] = insertelement <4 x i8> [[R0]], i8 [[TMP2]], i32 1
142; NO-SVE-NEXT:    [[R2:%.*]] = insertelement <4 x i8> [[R1]], i8 [[TMP3]], i32 2
143; NO-SVE-NEXT:    [[R3:%.*]] = insertelement <4 x i8> [[R2]], i8 [[TMP4]], i32 3
144; NO-SVE-NEXT:    ret <4 x i8> [[R3]]
145;
146; SVE-LABEL: define <4 x i8> @slp_v4i8_Op1_Op2_unknown(
147; SVE-SAME: <4 x i8> [[A:%.*]], <4 x i8> [[B:%.*]]) #[[ATTR0]] {
148; SVE-NEXT:    [[TMP1:%.*]] = sdiv <4 x i8> [[A]], [[B]]
149; SVE-NEXT:    ret <4 x i8> [[TMP1]]
150;
151{
152  %a0 = extractelement <4 x i8> %a, i32 0
153  %a1 = extractelement <4 x i8> %a, i32 1
154  %a2 = extractelement <4 x i8> %a, i32 2
155  %a3 = extractelement <4 x i8> %a, i32 3
156  %b0 = extractelement <4 x i8> %b, i32 0
157  %b1 = extractelement <4 x i8> %b, i32 1
158  %b2 = extractelement <4 x i8> %b, i32 2
159  %b3 = extractelement <4 x i8> %b, i32 3
160  %1 = sdiv i8 %a0, %b0
161  %2 = sdiv i8 %a1, %b1
162  %3 = sdiv i8 %a2, %b2
163  %4 = sdiv i8 %a3, %b3
164  %r0 = insertelement <4 x i8> poison, i8 %1, i32 0
165  %r1 = insertelement <4 x i8> %r0, i8 %2, i32 1
166  %r2 = insertelement <4 x i8> %r1, i8 %3, i32 2
167  %r3 = insertelement <4 x i8> %r2, i8 %4, i32 3
168  ret <4 x i8> %r3
169}
170
171define <4 x i16> @slp_v4i16_Op1_Op2_unknown(<4 x i16> %a, <4 x i16> %b)
172; NO-SVE-LABEL: define <4 x i16> @slp_v4i16_Op1_Op2_unknown(
173; NO-SVE-SAME: <4 x i16> [[A:%.*]], <4 x i16> [[B:%.*]]) #[[ATTR0]] {
174; NO-SVE-NEXT:    [[A0:%.*]] = extractelement <4 x i16> [[A]], i32 0
175; NO-SVE-NEXT:    [[A1:%.*]] = extractelement <4 x i16> [[A]], i32 1
176; NO-SVE-NEXT:    [[A2:%.*]] = extractelement <4 x i16> [[A]], i32 2
177; NO-SVE-NEXT:    [[A3:%.*]] = extractelement <4 x i16> [[A]], i32 3
178; NO-SVE-NEXT:    [[B0:%.*]] = extractelement <4 x i16> [[B]], i32 0
179; NO-SVE-NEXT:    [[B1:%.*]] = extractelement <4 x i16> [[B]], i32 1
180; NO-SVE-NEXT:    [[B2:%.*]] = extractelement <4 x i16> [[B]], i32 2
181; NO-SVE-NEXT:    [[B3:%.*]] = extractelement <4 x i16> [[B]], i32 3
182; NO-SVE-NEXT:    [[TMP1:%.*]] = sdiv i16 [[A0]], [[B0]]
183; NO-SVE-NEXT:    [[TMP2:%.*]] = sdiv i16 [[A1]], [[B1]]
184; NO-SVE-NEXT:    [[TMP3:%.*]] = sdiv i16 [[A2]], [[B2]]
185; NO-SVE-NEXT:    [[TMP4:%.*]] = sdiv i16 [[A3]], [[B3]]
186; NO-SVE-NEXT:    [[R0:%.*]] = insertelement <4 x i16> poison, i16 [[TMP1]], i32 0
187; NO-SVE-NEXT:    [[R1:%.*]] = insertelement <4 x i16> [[R0]], i16 [[TMP2]], i32 1
188; NO-SVE-NEXT:    [[R2:%.*]] = insertelement <4 x i16> [[R1]], i16 [[TMP3]], i32 2
189; NO-SVE-NEXT:    [[R3:%.*]] = insertelement <4 x i16> [[R2]], i16 [[TMP4]], i32 3
190; NO-SVE-NEXT:    ret <4 x i16> [[R3]]
191;
192; SVE-LABEL: define <4 x i16> @slp_v4i16_Op1_Op2_unknown(
193; SVE-SAME: <4 x i16> [[A:%.*]], <4 x i16> [[B:%.*]]) #[[ATTR0]] {
194; SVE-NEXT:    [[TMP1:%.*]] = sdiv <4 x i16> [[A]], [[B]]
195; SVE-NEXT:    ret <4 x i16> [[TMP1]]
196;
197{
198  %a0 = extractelement <4 x i16> %a, i32 0
199  %a1 = extractelement <4 x i16> %a, i32 1
200  %a2 = extractelement <4 x i16> %a, i32 2
201  %a3 = extractelement <4 x i16> %a, i32 3
202  %b0 = extractelement <4 x i16> %b, i32 0
203  %b1 = extractelement <4 x i16> %b, i32 1
204  %b2 = extractelement <4 x i16> %b, i32 2
205  %b3 = extractelement <4 x i16> %b, i32 3
206  %1 = sdiv i16 %a0, %b0
207  %2 = sdiv i16 %a1, %b1
208  %3 = sdiv i16 %a2, %b2
209  %4 = sdiv i16 %a3, %b3
210  %r0 = insertelement <4 x i16> poison, i16 %1, i32 0
211  %r1 = insertelement <4 x i16> %r0, i16 %2, i32 1
212  %r2 = insertelement <4 x i16> %r1, i16 %3, i32 2
213  %r3 = insertelement <4 x i16> %r2, i16 %4, i32 3
214  ret <4 x i16> %r3
215}
216
217define <4 x i32> @slp_v4i32_Op1_Op2_unknown(<4 x i32> %a, <4 x i32> %b)
218; NO-SVE-LABEL: define <4 x i32> @slp_v4i32_Op1_Op2_unknown(
219; NO-SVE-SAME: <4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]]) #[[ATTR0]] {
220; NO-SVE-NEXT:    [[A0:%.*]] = extractelement <4 x i32> [[A]], i32 0
221; NO-SVE-NEXT:    [[A1:%.*]] = extractelement <4 x i32> [[A]], i32 1
222; NO-SVE-NEXT:    [[A2:%.*]] = extractelement <4 x i32> [[A]], i32 2
223; NO-SVE-NEXT:    [[A3:%.*]] = extractelement <4 x i32> [[A]], i32 3
224; NO-SVE-NEXT:    [[B0:%.*]] = extractelement <4 x i32> [[B]], i32 0
225; NO-SVE-NEXT:    [[B1:%.*]] = extractelement <4 x i32> [[B]], i32 1
226; NO-SVE-NEXT:    [[B2:%.*]] = extractelement <4 x i32> [[B]], i32 2
227; NO-SVE-NEXT:    [[B3:%.*]] = extractelement <4 x i32> [[B]], i32 3
228; NO-SVE-NEXT:    [[TMP1:%.*]] = sdiv i32 [[A0]], [[B0]]
229; NO-SVE-NEXT:    [[TMP2:%.*]] = sdiv i32 [[A1]], [[B1]]
230; NO-SVE-NEXT:    [[TMP3:%.*]] = sdiv i32 [[A2]], [[B2]]
231; NO-SVE-NEXT:    [[TMP4:%.*]] = sdiv i32 [[A3]], [[B3]]
232; NO-SVE-NEXT:    [[R0:%.*]] = insertelement <4 x i32> poison, i32 [[TMP1]], i32 0
233; NO-SVE-NEXT:    [[R1:%.*]] = insertelement <4 x i32> [[R0]], i32 [[TMP2]], i32 1
234; NO-SVE-NEXT:    [[R2:%.*]] = insertelement <4 x i32> [[R1]], i32 [[TMP3]], i32 2
235; NO-SVE-NEXT:    [[R3:%.*]] = insertelement <4 x i32> [[R2]], i32 [[TMP4]], i32 3
236; NO-SVE-NEXT:    ret <4 x i32> [[R3]]
237;
238; SVE-LABEL: define <4 x i32> @slp_v4i32_Op1_Op2_unknown(
239; SVE-SAME: <4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]]) #[[ATTR0]] {
240; SVE-NEXT:    [[TMP1:%.*]] = sdiv <4 x i32> [[A]], [[B]]
241; SVE-NEXT:    ret <4 x i32> [[TMP1]]
242;
243{
244  %a0 = extractelement <4 x i32> %a, i32 0
245  %a1 = extractelement <4 x i32> %a, i32 1
246  %a2 = extractelement <4 x i32> %a, i32 2
247  %a3 = extractelement <4 x i32> %a, i32 3
248  %b0 = extractelement <4 x i32> %b, i32 0
249  %b1 = extractelement <4 x i32> %b, i32 1
250  %b2 = extractelement <4 x i32> %b, i32 2
251  %b3 = extractelement <4 x i32> %b, i32 3
252  %1 = sdiv i32 %a0, %b0
253  %2 = sdiv i32 %a1, %b1
254  %3 = sdiv i32 %a2, %b2
255  %4 = sdiv i32 %a3, %b3
256  %r0 = insertelement <4 x i32> poison, i32 %1, i32 0
257  %r1 = insertelement <4 x i32> %r0, i32 %2, i32 1
258  %r2 = insertelement <4 x i32> %r1, i32 %3, i32 2
259  %r3 = insertelement <4 x i32> %r2, i32 %4, i32 3
260  ret <4 x i32> %r3
261}
262
263define <8 x i8> @slp_v8i8_Op1_Op2_unknown(<8 x i8> %a, <8 x i8> %b)
264; NO-SVE-LABEL: define <8 x i8> @slp_v8i8_Op1_Op2_unknown(
265; NO-SVE-SAME: <8 x i8> [[A:%.*]], <8 x i8> [[B:%.*]]) #[[ATTR0]] {
266; NO-SVE-NEXT:    [[A0:%.*]] = extractelement <8 x i8> [[A]], i32 0
267; NO-SVE-NEXT:    [[A1:%.*]] = extractelement <8 x i8> [[A]], i32 1
268; NO-SVE-NEXT:    [[A2:%.*]] = extractelement <8 x i8> [[A]], i32 2
269; NO-SVE-NEXT:    [[A3:%.*]] = extractelement <8 x i8> [[A]], i32 3
270; NO-SVE-NEXT:    [[A4:%.*]] = extractelement <8 x i8> [[A]], i32 4
271; NO-SVE-NEXT:    [[A5:%.*]] = extractelement <8 x i8> [[A]], i32 5
272; NO-SVE-NEXT:    [[A6:%.*]] = extractelement <8 x i8> [[A]], i32 6
273; NO-SVE-NEXT:    [[A7:%.*]] = extractelement <8 x i8> [[A]], i32 7
274; NO-SVE-NEXT:    [[B0:%.*]] = extractelement <8 x i8> [[B]], i32 0
275; NO-SVE-NEXT:    [[B1:%.*]] = extractelement <8 x i8> [[B]], i32 1
276; NO-SVE-NEXT:    [[B2:%.*]] = extractelement <8 x i8> [[B]], i32 2
277; NO-SVE-NEXT:    [[B3:%.*]] = extractelement <8 x i8> [[B]], i32 3
278; NO-SVE-NEXT:    [[B4:%.*]] = extractelement <8 x i8> [[B]], i32 4
279; NO-SVE-NEXT:    [[B5:%.*]] = extractelement <8 x i8> [[B]], i32 5
280; NO-SVE-NEXT:    [[B6:%.*]] = extractelement <8 x i8> [[B]], i32 6
281; NO-SVE-NEXT:    [[B7:%.*]] = extractelement <8 x i8> [[B]], i32 7
282; NO-SVE-NEXT:    [[TMP1:%.*]] = sdiv i8 [[A0]], [[B0]]
283; NO-SVE-NEXT:    [[TMP2:%.*]] = sdiv i8 [[A1]], [[B1]]
284; NO-SVE-NEXT:    [[TMP3:%.*]] = sdiv i8 [[A2]], [[B2]]
285; NO-SVE-NEXT:    [[TMP4:%.*]] = sdiv i8 [[A3]], [[B3]]
286; NO-SVE-NEXT:    [[TMP5:%.*]] = sdiv i8 [[A4]], [[B4]]
287; NO-SVE-NEXT:    [[TMP6:%.*]] = sdiv i8 [[A5]], [[B5]]
288; NO-SVE-NEXT:    [[TMP7:%.*]] = sdiv i8 [[A6]], [[B6]]
289; NO-SVE-NEXT:    [[TMP8:%.*]] = sdiv i8 [[A7]], [[B7]]
290; NO-SVE-NEXT:    [[R0:%.*]] = insertelement <8 x i8> poison, i8 [[TMP1]], i32 0
291; NO-SVE-NEXT:    [[R1:%.*]] = insertelement <8 x i8> [[R0]], i8 [[TMP2]], i32 1
292; NO-SVE-NEXT:    [[R2:%.*]] = insertelement <8 x i8> [[R1]], i8 [[TMP3]], i32 2
293; NO-SVE-NEXT:    [[R3:%.*]] = insertelement <8 x i8> [[R2]], i8 [[TMP4]], i32 3
294; NO-SVE-NEXT:    [[R4:%.*]] = insertelement <8 x i8> [[R3]], i8 [[TMP5]], i32 4
295; NO-SVE-NEXT:    [[R5:%.*]] = insertelement <8 x i8> [[R4]], i8 [[TMP6]], i32 5
296; NO-SVE-NEXT:    [[R6:%.*]] = insertelement <8 x i8> [[R5]], i8 [[TMP7]], i32 6
297; NO-SVE-NEXT:    [[R7:%.*]] = insertelement <8 x i8> [[R6]], i8 [[TMP8]], i32 7
298; NO-SVE-NEXT:    ret <8 x i8> [[R3]]
299;
300; SVE-LABEL: define <8 x i8> @slp_v8i8_Op1_Op2_unknown(
301; SVE-SAME: <8 x i8> [[A:%.*]], <8 x i8> [[B:%.*]]) #[[ATTR0]] {
302; SVE-NEXT:    [[TMP1:%.*]] = shufflevector <8 x i8> [[A]], <8 x i8> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
303; SVE-NEXT:    [[TMP2:%.*]] = shufflevector <8 x i8> [[B]], <8 x i8> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
304; SVE-NEXT:    [[TMP3:%.*]] = sdiv <4 x i8> [[TMP1]], [[TMP2]]
305; SVE-NEXT:    [[TMP4:%.*]] = shufflevector <8 x i8> [[A]], <8 x i8> poison, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
306; SVE-NEXT:    [[TMP5:%.*]] = shufflevector <8 x i8> [[B]], <8 x i8> poison, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
307; SVE-NEXT:    [[TMP6:%.*]] = sdiv <4 x i8> [[TMP4]], [[TMP5]]
308; SVE-NEXT:    [[TMP7:%.*]] = shufflevector <4 x i8> [[TMP3]], <4 x i8> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>
309; SVE-NEXT:    [[TMP8:%.*]] = shufflevector <4 x i8> [[TMP6]], <4 x i8> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>
310; SVE-NEXT:    [[R71:%.*]] = shufflevector <8 x i8> [[TMP7]], <8 x i8> [[TMP8]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 8, i32 9, i32 10, i32 11>
311; SVE-NEXT:    ret <8 x i8> [[TMP7]]
312;
313{
314  %a0 = extractelement <8 x i8> %a, i32 0
315  %a1 = extractelement <8 x i8> %a, i32 1
316  %a2 = extractelement <8 x i8> %a, i32 2
317  %a3 = extractelement <8 x i8> %a, i32 3
318  %a4 = extractelement <8 x i8> %a, i32 4
319  %a5 = extractelement <8 x i8> %a, i32 5
320  %a6 = extractelement <8 x i8> %a, i32 6
321  %a7 = extractelement <8 x i8> %a, i32 7
322  %b0 = extractelement <8 x i8> %b, i32 0
323  %b1 = extractelement <8 x i8> %b, i32 1
324  %b2 = extractelement <8 x i8> %b, i32 2
325  %b3 = extractelement <8 x i8> %b, i32 3
326  %b4 = extractelement <8 x i8> %b, i32 4
327  %b5 = extractelement <8 x i8> %b, i32 5
328  %b6 = extractelement <8 x i8> %b, i32 6
329  %b7 = extractelement <8 x i8> %b, i32 7
330  %1 = sdiv i8 %a0, %b0
331  %2 = sdiv i8 %a1, %b1
332  %3 = sdiv i8 %a2, %b2
333  %4 = sdiv i8 %a3, %b3
334  %5 = sdiv i8 %a4, %b4
335  %6 = sdiv i8 %a5, %b5
336  %7 = sdiv i8 %a6, %b6
337  %8 = sdiv i8 %a7, %b7
338  %r0 = insertelement <8 x i8> poison, i8 %1, i32 0
339  %r1 = insertelement <8 x i8> %r0, i8 %2, i32 1
340  %r2 = insertelement <8 x i8> %r1, i8 %3, i32 2
341  %r3 = insertelement <8 x i8> %r2, i8 %4, i32 3
342  %r4 = insertelement <8 x i8> %r3, i8 %5, i32 4
343  %r5 = insertelement <8 x i8> %r4, i8 %6, i32 5
344  %r6 = insertelement <8 x i8> %r5, i8 %7, i32 6
345  %r7 = insertelement <8 x i8> %r6, i8 %8, i32 7
346  ret <8 x i8> %r3
347}
348
349define <8 x i16> @slp_v8i16_Op1_Op2_unknown(<8 x i16> %a, <8 x i16> %b)
350; NO-SVE-LABEL: define <8 x i16> @slp_v8i16_Op1_Op2_unknown(
351; NO-SVE-SAME: <8 x i16> [[A:%.*]], <8 x i16> [[B:%.*]]) #[[ATTR0]] {
352; NO-SVE-NEXT:    [[A0:%.*]] = extractelement <8 x i16> [[A]], i32 0
353; NO-SVE-NEXT:    [[A1:%.*]] = extractelement <8 x i16> [[A]], i32 1
354; NO-SVE-NEXT:    [[A2:%.*]] = extractelement <8 x i16> [[A]], i32 2
355; NO-SVE-NEXT:    [[A3:%.*]] = extractelement <8 x i16> [[A]], i32 3
356; NO-SVE-NEXT:    [[A4:%.*]] = extractelement <8 x i16> [[A]], i32 4
357; NO-SVE-NEXT:    [[A5:%.*]] = extractelement <8 x i16> [[A]], i32 5
358; NO-SVE-NEXT:    [[A6:%.*]] = extractelement <8 x i16> [[A]], i32 6
359; NO-SVE-NEXT:    [[A7:%.*]] = extractelement <8 x i16> [[A]], i32 7
360; NO-SVE-NEXT:    [[B0:%.*]] = extractelement <8 x i16> [[B]], i32 0
361; NO-SVE-NEXT:    [[B1:%.*]] = extractelement <8 x i16> [[B]], i32 1
362; NO-SVE-NEXT:    [[B2:%.*]] = extractelement <8 x i16> [[B]], i32 2
363; NO-SVE-NEXT:    [[B3:%.*]] = extractelement <8 x i16> [[B]], i32 3
364; NO-SVE-NEXT:    [[B4:%.*]] = extractelement <8 x i16> [[B]], i32 4
365; NO-SVE-NEXT:    [[B5:%.*]] = extractelement <8 x i16> [[B]], i32 5
366; NO-SVE-NEXT:    [[B6:%.*]] = extractelement <8 x i16> [[B]], i32 6
367; NO-SVE-NEXT:    [[B7:%.*]] = extractelement <8 x i16> [[B]], i32 7
368; NO-SVE-NEXT:    [[TMP1:%.*]] = sdiv i16 [[A0]], [[B0]]
369; NO-SVE-NEXT:    [[TMP2:%.*]] = sdiv i16 [[A1]], [[B1]]
370; NO-SVE-NEXT:    [[TMP3:%.*]] = sdiv i16 [[A2]], [[B2]]
371; NO-SVE-NEXT:    [[TMP4:%.*]] = sdiv i16 [[A3]], [[B3]]
372; NO-SVE-NEXT:    [[TMP5:%.*]] = sdiv i16 [[A4]], [[B4]]
373; NO-SVE-NEXT:    [[TMP6:%.*]] = sdiv i16 [[A5]], [[B5]]
374; NO-SVE-NEXT:    [[TMP7:%.*]] = sdiv i16 [[A6]], [[B6]]
375; NO-SVE-NEXT:    [[TMP8:%.*]] = sdiv i16 [[A7]], [[B7]]
376; NO-SVE-NEXT:    [[R0:%.*]] = insertelement <8 x i16> poison, i16 [[TMP1]], i32 0
377; NO-SVE-NEXT:    [[R1:%.*]] = insertelement <8 x i16> [[R0]], i16 [[TMP2]], i32 1
378; NO-SVE-NEXT:    [[R2:%.*]] = insertelement <8 x i16> [[R1]], i16 [[TMP3]], i32 2
379; NO-SVE-NEXT:    [[R3:%.*]] = insertelement <8 x i16> [[R2]], i16 [[TMP4]], i32 3
380; NO-SVE-NEXT:    [[R4:%.*]] = insertelement <8 x i16> [[R3]], i16 [[TMP5]], i32 4
381; NO-SVE-NEXT:    [[R5:%.*]] = insertelement <8 x i16> [[R4]], i16 [[TMP6]], i32 5
382; NO-SVE-NEXT:    [[R6:%.*]] = insertelement <8 x i16> [[R5]], i16 [[TMP7]], i32 6
383; NO-SVE-NEXT:    [[R7:%.*]] = insertelement <8 x i16> [[R6]], i16 [[TMP8]], i32 7
384; NO-SVE-NEXT:    ret <8 x i16> [[R3]]
385;
386; SVE-LABEL: define <8 x i16> @slp_v8i16_Op1_Op2_unknown(
387; SVE-SAME: <8 x i16> [[A:%.*]], <8 x i16> [[B:%.*]]) #[[ATTR0]] {
388; SVE-NEXT:    [[TMP1:%.*]] = shufflevector <8 x i16> [[A]], <8 x i16> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
389; SVE-NEXT:    [[TMP2:%.*]] = shufflevector <8 x i16> [[B]], <8 x i16> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
390; SVE-NEXT:    [[TMP3:%.*]] = sdiv <4 x i16> [[TMP1]], [[TMP2]]
391; SVE-NEXT:    [[TMP4:%.*]] = shufflevector <8 x i16> [[A]], <8 x i16> poison, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
392; SVE-NEXT:    [[TMP5:%.*]] = shufflevector <8 x i16> [[B]], <8 x i16> poison, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
393; SVE-NEXT:    [[TMP6:%.*]] = sdiv <4 x i16> [[TMP4]], [[TMP5]]
394; SVE-NEXT:    [[TMP7:%.*]] = shufflevector <4 x i16> [[TMP3]], <4 x i16> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>
395; SVE-NEXT:    [[TMP8:%.*]] = shufflevector <4 x i16> [[TMP6]], <4 x i16> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>
396; SVE-NEXT:    [[R71:%.*]] = shufflevector <8 x i16> [[TMP7]], <8 x i16> [[TMP8]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 8, i32 9, i32 10, i32 11>
397; SVE-NEXT:    ret <8 x i16> [[TMP7]]
398;
399{
400  %a0 = extractelement <8 x i16> %a, i32 0
401  %a1 = extractelement <8 x i16> %a, i32 1
402  %a2 = extractelement <8 x i16> %a, i32 2
403  %a3 = extractelement <8 x i16> %a, i32 3
404  %a4 = extractelement <8 x i16> %a, i32 4
405  %a5 = extractelement <8 x i16> %a, i32 5
406  %a6 = extractelement <8 x i16> %a, i32 6
407  %a7 = extractelement <8 x i16> %a, i32 7
408  %b0 = extractelement <8 x i16> %b, i32 0
409  %b1 = extractelement <8 x i16> %b, i32 1
410  %b2 = extractelement <8 x i16> %b, i32 2
411  %b3 = extractelement <8 x i16> %b, i32 3
412  %b4 = extractelement <8 x i16> %b, i32 4
413  %b5 = extractelement <8 x i16> %b, i32 5
414  %b6 = extractelement <8 x i16> %b, i32 6
415  %b7 = extractelement <8 x i16> %b, i32 7
416  %1 = sdiv i16 %a0, %b0
417  %2 = sdiv i16 %a1, %b1
418  %3 = sdiv i16 %a2, %b2
419  %4 = sdiv i16 %a3, %b3
420  %5 = sdiv i16 %a4, %b4
421  %6 = sdiv i16 %a5, %b5
422  %7 = sdiv i16 %a6, %b6
423  %8 = sdiv i16 %a7, %b7
424  %r0 = insertelement <8 x i16> poison, i16 %1, i32 0
425  %r1 = insertelement <8 x i16> %r0, i16 %2, i32 1
426  %r2 = insertelement <8 x i16> %r1, i16 %3, i32 2
427  %r3 = insertelement <8 x i16> %r2, i16 %4, i32 3
428  %r4 = insertelement <8 x i16> %r3, i16 %5, i32 4
429  %r5 = insertelement <8 x i16> %r4, i16 %6, i32 5
430  %r6 = insertelement <8 x i16> %r5, i16 %7, i32 6
431  %r7 = insertelement <8 x i16> %r6, i16 %8, i32 7
432  ret <8 x i16> %r3
433}
434
435define <4 x i32> @slp_v4i32_Op1_unknown_Op2_const(<4 x i32> %a)
436; NO-SVE-LABEL: define <4 x i32> @slp_v4i32_Op1_unknown_Op2_const(
437; NO-SVE-SAME: <4 x i32> [[A:%.*]]) #[[ATTR0]] {
438; NO-SVE-NEXT:    [[A0:%.*]] = extractelement <4 x i32> [[A]], i32 0
439; NO-SVE-NEXT:    [[A1:%.*]] = extractelement <4 x i32> [[A]], i32 1
440; NO-SVE-NEXT:    [[A2:%.*]] = extractelement <4 x i32> [[A]], i32 2
441; NO-SVE-NEXT:    [[A3:%.*]] = extractelement <4 x i32> [[A]], i32 3
442; NO-SVE-NEXT:    [[TMP1:%.*]] = sdiv i32 [[A0]], 1
443; NO-SVE-NEXT:    [[TMP2:%.*]] = sdiv i32 [[A1]], 3
444; NO-SVE-NEXT:    [[TMP3:%.*]] = sdiv i32 [[A2]], 5
445; NO-SVE-NEXT:    [[TMP4:%.*]] = sdiv i32 [[A3]], 7
446; NO-SVE-NEXT:    [[R0:%.*]] = insertelement <4 x i32> poison, i32 [[TMP1]], i32 0
447; NO-SVE-NEXT:    [[R1:%.*]] = insertelement <4 x i32> [[R0]], i32 [[TMP2]], i32 1
448; NO-SVE-NEXT:    [[R2:%.*]] = insertelement <4 x i32> [[R1]], i32 [[TMP3]], i32 2
449; NO-SVE-NEXT:    [[R3:%.*]] = insertelement <4 x i32> [[R2]], i32 [[TMP4]], i32 3
450; NO-SVE-NEXT:    ret <4 x i32> [[R3]]
451;
452; SVE-LABEL: define <4 x i32> @slp_v4i32_Op1_unknown_Op2_const(
453; SVE-SAME: <4 x i32> [[A:%.*]]) #[[ATTR0]] {
454; SVE-NEXT:    [[TMP1:%.*]] = sdiv <4 x i32> [[A]], <i32 1, i32 3, i32 5, i32 7>
455; SVE-NEXT:    ret <4 x i32> [[TMP1]]
456;
457{
458  %a0 = extractelement <4 x i32> %a, i32 0
459  %a1 = extractelement <4 x i32> %a, i32 1
460  %a2 = extractelement <4 x i32> %a, i32 2
461  %a3 = extractelement <4 x i32> %a, i32 3
462  %1 = sdiv i32 %a0, 1
463  %2 = sdiv i32 %a1, 3
464  %3 = sdiv i32 %a2, 5
465  %4 = sdiv i32 %a3, 7
466  %r0 = insertelement <4 x i32> poison, i32 %1, i32 0
467  %r1 = insertelement <4 x i32> %r0, i32 %2, i32 1
468  %r2 = insertelement <4 x i32> %r1, i32 %3, i32 2
469  %r3 = insertelement <4 x i32> %r2, i32 %4, i32 3
470  ret <4 x i32> %r3
471}
472
473define <4 x i32> @slp_v4i32_Op1_unknown_Op2_uniform_const(<4 x i32> %a)
474; CHECK-LABEL: define <4 x i32> @slp_v4i32_Op1_unknown_Op2_uniform_const(
475; CHECK-SAME: <4 x i32> [[A:%.*]]) #[[ATTR0:[0-9]+]] {
476; CHECK-NEXT:    [[TMP1:%.*]] = sdiv <4 x i32> [[A]], splat (i32 5)
477; CHECK-NEXT:    ret <4 x i32> [[TMP1]]
478;
479{
480  %a0 = extractelement <4 x i32> %a, i32 0
481  %a1 = extractelement <4 x i32> %a, i32 1
482  %a2 = extractelement <4 x i32> %a, i32 2
483  %a3 = extractelement <4 x i32> %a, i32 3
484  %1 = sdiv i32 %a0, 5
485  %2 = sdiv i32 %a1, 5
486  %3 = sdiv i32 %a2, 5
487  %4 = sdiv i32 %a3, 5
488  %r0 = insertelement <4 x i32> poison, i32 %1, i32 0
489  %r1 = insertelement <4 x i32> %r0, i32 %2, i32 1
490  %r2 = insertelement <4 x i32> %r1, i32 %3, i32 2
491  %r3 = insertelement <4 x i32> %r2, i32 %4, i32 3
492  ret <4 x i32> %r3
493}
494
495define <4 x i32> @slp_v4i32_Op1_unknown_Op2_uniform_const_pow2(<4 x i32> %a)
496; CHECK-LABEL: define <4 x i32> @slp_v4i32_Op1_unknown_Op2_uniform_const_pow2(
497; CHECK-SAME: <4 x i32> [[A:%.*]]) #[[ATTR0]] {
498; CHECK-NEXT:    [[TMP1:%.*]] = sdiv <4 x i32> [[A]], splat (i32 4)
499; CHECK-NEXT:    ret <4 x i32> [[TMP1]]
500;
501{
502  %a0 = extractelement <4 x i32> %a, i32 0
503  %a1 = extractelement <4 x i32> %a, i32 1
504  %a2 = extractelement <4 x i32> %a, i32 2
505  %a3 = extractelement <4 x i32> %a, i32 3
506  %1 = sdiv i32 %a0, 4
507  %2 = sdiv i32 %a1, 4
508  %3 = sdiv i32 %a2, 4
509  %4 = sdiv i32 %a3, 4
510  %r0 = insertelement <4 x i32> poison, i32 %1, i32 0
511  %r1 = insertelement <4 x i32> %r0, i32 %2, i32 1
512  %r2 = insertelement <4 x i32> %r1, i32 %3, i32 2
513  %r3 = insertelement <4 x i32> %r2, i32 %4, i32 3
514  ret <4 x i32> %r3
515}
516
517define <4 x i32> @slp_v4i32_Op1_unknown_Op2_const_pow2(<4 x i32> %a)
518; NO-SVE-LABEL: define <4 x i32> @slp_v4i32_Op1_unknown_Op2_const_pow2(
519; NO-SVE-SAME: <4 x i32> [[A:%.*]]) #[[ATTR0]] {
520; NO-SVE-NEXT:    [[A0:%.*]] = extractelement <4 x i32> [[A]], i32 0
521; NO-SVE-NEXT:    [[A1:%.*]] = extractelement <4 x i32> [[A]], i32 1
522; NO-SVE-NEXT:    [[A2:%.*]] = extractelement <4 x i32> [[A]], i32 2
523; NO-SVE-NEXT:    [[A3:%.*]] = extractelement <4 x i32> [[A]], i32 3
524; NO-SVE-NEXT:    [[TMP1:%.*]] = sdiv i32 [[A0]], 1
525; NO-SVE-NEXT:    [[TMP2:%.*]] = sdiv i32 [[A1]], 2
526; NO-SVE-NEXT:    [[TMP3:%.*]] = sdiv i32 [[A2]], 4
527; NO-SVE-NEXT:    [[TMP4:%.*]] = sdiv i32 [[A3]], 8
528; NO-SVE-NEXT:    [[R0:%.*]] = insertelement <4 x i32> poison, i32 [[TMP1]], i32 0
529; NO-SVE-NEXT:    [[R1:%.*]] = insertelement <4 x i32> [[R0]], i32 [[TMP2]], i32 1
530; NO-SVE-NEXT:    [[R2:%.*]] = insertelement <4 x i32> [[R1]], i32 [[TMP3]], i32 2
531; NO-SVE-NEXT:    [[R3:%.*]] = insertelement <4 x i32> [[R2]], i32 [[TMP4]], i32 3
532; NO-SVE-NEXT:    ret <4 x i32> [[R3]]
533;
534; SVE-LABEL: define <4 x i32> @slp_v4i32_Op1_unknown_Op2_const_pow2(
535; SVE-SAME: <4 x i32> [[A:%.*]]) #[[ATTR0]] {
536; SVE-NEXT:    [[TMP1:%.*]] = sdiv <4 x i32> [[A]], <i32 1, i32 2, i32 4, i32 8>
537; SVE-NEXT:    ret <4 x i32> [[TMP1]]
538;
539{
540  %a0 = extractelement <4 x i32> %a, i32 0
541  %a1 = extractelement <4 x i32> %a, i32 1
542  %a2 = extractelement <4 x i32> %a, i32 2
543  %a3 = extractelement <4 x i32> %a, i32 3
544  %1 = sdiv i32 %a0, 1
545  %2 = sdiv i32 %a1, 2
546  %3 = sdiv i32 %a2, 4
547  %4 = sdiv i32 %a3, 8
548  %r0 = insertelement <4 x i32> poison, i32 %1, i32 0
549  %r1 = insertelement <4 x i32> %r0, i32 %2, i32 1
550  %r2 = insertelement <4 x i32> %r1, i32 %3, i32 2
551  %r3 = insertelement <4 x i32> %r2, i32 %4, i32 3
552  ret <4 x i32> %r3
553}
554
555define <2 x i32> @sdiv_v2i32_unknown_divisor(<2 x i32> %a, <2 x i32> %x, <2 x i32> %y, <2 x i32> %z)
556; NO-SVE-LABEL: define <2 x i32> @sdiv_v2i32_unknown_divisor(
557; NO-SVE-SAME: <2 x i32> [[A:%.*]], <2 x i32> [[X:%.*]], <2 x i32> [[Y:%.*]], <2 x i32> [[Z:%.*]]) #[[ATTR0]] {
558; NO-SVE-NEXT:    [[A0:%.*]] = extractelement <2 x i32> [[A]], i64 0
559; NO-SVE-NEXT:    [[A1:%.*]] = extractelement <2 x i32> [[A]], i64 1
560; NO-SVE-NEXT:    [[X0:%.*]] = extractelement <2 x i32> [[X]], i64 0
561; NO-SVE-NEXT:    [[X1:%.*]] = extractelement <2 x i32> [[X]], i64 1
562; NO-SVE-NEXT:    [[TMP1:%.*]] = sdiv i32 [[A0]], [[X0]]
563; NO-SVE-NEXT:    [[TMP2:%.*]] = sdiv i32 [[A1]], [[X1]]
564; NO-SVE-NEXT:    [[TMP3:%.*]] = add i32 [[TMP1]], [[X0]]
565; NO-SVE-NEXT:    [[TMP4:%.*]] = add i32 [[TMP2]], [[X1]]
566; NO-SVE-NEXT:    [[Y0:%.*]] = extractelement <2 x i32> [[Y]], i64 0
567; NO-SVE-NEXT:    [[Y1:%.*]] = extractelement <2 x i32> [[Y]], i64 1
568; NO-SVE-NEXT:    [[TMP5:%.*]] = sub i32 [[TMP3]], [[Y0]]
569; NO-SVE-NEXT:    [[TMP6:%.*]] = sub i32 [[TMP4]], [[Y1]]
570; NO-SVE-NEXT:    [[Z0:%.*]] = extractelement <2 x i32> [[Z]], i64 0
571; NO-SVE-NEXT:    [[Z1:%.*]] = extractelement <2 x i32> [[Z]], i64 1
572; NO-SVE-NEXT:    [[TMP7:%.*]] = mul i32 [[TMP5]], [[Z0]]
573; NO-SVE-NEXT:    [[TMP8:%.*]] = mul i32 [[TMP6]], [[Z1]]
574; NO-SVE-NEXT:    [[RES0:%.*]] = insertelement <2 x i32> poison, i32 [[TMP7]], i32 0
575; NO-SVE-NEXT:    [[RES1:%.*]] = insertelement <2 x i32> [[RES0]], i32 [[TMP8]], i32 1
576; NO-SVE-NEXT:    ret <2 x i32> [[RES1]]
577;
578; SVE-LABEL: define <2 x i32> @sdiv_v2i32_unknown_divisor(
579; SVE-SAME: <2 x i32> [[A:%.*]], <2 x i32> [[X:%.*]], <2 x i32> [[Y:%.*]], <2 x i32> [[Z:%.*]]) #[[ATTR0]] {
580; SVE-NEXT:    [[TMP2:%.*]] = sdiv <2 x i32> [[A]], [[X]]
581; SVE-NEXT:    [[TMP3:%.*]] = add <2 x i32> [[TMP2]], [[X]]
582; SVE-NEXT:    [[TMP4:%.*]] = sub <2 x i32> [[TMP3]], [[Y]]
583; SVE-NEXT:    [[TMP5:%.*]] = mul <2 x i32> [[TMP4]], [[Z]]
584; SVE-NEXT:    ret <2 x i32> [[TMP5]]
585;
586{
587  %a0 = extractelement <2 x i32> %a, i64 0
588  %a1 = extractelement <2 x i32> %a, i64 1
589  %x0 = extractelement <2 x i32> %x, i64 0
590  %x1 = extractelement <2 x i32> %x, i64 1
591  %1 = sdiv i32 %a0, %x0
592  %2 = sdiv i32 %a1, %x1
593  %3 = add i32 %1, %x0
594  %4 = add i32 %2, %x1
595  %y0 = extractelement <2 x i32> %y, i64 0
596  %y1 = extractelement <2 x i32> %y, i64 1
597  %5 = sub i32 %3, %y0
598  %6 = sub i32 %4, %y1
599  %z0 = extractelement <2 x i32> %z, i64 0
600  %z1 = extractelement <2 x i32> %z, i64 1
601  %7 = mul i32 %5, %z0
602  %8 = mul i32 %6, %z1
603  %res0 = insertelement <2 x i32> poison, i32 %7, i32 0
604  %res1 = insertelement <2 x i32> %res0, i32 %8, i32 1
605  ret <2 x i32> %res1
606}
607
608; computes (a/const + x - y) * z
609define <2 x i32> @sdiv_v2i32_const_divisor(<2 x i32> %a, <2 x i32> %x, <2 x i32> %y, <2 x i32> %z)
610; NO-SVE-LABEL: define <2 x i32> @sdiv_v2i32_const_divisor(
611; NO-SVE-SAME: <2 x i32> [[A:%.*]], <2 x i32> [[X:%.*]], <2 x i32> [[Y:%.*]], <2 x i32> [[Z:%.*]]) #[[ATTR0]] {
612; NO-SVE-NEXT:    [[A0:%.*]] = extractelement <2 x i32> [[A]], i64 0
613; NO-SVE-NEXT:    [[A1:%.*]] = extractelement <2 x i32> [[A]], i64 1
614; NO-SVE-NEXT:    [[TMP1:%.*]] = sdiv i32 [[A0]], 2
615; NO-SVE-NEXT:    [[TMP2:%.*]] = sdiv i32 [[A1]], 4
616; NO-SVE-NEXT:    [[X0:%.*]] = extractelement <2 x i32> [[X]], i64 0
617; NO-SVE-NEXT:    [[X1:%.*]] = extractelement <2 x i32> [[X]], i64 1
618; NO-SVE-NEXT:    [[TMP3:%.*]] = add i32 [[TMP1]], [[X0]]
619; NO-SVE-NEXT:    [[TMP4:%.*]] = add i32 [[TMP2]], [[X1]]
620; NO-SVE-NEXT:    [[Y0:%.*]] = extractelement <2 x i32> [[Y]], i64 0
621; NO-SVE-NEXT:    [[Y1:%.*]] = extractelement <2 x i32> [[Y]], i64 1
622; NO-SVE-NEXT:    [[TMP5:%.*]] = sub i32 [[TMP3]], [[Y0]]
623; NO-SVE-NEXT:    [[TMP6:%.*]] = sub i32 [[TMP4]], [[Y1]]
624; NO-SVE-NEXT:    [[Z0:%.*]] = extractelement <2 x i32> [[Z]], i64 0
625; NO-SVE-NEXT:    [[Z1:%.*]] = extractelement <2 x i32> [[Z]], i64 1
626; NO-SVE-NEXT:    [[TMP7:%.*]] = mul i32 [[TMP5]], [[Z0]]
627; NO-SVE-NEXT:    [[TMP8:%.*]] = mul i32 [[TMP6]], [[Z1]]
628; NO-SVE-NEXT:    [[RES0:%.*]] = insertelement <2 x i32> poison, i32 [[TMP7]], i32 0
629; NO-SVE-NEXT:    [[RES1:%.*]] = insertelement <2 x i32> [[RES0]], i32 [[TMP8]], i32 1
630; NO-SVE-NEXT:    ret <2 x i32> [[RES1]]
631;
632; SVE-LABEL: define <2 x i32> @sdiv_v2i32_const_divisor(
633; SVE-SAME: <2 x i32> [[A:%.*]], <2 x i32> [[X:%.*]], <2 x i32> [[Y:%.*]], <2 x i32> [[Z:%.*]]) #[[ATTR0]] {
634; SVE-NEXT:    [[TMP1:%.*]] = sdiv <2 x i32> [[A]], <i32 2, i32 4>
635; SVE-NEXT:    [[TMP2:%.*]] = add <2 x i32> [[TMP1]], [[X]]
636; SVE-NEXT:    [[TMP3:%.*]] = sub <2 x i32> [[TMP2]], [[Y]]
637; SVE-NEXT:    [[TMP4:%.*]] = mul <2 x i32> [[TMP3]], [[Z]]
638; SVE-NEXT:    ret <2 x i32> [[TMP4]]
639;
640{
641  %a0 = extractelement <2 x i32> %a, i64 0
642  %a1 = extractelement <2 x i32> %a, i64 1
643  %1 = sdiv i32 %a0, 2
644  %2 = sdiv i32 %a1, 4
645  %x0 = extractelement <2 x i32> %x, i64 0
646  %x1 = extractelement <2 x i32> %x, i64 1
647  %3 = add i32 %1, %x0
648  %4 = add i32 %2, %x1
649  %y0 = extractelement <2 x i32> %y, i64 0
650  %y1 = extractelement <2 x i32> %y, i64 1
651  %5 = sub i32 %3, %y0
652  %6 = sub i32 %4, %y1
653  %z0 = extractelement <2 x i32> %z, i64 0
654  %z1 = extractelement <2 x i32> %z, i64 1
655  %7 = mul i32 %5, %z0
656  %8 = mul i32 %6, %z1
657  %res0 = insertelement <2 x i32> poison, i32 %7, i32 0
658  %res1 = insertelement <2 x i32> %res0, i32 %8, i32 1
659  ret <2 x i32> %res1
660}
661
662define <2 x i32> @sdiv_v2i32_Op1_unknown_Op2_const(<2 x i32> %a, <2 x i32> %x, <2 x i32> %y, <2 x i32> %z)
663; NO-SVE-LABEL: define <2 x i32> @sdiv_v2i32_Op1_unknown_Op2_const(
664; NO-SVE-SAME: <2 x i32> [[A:%.*]], <2 x i32> [[X:%.*]], <2 x i32> [[Y:%.*]], <2 x i32> [[Z:%.*]]) #[[ATTR0]] {
665; NO-SVE-NEXT:    [[A0:%.*]] = extractelement <2 x i32> [[A]], i64 0
666; NO-SVE-NEXT:    [[A1:%.*]] = extractelement <2 x i32> [[A]], i64 1
667; NO-SVE-NEXT:    [[TMP1:%.*]] = sdiv i32 [[A0]], [[A0]]
668; NO-SVE-NEXT:    [[TMP2:%.*]] = sdiv i32 [[A1]], 4
669; NO-SVE-NEXT:    [[X0:%.*]] = extractelement <2 x i32> [[X]], i64 0
670; NO-SVE-NEXT:    [[X1:%.*]] = extractelement <2 x i32> [[X]], i64 1
671; NO-SVE-NEXT:    [[TMP3:%.*]] = add i32 [[TMP1]], [[X0]]
672; NO-SVE-NEXT:    [[TMP4:%.*]] = add i32 [[TMP2]], [[X1]]
673; NO-SVE-NEXT:    [[Y0:%.*]] = extractelement <2 x i32> [[Y]], i64 0
674; NO-SVE-NEXT:    [[Y1:%.*]] = extractelement <2 x i32> [[Y]], i64 1
675; NO-SVE-NEXT:    [[TMP5:%.*]] = sub i32 [[TMP3]], [[Y0]]
676; NO-SVE-NEXT:    [[TMP6:%.*]] = sub i32 [[TMP4]], [[Y1]]
677; NO-SVE-NEXT:    [[Z0:%.*]] = extractelement <2 x i32> [[Z]], i64 0
678; NO-SVE-NEXT:    [[Z1:%.*]] = extractelement <2 x i32> [[Z]], i64 1
679; NO-SVE-NEXT:    [[TMP7:%.*]] = mul i32 [[TMP5]], [[Z0]]
680; NO-SVE-NEXT:    [[TMP8:%.*]] = mul i32 [[TMP6]], [[Z1]]
681; NO-SVE-NEXT:    [[RES0:%.*]] = insertelement <2 x i32> poison, i32 [[TMP7]], i32 0
682; NO-SVE-NEXT:    [[RES1:%.*]] = insertelement <2 x i32> [[RES0]], i32 [[TMP8]], i32 1
683; NO-SVE-NEXT:    ret <2 x i32> [[RES1]]
684;
685; SVE-LABEL: define <2 x i32> @sdiv_v2i32_Op1_unknown_Op2_const(
686; SVE-SAME: <2 x i32> [[A:%.*]], <2 x i32> [[X:%.*]], <2 x i32> [[Y:%.*]], <2 x i32> [[Z:%.*]]) #[[ATTR0]] {
687; SVE-NEXT:    [[TMP1:%.*]] = shufflevector <2 x i32> [[A]], <2 x i32> <i32 poison, i32 4>, <2 x i32> <i32 0, i32 3>
688; SVE-NEXT:    [[TMP2:%.*]] = sdiv <2 x i32> [[A]], [[TMP1]]
689; SVE-NEXT:    [[TMP3:%.*]] = add <2 x i32> [[TMP2]], [[X]]
690; SVE-NEXT:    [[TMP4:%.*]] = sub <2 x i32> [[TMP3]], [[Y]]
691; SVE-NEXT:    [[TMP5:%.*]] = mul <2 x i32> [[TMP4]], [[Z]]
692; SVE-NEXT:    ret <2 x i32> [[TMP5]]
693;
694{
695  %a0 = extractelement <2 x i32> %a, i64 0
696  %a1 = extractelement <2 x i32> %a, i64 1
697  %1 = sdiv i32 %a0, %a0
698  %2 = sdiv i32 %a1, 4
699  %x0 = extractelement <2 x i32> %x, i64 0
700  %x1 = extractelement <2 x i32> %x, i64 1
701  %3 = add i32 %1, %x0
702  %4 = add i32 %2, %x1
703  %y0 = extractelement <2 x i32> %y, i64 0
704  %y1 = extractelement <2 x i32> %y, i64 1
705  %5 = sub i32 %3, %y0
706  %6 = sub i32 %4, %y1
707  %z0 = extractelement <2 x i32> %z, i64 0
708  %z1 = extractelement <2 x i32> %z, i64 1
709  %7 = mul i32 %5, %z0
710  %8 = mul i32 %6, %z1
711  %res0 = insertelement <2 x i32> poison, i32 %7, i32 0
712  %res1 = insertelement <2 x i32> %res0, i32 %8, i32 1
713  ret <2 x i32> %res1
714}
715