@@ -13,8 +13,21 @@ define <8 x i8> @trivial(<8 x i8> %a) {
13
13
ret <8 x i8 > %r
14
14
}
15
15
16
- define <8 x i8 > @add (<8 x i8 > %a , <8 x i8 > %b ) {
17
- ; CHECK-LABEL: @add(
16
+ define <4 x i32 > @add_same_operands (<4 x i32 > %x ) {
17
+ ; CHECK-LABEL: @add_same_operands(
18
+ ; CHECK-NEXT: [[SHUF:%.*]] = shufflevector <4 x i32> [[X:%.*]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
19
+ ; CHECK-NEXT: [[ADD:%.*]] = add <4 x i32> [[SHUF]], [[SHUF]]
20
+ ; CHECK-NEXT: [[REVSHUF:%.*]] = shufflevector <4 x i32> [[ADD]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
21
+ ; CHECK-NEXT: ret <4 x i32> [[REVSHUF]]
22
+ ;
23
+ %shuf = shufflevector <4 x i32 > %x , <4 x i32 > poison, <4 x i32 > <i32 3 , i32 2 , i32 1 , i32 0 >
24
+ %add = add <4 x i32 > %shuf , %shuf
25
+ %revshuf = shufflevector <4 x i32 > %add , <4 x i32 > poison, <4 x i32 > <i32 3 , i32 2 , i32 1 , i32 0 >
26
+ ret <4 x i32 > %revshuf
27
+ }
28
+
29
+ define <8 x i8 > @add_different_operands (<8 x i8 > %a , <8 x i8 > %b ) {
30
+ ; CHECK-LABEL: @add_different_operands(
18
31
; CHECK-NEXT: [[R:%.*]] = add <8 x i8> [[A:%.*]], [[B:%.*]]
19
32
; CHECK-NEXT: ret <8 x i8> [[R]]
20
33
;
@@ -356,8 +369,23 @@ define <8 x i8> @inner_shuffle(<8 x i8> %a, <8 x i8> %b, <8 x i8> %c) {
356
369
ret <8 x i8 > %r
357
370
}
358
371
359
- define <8 x i8 > @extrause_add (<8 x i8 > %a , <8 x i8 > %b ) {
360
- ; CHECK-LABEL: @extrause_add(
372
+ define <4 x i32 > @extrause_add_same_operands (<4 x i32 > %x ) {
373
+ ; CHECK-LABEL: @extrause_add_same_operands(
374
+ ; CHECK-NEXT: [[SHUF:%.*]] = shufflevector <4 x i32> [[X:%.*]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
375
+ ; CHECK-NEXT: [[ADD:%.*]] = add <4 x i32> [[SHUF]], [[SHUF]]
376
+ ; CHECK-NEXT: [[REVSHUF:%.*]] = shufflevector <4 x i32> [[ADD]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
377
+ ; CHECK-NEXT: [[ADD2:%.*]] = add <4 x i32> [[SHUF]], [[REVSHUF]]
378
+ ; CHECK-NEXT: ret <4 x i32> [[ADD2]]
379
+ ;
380
+ %shuf = shufflevector <4 x i32 > %x , <4 x i32 > poison, <4 x i32 > <i32 3 , i32 2 , i32 1 , i32 0 >
381
+ %add = add <4 x i32 > %shuf , %shuf
382
+ %revshuf = shufflevector <4 x i32 > %add , <4 x i32 > poison, <4 x i32 > <i32 3 , i32 2 , i32 1 , i32 0 >
383
+ %add2 = add <4 x i32 > %shuf , %revshuf
384
+ ret <4 x i32 > %add2
385
+ }
386
+
387
+ define <8 x i8 > @extrause_add_different_operands (<8 x i8 > %a , <8 x i8 > %b ) {
388
+ ; CHECK-LABEL: @extrause_add_different_operands(
361
389
; CHECK-NEXT: [[AB:%.*]] = shufflevector <8 x i8> [[A:%.*]], <8 x i8> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
362
390
; CHECK-NEXT: [[AT:%.*]] = shufflevector <8 x i8> [[A]], <8 x i8> poison, <4 x i32> <i32 7, i32 6, i32 5, i32 4>
363
391
; CHECK-NEXT: [[BB:%.*]] = shufflevector <8 x i8> [[B:%.*]], <8 x i8> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
@@ -513,6 +541,63 @@ define <8 x half> @fma(<8 x half> %a, <8 x half> %b, <8 x half> %c) {
513
541
ret <8 x half > %r
514
542
}
515
543
544
+ define <4 x i64 > @single_zext (<4 x i32 > %x ) {
545
+ ; CHECK-LABEL: @single_zext(
546
+ ; CHECK-NEXT: [[SHUF:%.*]] = shufflevector <4 x i32> [[X:%.*]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
547
+ ; CHECK-NEXT: [[ZEXT:%.*]] = zext <4 x i32> [[SHUF]] to <4 x i64>
548
+ ; CHECK-NEXT: [[REVSHUF:%.*]] = shufflevector <4 x i64> [[ZEXT]], <4 x i64> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
549
+ ; CHECK-NEXT: ret <4 x i64> [[REVSHUF]]
550
+ ;
551
+ %shuf = shufflevector <4 x i32 > %x , <4 x i32 > poison, <4 x i32 > <i32 3 , i32 2 , i32 1 , i32 0 >
552
+ %zext = zext <4 x i32 > %shuf to <4 x i64 >
553
+ %revshuf = shufflevector <4 x i64 > %zext , <4 x i64 > poison, <4 x i32 > <i32 3 , i32 2 , i32 1 , i32 0 >
554
+ ret <4 x i64 > %revshuf
555
+ }
556
+
557
+ define <4 x i64 > @not_zext (<4 x i32 > %x ) {
558
+ ; CHECK-LABEL: @not_zext(
559
+ ; CHECK-NEXT: [[ZEXT:%.*]] = zext <4 x i32> [[X:%.*]] to <4 x i64>
560
+ ; CHECK-NEXT: [[REVSHUF:%.*]] = shufflevector <4 x i64> [[ZEXT]], <4 x i64> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
561
+ ; CHECK-NEXT: ret <4 x i64> [[REVSHUF]]
562
+ ;
563
+ %zext = zext <4 x i32 > %x to <4 x i64 >
564
+ %revshuf = shufflevector <4 x i64 > %zext , <4 x i64 > poison, <4 x i32 > <i32 3 , i32 2 , i32 1 , i32 0 >
565
+ ret <4 x i64 > %revshuf
566
+ }
567
+
568
+ define <4 x i64 > @not_zext2 (<4 x i32 > %x ) {
569
+ ; CHECK-LABEL: @not_zext2(
570
+ ; CHECK-NEXT: [[SHUF:%.*]] = shufflevector <4 x i32> [[X:%.*]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
571
+ ; CHECK-NEXT: [[ZEXT:%.*]] = zext <4 x i32> [[SHUF]] to <4 x i64>
572
+ ; CHECK-NEXT: ret <4 x i64> [[ZEXT]]
573
+ ;
574
+ %shuf = shufflevector <4 x i32 > %x , <4 x i32 > poison, <4 x i32 > <i32 3 , i32 2 , i32 1 , i32 0 >
575
+ %zext = zext <4 x i32 > %shuf to <4 x i64 >
576
+ ret <4 x i64 > %zext
577
+ }
578
+
579
+ define i32 @not_bitcast (<4 x i8 > %x ) {
580
+ ; CHECK-LABEL: @not_bitcast(
581
+ ; CHECK-NEXT: [[SHUF:%.*]] = shufflevector <4 x i8> [[X:%.*]], <4 x i8> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
582
+ ; CHECK-NEXT: [[BITCAST:%.*]] = bitcast <4 x i8> [[SHUF]] to i32
583
+ ; CHECK-NEXT: ret i32 [[BITCAST]]
584
+ ;
585
+ %shuf = shufflevector <4 x i8 > %x , <4 x i8 > poison, <4 x i32 > <i32 3 , i32 2 , i32 1 , i32 0 >
586
+ %bitcast = bitcast <4 x i8 > %shuf to i32
587
+ ret i32 %bitcast
588
+ }
589
+
590
+ define <8 x i16 > @not_bitcast2 (<4 x i32 > %x , <8 x i16 > %y ) {
591
+ ; CHECK-LABEL: @not_bitcast2(
592
+ ; CHECK-NEXT: [[CAST:%.*]] = bitcast <4 x i32> [[X:%.*]] to <8 x i16>
593
+ ; CHECK-NEXT: [[OUT:%.*]] = shufflevector <8 x i16> [[Y:%.*]], <8 x i16> [[CAST]], <8 x i32> <i32 8, i32 1, i32 10, i32 3, i32 12, i32 5, i32 14, i32 7>
594
+ ; CHECK-NEXT: ret <8 x i16> [[OUT]]
595
+ ;
596
+ %cast = bitcast <4 x i32 > %x to <8 x i16 >
597
+ %out = shufflevector <8 x i16 > %y , <8 x i16 > %cast , <8 x i32 > <i32 8 , i32 1 , i32 10 , i32 3 , i32 12 , i32 5 , i32 14 , i32 7 >
598
+ ret <8 x i16 > %out
599
+ }
600
+
516
601
define void @exttrunc (<8 x i32 > %a , <8 x i32 > %b , ptr %p ) {
517
602
; CHECK-LABEL: @exttrunc(
518
603
; CHECK-NEXT: [[AB:%.*]] = shufflevector <8 x i32> [[A:%.*]], <8 x i32> poison, <4 x i32> <i32 0, i32 2, i32 4, i32 6>
@@ -667,6 +752,51 @@ define void @trunc(<8 x i64> %a, <8 x i64> %b, ptr %p) {
667
752
ret void
668
753
}
669
754
755
+ define <4 x i64 > @zext_chain (<4 x i16 > %x ) {
756
+ ; CHECK-LABEL: @zext_chain(
757
+ ; CHECK-NEXT: [[SHUF:%.*]] = shufflevector <4 x i16> [[X:%.*]], <4 x i16> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
758
+ ; CHECK-NEXT: [[ZEXT:%.*]] = zext <4 x i16> [[SHUF]] to <4 x i32>
759
+ ; CHECK-NEXT: [[SEXT:%.*]] = sext <4 x i32> [[ZEXT]] to <4 x i64>
760
+ ; CHECK-NEXT: [[REVSHUF:%.*]] = shufflevector <4 x i64> [[SEXT]], <4 x i64> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
761
+ ; CHECK-NEXT: ret <4 x i64> [[REVSHUF]]
762
+ ;
763
+ %shuf = shufflevector <4 x i16 > %x , <4 x i16 > poison, <4 x i32 > <i32 3 , i32 2 , i32 1 , i32 0 >
764
+ %zext = zext <4 x i16 > %shuf to <4 x i32 >
765
+ %sext = sext <4 x i32 > %zext to <4 x i64 >
766
+ %revshuf = shufflevector <4 x i64 > %sext , <4 x i64 > poison, <4 x i32 > <i32 3 , i32 2 , i32 1 , i32 0 >
767
+ ret <4 x i64 > %revshuf
768
+ }
769
+
770
+ define <4 x i32 > @add_chain (<4 x i32 > %x ) {
771
+ ; CHECK-LABEL: @add_chain(
772
+ ; CHECK-NEXT: [[SHUF:%.*]] = shufflevector <4 x i32> [[X:%.*]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
773
+ ; CHECK-NEXT: [[ADD:%.*]] = add <4 x i32> [[SHUF]], [[SHUF]]
774
+ ; CHECK-NEXT: [[ADD2:%.*]] = add <4 x i32> [[ADD]], [[ADD]]
775
+ ; CHECK-NEXT: [[REVSHUF:%.*]] = shufflevector <4 x i32> [[ADD2]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
776
+ ; CHECK-NEXT: ret <4 x i32> [[REVSHUF]]
777
+ ;
778
+ %shuf = shufflevector <4 x i32 > %x , <4 x i32 > poison, <4 x i32 > <i32 3 , i32 2 , i32 1 , i32 0 >
779
+ %add = add <4 x i32 > %shuf , %shuf
780
+ %add2 = add <4 x i32 > %add , %add
781
+ %revshuf = shufflevector <4 x i32 > %add2 , <4 x i32 > poison, <4 x i32 > <i32 3 , i32 2 , i32 1 , i32 0 >
782
+ ret <4 x i32 > %revshuf
783
+ }
784
+
785
+ define <4 x i64 > @zext_add_chain (<4 x i32 > %x ) {
786
+ ; CHECK-LABEL: @zext_add_chain(
787
+ ; CHECK-NEXT: [[SHUF:%.*]] = shufflevector <4 x i32> [[X:%.*]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
788
+ ; CHECK-NEXT: [[ZEXT:%.*]] = zext <4 x i32> [[SHUF]] to <4 x i64>
789
+ ; CHECK-NEXT: [[ADD:%.*]] = add <4 x i64> [[ZEXT]], [[ZEXT]]
790
+ ; CHECK-NEXT: [[REVSHUF:%.*]] = shufflevector <4 x i64> [[ADD]], <4 x i64> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
791
+ ; CHECK-NEXT: ret <4 x i64> [[REVSHUF]]
792
+ ;
793
+ %shuf = shufflevector <4 x i32 > %x , <4 x i32 > poison, <4 x i32 > <i32 3 , i32 2 , i32 1 , i32 0 >
794
+ %zext = zext <4 x i32 > %shuf to <4 x i64 >
795
+ %add = add <4 x i64 > %zext , %zext
796
+ %revshuf = shufflevector <4 x i64 > %add , <4 x i64 > poison, <4 x i32 > <i32 3 , i32 2 , i32 1 , i32 0 >
797
+ ret <4 x i64 > %revshuf
798
+ }
799
+
670
800
define <8 x i8 > @intrinsics_minmax (<8 x i8 > %a , <8 x i8 > %b ) {
671
801
; CHECK-LABEL: @intrinsics_minmax(
672
802
; CHECK-NEXT: [[TMP1:%.*]] = call <8 x i8> @llvm.smin.v8i8(<8 x i8> [[A:%.*]], <8 x i8> [[B:%.*]])
@@ -847,5 +977,33 @@ define <4 x i8> @singleop(<4 x i8> %a, <4 x i8> %b) {
847
977
ret <4 x i8 > %r
848
978
}
849
979
980
+ define <4 x i64 > @cast_mismatched_types (<4 x i32 > %x ) {
981
+ ; CHECK-LABEL: @cast_mismatched_types(
982
+ ; CHECK-NEXT: [[SHUF:%.*]] = shufflevector <4 x i32> [[X:%.*]], <4 x i32> poison, <2 x i32> <i32 0, i32 2>
983
+ ; CHECK-NEXT: [[ZEXT:%.*]] = zext <2 x i32> [[SHUF]] to <2 x i64>
984
+ ; CHECK-NEXT: [[EXTSHUF:%.*]] = shufflevector <2 x i64> [[ZEXT]], <2 x i64> poison, <4 x i32> <i32 0, i32 2, i32 1, i32 3>
985
+ ; CHECK-NEXT: ret <4 x i64> [[EXTSHUF]]
986
+ ;
987
+ %shuf = shufflevector <4 x i32 > %x , <4 x i32 > poison, <2 x i32 > <i32 0 , i32 2 >
988
+ %zext = zext <2 x i32 > %shuf to <2 x i64 >
989
+ %extshuf = shufflevector <2 x i64 > %zext , <2 x i64 > poison, <4 x i32 > <i32 0 , i32 2 , i32 1 , i32 3 >
990
+ ret <4 x i64 > %extshuf
991
+ }
992
+
993
+ define <4 x float > @fadd_mismatched_types (<4 x float > %x , <4 x float > %y ) {
994
+ ; CHECK-LABEL: @fadd_mismatched_types(
995
+ ; CHECK-NEXT: [[SHUF_X:%.*]] = shufflevector <4 x float> [[X:%.*]], <4 x float> poison, <2 x i32> <i32 0, i32 2>
996
+ ; CHECK-NEXT: [[SHUF_Y:%.*]] = shufflevector <4 x float> [[Y:%.*]], <4 x float> poison, <2 x i32> <i32 1, i32 3>
997
+ ; CHECK-NEXT: [[FADD:%.*]] = fadd fast <2 x float> [[SHUF_X]], [[SHUF_Y]]
998
+ ; CHECK-NEXT: [[EXTSHUF:%.*]] = shufflevector <2 x float> [[FADD]], <2 x float> poison, <4 x i32> <i32 0, i32 2, i32 1, i32 3>
999
+ ; CHECK-NEXT: ret <4 x float> [[EXTSHUF]]
1000
+ ;
1001
+ %shuf.x = shufflevector <4 x float > %x , <4 x float > poison, <2 x i32 > <i32 0 , i32 2 >
1002
+ %shuf.y = shufflevector <4 x float > %y , <4 x float > poison, <2 x i32 > <i32 1 , i32 3 >
1003
+ %fadd = fadd fast <2 x float > %shuf.x , %shuf.y
1004
+ %extshuf = shufflevector <2 x float > %fadd , <2 x float > poison, <4 x i32 > <i32 0 , i32 2 , i32 1 , i32 3 >
1005
+ ret <4 x float > %extshuf
1006
+ }
1007
+
850
1008
851
1009
declare void @use (<4 x i8 >)
0 commit comments