@@ -1160,3 +1160,65 @@ define i1 @sdiv_known_non_zero_fail(i8 %x, i8 %y) {
11601160 %nz = icmp ne i8 %xy , 0
11611161 ret i1 %nz
11621162}
1163+
1164+ define <2 x i1 > @cmp_excludes_zero_with_nonsplat_vec (<2 x i8 > %a , <2 x i8 > %b ) {
1165+ ; CHECK-LABEL: @cmp_excludes_zero_with_nonsplat_vec(
1166+ ; CHECK-NEXT: [[C:%.*]] = icmp sge <2 x i8> [[A:%.*]], <i8 1, i8 4>
1167+ ; CHECK-NEXT: [[S:%.*]] = select <2 x i1> [[C]], <2 x i8> [[A]], <2 x i8> <i8 4, i8 5>
1168+ ; CHECK-NEXT: [[AND:%.*]] = or <2 x i8> [[S]], [[B:%.*]]
1169+ ; CHECK-NEXT: [[R:%.*]] = icmp eq <2 x i8> [[AND]], zeroinitializer
1170+ ; CHECK-NEXT: ret <2 x i1> [[R]]
1171+ ;
1172+ %c = icmp sge <2 x i8 > %a , <i8 1 , i8 4 >
1173+ %s = select <2 x i1 > %c , <2 x i8 > %a , <2 x i8 > <i8 4 , i8 5 >
1174+ %and = or <2 x i8 > %s , %b
1175+ %r = icmp eq <2 x i8 > %and , zeroinitializer
1176+ ret <2 x i1 > %r
1177+ }
1178+
1179+ define <2 x i1 > @cmp_excludes_zero_with_nonsplat_vec_wundef (<2 x i8 > %a , <2 x i8 > %b ) {
1180+ ; CHECK-LABEL: @cmp_excludes_zero_with_nonsplat_vec_wundef(
1181+ ; CHECK-NEXT: [[C:%.*]] = icmp sge <2 x i8> [[A:%.*]], <i8 1, i8 undef>
1182+ ; CHECK-NEXT: [[S:%.*]] = select <2 x i1> [[C]], <2 x i8> [[A]], <2 x i8> <i8 4, i8 5>
1183+ ; CHECK-NEXT: [[AND:%.*]] = or <2 x i8> [[S]], [[B:%.*]]
1184+ ; CHECK-NEXT: [[R:%.*]] = icmp eq <2 x i8> [[AND]], zeroinitializer
1185+ ; CHECK-NEXT: ret <2 x i1> [[R]]
1186+ ;
1187+ %c = icmp sge <2 x i8 > %a , <i8 1 , i8 undef >
1188+ %s = select <2 x i1 > %c , <2 x i8 > %a , <2 x i8 > <i8 4 , i8 5 >
1189+ %and = or <2 x i8 > %s , %b
1190+ %r = icmp eq <2 x i8 > %and , zeroinitializer
1191+ ret <2 x i1 > %r
1192+ }
1193+
1194+ define <2 x i1 > @cmp_excludes_zero_with_nonsplat_vec_wpoison (<2 x i8 > %a , <2 x i8 > %b ) {
1195+ ; CHECK-LABEL: @cmp_excludes_zero_with_nonsplat_vec_wpoison(
1196+ ; CHECK-NEXT: [[C:%.*]] = icmp sge <2 x i8> [[A:%.*]], <i8 1, i8 poison>
1197+ ; CHECK-NEXT: [[S:%.*]] = select <2 x i1> [[C]], <2 x i8> [[A]], <2 x i8> <i8 4, i8 5>
1198+ ; CHECK-NEXT: [[AND:%.*]] = or <2 x i8> [[S]], [[B:%.*]]
1199+ ; CHECK-NEXT: [[R:%.*]] = icmp eq <2 x i8> [[AND]], zeroinitializer
1200+ ; CHECK-NEXT: ret <2 x i1> [[R]]
1201+ ;
1202+ %c = icmp sge <2 x i8 > %a , <i8 1 , i8 poison>
1203+ %s = select <2 x i1 > %c , <2 x i8 > %a , <2 x i8 > <i8 4 , i8 5 >
1204+ %and = or <2 x i8 > %s , %b
1205+ %r = icmp eq <2 x i8 > %and , zeroinitializer
1206+ ret <2 x i1 > %r
1207+ }
1208+
1209+
1210+ define <2 x i1 > @cmp_excludes_zero_with_nonsplat_vec_fail (<2 x i8 > %a , <2 x i8 > %b ) {
1211+ ; CHECK-LABEL: @cmp_excludes_zero_with_nonsplat_vec_fail(
1212+ ; CHECK-NEXT: [[C:%.*]] = icmp sge <2 x i8> [[A:%.*]], <i8 0, i8 4>
1213+ ; CHECK-NEXT: [[S:%.*]] = select <2 x i1> [[C]], <2 x i8> [[A]], <2 x i8> <i8 4, i8 5>
1214+ ; CHECK-NEXT: [[AND:%.*]] = or <2 x i8> [[S]], [[B:%.*]]
1215+ ; CHECK-NEXT: [[R:%.*]] = icmp eq <2 x i8> [[AND]], zeroinitializer
1216+ ; CHECK-NEXT: ret <2 x i1> [[R]]
1217+ ;
1218+ %c = icmp sge <2 x i8 > %a , <i8 0 , i8 4 >
1219+ %s = select <2 x i1 > %c , <2 x i8 > %a , <2 x i8 > <i8 4 , i8 5 >
1220+ %and = or <2 x i8 > %s , %b
1221+ %r = icmp eq <2 x i8 > %and , zeroinitializer
1222+ ret <2 x i1 > %r
1223+ }
1224+
0 commit comments