@@ -1160,3 +1160,65 @@ define i1 @sdiv_known_non_zero_fail(i8 %x, i8 %y) {
1160
1160
%nz = icmp ne i8 %xy , 0
1161
1161
ret i1 %nz
1162
1162
}
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