@@ -482,10 +482,9 @@ define i1 @test_select_inverse_nonconst4(i64 %x, i64 %y, i64 %z, i1 %cond) {
482
482
483
483
define i1 @sel_icmp_two_cmp (i1 %c , i32 %a1 , i32 %a2 , i32 %a3 , i32 %a4 ) {
484
484
; CHECK-LABEL: @sel_icmp_two_cmp(
485
- ; CHECK-NEXT: [[V1:%.*]] = call i8 @llvm.ucmp.i8.i32(i32 [[A1:%.*]], i32 [[A2:%.*]])
486
- ; CHECK-NEXT: [[V2:%.*]] = call i8 @llvm.scmp.i8.i32(i32 [[A3:%.*]], i32 [[A4:%.*]])
487
- ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C:%.*]], i8 [[V1]], i8 [[V2]]
488
- ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[SEL]], 1
485
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp ule i32 [[A1:%.*]], [[A2:%.*]]
486
+ ; CHECK-NEXT: [[CMP2:%.*]] = icmp sle i32 [[A3:%.*]], [[A4:%.*]]
487
+ ; CHECK-NEXT: [[CMP:%.*]] = select i1 [[C:%.*]], i1 [[CMP1]], i1 [[CMP2]]
489
488
; CHECK-NEXT: ret i1 [[CMP]]
490
489
;
491
490
%v1 = call i8 @llvm.ucmp (i32 %a1 , i32 %a2 )
@@ -498,10 +497,10 @@ define i1 @sel_icmp_two_cmp(i1 %c, i32 %a1, i32 %a2, i32 %a3, i32 %a4) {
498
497
define i1 @sel_icmp_two_cmp_extra_use1 (i1 %c , i32 %a1 , i32 %a2 , i32 %a3 , i32 %a4 ) {
499
498
; CHECK-LABEL: @sel_icmp_two_cmp_extra_use1(
500
499
; CHECK-NEXT: [[V1:%.*]] = call i8 @llvm.ucmp.i8.i32(i32 [[A1:%.*]], i32 [[A2:%.*]])
501
- ; CHECK-NEXT: [[V2:%.*]] = call i8 @llvm.scmp.i8.i32(i32 [[A3:%.*]], i32 [[A4:%.*]])
502
500
; CHECK-NEXT: call void @use.i8(i8 [[V1]])
503
- ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C:%.*]], i8 [[V1]], i8 [[V2]]
504
- ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[SEL]], 1
501
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp ule i32 [[A1]], [[A2]]
502
+ ; CHECK-NEXT: [[CMP2:%.*]] = icmp sle i32 [[A3:%.*]], [[A4:%.*]]
503
+ ; CHECK-NEXT: [[CMP:%.*]] = select i1 [[C:%.*]], i1 [[CMP1]], i1 [[CMP2]]
505
504
; CHECK-NEXT: ret i1 [[CMP]]
506
505
;
507
506
%v1 = call i8 @llvm.ucmp (i32 %a1 , i32 %a2 )
@@ -544,6 +543,35 @@ define i1 @sel_icmp_two_cmp_not_const(i1 %c, i32 %a1, i32 %a2, i32 %a3, i32 %a4,
544
543
ret i1 %cmp
545
544
}
546
545
546
+ define <2 x i1 > @sel_icmp_two_cmp_vec (i1 %c , <2 x i32 > %a1 , <2 x i32 > %a2 , <2 x i32 > %a3 , <2 x i32 > %a4 ) {
547
+ ; CHECK-LABEL: @sel_icmp_two_cmp_vec(
548
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp ule <2 x i32> [[A1:%.*]], [[A2:%.*]]
549
+ ; CHECK-NEXT: [[CMP2:%.*]] = icmp sle <2 x i32> [[A3:%.*]], [[A4:%.*]]
550
+ ; CHECK-NEXT: [[CMP:%.*]] = select i1 [[C:%.*]], <2 x i1> [[CMP1]], <2 x i1> [[CMP2]]
551
+ ; CHECK-NEXT: ret <2 x i1> [[CMP]]
552
+ ;
553
+ %v1 = call <2 x i8 > @llvm.ucmp (<2 x i32 > %a1 , <2 x i32 > %a2 )
554
+ %v2 = call <2 x i8 > @llvm.scmp (<2 x i32 > %a3 , <2 x i32 > %a4 )
555
+ %sel = select i1 %c , <2 x i8 > %v1 , <2 x i8 > %v2
556
+ %cmp = icmp sle <2 x i8 > %sel , zeroinitializer
557
+ ret <2 x i1 > %cmp
558
+ }
559
+
560
+ define <2 x i1 > @sel_icmp_two_cmp_vec_nonsplat (i1 %c , <2 x i32 > %a1 , <2 x i32 > %a2 , <2 x i32 > %a3 , <2 x i32 > %a4 ) {
561
+ ; CHECK-LABEL: @sel_icmp_two_cmp_vec_nonsplat(
562
+ ; CHECK-NEXT: [[V1:%.*]] = call <2 x i8> @llvm.ucmp.v2i8.v2i32(<2 x i32> [[A1:%.*]], <2 x i32> [[A2:%.*]])
563
+ ; CHECK-NEXT: [[V2:%.*]] = call <2 x i8> @llvm.scmp.v2i8.v2i32(<2 x i32> [[A3:%.*]], <2 x i32> [[A4:%.*]])
564
+ ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C:%.*]], <2 x i8> [[V1]], <2 x i8> [[V2]]
565
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt <2 x i8> [[SEL]], <i8 1, i8 2>
566
+ ; CHECK-NEXT: ret <2 x i1> [[CMP]]
567
+ ;
568
+ %v1 = call <2 x i8 > @llvm.ucmp (<2 x i32 > %a1 , <2 x i32 > %a2 )
569
+ %v2 = call <2 x i8 > @llvm.scmp (<2 x i32 > %a3 , <2 x i32 > %a4 )
570
+ %sel = select i1 %c , <2 x i8 > %v1 , <2 x i8 > %v2
571
+ %cmp = icmp sle <2 x i8 > %sel , <i8 0 , i8 1 >
572
+ ret <2 x i1 > %cmp
573
+ }
574
+
547
575
define i1 @sel_icmp_cmp_and_simplify (i1 %c , i32 %a1 , i32 %a2 ) {
548
576
; CHECK-LABEL: @sel_icmp_cmp_and_simplify(
549
577
; CHECK-NEXT: [[CMP1:%.*]] = icmp ule i32 [[A1:%.*]], [[A2:%.*]]
@@ -559,9 +587,9 @@ define i1 @sel_icmp_cmp_and_simplify(i1 %c, i32 %a1, i32 %a2) {
559
587
560
588
define i1 @sel_icmp_cmp_and_no_simplify (i1 %c , i32 %a1 , i32 %a2 , i8 %b ) {
561
589
; CHECK-LABEL: @sel_icmp_cmp_and_no_simplify(
562
- ; CHECK-NEXT: [[V :%.*]] = call i8 @llvm.ucmp.i8. i32(i32 [[A1:%.*]], i32 [[A2:%.*]])
563
- ; CHECK-NEXT: [[SEL :%.*]] = select i1 [[C:%.*]], i8 [[V]], i8 [[ B:%.*]]
564
- ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[SEL ]], 1
590
+ ; CHECK-NEXT: [[CMP1 :%.*]] = icmp ule i32 [[A1:%.*]], [[A2:%.*]]
591
+ ; CHECK-NEXT: [[CMP2 :%.*]] = icmp slt i8 [[B:%.*]], 1
592
+ ; CHECK-NEXT: [[CMP:%.*]] = select i1 [[C:%.*]], i1 [[CMP1 ]], i1 [[CMP2]]
565
593
; CHECK-NEXT: ret i1 [[CMP]]
566
594
;
567
595
%v = call i8 @llvm.ucmp (i32 %a1 , i32 %a2 )
@@ -572,9 +600,9 @@ define i1 @sel_icmp_cmp_and_no_simplify(i1 %c, i32 %a1, i32 %a2, i8 %b) {
572
600
573
601
define i1 @sel_icmp_cmp_and_no_simplify_comm (i1 %c , i32 %a1 , i32 %a2 , i8 %b ) {
574
602
; CHECK-LABEL: @sel_icmp_cmp_and_no_simplify_comm(
575
- ; CHECK-NEXT: [[V :%.*]] = call i8 @llvm.ucmp.i8.i32(i32 [[A1 :%.*]], i32 [[A2:%.*]])
576
- ; CHECK-NEXT: [[SEL :%.*]] = select i1 [[C :%.*]], i8 [[B :%.*]], i8 [[V ]]
577
- ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[SEL ]], 1
603
+ ; CHECK-NEXT: [[CMP1 :%.*]] = icmp slt i8 [[B :%.*]], 1
604
+ ; CHECK-NEXT: [[CMP2 :%.*]] = icmp ule i32 [[A1 :%.*]], [[A2 :%.*]]
605
+ ; CHECK-NEXT: [[CMP:%.*]] = select i1 [[C:%.*]], i1 [[CMP1 ]], i1 [[CMP2]]
578
606
; CHECK-NEXT: ret i1 [[CMP]]
579
607
;
580
608
%v = call i8 @llvm.ucmp (i32 %a1 , i32 %a2 )
0 commit comments