@@ -1256,6 +1256,227 @@ define <2 x i1> @icmp_ne_zext_eq_non_boolean_vec(<2 x i32> %a) {
1256
1256
ret <2 x i1 > %cmp1
1257
1257
}
1258
1258
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
+
1259
1480
!0 = !{i32 1 , i32 6 }
1260
1481
!1 = !{i32 0 , i32 6 }
1261
1482
!2 = !{i8 0 , i8 1 }
0 commit comments