@@ -271,3 +271,66 @@ define <8 x i16> @concat_v8s16_v2s16_reg(<2 x i16> %A, <2 x i16> %B, <2 x i16> %
271
271
%d = shufflevector <8 x i16 > %b , <8 x i16 > %c , <8 x i32 > <i32 0 , i32 1 , i32 2 , i32 3 , i32 8 , i32 9 , i32 10 , i32 11 >
272
272
ret <8 x i16 > %d
273
273
}
274
+
275
+ define <4 x i16 > @concat_undef_first_use_first (ptr %p1 , ptr %p2 ) {
276
+ ; CHECK-SD-LABEL: concat_undef_first_use_first:
277
+ ; CHECK-SD: // %bb.0:
278
+ ; CHECK-SD-NEXT: ld1r { v0.2s }, [x0]
279
+ ; CHECK-SD-NEXT: ret
280
+ ;
281
+ ; CHECK-GI-LABEL: concat_undef_first_use_first:
282
+ ; CHECK-GI: // %bb.0:
283
+ ; CHECK-GI-NEXT: ldrh w8, [x0]
284
+ ; CHECK-GI-NEXT: ldrh w9, [x0, #2]
285
+ ; CHECK-GI-NEXT: fmov s1, w8
286
+ ; CHECK-GI-NEXT: mov v1.h[1], w9
287
+ ; CHECK-GI-NEXT: mov v0.s[1], v1.s[0]
288
+ ; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0
289
+ ; CHECK-GI-NEXT: ret
290
+ %l1 = load <2 x i16 >, ptr %p1
291
+ %l2 = load <2 x i16 >, ptr %p2
292
+ %ext1 = shufflevector <2 x i16 > %l1 , <2 x i16 > poison, <8 x i32 > <i32 0 , i32 1 , i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
293
+ %ext2 = shufflevector <2 x i16 > %l1 , <2 x i16 > poison, <8 x i32 > <i32 0 , i32 1 , i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
294
+ %t = shufflevector <8 x i16 > %ext1 , <8 x i16 > %ext2 , <4 x i32 > <i32 poison, i32 poison, i32 0 , i32 1 >
295
+ ret <4 x i16 > %t
296
+ }
297
+
298
+ define <4 x i16 > @concat_undef_first_use_second (ptr %p1 , ptr %p2 ) {
299
+ ; CHECK-SD-LABEL: concat_undef_first_use_second:
300
+ ; CHECK-SD: // %bb.0:
301
+ ; CHECK-SD-NEXT: ld1r { v0.2s }, [x0]
302
+ ; CHECK-SD-NEXT: ret
303
+ ;
304
+ ; CHECK-GI-LABEL: concat_undef_first_use_second:
305
+ ; CHECK-GI: // %bb.0:
306
+ ; CHECK-GI-NEXT: ldrh w8, [x0]
307
+ ; CHECK-GI-NEXT: ldrh w9, [x0, #2]
308
+ ; CHECK-GI-NEXT: fmov s1, w8
309
+ ; CHECK-GI-NEXT: mov v1.h[1], w9
310
+ ; CHECK-GI-NEXT: mov v0.s[1], v1.s[0]
311
+ ; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0
312
+ ; CHECK-GI-NEXT: ret
313
+ %l1 = load <2 x i16 >, ptr %p1
314
+ %l2 = load <2 x i16 >, ptr %p2
315
+ %ext1 = shufflevector <2 x i16 > %l1 , <2 x i16 > poison, <8 x i32 > <i32 0 , i32 1 , i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
316
+ %ext2 = shufflevector <2 x i16 > %l1 , <2 x i16 > poison, <8 x i32 > <i32 0 , i32 1 , i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
317
+ %t = shufflevector <8 x i16 > %ext1 , <8 x i16 > %ext2 , <4 x i32 > <i32 poison, i32 poison, i32 8 , i32 9 >
318
+ ret <4 x i16 > %t
319
+ }
320
+
321
+ define <4 x i16 > @concat_undef_first_use_undef (ptr %p1 , ptr %p2 ) {
322
+ ; CHECK-SD-LABEL: concat_undef_first_use_undef:
323
+ ; CHECK-SD: // %bb.0:
324
+ ; CHECK-SD-NEXT: ldr s0, [x0]
325
+ ; CHECK-SD-NEXT: ret
326
+ ;
327
+ ; CHECK-GI-LABEL: concat_undef_first_use_undef:
328
+ ; CHECK-GI: // %bb.0:
329
+ ; CHECK-GI-NEXT: ret
330
+ %l1 = load <2 x i16 >, ptr %p1
331
+ %l2 = load <2 x i16 >, ptr %p2
332
+ %ext1 = shufflevector <2 x i16 > %l1 , <2 x i16 > poison, <8 x i32 > <i32 0 , i32 1 , i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
333
+ %ext2 = shufflevector <2 x i16 > %l1 , <2 x i16 > poison, <8 x i32 > <i32 0 , i32 1 , i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
334
+ %t = shufflevector <8 x i16 > %ext1 , <8 x i16 > %ext2 , <4 x i32 > <i32 poison, i32 poison, i32 2 , i32 3 >
335
+ ret <4 x i16 > %t
336
+ }
0 commit comments