@@ -342,3 +342,71 @@ define <16 x i32> @concat_sext_zext_v8i16_v16i32(<8 x i16> %a0, <8 x i16> %a1) {
342
342
%r = shufflevector <8 x i32 > %x0 , <8 x i32 > %x1 , <16 x i32 > <i32 0 , i32 1 , i32 2 , i32 3 , i32 4 , i32 5 , i32 6 , i32 7 , i32 8 , i32 9 , i32 10 , i32 11 , i32 12 , i32 13 , i32 14 , i32 15 >
343
343
ret <16 x i32 > %r
344
344
}
345
+
346
+ ; Unary shuffles
347
+
348
+ define <4 x i16 > @unary_shuffle_zext_v8i8_v4i16 (<8 x i8 > %a0 ) {
349
+ ; CHECK-LABEL: define <4 x i16> @unary_shuffle_zext_v8i8_v4i16(
350
+ ; CHECK-SAME: <8 x i8> [[A0:%.*]]) #[[ATTR0]] {
351
+ ; CHECK-NEXT: [[VEC_SHUFFLE:%.*]] = shufflevector <8 x i8> [[A0]], <8 x i8> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
352
+ ; CHECK-NEXT: [[X1:%.*]] = zext <4 x i8> [[VEC_SHUFFLE]] to <4 x i16>
353
+ ; CHECK-NEXT: ret <4 x i16> [[X1]]
354
+ ;
355
+ %x1 = zext <8 x i8 > %a0 to <8 x i16 >
356
+ %vec.shuffle = shufflevector <8 x i16 > %x1 , <8 x i16 > poison, <4 x i32 > <i32 0 , i32 1 , i32 2 , i32 3 >
357
+ ret <4 x i16 > %vec.shuffle
358
+ }
359
+
360
+ define <4 x i16 > @unary_shuffle_sext_v8i8_v4i16 (<8 x i8 > %a0 ) {
361
+ ; CHECK-LABEL: define <4 x i16> @unary_shuffle_sext_v8i8_v4i16(
362
+ ; CHECK-SAME: <8 x i8> [[A0:%.*]]) #[[ATTR0]] {
363
+ ; CHECK-NEXT: [[VEC_SHUFFLE:%.*]] = shufflevector <8 x i8> [[A0]], <8 x i8> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
364
+ ; CHECK-NEXT: [[X1:%.*]] = sext <4 x i8> [[VEC_SHUFFLE]] to <4 x i16>
365
+ ; CHECK-NEXT: ret <4 x i16> [[X1]]
366
+ ;
367
+ %x1 = sext <8 x i8 > %a0 to <8 x i16 >
368
+ %vec.shuffle = shufflevector <8 x i16 > %x1 , <8 x i16 > poison, <4 x i32 > <i32 0 , i32 1 , i32 2 , i32 3 >
369
+ ret <4 x i16 > %vec.shuffle
370
+ }
371
+
372
+ define <4 x i16 > @unary_shuffle_sext_v8i8_v4i16_undef (<8 x i8 > %a0 ) {
373
+ ; CHECK-LABEL: define <4 x i16> @unary_shuffle_sext_v8i8_v4i16_undef(
374
+ ; CHECK-SAME: <8 x i8> [[A0:%.*]]) #[[ATTR0]] {
375
+ ; CHECK-NEXT: [[VEC_SHUFFLE:%.*]] = shufflevector <8 x i8> [[A0]], <8 x i8> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
376
+ ; CHECK-NEXT: [[X1:%.*]] = sext <4 x i8> [[VEC_SHUFFLE]] to <4 x i16>
377
+ ; CHECK-NEXT: ret <4 x i16> [[X1]]
378
+ ;
379
+ %x1 = sext <8 x i8 > %a0 to <8 x i16 >
380
+ %vec.shuffle = shufflevector <8 x i16 > %x1 , <8 x i16 > undef , <4 x i32 > <i32 0 , i32 1 , i32 2 , i32 3 >
381
+ ret <4 x i16 > %vec.shuffle
382
+ }
383
+
384
+ ; negative - avoid loop with foldBitcastOfShuffle
385
+
386
+ define <2 x i32 > @unary_shuffle_bitcast_v8i8_v2i32 (<8 x i8 > %a0 ) {
387
+ ; CHECK-LABEL: define <2 x i32> @unary_shuffle_bitcast_v8i8_v2i32(
388
+ ; CHECK-SAME: <8 x i8> [[A0:%.*]]) #[[ATTR0]] {
389
+ ; CHECK-NEXT: [[X1:%.*]] = bitcast <8 x i8> [[A0]] to <2 x i32>
390
+ ; CHECK-NEXT: [[VEC_SHUFFLE:%.*]] = shufflevector <2 x i32> [[X1]], <2 x i32> poison, <2 x i32> <i32 0, i32 1>
391
+ ; CHECK-NEXT: ret <2 x i32> [[VEC_SHUFFLE]]
392
+ ;
393
+ %x1 = bitcast <8 x i8 > %a0 to <2 x i32 >
394
+ %vec.shuffle = shufflevector <2 x i32 > %x1 , <2 x i32 > poison, <2 x i32 > <i32 0 , i32 1 >
395
+ ret <2 x i32 > %vec.shuffle
396
+ }
397
+
398
+ ; negative - multiuse
399
+
400
+ define <4 x i16 > @unary_shuffle_sext_v8i8_v4i16_multiuse (<8 x i8 > %a0 , ptr %a1 ) {
401
+ ; CHECK-LABEL: define <4 x i16> @unary_shuffle_sext_v8i8_v4i16_multiuse(
402
+ ; CHECK-SAME: <8 x i8> [[A0:%.*]], ptr [[A1:%.*]]) #[[ATTR0]] {
403
+ ; CHECK-NEXT: [[X1:%.*]] = sext <8 x i8> [[A0]] to <8 x i16>
404
+ ; CHECK-NEXT: [[VEC_SHUFFLE:%.*]] = shufflevector <8 x i16> [[X1]], <8 x i16> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
405
+ ; CHECK-NEXT: store <8 x i16> [[X1]], ptr [[A1]], align 16
406
+ ; CHECK-NEXT: ret <4 x i16> [[VEC_SHUFFLE]]
407
+ ;
408
+ %x1 = sext <8 x i8 > %a0 to <8 x i16 >
409
+ %vec.shuffle = shufflevector <8 x i16 > %x1 , <8 x i16 > poison, <4 x i32 > <i32 0 , i32 1 , i32 2 , i32 3 >
410
+ store <8 x i16 > %x1 , ptr %a1 , align 16
411
+ ret <4 x i16 > %vec.shuffle
412
+ }
0 commit comments