Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / RISCV / rvv / fixed-vectors-int-buildvec.ll
blob85939377c6db08ea6bb93e7e5fcb97cff39c72e0
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv32 -mattr=+v -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV32
3 ; RUN: llc -mtriple=riscv64 -mattr=+v -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV64
5 define void @buildvec_vid_v16i8(ptr %x) {
6 ; CHECK-LABEL: buildvec_vid_v16i8:
7 ; CHECK:       # %bb.0:
8 ; CHECK-NEXT:    vsetivli zero, 16, e8, m1, ta, ma
9 ; CHECK-NEXT:    vid.v v8
10 ; CHECK-NEXT:    vse8.v v8, (a0)
11 ; CHECK-NEXT:    ret
12   store <16 x i8> <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15>, ptr %x
13   ret void
16 define void @buildvec_vid_undefelts_v16i8(ptr %x) {
17 ; CHECK-LABEL: buildvec_vid_undefelts_v16i8:
18 ; CHECK:       # %bb.0:
19 ; CHECK-NEXT:    vsetivli zero, 16, e8, m1, ta, ma
20 ; CHECK-NEXT:    vid.v v8
21 ; CHECK-NEXT:    vse8.v v8, (a0)
22 ; CHECK-NEXT:    ret
23   store <16 x i8> <i8 0, i8 1, i8 2, i8 undef, i8 4, i8 undef, i8 6, i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15>, ptr %x
24   ret void
27 ; TODO: Could do VID then insertelement on missing elements
28 define void @buildvec_notquite_vid_v16i8(ptr %x) {
29 ; CHECK-LABEL: buildvec_notquite_vid_v16i8:
30 ; CHECK:       # %bb.0:
31 ; CHECK-NEXT:    lui a1, %hi(.LCPI2_0)
32 ; CHECK-NEXT:    addi a1, a1, %lo(.LCPI2_0)
33 ; CHECK-NEXT:    vsetivli zero, 16, e8, m1, ta, ma
34 ; CHECK-NEXT:    vle8.v v8, (a1)
35 ; CHECK-NEXT:    vse8.v v8, (a0)
36 ; CHECK-NEXT:    ret
37   store <16 x i8> <i8 0, i8 1, i8 3, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15>, ptr %x
38   ret void
41 define void @buildvec_vid_plus_imm_v16i8(ptr %x) {
42 ; CHECK-LABEL: buildvec_vid_plus_imm_v16i8:
43 ; CHECK:       # %bb.0:
44 ; CHECK-NEXT:    vsetivli zero, 16, e8, m1, ta, ma
45 ; CHECK-NEXT:    vid.v v8
46 ; CHECK-NEXT:    vadd.vi v8, v8, 2
47 ; CHECK-NEXT:    vse8.v v8, (a0)
48 ; CHECK-NEXT:    ret
49   store <16 x i8> <i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15, i8 16, i8 17>, ptr %x
50   ret void
53 define void @buildvec_vid_plus_nonimm_v16i8(ptr %x) {
54 ; CHECK-LABEL: buildvec_vid_plus_nonimm_v16i8:
55 ; CHECK:       # %bb.0:
56 ; CHECK-NEXT:    lui a1, %hi(.LCPI4_0)
57 ; CHECK-NEXT:    addi a1, a1, %lo(.LCPI4_0)
58 ; CHECK-NEXT:    vsetivli zero, 16, e8, m1, ta, ma
59 ; CHECK-NEXT:    vle8.v v8, (a1)
60 ; CHECK-NEXT:    vse8.v v8, (a0)
61 ; CHECK-NEXT:    ret
62   store <16 x i8> <i8 100, i8 101, i8 102, i8 103, i8 104, i8 105, i8 106, i8 107, i8 108, i8 109, i8 110, i8 111, i8 112, i8 113, i8 114, i8 115>, ptr %x
63   ret void
66 define void @buildvec_vid_mpy_imm_v16i8(ptr %x) {
67 ; CHECK-LABEL: buildvec_vid_mpy_imm_v16i8:
68 ; CHECK:       # %bb.0:
69 ; CHECK-NEXT:    vsetivli zero, 16, e8, m1, ta, ma
70 ; CHECK-NEXT:    vid.v v8
71 ; CHECK-NEXT:    li a1, 3
72 ; CHECK-NEXT:    vmul.vx v8, v8, a1
73 ; CHECK-NEXT:    vse8.v v8, (a0)
74 ; CHECK-NEXT:    ret
75   store <16 x i8> <i8 0, i8 3, i8 6, i8 9, i8 12, i8 15, i8 18, i8 21, i8 24, i8 27, i8 30, i8 33, i8 36, i8 39, i8 42, i8 45>, ptr %x
76   ret void
79 define <4 x i8> @buildvec_vid_step2_add0_v4i8() {
80 ; CHECK-LABEL: buildvec_vid_step2_add0_v4i8:
81 ; CHECK:       # %bb.0:
82 ; CHECK-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma
83 ; CHECK-NEXT:    vid.v v8
84 ; CHECK-NEXT:    vadd.vv v8, v8, v8
85 ; CHECK-NEXT:    ret
86   ret <4 x i8> <i8 0, i8 2, i8 4, i8 6>
89 define <4 x i8> @buildvec_vid_step2_add0_v4i8_undef0() {
90 ; CHECK-LABEL: buildvec_vid_step2_add0_v4i8_undef0:
91 ; CHECK:       # %bb.0:
92 ; CHECK-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma
93 ; CHECK-NEXT:    vid.v v8
94 ; CHECK-NEXT:    vadd.vv v8, v8, v8
95 ; CHECK-NEXT:    ret
96   ret <4 x i8> <i8 undef, i8 2, i8 4, i8 6>
99 define <4 x i8> @buildvec_vid_step2_add0_v4i8_undef1() {
100 ; CHECK-LABEL: buildvec_vid_step2_add0_v4i8_undef1:
101 ; CHECK:       # %bb.0:
102 ; CHECK-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma
103 ; CHECK-NEXT:    vid.v v8
104 ; CHECK-NEXT:    vadd.vv v8, v8, v8
105 ; CHECK-NEXT:    ret
106   ret <4 x i8> <i8 undef, i8 undef, i8 4, i8 6>
109 define <4 x i8> @buildvec_vid_step2_add0_v4i8_undef2() {
110 ; CHECK-LABEL: buildvec_vid_step2_add0_v4i8_undef2:
111 ; CHECK:       # %bb.0:
112 ; CHECK-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma
113 ; CHECK-NEXT:    vid.v v8
114 ; CHECK-NEXT:    vadd.vv v8, v8, v8
115 ; CHECK-NEXT:    ret
116   ret <4 x i8> <i8 0, i8 undef, i8 undef, i8 6>
119 define <4 x i8> @buildvec_vid_step2_add1_v4i8() {
120 ; CHECK-LABEL: buildvec_vid_step2_add1_v4i8:
121 ; CHECK:       # %bb.0:
122 ; CHECK-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma
123 ; CHECK-NEXT:    vid.v v8
124 ; CHECK-NEXT:    vadd.vv v8, v8, v8
125 ; CHECK-NEXT:    vadd.vi v8, v8, 1
126 ; CHECK-NEXT:    ret
127   ret <4 x i8> <i8 1, i8 3, i8 5, i8 7>
130 define <4 x i8> @buildvec_vid_step2_add1_v4i8_undef0() {
131 ; CHECK-LABEL: buildvec_vid_step2_add1_v4i8_undef0:
132 ; CHECK:       # %bb.0:
133 ; CHECK-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma
134 ; CHECK-NEXT:    vid.v v8
135 ; CHECK-NEXT:    vadd.vv v8, v8, v8
136 ; CHECK-NEXT:    vadd.vi v8, v8, 1
137 ; CHECK-NEXT:    ret
138   ret <4 x i8> <i8 undef, i8 3, i8 5, i8 7>
141 define <4 x i8> @buildvec_vid_step2_add1_v4i8_undef1() {
142 ; CHECK-LABEL: buildvec_vid_step2_add1_v4i8_undef1:
143 ; CHECK:       # %bb.0:
144 ; CHECK-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma
145 ; CHECK-NEXT:    vid.v v8
146 ; CHECK-NEXT:    vadd.vv v8, v8, v8
147 ; CHECK-NEXT:    vadd.vi v8, v8, 1
148 ; CHECK-NEXT:    ret
149   ret <4 x i8> <i8 undef, i8 undef, i8 5, i8 7>
152 define <4 x i8> @buildvec_vid_step2_add1_v4i8_undef2() {
153 ; CHECK-LABEL: buildvec_vid_step2_add1_v4i8_undef2:
154 ; CHECK:       # %bb.0:
155 ; CHECK-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma
156 ; CHECK-NEXT:    vid.v v8
157 ; CHECK-NEXT:    vadd.vv v8, v8, v8
158 ; CHECK-NEXT:    vadd.vi v8, v8, 1
159 ; CHECK-NEXT:    ret
160   ret <4 x i8> <i8 1, i8 undef, i8 undef, i8 7>
163 define <4 x i8> @buildvec_vid_stepn1_add0_v4i8() {
164 ; CHECK-LABEL: buildvec_vid_stepn1_add0_v4i8:
165 ; CHECK:       # %bb.0:
166 ; CHECK-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma
167 ; CHECK-NEXT:    vid.v v8
168 ; CHECK-NEXT:    vrsub.vi v8, v8, 0
169 ; CHECK-NEXT:    ret
170   ret <4 x i8> <i8 0, i8 -1, i8 -2, i8 -3>
173 define <4 x i8> @buildvec_vid_stepn1_add0_v4i8_undef0() {
174 ; CHECK-LABEL: buildvec_vid_stepn1_add0_v4i8_undef0:
175 ; CHECK:       # %bb.0:
176 ; CHECK-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma
177 ; CHECK-NEXT:    vid.v v8
178 ; CHECK-NEXT:    vrsub.vi v8, v8, 0
179 ; CHECK-NEXT:    ret
180   ret <4 x i8> <i8 undef, i8 -1, i8 -2, i8 -3>
183 define <4 x i8> @buildvec_vid_stepn1_add0_v4i8_undef1() {
184 ; CHECK-LABEL: buildvec_vid_stepn1_add0_v4i8_undef1:
185 ; CHECK:       # %bb.0:
186 ; CHECK-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma
187 ; CHECK-NEXT:    vid.v v8
188 ; CHECK-NEXT:    vrsub.vi v8, v8, 0
189 ; CHECK-NEXT:    ret
190   ret <4 x i8> <i8 undef, i8 undef, i8 -2, i8 -3>
193 define <4 x i8> @buildvec_vid_stepn1_add0_v4i8_undef2() {
194 ; CHECK-LABEL: buildvec_vid_stepn1_add0_v4i8_undef2:
195 ; CHECK:       # %bb.0:
196 ; CHECK-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma
197 ; CHECK-NEXT:    vid.v v8
198 ; CHECK-NEXT:    vrsub.vi v8, v8, 0
199 ; CHECK-NEXT:    ret
200   ret <4 x i8> <i8 0, i8 undef, i8 undef, i8 -3>
203 define <4 x i8> @buildvec_vid_stepn2_add0_v4i8() {
204 ; CHECK-LABEL: buildvec_vid_stepn2_add0_v4i8:
205 ; CHECK:       # %bb.0:
206 ; CHECK-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma
207 ; CHECK-NEXT:    vid.v v8
208 ; CHECK-NEXT:    vadd.vv v8, v8, v8
209 ; CHECK-NEXT:    vrsub.vi v8, v8, 0
210 ; CHECK-NEXT:    ret
211   ret <4 x i8> <i8 0, i8 -2, i8 -4, i8 -6>
214 define <4 x i8> @buildvec_vid_stepn2_add0_v4i8_undef0() {
215 ; CHECK-LABEL: buildvec_vid_stepn2_add0_v4i8_undef0:
216 ; CHECK:       # %bb.0:
217 ; CHECK-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma
218 ; CHECK-NEXT:    vid.v v8
219 ; CHECK-NEXT:    vadd.vv v8, v8, v8
220 ; CHECK-NEXT:    vrsub.vi v8, v8, 0
221 ; CHECK-NEXT:    ret
222   ret <4 x i8> <i8 undef, i8 -2, i8 -4, i8 -6>
225 define <4 x i8> @buildvec_vid_stepn2_add0_v4i8_undef1() {
226 ; CHECK-LABEL: buildvec_vid_stepn2_add0_v4i8_undef1:
227 ; CHECK:       # %bb.0:
228 ; CHECK-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma
229 ; CHECK-NEXT:    vid.v v8
230 ; CHECK-NEXT:    vadd.vv v8, v8, v8
231 ; CHECK-NEXT:    vrsub.vi v8, v8, 0
232 ; CHECK-NEXT:    ret
233   ret <4 x i8> <i8 undef, i8 undef, i8 -4, i8 -6>
236 define <4 x i8> @buildvec_vid_stepn2_add0_v4i8_undef2() {
237 ; CHECK-LABEL: buildvec_vid_stepn2_add0_v4i8_undef2:
238 ; CHECK:       # %bb.0:
239 ; CHECK-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma
240 ; CHECK-NEXT:    vmv.v.i v8, -6
241 ; CHECK-NEXT:    ret
242   ret <4 x i8> <i8 undef, i8 undef, i8 undef, i8 -6>
245 define <4 x i8> @buildvec_vid_stepn2_add3_v4i8() {
246 ; CHECK-LABEL: buildvec_vid_stepn2_add3_v4i8:
247 ; CHECK:       # %bb.0:
248 ; CHECK-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma
249 ; CHECK-NEXT:    vid.v v8
250 ; CHECK-NEXT:    vadd.vv v8, v8, v8
251 ; CHECK-NEXT:    vrsub.vi v8, v8, 3
252 ; CHECK-NEXT:    ret
253   ret <4 x i8> <i8 3, i8 1, i8 -1, i8 -3>
256 define <4 x i8> @buildvec_vid_stepn3_add3_v4i8() {
257 ; CHECK-LABEL: buildvec_vid_stepn3_add3_v4i8:
258 ; CHECK:       # %bb.0:
259 ; CHECK-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma
260 ; CHECK-NEXT:    vmv.v.i v9, 3
261 ; CHECK-NEXT:    vid.v v8
262 ; CHECK-NEXT:    li a0, 253
263 ; CHECK-NEXT:    vmadd.vx v8, a0, v9
264 ; CHECK-NEXT:    ret
265   ret <4 x i8> <i8 3, i8 0, i8 -3, i8 -6>
268 define void @buildvec_vid_stepn3_addn3_v4i32(ptr %z0, ptr %z1, ptr %z2, ptr %z3) {
269 ; CHECK-LABEL: buildvec_vid_stepn3_addn3_v4i32:
270 ; CHECK:       # %bb.0:
271 ; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
272 ; CHECK-NEXT:    vmv.v.i v8, -3
273 ; CHECK-NEXT:    vid.v v9
274 ; CHECK-NEXT:    li a4, -3
275 ; CHECK-NEXT:    vmadd.vx v9, a4, v8
276 ; CHECK-NEXT:    vse32.v v9, (a0)
277 ; CHECK-NEXT:    vse32.v v9, (a1)
278 ; CHECK-NEXT:    vse32.v v9, (a2)
279 ; CHECK-NEXT:    vse32.v v9, (a3)
280 ; CHECK-NEXT:    ret
281   store <4 x i32> <i32 -3, i32 -6, i32 -9, i32 -12>, ptr %z0
282   store <4 x i32> <i32 undef, i32 -6, i32 -9, i32 -12>, ptr %z1
283   store <4 x i32> <i32 undef, i32 undef, i32 -9, i32 -12>, ptr %z2
284   store <4 x i32> <i32 -3, i32 undef, i32 undef, i32 -12>, ptr %z3
285   ret void
288 ; FIXME: RV32 doesn't catch this pattern due to BUILD_VECTOR legalization.
289 define <4 x i64> @buildvec_vid_step1_add0_v4i64() {
290 ; RV32-LABEL: buildvec_vid_step1_add0_v4i64:
291 ; RV32:       # %bb.0:
292 ; RV32-NEXT:    lui a0, %hi(.LCPI25_0)
293 ; RV32-NEXT:    addi a0, a0, %lo(.LCPI25_0)
294 ; RV32-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
295 ; RV32-NEXT:    vle8.v v10, (a0)
296 ; RV32-NEXT:    vsext.vf4 v8, v10
297 ; RV32-NEXT:    ret
299 ; RV64-LABEL: buildvec_vid_step1_add0_v4i64:
300 ; RV64:       # %bb.0:
301 ; RV64-NEXT:    vsetivli zero, 4, e64, m2, ta, ma
302 ; RV64-NEXT:    vid.v v8
303 ; RV64-NEXT:    ret
304   ret <4 x i64> <i64 0, i64 1, i64 2, i64 3>
307 define <4 x i64> @buildvec_vid_step2_add0_v4i64() {
308 ; RV32-LABEL: buildvec_vid_step2_add0_v4i64:
309 ; RV32:       # %bb.0:
310 ; RV32-NEXT:    lui a0, %hi(.LCPI26_0)
311 ; RV32-NEXT:    addi a0, a0, %lo(.LCPI26_0)
312 ; RV32-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
313 ; RV32-NEXT:    vle8.v v10, (a0)
314 ; RV32-NEXT:    vsext.vf4 v8, v10
315 ; RV32-NEXT:    ret
317 ; RV64-LABEL: buildvec_vid_step2_add0_v4i64:
318 ; RV64:       # %bb.0:
319 ; RV64-NEXT:    vsetivli zero, 4, e64, m2, ta, ma
320 ; RV64-NEXT:    vid.v v8
321 ; RV64-NEXT:    vadd.vv v8, v8, v8
322 ; RV64-NEXT:    ret
323   ret <4 x i64> <i64 0, i64 2, i64 4, i64 6>
326 define <4 x i8> @buildvec_no_vid_v4i8_0() {
327 ; CHECK-LABEL: buildvec_no_vid_v4i8_0:
328 ; CHECK:       # %bb.0:
329 ; CHECK-NEXT:    lui a0, 28768
330 ; CHECK-NEXT:    addi a0, a0, 769
331 ; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
332 ; CHECK-NEXT:    vmv.s.x v8, a0
333 ; CHECK-NEXT:    ret
334   ret <4 x i8> <i8 1, i8 3, i8 6, i8 7>
337 define <4 x i8> @buildvec_no_vid_v4i8_1() {
338 ; CHECK-LABEL: buildvec_no_vid_v4i8_1:
339 ; CHECK:       # %bb.0:
340 ; CHECK-NEXT:    lui a0, 28752
341 ; CHECK-NEXT:    addi a0, a0, 512
342 ; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
343 ; CHECK-NEXT:    vmv.s.x v8, a0
344 ; CHECK-NEXT:    ret
345   ret <4 x i8> <i8 undef, i8 2, i8 5, i8 7>
348 define <4 x i8> @buildvec_no_vid_v4i8_2() {
349 ; CHECK-LABEL: buildvec_no_vid_v4i8_2:
350 ; CHECK:       # %bb.0:
351 ; CHECK-NEXT:    lui a0, 32768
352 ; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
353 ; CHECK-NEXT:    vmv.s.x v8, a0
354 ; CHECK-NEXT:    ret
355   ret <4 x i8> <i8 0, i8 undef, i8 undef, i8 8>
358 define <4 x i8> @buildvec_no_vid_v4i8_3() {
359 ; CHECK-LABEL: buildvec_no_vid_v4i8_3:
360 ; CHECK:       # %bb.0:
361 ; CHECK-NEXT:    lui a0, 28672
362 ; CHECK-NEXT:    addi a0, a0, 255
363 ; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
364 ; CHECK-NEXT:    vmv.s.x v8, a0
365 ; CHECK-NEXT:    ret
366   ret <4 x i8> <i8 -1, i8 undef, i8 undef, i8 7>
369 define <4 x i8> @buildvec_no_vid_v4i8_4() {
370 ; CHECK-LABEL: buildvec_no_vid_v4i8_4:
371 ; CHECK:       # %bb.0:
372 ; CHECK-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma
373 ; CHECK-NEXT:    vmv.v.i v8, -2
374 ; CHECK-NEXT:    ret
375   ret <4 x i8> <i8 -2, i8 undef, i8 undef, i8 undef>
378 define <4 x i8> @buildvec_no_vid_v4i8_5() {
379 ; CHECK-LABEL: buildvec_no_vid_v4i8_5:
380 ; CHECK:       # %bb.0:
381 ; CHECK-NEXT:    lui a0, 1032144
382 ; CHECK-NEXT:    addi a0, a0, -257
383 ; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
384 ; CHECK-NEXT:    vmv.s.x v8, a0
385 ; CHECK-NEXT:    ret
386   ret <4 x i8> <i8 -1, i8 -2, i8 -4, i8 -5>
389 define void @buildvec_dominant0_v8i16(ptr %x) {
390 ; CHECK-LABEL: buildvec_dominant0_v8i16:
391 ; CHECK:       # %bb.0:
392 ; CHECK-NEXT:    vsetivli zero, 8, e16, m1, ta, ma
393 ; CHECK-NEXT:    vmv.s.x v8, zero
394 ; CHECK-NEXT:    vmv.v.i v9, 8
395 ; CHECK-NEXT:    vsetivli zero, 4, e16, m1, tu, ma
396 ; CHECK-NEXT:    vslideup.vi v9, v8, 3
397 ; CHECK-NEXT:    vsetivli zero, 8, e16, m1, ta, ma
398 ; CHECK-NEXT:    vse16.v v9, (a0)
399 ; CHECK-NEXT:    ret
400   store <8 x i16> <i16 8, i16 8, i16 undef, i16 0, i16 8, i16 undef, i16 8, i16 8>, ptr %x
401   ret void
404 define void @buildvec_dominant1_v8i16(ptr %x) {
405 ; CHECK-LABEL: buildvec_dominant1_v8i16:
406 ; CHECK:       # %bb.0:
407 ; CHECK-NEXT:    vsetivli zero, 8, e16, m1, ta, ma
408 ; CHECK-NEXT:    vmv.v.i v8, 8
409 ; CHECK-NEXT:    vse16.v v8, (a0)
410 ; CHECK-NEXT:    ret
411   store <8 x i16> <i16 undef, i16 8, i16 undef, i16 undef, i16 undef, i16 undef, i16 undef, i16 undef>, ptr %x
412   ret void
415 define <2 x i8> @buildvec_dominant0_v2i8() {
416 ; CHECK-LABEL: buildvec_dominant0_v2i8:
417 ; CHECK:       # %bb.0:
418 ; CHECK-NEXT:    ret
419   ret <2 x i8> <i8 undef, i8 undef>
422 define <2 x i8> @buildvec_dominant1_v2i8() {
423 ; CHECK-LABEL: buildvec_dominant1_v2i8:
424 ; CHECK:       # %bb.0:
425 ; CHECK-NEXT:    vsetivli zero, 2, e8, mf8, ta, ma
426 ; CHECK-NEXT:    vmv.v.i v8, -1
427 ; CHECK-NEXT:    ret
428   ret <2 x i8> <i8 undef, i8 -1>
431 define <2 x i8> @buildvec_dominant2_v2i8() {
432 ; CHECK-LABEL: buildvec_dominant2_v2i8:
433 ; CHECK:       # %bb.0:
434 ; CHECK-NEXT:    vsetivli zero, 2, e8, mf8, ta, ma
435 ; CHECK-NEXT:    vid.v v8
436 ; CHECK-NEXT:    vrsub.vi v8, v8, 0
437 ; CHECK-NEXT:    ret
438   ret <2 x i8> <i8 0, i8 -1>
441 define void @buildvec_dominant0_v2i32(ptr %x) {
442 ; RV32-LABEL: buildvec_dominant0_v2i32:
443 ; RV32:       # %bb.0:
444 ; RV32-NEXT:    lui a1, %hi(.LCPI38_0)
445 ; RV32-NEXT:    addi a1, a1, %lo(.LCPI38_0)
446 ; RV32-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
447 ; RV32-NEXT:    vle32.v v8, (a1)
448 ; RV32-NEXT:    vse32.v v8, (a0)
449 ; RV32-NEXT:    ret
451 ; RV64-LABEL: buildvec_dominant0_v2i32:
452 ; RV64:       # %bb.0:
453 ; RV64-NEXT:    lui a1, %hi(.LCPI38_0)
454 ; RV64-NEXT:    ld a1, %lo(.LCPI38_0)(a1)
455 ; RV64-NEXT:    vsetivli zero, 2, e64, m1, ta, ma
456 ; RV64-NEXT:    vmv.v.i v8, -1
457 ; RV64-NEXT:    vsetvli zero, zero, e64, m1, tu, ma
458 ; RV64-NEXT:    vmv.s.x v8, a1
459 ; RV64-NEXT:    vse64.v v8, (a0)
460 ; RV64-NEXT:    ret
461   store <2 x i64> <i64 2049638230412172402, i64 -1>, ptr %x
462   ret void
465 define void @buildvec_dominant1_optsize_v2i32(ptr %x) optsize {
466 ; RV32-LABEL: buildvec_dominant1_optsize_v2i32:
467 ; RV32:       # %bb.0:
468 ; RV32-NEXT:    lui a1, %hi(.LCPI39_0)
469 ; RV32-NEXT:    addi a1, a1, %lo(.LCPI39_0)
470 ; RV32-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
471 ; RV32-NEXT:    vle32.v v8, (a1)
472 ; RV32-NEXT:    vse32.v v8, (a0)
473 ; RV32-NEXT:    ret
475 ; RV64-LABEL: buildvec_dominant1_optsize_v2i32:
476 ; RV64:       # %bb.0:
477 ; RV64-NEXT:    lui a1, %hi(.LCPI39_0)
478 ; RV64-NEXT:    addi a1, a1, %lo(.LCPI39_0)
479 ; RV64-NEXT:    vsetivli zero, 2, e64, m1, ta, ma
480 ; RV64-NEXT:    vle64.v v8, (a1)
481 ; RV64-NEXT:    vse64.v v8, (a0)
482 ; RV64-NEXT:    ret
483   store <2 x i64> <i64 2049638230412172402, i64 -1>, ptr %x
484   ret void
487 define void @buildvec_seq_v8i8_v4i16(ptr %x) {
488 ; CHECK-LABEL: buildvec_seq_v8i8_v4i16:
489 ; CHECK:       # %bb.0:
490 ; CHECK-NEXT:    li a1, 513
491 ; CHECK-NEXT:    vsetivli zero, 8, e16, m1, ta, ma
492 ; CHECK-NEXT:    vmv.v.x v8, a1
493 ; CHECK-NEXT:    vse8.v v8, (a0)
494 ; CHECK-NEXT:    ret
495   store <8 x i8> <i8 1, i8 2, i8 1, i8 2, i8 1, i8 2, i8 undef, i8 2>, ptr %x
496   ret void
499 define void @buildvec_seq_v8i8_v2i32(ptr %x) {
500 ; CHECK-LABEL: buildvec_seq_v8i8_v2i32:
501 ; CHECK:       # %bb.0:
502 ; CHECK-NEXT:    lui a1, 48
503 ; CHECK-NEXT:    addi a1, a1, 513
504 ; CHECK-NEXT:    vsetivli zero, 2, e32, mf2, ta, ma
505 ; CHECK-NEXT:    vmv.v.x v8, a1
506 ; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma
507 ; CHECK-NEXT:    vse8.v v8, (a0)
508 ; CHECK-NEXT:    ret
509   store <8 x i8> <i8 1, i8 2, i8 3, i8 undef, i8 1, i8 2, i8 3, i8 undef>, ptr %x
510   ret void
513 define void @buildvec_seq_v16i8_v2i64(ptr %x) {
514 ; RV32-LABEL: buildvec_seq_v16i8_v2i64:
515 ; RV32:       # %bb.0:
516 ; RV32-NEXT:    lui a1, %hi(.LCPI42_0)
517 ; RV32-NEXT:    addi a1, a1, %lo(.LCPI42_0)
518 ; RV32-NEXT:    vsetivli zero, 16, e8, m1, ta, ma
519 ; RV32-NEXT:    vle8.v v8, (a1)
520 ; RV32-NEXT:    vse8.v v8, (a0)
521 ; RV32-NEXT:    ret
523 ; RV64-LABEL: buildvec_seq_v16i8_v2i64:
524 ; RV64:       # %bb.0:
525 ; RV64-NEXT:    lui a1, %hi(.LCPI42_0)
526 ; RV64-NEXT:    addi a1, a1, %lo(.LCPI42_0)
527 ; RV64-NEXT:    vsetivli zero, 2, e64, m1, ta, ma
528 ; RV64-NEXT:    vlse64.v v8, (a1), zero
529 ; RV64-NEXT:    vsetivli zero, 16, e8, m1, ta, ma
530 ; RV64-NEXT:    vse8.v v8, (a0)
531 ; RV64-NEXT:    ret
532   store <16 x i8> <i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8>, ptr %x
533   ret void
536 define void @buildvec_seq2_v16i8_v2i64(ptr %x) {
537 ; RV32-LABEL: buildvec_seq2_v16i8_v2i64:
538 ; RV32:       # %bb.0:
539 ; RV32-NEXT:    lui a1, 528432
540 ; RV32-NEXT:    addi a1, a1, 513
541 ; RV32-NEXT:    vsetivli zero, 2, e64, m1, ta, ma
542 ; RV32-NEXT:    vmv.v.x v8, a1
543 ; RV32-NEXT:    vsetivli zero, 16, e8, m1, ta, ma
544 ; RV32-NEXT:    vse8.v v8, (a0)
545 ; RV32-NEXT:    ret
547 ; RV64-LABEL: buildvec_seq2_v16i8_v2i64:
548 ; RV64:       # %bb.0:
549 ; RV64-NEXT:    lui a1, 528432
550 ; RV64-NEXT:    addiw a1, a1, 513
551 ; RV64-NEXT:    vsetivli zero, 2, e64, m1, ta, ma
552 ; RV64-NEXT:    vmv.v.x v8, a1
553 ; RV64-NEXT:    vsetivli zero, 16, e8, m1, ta, ma
554 ; RV64-NEXT:    vse8.v v8, (a0)
555 ; RV64-NEXT:    ret
556   store <16 x i8> <i8 1, i8 2, i8 3, i8 129, i8 -1, i8 -1, i8 -1, i8 -1, i8 1, i8 2, i8 3, i8 129, i8 -1, i8 -1, i8 -1, i8 -1>, ptr %x
557   ret void
560 define void @buildvec_seq_v9i8(ptr %x) {
561 ; CHECK-LABEL: buildvec_seq_v9i8:
562 ; CHECK:       # %bb.0:
563 ; CHECK-NEXT:    li a1, 73
564 ; CHECK-NEXT:    vsetivli zero, 1, e16, mf4, ta, ma
565 ; CHECK-NEXT:    vmv.s.x v0, a1
566 ; CHECK-NEXT:    vsetivli zero, 16, e8, m1, ta, ma
567 ; CHECK-NEXT:    vmv.v.i v8, 3
568 ; CHECK-NEXT:    vmerge.vim v8, v8, 1, v0
569 ; CHECK-NEXT:    li a1, 146
570 ; CHECK-NEXT:    vsetvli zero, zero, e16, m2, ta, ma
571 ; CHECK-NEXT:    vmv.s.x v0, a1
572 ; CHECK-NEXT:    vsetvli zero, zero, e8, m1, ta, ma
573 ; CHECK-NEXT:    vmerge.vim v8, v8, 2, v0
574 ; CHECK-NEXT:    vsetivli zero, 9, e8, m1, ta, ma
575 ; CHECK-NEXT:    vse8.v v8, (a0)
576 ; CHECK-NEXT:    ret
577   store <9 x i8> <i8 1, i8 2, i8 3, i8 1, i8 2, i8 3, i8 1, i8 2, i8 3>, ptr %x
578   ret void
581 define void @buildvec_seq_v4i16_v2i32(ptr %x) {
582 ; CHECK-LABEL: buildvec_seq_v4i16_v2i32:
583 ; CHECK:       # %bb.0:
584 ; CHECK-NEXT:    li a1, -127
585 ; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
586 ; CHECK-NEXT:    vmv.v.x v8, a1
587 ; CHECK-NEXT:    vse16.v v8, (a0)
588 ; CHECK-NEXT:    ret
589   store <4 x i16> <i16 -127, i16 -1, i16 -127, i16 -1>, ptr %x
590   ret void
593 define void @buildvec_vid_step1o2_v4i32(ptr %z0, ptr %z1, ptr %z2, ptr %z3, ptr %z4, ptr %z5, ptr %z6) {
594 ; RV32-LABEL: buildvec_vid_step1o2_v4i32:
595 ; RV32:       # %bb.0:
596 ; RV32-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
597 ; RV32-NEXT:    vid.v v8
598 ; RV32-NEXT:    vsrl.vi v8, v8, 1
599 ; RV32-NEXT:    vse32.v v8, (a0)
600 ; RV32-NEXT:    vse32.v v8, (a1)
601 ; RV32-NEXT:    vmv.v.i v9, 1
602 ; RV32-NEXT:    vse32.v v8, (a2)
603 ; RV32-NEXT:    vse32.v v8, (a3)
604 ; RV32-NEXT:    vse32.v v8, (a4)
605 ; RV32-NEXT:    vmv.s.x v8, zero
606 ; RV32-NEXT:    vsetivli zero, 2, e32, m1, tu, ma
607 ; RV32-NEXT:    vslideup.vi v9, v8, 1
608 ; RV32-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
609 ; RV32-NEXT:    vse32.v v9, (a5)
610 ; RV32-NEXT:    vmv.v.i v8, 0
611 ; RV32-NEXT:    li a0, 1
612 ; RV32-NEXT:    vslide1down.vx v8, v8, a0
613 ; RV32-NEXT:    vse32.v v8, (a6)
614 ; RV32-NEXT:    ret
616 ; RV64-LABEL: buildvec_vid_step1o2_v4i32:
617 ; RV64:       # %bb.0:
618 ; RV64-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
619 ; RV64-NEXT:    vid.v v8
620 ; RV64-NEXT:    vsrl.vi v8, v8, 1
621 ; RV64-NEXT:    vse32.v v8, (a0)
622 ; RV64-NEXT:    vmv.v.i v9, 1
623 ; RV64-NEXT:    vse32.v v8, (a1)
624 ; RV64-NEXT:    vse32.v v8, (a2)
625 ; RV64-NEXT:    vse32.v v8, (a3)
626 ; RV64-NEXT:    vse32.v v8, (a4)
627 ; RV64-NEXT:    vmv.s.x v8, zero
628 ; RV64-NEXT:    vsetivli zero, 2, e32, m1, tu, ma
629 ; RV64-NEXT:    vslideup.vi v9, v8, 1
630 ; RV64-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
631 ; RV64-NEXT:    vse32.v v9, (a5)
632 ; RV64-NEXT:    vmv.v.i v8, 0
633 ; RV64-NEXT:    li a0, 1
634 ; RV64-NEXT:    vslide1down.vx v8, v8, a0
635 ; RV64-NEXT:    vse32.v v8, (a6)
636 ; RV64-NEXT:    ret
637   store <4 x i32> <i32 0, i32 0, i32 1, i32 1>, ptr %z0
638   store <4 x i32> <i32 0, i32 0, i32 1, i32 undef>, ptr %z1
639   store <4 x i32> <i32 0, i32 undef, i32 1, i32 1>, ptr %z2
640   store <4 x i32> <i32 undef, i32 0, i32 undef, i32 1>, ptr %z3
641   store <4 x i32> <i32 0, i32 undef, i32 1, i32 undef>, ptr %z4
642   ; We don't catch this one
643   store <4 x i32> <i32 undef, i32 0, i32 1, i32 1>, ptr %z5
644   ; We catch this one but as VID/3 rather than VID/2
645   store <4 x i32> <i32 0, i32 0, i32 undef, i32 1>, ptr %z6
646   ret void
649 define void @buildvec_vid_step1o2_add3_v4i16(ptr %z0, ptr %z1, ptr %z2, ptr %z3, ptr %z4, ptr %z5, ptr %z6) {
650 ; CHECK-LABEL: buildvec_vid_step1o2_add3_v4i16:
651 ; CHECK:       # %bb.0:
652 ; CHECK-NEXT:    vsetivli zero, 4, e16, mf2, ta, ma
653 ; CHECK-NEXT:    vid.v v8
654 ; CHECK-NEXT:    vsrl.vi v8, v8, 1
655 ; CHECK-NEXT:    vadd.vi v8, v8, 3
656 ; CHECK-NEXT:    vse16.v v8, (a0)
657 ; CHECK-NEXT:    vmv.v.i v9, 3
658 ; CHECK-NEXT:    vse16.v v8, (a1)
659 ; CHECK-NEXT:    vse16.v v8, (a2)
660 ; CHECK-NEXT:    vse16.v v8, (a3)
661 ; CHECK-NEXT:    vse16.v v8, (a4)
662 ; CHECK-NEXT:    vmv.v.i v8, 4
663 ; CHECK-NEXT:    vsetivli zero, 2, e16, mf2, tu, ma
664 ; CHECK-NEXT:    vslideup.vi v8, v9, 1
665 ; CHECK-NEXT:    vsetivli zero, 4, e16, mf2, ta, ma
666 ; CHECK-NEXT:    vse16.v v8, (a5)
667 ; CHECK-NEXT:    li a0, 4
668 ; CHECK-NEXT:    vslide1down.vx v8, v9, a0
669 ; CHECK-NEXT:    vse16.v v8, (a6)
670 ; CHECK-NEXT:    ret
671   store <4 x i16> <i16 3, i16 3, i16 4, i16 4>, ptr %z0
672   store <4 x i16> <i16 3, i16 3, i16 4, i16 undef>, ptr %z1
673   store <4 x i16> <i16 3, i16 undef, i16 4, i16 4>, ptr %z2
674   store <4 x i16> <i16 undef, i16 3, i16 undef, i16 4>, ptr %z3
675   store <4 x i16> <i16 3, i16 undef, i16 4, i16 undef>, ptr %z4
676   ; We don't catch this one
677   store <4 x i16> <i16 undef, i16 3, i16 4, i16 4>, ptr %z5
678   ; We catch this one but as VID/3 rather than VID/2
679   store <4 x i16> <i16 3, i16 3, i16 undef, i16 4>, ptr %z6
680   ret void
683 define void @buildvec_vid_stepn1o4_addn5_v8i8(ptr %z0) {
684 ; CHECK-LABEL: buildvec_vid_stepn1o4_addn5_v8i8:
685 ; CHECK:       # %bb.0:
686 ; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma
687 ; CHECK-NEXT:    vid.v v8
688 ; CHECK-NEXT:    vsrl.vi v8, v8, 2
689 ; CHECK-NEXT:    vrsub.vi v8, v8, -5
690 ; CHECK-NEXT:    vse8.v v8, (a0)
691 ; CHECK-NEXT:    ret
692   store <8 x i8> <i8 -5, i8 -5, i8 -5, i8 -5, i8 -6, i8 -6, i8 -6, i8 -6>, ptr %z0
693   ret void
696 define void @buildvec_vid_mpy_imm_v8i16(ptr %x) {
697 ; CHECK-LABEL: buildvec_vid_mpy_imm_v8i16:
698 ; CHECK:       # %bb.0:
699 ; CHECK-NEXT:    vsetivli zero, 8, e16, m1, ta, ma
700 ; CHECK-NEXT:    vid.v v8
701 ; CHECK-NEXT:    li a1, 17
702 ; CHECK-NEXT:    vmul.vx v8, v8, a1
703 ; CHECK-NEXT:    vse16.v v8, (a0)
704 ; CHECK-NEXT:    ret
705   store <8 x i16> <i16 0, i16 17, i16 34, i16 51, i16 68, i16 85, i16 102, i16 119>, ptr %x
706   ret void
709 define void @buildvec_vid_shl_imm_v8i16(ptr %x) {
710 ; CHECK-LABEL: buildvec_vid_shl_imm_v8i16:
711 ; CHECK:       # %bb.0:
712 ; CHECK-NEXT:    vsetivli zero, 8, e16, m1, ta, ma
713 ; CHECK-NEXT:    vid.v v8
714 ; CHECK-NEXT:    vsll.vi v8, v8, 9
715 ; CHECK-NEXT:    vse16.v v8, (a0)
716 ; CHECK-NEXT:    ret
717   store <8 x i16> <i16 0, i16 512, i16 1024, i16 1536, i16 2048, i16 2560, i16 3072, i16 3584>, ptr %x
718   ret void
721 define <4 x i32> @splat_c3_v4i32(<4 x i32> %v) {
722 ; CHECK-LABEL: splat_c3_v4i32:
723 ; CHECK:       # %bb.0:
724 ; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
725 ; CHECK-NEXT:    vrgather.vi v9, v8, 3
726 ; CHECK-NEXT:    vmv.v.v v8, v9
727 ; CHECK-NEXT:    ret
728   %x = extractelement <4 x i32> %v, i32 3
729   %ins = insertelement <4 x i32> poison, i32 %x, i32 0
730   %splat = shufflevector <4 x i32> %ins, <4 x i32> poison, <4 x i32> zeroinitializer
731   ret <4 x i32> %splat
734 define <4 x i32> @splat_idx_v4i32(<4 x i32> %v, i64 %idx) {
735 ; CHECK-LABEL: splat_idx_v4i32:
736 ; CHECK:       # %bb.0:
737 ; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
738 ; CHECK-NEXT:    vrgather.vx v9, v8, a0
739 ; CHECK-NEXT:    vmv.v.v v8, v9
740 ; CHECK-NEXT:    ret
741   %x = extractelement <4 x i32> %v, i64 %idx
742   %ins = insertelement <4 x i32> poison, i32 %x, i32 0
743   %splat = shufflevector <4 x i32> %ins, <4 x i32> poison, <4 x i32> zeroinitializer
744   ret <4 x i32> %splat
747 define <8 x i16> @splat_c4_v8i16(<8 x i16> %v) {
748 ; CHECK-LABEL: splat_c4_v8i16:
749 ; CHECK:       # %bb.0:
750 ; CHECK-NEXT:    vsetivli zero, 8, e16, m1, ta, ma
751 ; CHECK-NEXT:    vrgather.vi v9, v8, 4
752 ; CHECK-NEXT:    vmv.v.v v8, v9
753 ; CHECK-NEXT:    ret
754   %x = extractelement <8 x i16> %v, i32 4
755   %ins = insertelement <8 x i16> poison, i16 %x, i32 0
756   %splat = shufflevector <8 x i16> %ins, <8 x i16> poison, <8 x i32> zeroinitializer
757   ret <8 x i16> %splat
760 define <8 x i16> @splat_idx_v8i16(<8 x i16> %v, i64 %idx) {
761 ; CHECK-LABEL: splat_idx_v8i16:
762 ; CHECK:       # %bb.0:
763 ; CHECK-NEXT:    vsetivli zero, 8, e16, m1, ta, ma
764 ; CHECK-NEXT:    vrgather.vx v9, v8, a0
765 ; CHECK-NEXT:    vmv.v.v v8, v9
766 ; CHECK-NEXT:    ret
767   %x = extractelement <8 x i16> %v, i64 %idx
768   %ins = insertelement <8 x i16> poison, i16 %x, i32 0
769   %splat = shufflevector <8 x i16> %ins, <8 x i16> poison, <8 x i32> zeroinitializer
770   ret <8 x i16> %splat
773 define <4 x i8> @buildvec_not_vid_v4i8_1() {
774 ; CHECK-LABEL: buildvec_not_vid_v4i8_1:
775 ; CHECK:       # %bb.0:
776 ; CHECK-NEXT:    lui a0, 12320
777 ; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
778 ; CHECK-NEXT:    vmv.s.x v8, a0
779 ; CHECK-NEXT:    ret
780   ret <4 x i8> <i8 0, i8 0, i8 2, i8 3>
783 define <4 x i8> @buildvec_not_vid_v4i8_2() {
784 ; CHECK-LABEL: buildvec_not_vid_v4i8_2:
785 ; CHECK:       # %bb.0:
786 ; CHECK-NEXT:    lui a0, 16
787 ; CHECK-NEXT:    addi a0, a0, 771
788 ; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
789 ; CHECK-NEXT:    vmv.s.x v8, a0
790 ; CHECK-NEXT:    ret
791   ret <4 x i8> <i8 3, i8 3, i8 1, i8 0>
794 ; We match this as a VID sequence (-3 / 8) + 5 but choose not to introduce
795 ; division to compute it.
796 define <16 x i8> @buildvec_not_vid_v16i8() {
797 ; CHECK-LABEL: buildvec_not_vid_v16i8:
798 ; CHECK:       # %bb.0:
799 ; CHECK-NEXT:    vsetivli zero, 16, e8, m1, ta, ma
800 ; CHECK-NEXT:    vmv.v.i v9, 3
801 ; CHECK-NEXT:    vmv.v.i v8, 0
802 ; CHECK-NEXT:    vsetivli zero, 7, e8, m1, tu, ma
803 ; CHECK-NEXT:    vslideup.vi v8, v9, 6
804 ; CHECK-NEXT:    ret
805   ret <16 x i8> <i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 3, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 0, i8 0>