@@ -543,3 +543,146 @@ define <8 x double> @uitofp_load_fadd(ptr %p) {
543
543
ret <8 x double > %c
544
544
}
545
545
546
+ define <4 x i32 > @isUndefDeInterleave_b0 (<8 x i16 > %a , <8 x i16 > %b ) {
547
+ ; CHECK-LABEL: isUndefDeInterleave_b0:
548
+ ; CHECK: // %bb.0:
549
+ ; CHECK-NEXT: movi v1.2d, #0x00ffff0000ffff
550
+ ; CHECK-NEXT: uzp1 v0.4s, v0.4s, v0.4s
551
+ ; CHECK-NEXT: and v0.16b, v0.16b, v1.16b
552
+ ; CHECK-NEXT: ret
553
+ %2 = shufflevector <8 x i16 > %a , <8 x i16 > poison, <8 x i32 > <i32 poison, i32 poison, i32 0 , i32 4 , i32 poison, i32 poison, i32 poison, i32 poison>
554
+ %s2 = shufflevector <8 x i16 > %2 , <8 x i16 > poison, <4 x i32 > <i32 0 , i32 1 , i32 2 , i32 3 >
555
+ %3 = zext <4 x i16 > %s2 to <4 x i32 >
556
+ ret <4 x i32 > %3
557
+ }
558
+
559
+ define <4 x i32 > @isUndefDeInterleave_b1 (<8 x i16 > %a ) {
560
+ ; CHECK-LABEL: isUndefDeInterleave_b1:
561
+ ; CHECK: // %bb.0:
562
+ ; CHECK-NEXT: uzp1 v0.4s, v0.4s, v0.4s
563
+ ; CHECK-NEXT: ushr v0.4s, v0.4s, #16
564
+ ; CHECK-NEXT: ret
565
+ %2 = shufflevector <8 x i16 > %a , <8 x i16 > poison, <8 x i32 > <i32 poison, i32 poison, i32 1 , i32 5 , i32 poison, i32 poison, i32 poison, i32 poison>
566
+ %s2 = shufflevector <8 x i16 > %2 , <8 x i16 > poison, <4 x i32 > <i32 0 , i32 1 , i32 2 , i32 3 >
567
+ %3 = zext <4 x i16 > %s2 to <4 x i32 >
568
+ ret <4 x i32 > %3
569
+ }
570
+
571
+ define <4 x i32 > @isUndefDeInterleave_b2 (<8 x i16 > %a ) {
572
+ ; CHECK-LABEL: isUndefDeInterleave_b2:
573
+ ; CHECK: // %bb.0:
574
+ ; CHECK-NEXT: movi v1.2d, #0x00ffff0000ffff
575
+ ; CHECK-NEXT: uzp2 v0.4s, v0.4s, v0.4s
576
+ ; CHECK-NEXT: and v0.16b, v0.16b, v1.16b
577
+ ; CHECK-NEXT: ret
578
+ %2 = shufflevector <8 x i16 > %a , <8 x i16 > poison, <8 x i32 > <i32 poison, i32 poison, i32 2 , i32 6 , i32 poison, i32 poison, i32 poison, i32 poison>
579
+ %s2 = shufflevector <8 x i16 > %2 , <8 x i16 > poison, <4 x i32 > <i32 0 , i32 1 , i32 2 , i32 3 >
580
+ %3 = zext <4 x i16 > %s2 to <4 x i32 >
581
+ ret <4 x i32 > %3
582
+ }
583
+
584
+ define <4 x i32 > @isUndefDeInterleave_b3 (<8 x i16 > %a ) {
585
+ ; CHECK-LABEL: isUndefDeInterleave_b3:
586
+ ; CHECK: // %bb.0:
587
+ ; CHECK-NEXT: uzp2 v0.4s, v0.4s, v0.4s
588
+ ; CHECK-NEXT: ushr v0.4s, v0.4s, #16
589
+ ; CHECK-NEXT: ret
590
+ %2 = shufflevector <8 x i16 > %a , <8 x i16 > poison, <8 x i32 > <i32 poison, i32 poison, i32 3 , i32 7 , i32 poison, i32 poison, i32 poison, i32 poison>
591
+ %s2 = shufflevector <8 x i16 > %2 , <8 x i16 > poison, <4 x i32 > <i32 0 , i32 1 , i32 2 , i32 3 >
592
+ %3 = zext <4 x i16 > %s2 to <4 x i32 >
593
+ ret <4 x i32 > %3
594
+ }
595
+
596
+ define <4 x i32 > @isUndefDeInterleave_t0 (<8 x i16 > %a , <8 x i16 > %b ) {
597
+ ; CHECK-LABEL: isUndefDeInterleave_t0:
598
+ ; CHECK: // %bb.0:
599
+ ; CHECK-NEXT: movi v1.2d, #0x00ffff0000ffff
600
+ ; CHECK-NEXT: uzp1 v0.4s, v0.4s, v0.4s
601
+ ; CHECK-NEXT: and v0.16b, v0.16b, v1.16b
602
+ ; CHECK-NEXT: ret
603
+ %2 = shufflevector <8 x i16 > %a , <8 x i16 > poison, <8 x i32 > <i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 0 , i32 4 >
604
+ %s2 = shufflevector <8 x i16 > %2 , <8 x i16 > poison, <4 x i32 > <i32 4 , i32 5 , i32 6 , i32 7 >
605
+ %3 = zext <4 x i16 > %s2 to <4 x i32 >
606
+ ret <4 x i32 > %3
607
+ }
608
+
609
+ define <4 x i32 > @isUndefDeInterleave_t1 (<8 x i16 > %a ) {
610
+ ; CHECK-LABEL: isUndefDeInterleave_t1:
611
+ ; CHECK: // %bb.0:
612
+ ; CHECK-NEXT: uzp1 v0.4s, v0.4s, v0.4s
613
+ ; CHECK-NEXT: ushr v0.4s, v0.4s, #16
614
+ ; CHECK-NEXT: ret
615
+ %2 = shufflevector <8 x i16 > %a , <8 x i16 > poison, <8 x i32 > <i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 1 , i32 5 >
616
+ %s2 = shufflevector <8 x i16 > %2 , <8 x i16 > poison, <4 x i32 > <i32 4 , i32 5 , i32 6 , i32 7 >
617
+ %3 = zext <4 x i16 > %s2 to <4 x i32 >
618
+ ret <4 x i32 > %3
619
+ }
620
+
621
+ define <4 x i32 > @isUndefDeInterleave_t2 (<8 x i16 > %a ) {
622
+ ; CHECK-LABEL: isUndefDeInterleave_t2:
623
+ ; CHECK: // %bb.0:
624
+ ; CHECK-NEXT: movi v1.2d, #0x00ffff0000ffff
625
+ ; CHECK-NEXT: uzp2 v0.4s, v0.4s, v0.4s
626
+ ; CHECK-NEXT: and v0.16b, v0.16b, v1.16b
627
+ ; CHECK-NEXT: ret
628
+ %2 = shufflevector <8 x i16 > %a , <8 x i16 > poison, <8 x i32 > <i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 2 , i32 6 >
629
+ %s2 = shufflevector <8 x i16 > %2 , <8 x i16 > poison, <4 x i32 > <i32 4 , i32 5 , i32 6 , i32 7 >
630
+ %3 = zext <4 x i16 > %s2 to <4 x i32 >
631
+ ret <4 x i32 > %3
632
+ }
633
+
634
+ define <4 x i32 > @isUndefDeInterleave_t3 (<8 x i16 > %a ) {
635
+ ; CHECK-LABEL: isUndefDeInterleave_t3:
636
+ ; CHECK: // %bb.0:
637
+ ; CHECK-NEXT: uzp2 v0.4s, v0.4s, v0.4s
638
+ ; CHECK-NEXT: ushr v0.4s, v0.4s, #16
639
+ ; CHECK-NEXT: ret
640
+ %2 = shufflevector <8 x i16 > %a , <8 x i16 > poison, <8 x i32 > <i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 3 , i32 7 >
641
+ %s2 = shufflevector <8 x i16 > %2 , <8 x i16 > poison, <4 x i32 > <i32 4 , i32 5 , i32 6 , i32 7 >
642
+ %3 = zext <4 x i16 > %s2 to <4 x i32 >
643
+ ret <4 x i32 > %3
644
+ }
645
+
646
+ define <4 x i32 > @isUndefDeInterleave_b0_bad (<8 x i16 > %a , <8 x i16 > %b ) {
647
+ ; CHECK-LABEL: isUndefDeInterleave_b0_bad:
648
+ ; CHECK: // %bb.0:
649
+ ; CHECK-NEXT: adrp x8, .LCPI40_0
650
+ ; CHECK-NEXT: ldr q1, [x8, :lo12:.LCPI40_0]
651
+ ; CHECK-NEXT: tbl v0.16b, { v0.16b }, v1.16b
652
+ ; CHECK-NEXT: ushll v0.4s, v0.4h, #0
653
+ ; CHECK-NEXT: ret
654
+ %2 = shufflevector <8 x i16 > %a , <8 x i16 > poison, <8 x i32 > <i32 4 , i32 4 , i32 0 , i32 4 , i32 poison, i32 poison, i32 poison, i32 poison>
655
+ %s2 = shufflevector <8 x i16 > %2 , <8 x i16 > poison, <4 x i32 > <i32 0 , i32 1 , i32 2 , i32 3 >
656
+ %3 = zext <4 x i16 > %s2 to <4 x i32 >
657
+ ret <4 x i32 > %3
658
+ }
659
+
660
+ define <4 x i32 > @isUndefDeInterleave_t1_bad (<8 x i16 > %a ) {
661
+ ; CHECK-LABEL: isUndefDeInterleave_t1_bad:
662
+ ; CHECK: // %bb.0:
663
+ ; CHECK-NEXT: adrp x8, .LCPI41_0
664
+ ; CHECK-NEXT: ldr q1, [x8, :lo12:.LCPI41_0]
665
+ ; CHECK-NEXT: tbl v0.16b, { v0.16b }, v1.16b
666
+ ; CHECK-NEXT: ushll2 v0.4s, v0.8h, #0
667
+ ; CHECK-NEXT: ret
668
+ %2 = shufflevector <8 x i16 > %a , <8 x i16 > poison, <8 x i32 > <i32 poison, i32 poison, i32 poison, i32 poison, i32 4 , i32 4 , i32 1 , i32 5 >
669
+ %s2 = shufflevector <8 x i16 > %2 , <8 x i16 > poison, <4 x i32 > <i32 4 , i32 5 , i32 6 , i32 7 >
670
+ %3 = zext <4 x i16 > %s2 to <4 x i32 >
671
+ ret <4 x i32 > %3
672
+ }
673
+
674
+ define i16 @undeftop (<8 x i16 > %0 ) {
675
+ ; CHECK-LABEL: undeftop:
676
+ ; CHECK: // %bb.0:
677
+ ; CHECK-NEXT: dup v0.8h, v0.h[4]
678
+ ; CHECK-NEXT: uaddl v0.4s, v0.4h, v0.4h
679
+ ; CHECK-NEXT: xtn v0.4h, v0.4s
680
+ ; CHECK-NEXT: umov w0, v0.h[0]
681
+ ; CHECK-NEXT: ret
682
+ %2 = shufflevector <8 x i16 > %0 , <8 x i16 > zeroinitializer , <8 x i32 > <i32 4 , i32 5 , i32 6 , i32 7 , i32 9 , i32 7 , i32 5 , i32 3 >
683
+ %3 = zext <8 x i16 > %2 to <8 x i64 >
684
+ %new0 = add <8 x i64 > %3 , %3
685
+ %last = trunc <8 x i64 > %new0 to <8 x i16 >
686
+ %4 = extractelement <8 x i16 > %last , i32 0
687
+ ret i16 %4
688
+ }
0 commit comments