@@ -552,9 +552,63 @@ define <4 x i32> @slp_v4i32_Op1_unknown_Op2_const_pow2(<4 x i32> %a)
552
552
ret <4 x i32 > %r3
553
553
}
554
554
555
+ define <2 x i32 > @sdiv_v2i32_unknown_divisor (<2 x i32 > %a , <2 x i32 > %x , <2 x i32 > %y , <2 x i32 > %z )
556
+ ; NO-SVE-LABEL: define <2 x i32> @sdiv_v2i32_unknown_divisor(
557
+ ; NO-SVE-SAME: <2 x i32> [[A:%.*]], <2 x i32> [[X:%.*]], <2 x i32> [[Y:%.*]], <2 x i32> [[Z:%.*]]) #[[ATTR0]] {
558
+ ; NO-SVE-NEXT: [[A0:%.*]] = extractelement <2 x i32> [[A]], i64 0
559
+ ; NO-SVE-NEXT: [[A1:%.*]] = extractelement <2 x i32> [[A]], i64 1
560
+ ; NO-SVE-NEXT: [[TMP1:%.*]] = sdiv i32 [[A0]], [[A1]]
561
+ ; NO-SVE-NEXT: [[TMP2:%.*]] = sdiv i32 [[A1]], [[A0]]
562
+ ; NO-SVE-NEXT: [[X0:%.*]] = extractelement <2 x i32> [[X]], i64 0
563
+ ; NO-SVE-NEXT: [[X1:%.*]] = extractelement <2 x i32> [[X]], i64 1
564
+ ; NO-SVE-NEXT: [[TMP3:%.*]] = add i32 [[TMP1]], [[X0]]
565
+ ; NO-SVE-NEXT: [[TMP4:%.*]] = add i32 [[TMP2]], [[X1]]
566
+ ; NO-SVE-NEXT: [[Y0:%.*]] = extractelement <2 x i32> [[Y]], i64 0
567
+ ; NO-SVE-NEXT: [[Y1:%.*]] = extractelement <2 x i32> [[Y]], i64 1
568
+ ; NO-SVE-NEXT: [[TMP5:%.*]] = sub i32 [[TMP3]], [[Y0]]
569
+ ; NO-SVE-NEXT: [[TMP6:%.*]] = sub i32 [[TMP4]], [[Y1]]
570
+ ; NO-SVE-NEXT: [[Z0:%.*]] = extractelement <2 x i32> [[Z]], i64 0
571
+ ; NO-SVE-NEXT: [[Z1:%.*]] = extractelement <2 x i32> [[Z]], i64 1
572
+ ; NO-SVE-NEXT: [[TMP7:%.*]] = mul i32 [[TMP5]], [[Z0]]
573
+ ; NO-SVE-NEXT: [[TMP8:%.*]] = mul i32 [[TMP6]], [[Z1]]
574
+ ; NO-SVE-NEXT: [[RES0:%.*]] = insertelement <2 x i32> poison, i32 [[TMP7]], i32 0
575
+ ; NO-SVE-NEXT: [[RES1:%.*]] = insertelement <2 x i32> [[RES0]], i32 [[TMP8]], i32 1
576
+ ; NO-SVE-NEXT: ret <2 x i32> [[RES1]]
577
+ ;
578
+ ; SVE-LABEL: define <2 x i32> @sdiv_v2i32_unknown_divisor(
579
+ ; SVE-SAME: <2 x i32> [[A:%.*]], <2 x i32> [[X:%.*]], <2 x i32> [[Y:%.*]], <2 x i32> [[Z:%.*]]) #[[ATTR0]] {
580
+ ; SVE-NEXT: [[TMP1:%.*]] = shufflevector <2 x i32> [[A]], <2 x i32> poison, <2 x i32> <i32 1, i32 0>
581
+ ; SVE-NEXT: [[TMP2:%.*]] = sdiv <2 x i32> [[A]], [[TMP1]]
582
+ ; SVE-NEXT: [[TMP3:%.*]] = add <2 x i32> [[TMP2]], [[X]]
583
+ ; SVE-NEXT: [[TMP4:%.*]] = sub <2 x i32> [[TMP3]], [[Y]]
584
+ ; SVE-NEXT: [[TMP5:%.*]] = mul <2 x i32> [[TMP4]], [[Z]]
585
+ ; SVE-NEXT: ret <2 x i32> [[TMP5]]
586
+ ;
587
+ {
588
+ %a0 = extractelement <2 x i32 > %a , i64 0
589
+ %a1 = extractelement <2 x i32 > %a , i64 1
590
+ %1 = sdiv i32 %a0 , %a1
591
+ %2 = sdiv i32 %a1 , %a0
592
+ %x0 = extractelement <2 x i32 > %x , i64 0
593
+ %x1 = extractelement <2 x i32 > %x , i64 1
594
+ %3 = add i32 %1 , %x0
595
+ %4 = add i32 %2 , %x1
596
+ %y0 = extractelement <2 x i32 > %y , i64 0
597
+ %y1 = extractelement <2 x i32 > %y , i64 1
598
+ %5 = sub i32 %3 , %y0
599
+ %6 = sub i32 %4 , %y1
600
+ %z0 = extractelement <2 x i32 > %z , i64 0
601
+ %z1 = extractelement <2 x i32 > %z , i64 1
602
+ %7 = mul i32 %5 , %z0
603
+ %8 = mul i32 %6 , %z1
604
+ %res0 = insertelement <2 x i32 > poison, i32 %7 , i32 0
605
+ %res1 = insertelement <2 x i32 > %res0 , i32 %8 , i32 1
606
+ ret <2 x i32 > %res1
607
+ }
608
+
555
609
; computes (a/const + x - y) * z
556
- define <2 x i32 > @vectorize_sdiv_v2i32 (<2 x i32 > %a , <2 x i32 > %x , <2 x i32 > %y , <2 x i32 > %z )
557
- ; NO-SVE-LABEL: define <2 x i32> @vectorize_sdiv_v2i32 (
610
+ define <2 x i32 > @sdiv_v2i32_const_divisor (<2 x i32 > %a , <2 x i32 > %x , <2 x i32 > %y , <2 x i32 > %z )
611
+ ; NO-SVE-LABEL: define <2 x i32> @sdiv_v2i32_const_divisor (
558
612
; NO-SVE-SAME: <2 x i32> [[A:%.*]], <2 x i32> [[X:%.*]], <2 x i32> [[Y:%.*]], <2 x i32> [[Z:%.*]]) #[[ATTR0]] {
559
613
; NO-SVE-NEXT: [[A0:%.*]] = extractelement <2 x i32> [[A]], i64 0
560
614
; NO-SVE-NEXT: [[A1:%.*]] = extractelement <2 x i32> [[A]], i64 1
@@ -576,7 +630,7 @@ define <2 x i32> @vectorize_sdiv_v2i32(<2 x i32> %a, <2 x i32> %x, <2 x i32> %y,
576
630
; NO-SVE-NEXT: [[RES1:%.*]] = insertelement <2 x i32> [[RES0]], i32 [[TMP8]], i32 1
577
631
; NO-SVE-NEXT: ret <2 x i32> [[RES1]]
578
632
;
579
- ; SVE-LABEL: define <2 x i32> @vectorize_sdiv_v2i32 (
633
+ ; SVE-LABEL: define <2 x i32> @sdiv_v2i32_const_divisor (
580
634
; SVE-SAME: <2 x i32> [[A:%.*]], <2 x i32> [[X:%.*]], <2 x i32> [[Y:%.*]], <2 x i32> [[Z:%.*]]) #[[ATTR0]] {
581
635
; SVE-NEXT: [[TMP1:%.*]] = sdiv <2 x i32> [[A]], <i32 2, i32 4>
582
636
; SVE-NEXT: [[TMP2:%.*]] = add <2 x i32> [[TMP1]], [[X]]
@@ -605,3 +659,57 @@ define <2 x i32> @vectorize_sdiv_v2i32(<2 x i32> %a, <2 x i32> %x, <2 x i32> %y,
605
659
%res1 = insertelement <2 x i32 > %res0 , i32 %8 , i32 1
606
660
ret <2 x i32 > %res1
607
661
}
662
+
663
+ define <2 x i32 > @sdiv_v2i32_Op1_unknown_Op2_const (<2 x i32 > %a , <2 x i32 > %x , <2 x i32 > %y , <2 x i32 > %z )
664
+ ; NO-SVE-LABEL: define <2 x i32> @sdiv_v2i32_Op1_unknown_Op2_const(
665
+ ; NO-SVE-SAME: <2 x i32> [[A:%.*]], <2 x i32> [[X:%.*]], <2 x i32> [[Y:%.*]], <2 x i32> [[Z:%.*]]) #[[ATTR0]] {
666
+ ; NO-SVE-NEXT: [[A0:%.*]] = extractelement <2 x i32> [[A]], i64 0
667
+ ; NO-SVE-NEXT: [[A1:%.*]] = extractelement <2 x i32> [[A]], i64 1
668
+ ; NO-SVE-NEXT: [[TMP1:%.*]] = sdiv i32 [[A0]], [[A0]]
669
+ ; NO-SVE-NEXT: [[TMP2:%.*]] = sdiv i32 [[A1]], 4
670
+ ; NO-SVE-NEXT: [[X0:%.*]] = extractelement <2 x i32> [[X]], i64 0
671
+ ; NO-SVE-NEXT: [[X1:%.*]] = extractelement <2 x i32> [[X]], i64 1
672
+ ; NO-SVE-NEXT: [[TMP3:%.*]] = add i32 [[TMP1]], [[X0]]
673
+ ; NO-SVE-NEXT: [[TMP4:%.*]] = add i32 [[TMP2]], [[X1]]
674
+ ; NO-SVE-NEXT: [[Y0:%.*]] = extractelement <2 x i32> [[Y]], i64 0
675
+ ; NO-SVE-NEXT: [[Y1:%.*]] = extractelement <2 x i32> [[Y]], i64 1
676
+ ; NO-SVE-NEXT: [[TMP5:%.*]] = sub i32 [[TMP3]], [[Y0]]
677
+ ; NO-SVE-NEXT: [[TMP6:%.*]] = sub i32 [[TMP4]], [[Y1]]
678
+ ; NO-SVE-NEXT: [[Z0:%.*]] = extractelement <2 x i32> [[Z]], i64 0
679
+ ; NO-SVE-NEXT: [[Z1:%.*]] = extractelement <2 x i32> [[Z]], i64 1
680
+ ; NO-SVE-NEXT: [[TMP7:%.*]] = mul i32 [[TMP5]], [[Z0]]
681
+ ; NO-SVE-NEXT: [[TMP8:%.*]] = mul i32 [[TMP6]], [[Z1]]
682
+ ; NO-SVE-NEXT: [[RES0:%.*]] = insertelement <2 x i32> poison, i32 [[TMP7]], i32 0
683
+ ; NO-SVE-NEXT: [[RES1:%.*]] = insertelement <2 x i32> [[RES0]], i32 [[TMP8]], i32 1
684
+ ; NO-SVE-NEXT: ret <2 x i32> [[RES1]]
685
+ ;
686
+ ; SVE-LABEL: define <2 x i32> @sdiv_v2i32_Op1_unknown_Op2_const(
687
+ ; SVE-SAME: <2 x i32> [[A:%.*]], <2 x i32> [[X:%.*]], <2 x i32> [[Y:%.*]], <2 x i32> [[Z:%.*]]) #[[ATTR0]] {
688
+ ; SVE-NEXT: [[TMP1:%.*]] = shufflevector <2 x i32> [[A]], <2 x i32> <i32 poison, i32 4>, <2 x i32> <i32 0, i32 3>
689
+ ; SVE-NEXT: [[TMP2:%.*]] = sdiv <2 x i32> [[A]], [[TMP1]]
690
+ ; SVE-NEXT: [[TMP3:%.*]] = add <2 x i32> [[TMP2]], [[X]]
691
+ ; SVE-NEXT: [[TMP4:%.*]] = sub <2 x i32> [[TMP3]], [[Y]]
692
+ ; SVE-NEXT: [[TMP5:%.*]] = mul <2 x i32> [[TMP4]], [[Z]]
693
+ ; SVE-NEXT: ret <2 x i32> [[TMP5]]
694
+ ;
695
+ {
696
+ %a0 = extractelement <2 x i32 > %a , i64 0
697
+ %a1 = extractelement <2 x i32 > %a , i64 1
698
+ %1 = sdiv i32 %a0 , %a0
699
+ %2 = sdiv i32 %a1 , 4
700
+ %x0 = extractelement <2 x i32 > %x , i64 0
701
+ %x1 = extractelement <2 x i32 > %x , i64 1
702
+ %3 = add i32 %1 , %x0
703
+ %4 = add i32 %2 , %x1
704
+ %y0 = extractelement <2 x i32 > %y , i64 0
705
+ %y1 = extractelement <2 x i32 > %y , i64 1
706
+ %5 = sub i32 %3 , %y0
707
+ %6 = sub i32 %4 , %y1
708
+ %z0 = extractelement <2 x i32 > %z , i64 0
709
+ %z1 = extractelement <2 x i32 > %z , i64 1
710
+ %7 = mul i32 %5 , %z0
711
+ %8 = mul i32 %6 , %z1
712
+ %res0 = insertelement <2 x i32 > poison, i32 %7 , i32 0
713
+ %res1 = insertelement <2 x i32 > %res0 , i32 %8 , i32 1
714
+ ret <2 x i32 > %res1
715
+ }
0 commit comments