@@ -534,3 +534,114 @@ define <8 x i16> @PR47448_ugt(i16 signext %0) {
534
534
%6 = sext <8 x i1 > %5 to <8 x i16 >
535
535
ret <8 x i16 > %6
536
536
}
537
+
538
+ ; FIXME: Recognise the knownbits from X86ISD::AND in previous block.
539
+ define void @PR54171 (<4 x i64 >* %mask0 , <4 x i64 >* %mask1 , i64 %i ) {
540
+ ; SSE2-LABEL: PR54171:
541
+ ; SSE2: # %bb.0: # %entry
542
+ ; SSE2-NEXT: andq $7, %rdx
543
+ ; SSE2-NEXT: je .LBB18_2
544
+ ; SSE2-NEXT: # %bb.1: # %if.then
545
+ ; SSE2-NEXT: movd %edx, %xmm0
546
+ ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
547
+ ; SSE2-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
548
+ ; SSE2-NEXT: movdqa %xmm0, %xmm1
549
+ ; SSE2-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
550
+ ; SSE2-NEXT: movdqa %xmm0, %xmm2
551
+ ; SSE2-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
552
+ ; SSE2-NEXT: movdqa %xmm2, (%rdi)
553
+ ; SSE2-NEXT: movdqa %xmm1, 16(%rdi)
554
+ ; SSE2-NEXT: movdqa %xmm0, %xmm1
555
+ ; SSE2-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
556
+ ; SSE2-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
557
+ ; SSE2-NEXT: movdqa %xmm0, (%rsi)
558
+ ; SSE2-NEXT: movdqa %xmm1, 16(%rsi)
559
+ ; SSE2-NEXT: .LBB18_2: # %if.end
560
+ ; SSE2-NEXT: retq
561
+ ;
562
+ ; SSE41-LABEL: PR54171:
563
+ ; SSE41: # %bb.0: # %entry
564
+ ; SSE41-NEXT: andq $7, %rdx
565
+ ; SSE41-NEXT: je .LBB18_2
566
+ ; SSE41-NEXT: # %bb.1: # %if.then
567
+ ; SSE41-NEXT: movd %edx, %xmm0
568
+ ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
569
+ ; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [3,3,4,4]
570
+ ; SSE41-NEXT: pmaxud %xmm0, %xmm1
571
+ ; SSE41-NEXT: pcmpeqd %xmm0, %xmm1
572
+ ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [1,1,2,2]
573
+ ; SSE41-NEXT: pmaxud %xmm0, %xmm2
574
+ ; SSE41-NEXT: pcmpeqd %xmm0, %xmm2
575
+ ; SSE41-NEXT: movdqa %xmm2, (%rdi)
576
+ ; SSE41-NEXT: movdqa %xmm1, 16(%rdi)
577
+ ; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [7,7,8,8]
578
+ ; SSE41-NEXT: pmaxud %xmm0, %xmm1
579
+ ; SSE41-NEXT: pcmpeqd %xmm0, %xmm1
580
+ ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [5,5,6,6]
581
+ ; SSE41-NEXT: pmaxud %xmm0, %xmm2
582
+ ; SSE41-NEXT: pcmpeqd %xmm0, %xmm2
583
+ ; SSE41-NEXT: movdqa %xmm2, (%rsi)
584
+ ; SSE41-NEXT: movdqa %xmm1, 16(%rsi)
585
+ ; SSE41-NEXT: .LBB18_2: # %if.end
586
+ ; SSE41-NEXT: retq
587
+ ;
588
+ ; AVX1-LABEL: PR54171:
589
+ ; AVX1: # %bb.0: # %entry
590
+ ; AVX1-NEXT: andq $7, %rdx
591
+ ; AVX1-NEXT: je .LBB18_2
592
+ ; AVX1-NEXT: # %bb.1: # %if.then
593
+ ; AVX1-NEXT: vmovd %edx, %xmm0
594
+ ; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
595
+ ; AVX1-NEXT: vpmaxud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
596
+ ; AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm1
597
+ ; AVX1-NEXT: vpmaxud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm2
598
+ ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm0, %xmm2
599
+ ; AVX1-NEXT: vmovdqa %xmm2, (%rdi)
600
+ ; AVX1-NEXT: vmovdqa %xmm1, 16(%rdi)
601
+ ; AVX1-NEXT: vpmaxud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
602
+ ; AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm1
603
+ ; AVX1-NEXT: vpmaxud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm2
604
+ ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm0, %xmm0
605
+ ; AVX1-NEXT: vmovdqa %xmm0, (%rsi)
606
+ ; AVX1-NEXT: vmovdqa %xmm1, 16(%rsi)
607
+ ; AVX1-NEXT: .LBB18_2: # %if.end
608
+ ; AVX1-NEXT: retq
609
+ ;
610
+ ; AVX2-LABEL: PR54171:
611
+ ; AVX2: # %bb.0: # %entry
612
+ ; AVX2-NEXT: andq $7, %rdx
613
+ ; AVX2-NEXT: je .LBB18_2
614
+ ; AVX2-NEXT: # %bb.1: # %if.then
615
+ ; AVX2-NEXT: vmovd %edx, %xmm0
616
+ ; AVX2-NEXT: vpbroadcastd %xmm0, %ymm0
617
+ ; AVX2-NEXT: vpmaxud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm1
618
+ ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm0, %ymm1
619
+ ; AVX2-NEXT: vmovdqa %ymm1, (%rdi)
620
+ ; AVX2-NEXT: vpmaxud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm1
621
+ ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm0, %ymm0
622
+ ; AVX2-NEXT: vmovdqa %ymm0, (%rsi)
623
+ ; AVX2-NEXT: .LBB18_2: # %if.end
624
+ ; AVX2-NEXT: vzeroupper
625
+ ; AVX2-NEXT: retq
626
+ entry:
627
+ %sub = and i64 %i , 7
628
+ %cmp.not = icmp eq i64 %sub , 0
629
+ br i1 %cmp.not , label %if.end , label %if.then
630
+
631
+ if.then:
632
+ %conv = trunc i64 %sub to i32
633
+ %vecinit.i.i = insertelement <8 x i32 > undef , i32 %conv , i64 0
634
+ %vecinit7.i.i = shufflevector <8 x i32 > %vecinit.i.i , <8 x i32 > poison, <8 x i32 > zeroinitializer
635
+ %cmp.i = icmp ugt <8 x i32 > %vecinit7.i.i , <i32 0 , i32 0 , i32 1 , i32 1 , i32 2 , i32 2 , i32 3 , i32 3 >
636
+ %sext.i = sext <8 x i1 > %cmp.i to <8 x i32 >
637
+ %0 = bitcast <4 x i64 >* %mask0 to <8 x i32 >*
638
+ store <8 x i32 > %sext.i , <8 x i32 >* %0 , align 32
639
+ %cmp.i18 = icmp ugt <8 x i32 > %vecinit7.i.i , <i32 4 , i32 4 , i32 5 , i32 5 , i32 6 , i32 6 , i32 7 , i32 7 >
640
+ %sext.i19 = sext <8 x i1 > %cmp.i18 to <8 x i32 >
641
+ %1 = bitcast <4 x i64 >* %mask1 to <8 x i32 >*
642
+ store <8 x i32 > %sext.i19 , <8 x i32 >* %1 , align 32
643
+ br label %if.end
644
+
645
+ if.end:
646
+ ret void
647
+ }
0 commit comments