@@ -566,3 +566,160 @@ define <4 x i64> @PR50055_signed(ptr %src, ptr %dst) {
566
566
store <8 x i32 > %sext , ptr %dst , align 32
567
567
ret <4 x i64 > %t2
568
568
}
569
+
570
+ define <8 x i32 > @PR63946 (<8 x i32 > %a0 , <8 x i32 > %b0 ) nounwind {
571
+ ; SSE-LABEL: PR63946:
572
+ ; SSE: # %bb.0: # %entry
573
+ ; SSE-NEXT: movdqa %xmm1, %xmm4
574
+ ; SSE-NEXT: pshufd {{.*#+}} xmm6 = xmm2[1,2,3,0]
575
+ ; SSE-NEXT: pshufd {{.*#+}} xmm8 = xmm3[1,2,3,0]
576
+ ; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm3[2,3,0,1]
577
+ ; SSE-NEXT: pshufd {{.*#+}} xmm9 = xmm2[2,3,0,1]
578
+ ; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm3[3,0,1,2]
579
+ ; SSE-NEXT: pshufd {{.*#+}} xmm10 = xmm2[3,0,1,2]
580
+ ; SSE-NEXT: movdqa %xmm0, %xmm7
581
+ ; SSE-NEXT: pcmpeqd %xmm2, %xmm7
582
+ ; SSE-NEXT: movdqa %xmm7, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
583
+ ; SSE-NEXT: movdqa %xmm8, %xmm11
584
+ ; SSE-NEXT: pcmpeqd %xmm4, %xmm11
585
+ ; SSE-NEXT: movdqa %xmm6, %xmm12
586
+ ; SSE-NEXT: movdqa %xmm9, %xmm13
587
+ ; SSE-NEXT: movdqa %xmm5, %xmm14
588
+ ; SSE-NEXT: pcmpeqd %xmm4, %xmm14
589
+ ; SSE-NEXT: movdqa %xmm1, %xmm15
590
+ ; SSE-NEXT: pcmpeqd %xmm4, %xmm15
591
+ ; SSE-NEXT: pcmpeqd %xmm4, %xmm2
592
+ ; SSE-NEXT: pcmpeqd %xmm4, %xmm6
593
+ ; SSE-NEXT: pcmpeqd %xmm4, %xmm9
594
+ ; SSE-NEXT: movdqa %xmm10, %xmm7
595
+ ; SSE-NEXT: pcmpeqd %xmm4, %xmm10
596
+ ; SSE-NEXT: pcmpeqd %xmm3, %xmm4
597
+ ; SSE-NEXT: por %xmm4, %xmm11
598
+ ; SSE-NEXT: pcmpeqd %xmm0, %xmm12
599
+ ; SSE-NEXT: por {{[-0-9]+}}(%r{{[sb]}}p), %xmm12 # 16-byte Folded Reload
600
+ ; SSE-NEXT: pcmpeqd %xmm0, %xmm13
601
+ ; SSE-NEXT: pcmpeqd %xmm0, %xmm7
602
+ ; SSE-NEXT: por %xmm14, %xmm2
603
+ ; SSE-NEXT: por %xmm11, %xmm2
604
+ ; SSE-NEXT: pcmpeqd %xmm0, %xmm3
605
+ ; SSE-NEXT: por %xmm3, %xmm13
606
+ ; SSE-NEXT: por %xmm12, %xmm13
607
+ ; SSE-NEXT: por %xmm15, %xmm6
608
+ ; SSE-NEXT: pcmpeqd %xmm0, %xmm8
609
+ ; SSE-NEXT: por %xmm7, %xmm8
610
+ ; SSE-NEXT: pcmpeqd %xmm0, %xmm5
611
+ ; SSE-NEXT: por %xmm8, %xmm5
612
+ ; SSE-NEXT: por %xmm13, %xmm5
613
+ ; SSE-NEXT: por %xmm6, %xmm9
614
+ ; SSE-NEXT: por %xmm2, %xmm9
615
+ ; SSE-NEXT: packssdw %xmm9, %xmm5
616
+ ; SSE-NEXT: pcmpeqd %xmm0, %xmm1
617
+ ; SSE-NEXT: packssdw %xmm10, %xmm1
618
+ ; SSE-NEXT: por %xmm5, %xmm1
619
+ ; SSE-NEXT: movdqa %xmm1, %xmm0
620
+ ; SSE-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
621
+ ; SSE-NEXT: pslld $31, %xmm0
622
+ ; SSE-NEXT: psrad $31, %xmm0
623
+ ; SSE-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
624
+ ; SSE-NEXT: pslld $31, %xmm1
625
+ ; SSE-NEXT: psrad $31, %xmm1
626
+ ; SSE-NEXT: retq
627
+ ;
628
+ ; AVX2-LABEL: PR63946:
629
+ ; AVX2: # %bb.0: # %entry
630
+ ; AVX2-NEXT: vpshufd {{.*#+}} ymm2 = ymm1[1,2,3,0,5,6,7,4]
631
+ ; AVX2-NEXT: vpshufd {{.*#+}} ymm3 = ymm1[2,3,0,1,6,7,4,5]
632
+ ; AVX2-NEXT: vpshufd {{.*#+}} ymm4 = ymm1[3,0,1,2,7,4,5,6]
633
+ ; AVX2-NEXT: vpermq {{.*#+}} ymm5 = ymm1[2,3,0,1]
634
+ ; AVX2-NEXT: vpermq {{.*#+}} ymm6 = ymm2[2,3,0,1]
635
+ ; AVX2-NEXT: vpermq {{.*#+}} ymm7 = ymm3[2,3,0,1]
636
+ ; AVX2-NEXT: vpermq {{.*#+}} ymm8 = ymm4[2,3,0,1]
637
+ ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm0, %ymm1
638
+ ; AVX2-NEXT: vpcmpeqd %ymm0, %ymm2, %ymm2
639
+ ; AVX2-NEXT: vpor %ymm1, %ymm2, %ymm1
640
+ ; AVX2-NEXT: vpcmpeqd %ymm0, %ymm3, %ymm2
641
+ ; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm3
642
+ ; AVX2-NEXT: vpcmpeqd %ymm0, %ymm4, %ymm4
643
+ ; AVX2-NEXT: vextracti128 $1, %ymm4, %xmm9
644
+ ; AVX2-NEXT: vpcmpeqd %ymm0, %ymm5, %ymm5
645
+ ; AVX2-NEXT: vextracti128 $1, %ymm5, %xmm10
646
+ ; AVX2-NEXT: vpor %xmm3, %xmm10, %xmm3
647
+ ; AVX2-NEXT: vpcmpeqd %ymm0, %ymm6, %ymm6
648
+ ; AVX2-NEXT: vextracti128 $1, %ymm6, %xmm10
649
+ ; AVX2-NEXT: vpor %xmm10, %xmm9, %xmm9
650
+ ; AVX2-NEXT: vpcmpeqd %ymm0, %ymm7, %ymm7
651
+ ; AVX2-NEXT: vextracti128 $1, %ymm7, %xmm10
652
+ ; AVX2-NEXT: vpackssdw %xmm10, %xmm7, %xmm7
653
+ ; AVX2-NEXT: vpcmpeqd %ymm0, %ymm8, %ymm0
654
+ ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm8
655
+ ; AVX2-NEXT: vpackssdw %xmm8, %xmm0, %xmm0
656
+ ; AVX2-NEXT: vpor %xmm0, %xmm7, %xmm0
657
+ ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm7
658
+ ; AVX2-NEXT: vpor %xmm3, %xmm7, %xmm3
659
+ ; AVX2-NEXT: vpor %xmm3, %xmm9, %xmm3
660
+ ; AVX2-NEXT: vpor %xmm5, %xmm2, %xmm2
661
+ ; AVX2-NEXT: vpor %xmm2, %xmm1, %xmm1
662
+ ; AVX2-NEXT: vpor %xmm6, %xmm4, %xmm2
663
+ ; AVX2-NEXT: vpor %xmm2, %xmm1, %xmm1
664
+ ; AVX2-NEXT: vpackssdw %xmm3, %xmm1, %xmm1
665
+ ; AVX2-NEXT: vpor %xmm0, %xmm1, %xmm0
666
+ ; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
667
+ ; AVX2-NEXT: vpslld $31, %ymm0, %ymm0
668
+ ; AVX2-NEXT: vpsrad $31, %ymm0, %ymm0
669
+ ; AVX2-NEXT: retq
670
+ ;
671
+ ; AVX512-LABEL: PR63946:
672
+ ; AVX512: # %bb.0: # %entry
673
+ ; AVX512-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1
674
+ ; AVX512-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
675
+ ; AVX512-NEXT: vpshufd {{.*#+}} ymm2 = ymm1[1,2,3,0,5,6,7,4]
676
+ ; AVX512-NEXT: vpshufd {{.*#+}} ymm3 = ymm1[2,3,0,1,6,7,4,5]
677
+ ; AVX512-NEXT: vpshufd {{.*#+}} ymm4 = ymm1[3,0,1,2,7,4,5,6]
678
+ ; AVX512-NEXT: vpermq {{.*#+}} ymm5 = ymm1[2,3,0,1]
679
+ ; AVX512-NEXT: vpermq {{.*#+}} ymm6 = ymm2[2,3,0,1]
680
+ ; AVX512-NEXT: vpermq {{.*#+}} ymm7 = ymm3[2,3,0,1]
681
+ ; AVX512-NEXT: vpermq {{.*#+}} ymm8 = ymm4[2,3,0,1]
682
+ ; AVX512-NEXT: vpcmpeqd %zmm1, %zmm0, %k0
683
+ ; AVX512-NEXT: vpcmpeqd %zmm0, %zmm2, %k1
684
+ ; AVX512-NEXT: vpcmpeqd %zmm0, %zmm3, %k3
685
+ ; AVX512-NEXT: vpcmpeqd %zmm0, %zmm4, %k2
686
+ ; AVX512-NEXT: vpcmpeqd %zmm0, %zmm5, %k4
687
+ ; AVX512-NEXT: vpcmpeqd %zmm0, %zmm6, %k5
688
+ ; AVX512-NEXT: vpcmpeqd %zmm0, %zmm7, %k6
689
+ ; AVX512-NEXT: vpcmpeqd %zmm0, %zmm8, %k7
690
+ ; AVX512-NEXT: korw %k0, %k1, %k0
691
+ ; AVX512-NEXT: korw %k3, %k0, %k0
692
+ ; AVX512-NEXT: korw %k4, %k0, %k0
693
+ ; AVX512-NEXT: korw %k2, %k0, %k0
694
+ ; AVX512-NEXT: korw %k5, %k0, %k0
695
+ ; AVX512-NEXT: korw %k6, %k0, %k0
696
+ ; AVX512-NEXT: korw %k7, %k0, %k1
697
+ ; AVX512-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
698
+ ; AVX512-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0
699
+ ; AVX512-NEXT: retq
700
+ entry:
701
+ %shuffle = shufflevector <8 x i32 > %b0 , <8 x i32 > poison, <8 x i32 > <i32 1 , i32 2 , i32 3 , i32 0 , i32 5 , i32 6 , i32 7 , i32 4 >
702
+ %shuffle1 = shufflevector <8 x i32 > %b0 , <8 x i32 > poison, <8 x i32 > <i32 2 , i32 3 , i32 0 , i32 1 , i32 6 , i32 7 , i32 4 , i32 5 >
703
+ %shuffle2 = shufflevector <8 x i32 > %shuffle , <8 x i32 > poison, <8 x i32 > <i32 2 , i32 3 , i32 0 , i32 1 , i32 6 , i32 7 , i32 4 , i32 5 >
704
+ %shuffle3 = shufflevector <8 x i32 > %b0 , <8 x i32 > poison, <8 x i32 > <i32 4 , i32 5 , i32 6 , i32 7 , i32 0 , i32 1 , i32 2 , i32 3 >
705
+ %shuffle4 = shufflevector <8 x i32 > %shuffle , <8 x i32 > poison, <8 x i32 > <i32 4 , i32 5 , i32 6 , i32 7 , i32 0 , i32 1 , i32 2 , i32 3 >
706
+ %shuffle5 = shufflevector <8 x i32 > %shuffle1 , <8 x i32 > poison, <8 x i32 > <i32 4 , i32 5 , i32 6 , i32 7 , i32 0 , i32 1 , i32 2 , i32 3 >
707
+ %shuffle6 = shufflevector <8 x i32 > %shuffle2 , <8 x i32 > poison, <8 x i32 > <i32 4 , i32 5 , i32 6 , i32 7 , i32 0 , i32 1 , i32 2 , i32 3 >
708
+ %cmp = icmp eq <8 x i32 > %a0 , %b0
709
+ %cmp7 = icmp eq <8 x i32 > %shuffle , %a0
710
+ %cmp9 = icmp eq <8 x i32 > %shuffle1 , %a0
711
+ %cmp11 = icmp eq <8 x i32 > %shuffle2 , %a0
712
+ %cmp13 = icmp eq <8 x i32 > %shuffle3 , %a0
713
+ %cmp15 = icmp eq <8 x i32 > %shuffle4 , %a0
714
+ %cmp17 = icmp eq <8 x i32 > %shuffle5 , %a0
715
+ %cmp19 = icmp eq <8 x i32 > %shuffle6 , %a0
716
+ %or2365 = or <8 x i1 > %cmp7 , %cmp
717
+ %or2264 = or <8 x i1 > %or2365 , %cmp9
718
+ %or2567 = or <8 x i1 > %or2264 , %cmp13
719
+ %or2163 = or <8 x i1 > %or2567 , %cmp11
720
+ %or62 = or <8 x i1 > %or2163 , %cmp15
721
+ %or2466 = or <8 x i1 > %or62 , %cmp17
722
+ %or2668 = or <8 x i1 > %or2466 , %cmp19
723
+ %or26 = sext <8 x i1 > %or2668 to <8 x i32 >
724
+ ret <8 x i32 > %or26
725
+ }
0 commit comments