@@ -1256,6 +1256,227 @@ define <2 x i1> @icmp_ne_zext_eq_non_boolean_vec(<2 x i32> %a) {
12561256 ret <2 x i1 > %cmp1
12571257}
12581258
1259+ define i1 @icmp_ne_sext_eq_zero (i32 %a ) {
1260+ ; CHECK-LABEL: @icmp_ne_sext_eq_zero(
1261+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[A:%.*]], 0
1262+ ; CHECK-NEXT: [[CONV:%.*]] = sext i1 [[CMP]] to i32
1263+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp ne i32 [[CONV]], [[A]]
1264+ ; CHECK-NEXT: ret i1 [[CMP1]]
1265+ ;
1266+ %cmp = icmp eq i32 %a , 0
1267+ %conv = sext i1 %cmp to i32
1268+ %cmp1 = icmp ne i32 %conv , %a
1269+ ret i1 %cmp1
1270+ }
1271+
1272+ define i1 @icmp_ne_sext_ne_zero (i32 %a ) {
1273+ ; CHECK-LABEL: @icmp_ne_sext_ne_zero(
1274+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[A:%.*]], 0
1275+ ; CHECK-NEXT: [[CONV:%.*]] = sext i1 [[CMP]] to i32
1276+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp ne i32 [[CONV]], [[A]]
1277+ ; CHECK-NEXT: ret i1 [[CMP1]]
1278+ ;
1279+ %cmp = icmp ne i32 %a , 0
1280+ %conv = sext i1 %cmp to i32
1281+ %cmp1 = icmp ne i32 %conv , %a
1282+ ret i1 %cmp1
1283+ }
1284+
1285+ define i1 @icmp_eq_sext_eq_zero (i32 %a ) {
1286+ ; CHECK-LABEL: @icmp_eq_sext_eq_zero(
1287+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[A:%.*]], 0
1288+ ; CHECK-NEXT: [[CONV:%.*]] = sext i1 [[CMP]] to i32
1289+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i32 [[CONV]], [[A]]
1290+ ; CHECK-NEXT: ret i1 [[CMP1]]
1291+ ;
1292+ %cmp = icmp eq i32 %a , 0
1293+ %conv = sext i1 %cmp to i32
1294+ %cmp1 = icmp eq i32 %conv , %a
1295+ ret i1 %cmp1
1296+ }
1297+
1298+ define i1 @icmp_eq_sext_ne_zero (i32 %a ) {
1299+ ; CHECK-LABEL: @icmp_eq_sext_ne_zero(
1300+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[A:%.*]], 0
1301+ ; CHECK-NEXT: [[CONV:%.*]] = sext i1 [[CMP]] to i32
1302+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i32 [[CONV]], [[A]]
1303+ ; CHECK-NEXT: ret i1 [[CMP1]]
1304+ ;
1305+ %cmp = icmp ne i32 %a , 0
1306+ %conv = sext i1 %cmp to i32
1307+ %cmp1 = icmp eq i32 %conv , %a
1308+ ret i1 %cmp1
1309+ }
1310+
1311+ define i1 @icmp_ne_sext_eq_allone (i32 %a ) {
1312+ ; CHECK-LABEL: @icmp_ne_sext_eq_allone(
1313+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[A:%.*]], -1
1314+ ; CHECK-NEXT: [[CONV:%.*]] = sext i1 [[CMP]] to i32
1315+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp ne i32 [[CONV]], [[A]]
1316+ ; CHECK-NEXT: ret i1 [[CMP1]]
1317+ ;
1318+ %cmp = icmp eq i32 %a , -1
1319+ %conv = sext i1 %cmp to i32
1320+ %cmp1 = icmp ne i32 %conv , %a
1321+ ret i1 %cmp1
1322+ }
1323+
1324+ define i1 @icmp_ne_sext_ne_allone (i32 %a ) {
1325+ ; CHECK-LABEL: @icmp_ne_sext_ne_allone(
1326+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[A:%.*]], -1
1327+ ; CHECK-NEXT: [[CONV:%.*]] = sext i1 [[CMP]] to i32
1328+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp ne i32 [[CONV]], [[A]]
1329+ ; CHECK-NEXT: ret i1 [[CMP1]]
1330+ ;
1331+ %cmp = icmp ne i32 %a , -1
1332+ %conv = sext i1 %cmp to i32
1333+ %cmp1 = icmp ne i32 %conv , %a
1334+ ret i1 %cmp1
1335+ }
1336+
1337+ define i1 @icmp_eq_sext_eq_allone (i32 %a ) {
1338+ ; CHECK-LABEL: @icmp_eq_sext_eq_allone(
1339+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[A:%.*]], -1
1340+ ; CHECK-NEXT: [[CONV:%.*]] = sext i1 [[CMP]] to i32
1341+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i32 [[CONV]], [[A]]
1342+ ; CHECK-NEXT: ret i1 [[CMP1]]
1343+ ;
1344+ %cmp = icmp eq i32 %a , -1
1345+ %conv = sext i1 %cmp to i32
1346+ %cmp1 = icmp eq i32 %conv , %a
1347+ ret i1 %cmp1
1348+ }
1349+
1350+ define i1 @icmp_eq_sext_ne_allone (i32 %a ) {
1351+ ; CHECK-LABEL: @icmp_eq_sext_ne_allone(
1352+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[A:%.*]], -1
1353+ ; CHECK-NEXT: [[CONV:%.*]] = sext i1 [[CMP]] to i32
1354+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i32 [[CONV]], [[A]]
1355+ ; CHECK-NEXT: ret i1 [[CMP1]]
1356+ ;
1357+ %cmp = icmp ne i32 %a , -1
1358+ %conv = sext i1 %cmp to i32
1359+ %cmp1 = icmp eq i32 %conv , %a
1360+ ret i1 %cmp1
1361+ }
1362+
1363+ define i1 @icmp_ne_sext_eq_otherwise (i32 %a ) {
1364+ ; CHECK-LABEL: @icmp_ne_sext_eq_otherwise(
1365+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[A:%.*]], 2
1366+ ; CHECK-NEXT: [[CONV:%.*]] = sext i1 [[CMP]] to i32
1367+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp ne i32 [[CONV]], [[A]]
1368+ ; CHECK-NEXT: ret i1 [[CMP1]]
1369+ ;
1370+ %cmp = icmp eq i32 %a , 2
1371+ %conv = sext i1 %cmp to i32
1372+ %cmp1 = icmp ne i32 %conv , %a
1373+ ret i1 %cmp1
1374+ }
1375+
1376+ define i1 @icmp_ne_sext_ne_otherwise (i32 %a ) {
1377+ ; CHECK-LABEL: @icmp_ne_sext_ne_otherwise(
1378+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[A:%.*]], 2
1379+ ; CHECK-NEXT: [[CONV:%.*]] = sext i1 [[CMP]] to i32
1380+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp ne i32 [[CONV]], [[A]]
1381+ ; CHECK-NEXT: ret i1 [[CMP1]]
1382+ ;
1383+ %cmp = icmp ne i32 %a , 2
1384+ %conv = sext i1 %cmp to i32
1385+ %cmp1 = icmp ne i32 %conv , %a
1386+ ret i1 %cmp1
1387+ }
1388+
1389+ define i1 @icmp_eq_sext_eq_otherwise (i32 %a ) {
1390+ ; CHECK-LABEL: @icmp_eq_sext_eq_otherwise(
1391+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[A:%.*]], 2
1392+ ; CHECK-NEXT: [[CONV:%.*]] = sext i1 [[CMP]] to i32
1393+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i32 [[CONV]], [[A]]
1394+ ; CHECK-NEXT: ret i1 [[CMP1]]
1395+ ;
1396+ %cmp = icmp eq i32 %a , 2
1397+ %conv = sext i1 %cmp to i32
1398+ %cmp1 = icmp eq i32 %conv , %a
1399+ ret i1 %cmp1
1400+ }
1401+
1402+ define i1 @icmp_eq_sext_ne_otherwise (i32 %a ) {
1403+ ; CHECK-LABEL: @icmp_eq_sext_ne_otherwise(
1404+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[A:%.*]], 2
1405+ ; CHECK-NEXT: [[CONV:%.*]] = sext i1 [[CMP]] to i32
1406+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i32 [[CONV]], [[A]]
1407+ ; CHECK-NEXT: ret i1 [[CMP1]]
1408+ ;
1409+ %cmp = icmp ne i32 %a , 2
1410+ %conv = sext i1 %cmp to i32
1411+ %cmp1 = icmp eq i32 %conv , %a
1412+ ret i1 %cmp1
1413+ }
1414+
1415+ define <2 x i1 > @icmp_ne_sext_eq_zero_vec (<2 x i32 > %a ) {
1416+ ; CHECK-LABEL: @icmp_ne_sext_eq_zero_vec(
1417+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i32> [[A:%.*]], zeroinitializer
1418+ ; CHECK-NEXT: [[CONV:%.*]] = sext <2 x i1> [[CMP]] to <2 x i32>
1419+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp ne <2 x i32> [[CONV]], [[A]]
1420+ ; CHECK-NEXT: ret <2 x i1> [[CMP1]]
1421+ ;
1422+ %cmp = icmp eq <2 x i32 > %a , <i32 0 , i32 0 >
1423+ %conv = sext <2 x i1 > %cmp to <2 x i32 >
1424+ %cmp1 = icmp ne <2 x i32 > %conv , %a
1425+ ret <2 x i1 > %cmp1
1426+ }
1427+
1428+ define <2 x i1 > @icmp_ne_sext_ne_zero_vec (<2 x i32 > %a ) {
1429+ ; CHECK-LABEL: @icmp_ne_sext_ne_zero_vec(
1430+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ne <2 x i32> [[A:%.*]], zeroinitializer
1431+ ; CHECK-NEXT: [[CONV:%.*]] = sext <2 x i1> [[CMP]] to <2 x i32>
1432+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp ne <2 x i32> [[CONV]], [[A]]
1433+ ; CHECK-NEXT: ret <2 x i1> [[CMP1]]
1434+ ;
1435+ %cmp = icmp ne <2 x i32 > %a , <i32 0 , i32 0 >
1436+ %conv = sext <2 x i1 > %cmp to <2 x i32 >
1437+ %cmp1 = icmp ne <2 x i32 > %conv , %a
1438+ ret <2 x i1 > %cmp1
1439+ }
1440+
1441+ define <2 x i1 > @icmp_ne_sext_eq_allone_vec (<2 x i32 > %a ) {
1442+ ; CHECK-LABEL: @icmp_ne_sext_eq_allone_vec(
1443+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i32> [[A:%.*]], <i32 -1, i32 -1>
1444+ ; CHECK-NEXT: [[CONV:%.*]] = sext <2 x i1> [[CMP]] to <2 x i32>
1445+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp ne <2 x i32> [[CONV]], [[A]]
1446+ ; CHECK-NEXT: ret <2 x i1> [[CMP1]]
1447+ ;
1448+ %cmp = icmp eq <2 x i32 > %a , <i32 -1 , i32 -1 >
1449+ %conv = sext <2 x i1 > %cmp to <2 x i32 >
1450+ %cmp1 = icmp ne <2 x i32 > %conv , %a
1451+ ret <2 x i1 > %cmp1
1452+ }
1453+
1454+ define <2 x i1 > @icmp_ne_sext_ne_allone_vec (<2 x i32 > %a ) {
1455+ ; CHECK-LABEL: @icmp_ne_sext_ne_allone_vec(
1456+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ne <2 x i32> [[A:%.*]], <i32 -1, i32 -1>
1457+ ; CHECK-NEXT: [[CONV:%.*]] = sext <2 x i1> [[CMP]] to <2 x i32>
1458+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp ne <2 x i32> [[CONV]], [[A]]
1459+ ; CHECK-NEXT: ret <2 x i1> [[CMP1]]
1460+ ;
1461+ %cmp = icmp ne <2 x i32 > %a , <i32 -1 , i32 -1 >
1462+ %conv = sext <2 x i1 > %cmp to <2 x i32 >
1463+ %cmp1 = icmp ne <2 x i32 > %conv , %a
1464+ ret <2 x i1 > %cmp1
1465+ }
1466+
1467+ define <2 x i1 > @icmp_ne_sext_eq_otherwise_vec (<2 x i32 > %a ) {
1468+ ; CHECK-LABEL: @icmp_ne_sext_eq_otherwise_vec(
1469+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i32> [[A:%.*]], <i32 2, i32 2>
1470+ ; CHECK-NEXT: [[CONV:%.*]] = sext <2 x i1> [[CMP]] to <2 x i32>
1471+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp ne <2 x i32> [[CONV]], [[A]]
1472+ ; CHECK-NEXT: ret <2 x i1> [[CMP1]]
1473+ ;
1474+ %cmp = icmp eq <2 x i32 > %a , <i32 2 , i32 2 >
1475+ %conv = sext <2 x i1 > %cmp to <2 x i32 >
1476+ %cmp1 = icmp ne <2 x i32 > %conv , %a
1477+ ret <2 x i1 > %cmp1
1478+ }
1479+
12591480!0 = !{i32 1 , i32 6 }
12601481!1 = !{i32 0 , i32 6 }
12611482!2 = !{i8 0 , i8 1 }
0 commit comments