@@ -482,10 +482,9 @@ define i1 @test_select_inverse_nonconst4(i64 %x, i64 %y, i64 %z, i1 %cond) {
482482
483483define i1 @sel_icmp_two_cmp (i1 %c , i32 %a1 , i32 %a2 , i32 %a3 , i32 %a4 ) {
484484; 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]]
489488; CHECK-NEXT: ret i1 [[CMP]]
490489;
491490 %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) {
498497define i1 @sel_icmp_two_cmp_extra_use1 (i1 %c , i32 %a1 , i32 %a2 , i32 %a3 , i32 %a4 ) {
499498; CHECK-LABEL: @sel_icmp_two_cmp_extra_use1(
500499; 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:%.*]])
502500; 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]]
505504; CHECK-NEXT: ret i1 [[CMP]]
506505;
507506 %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,
544543 ret i1 %cmp
545544}
546545
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+
547575define i1 @sel_icmp_cmp_and_simplify (i1 %c , i32 %a1 , i32 %a2 ) {
548576; CHECK-LABEL: @sel_icmp_cmp_and_simplify(
549577; 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) {
559587
560588define i1 @sel_icmp_cmp_and_no_simplify (i1 %c , i32 %a1 , i32 %a2 , i8 %b ) {
561589; 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]]
565593; CHECK-NEXT: ret i1 [[CMP]]
566594;
567595 %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) {
572600
573601define i1 @sel_icmp_cmp_and_no_simplify_comm (i1 %c , i32 %a1 , i32 %a2 , i8 %b ) {
574602; 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]]
578606; CHECK-NEXT: ret i1 [[CMP]]
579607;
580608 %v = call i8 @llvm.ucmp (i32 %a1 , i32 %a2 )
0 commit comments