@@ -1303,3 +1303,222 @@ define i1 @logical_or_and_with_common_not_op_variant5(i1 %a) {
1303
1303
%or = select i1 %a , i1 true , i1 %and
1304
1304
ret i1 %or
1305
1305
}
1306
+
1307
+ define i1 @reduce_logical_and1 (i1 %a , i32 %b , i32 %c ) {
1308
+ ; CHECK-LABEL: @reduce_logical_and1(
1309
+ ; CHECK-NEXT: bb:
1310
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[B:%.*]], 6
1311
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp sgt i32 [[C:%.*]], [[B]]
1312
+ ; CHECK-NEXT: [[AND1:%.*]] = select i1 [[A:%.*]], i1 [[CMP1]], i1 false
1313
+ ; CHECK-NEXT: [[AND2:%.*]] = select i1 [[AND1]], i1 [[CMP]], i1 false
1314
+ ; CHECK-NEXT: ret i1 [[AND2]]
1315
+ ;
1316
+ bb:
1317
+ %cmp = icmp slt i32 %b , 6
1318
+ %cmp1 = icmp sgt i32 %c , %b
1319
+ %and1 = select i1 %a , i1 %cmp1 , i1 false
1320
+ %and2 = select i1 %and1 , i1 %cmp , i1 false
1321
+ ret i1 %and2
1322
+ }
1323
+
1324
+ define i1 @reduce_logical_and2 (i1 %a , i1 %b , i1 %c ) {
1325
+ ; CHECK-LABEL: @reduce_logical_and2(
1326
+ ; CHECK-NEXT: bb:
1327
+ ; CHECK-NEXT: [[CMP:%.*]] = xor i1 [[C:%.*]], [[B:%.*]]
1328
+ ; CHECK-NEXT: [[AND2:%.*]] = select i1 [[AND1:%.*]], i1 [[CMP]], i1 false
1329
+ ; CHECK-NEXT: [[AND3:%.*]] = select i1 [[AND2]], i1 [[B]], i1 false
1330
+ ; CHECK-NEXT: ret i1 [[AND3]]
1331
+ ;
1332
+ bb:
1333
+ %or = xor i1 %c , %b
1334
+ %and1 = select i1 %a , i1 %or , i1 false
1335
+ %and2 = select i1 %and1 , i1 %b , i1 false
1336
+ ret i1 %and2
1337
+ }
1338
+
1339
+ define i1 @reduce_logical_and3 (i1 %a , i32 %b , i32 noundef %c ) {
1340
+ ; CHECK-LABEL: @reduce_logical_and3(
1341
+ ; CHECK-NEXT: bb:
1342
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[B:%.*]], 6
1343
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp sgt i32 [[C:%.*]], [[B]]
1344
+ ; CHECK-NEXT: [[AND1:%.*]] = select i1 [[A:%.*]], i1 [[CMP]], i1 false
1345
+ ; CHECK-NEXT: [[AND2:%.*]] = select i1 [[AND1]], i1 [[CMP1]], i1 false
1346
+ ; CHECK-NEXT: ret i1 [[AND2]]
1347
+ ;
1348
+ bb:
1349
+ %cmp = icmp slt i32 %b , 6
1350
+ %cmp1 = icmp sgt i32 %c , %b
1351
+ %and1 = select i1 %a , i1 %cmp , i1 false
1352
+ %and2 = select i1 %and1 , i1 %cmp1 , i1 false
1353
+ ret i1 %and2
1354
+ }
1355
+
1356
+ define i1 @reduce_logical_or1 (i1 %a , i32 %b , i32 %c ) {
1357
+ ; CHECK-LABEL: @reduce_logical_or1(
1358
+ ; CHECK-NEXT: bb:
1359
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[B:%.*]], 6
1360
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp sgt i32 [[C:%.*]], [[B]]
1361
+ ; CHECK-NEXT: [[AND1:%.*]] = select i1 [[A:%.*]], i1 true, i1 [[CMP1]]
1362
+ ; CHECK-NEXT: [[AND2:%.*]] = select i1 [[AND1]], i1 true, i1 [[CMP]]
1363
+ ; CHECK-NEXT: ret i1 [[AND2]]
1364
+ ;
1365
+ bb:
1366
+ %cmp = icmp slt i32 %b , 6
1367
+ %cmp1 = icmp sgt i32 %c , %b
1368
+ %and1 = select i1 %a , i1 true , i1 %cmp1
1369
+ %and2 = select i1 %and1 , i1 true , i1 %cmp
1370
+ ret i1 %and2
1371
+ }
1372
+
1373
+ define i1 @reduce_logical_or2 (i1 %a , i1 %b , i1 %c ) {
1374
+ ; CHECK-LABEL: @reduce_logical_or2(
1375
+ ; CHECK-NEXT: bb:
1376
+ ; CHECK-NEXT: [[CMP:%.*]] = xor i1 [[C:%.*]], [[B:%.*]]
1377
+ ; CHECK-NEXT: [[AND2:%.*]] = select i1 [[AND1:%.*]], i1 true, i1 [[CMP]]
1378
+ ; CHECK-NEXT: [[AND3:%.*]] = select i1 [[AND2]], i1 true, i1 [[B]]
1379
+ ; CHECK-NEXT: ret i1 [[AND3]]
1380
+ ;
1381
+ bb:
1382
+ %or = xor i1 %c , %b
1383
+ %and1 = select i1 %a , i1 true , i1 %or
1384
+ %and2 = select i1 %and1 , i1 true , i1 %b
1385
+ ret i1 %and2
1386
+ }
1387
+
1388
+ define i1 @reduce_logical_or3 (i1 %a , i32 %b , i32 noundef %c ) {
1389
+ ; CHECK-LABEL: @reduce_logical_or3(
1390
+ ; CHECK-NEXT: bb:
1391
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[B:%.*]], 6
1392
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp sgt i32 [[C:%.*]], [[B]]
1393
+ ; CHECK-NEXT: [[AND1:%.*]] = select i1 [[A:%.*]], i1 true, i1 [[CMP]]
1394
+ ; CHECK-NEXT: [[AND2:%.*]] = select i1 [[AND1]], i1 true, i1 [[CMP1]]
1395
+ ; CHECK-NEXT: ret i1 [[AND2]]
1396
+ ;
1397
+ bb:
1398
+ %cmp = icmp slt i32 %b , 6
1399
+ %cmp1 = icmp sgt i32 %c , %b
1400
+ %and1 = select i1 %a , i1 true , i1 %cmp
1401
+ %and2 = select i1 %and1 , i1 true , i1 %cmp1
1402
+ ret i1 %and2
1403
+ }
1404
+
1405
+ define i1 @reduce_logical_and_fail1 (i1 %a , i32 %b , i32 %c ) {
1406
+ ; CHECK-LABEL: @reduce_logical_and_fail1(
1407
+ ; CHECK-NEXT: bb:
1408
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[B:%.*]], 6
1409
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp sgt i32 [[C:%.*]], [[B]]
1410
+ ; CHECK-NEXT: [[AND1:%.*]] = select i1 [[A:%.*]], i1 [[CMP]], i1 false
1411
+ ; CHECK-NEXT: [[AND2:%.*]] = select i1 [[AND1]], i1 [[CMP1]], i1 false
1412
+ ; CHECK-NEXT: ret i1 [[AND2]]
1413
+ ;
1414
+ bb:
1415
+ %cmp = icmp slt i32 %b , 6
1416
+ %cmp1 = icmp sgt i32 %c , %b
1417
+ %and1 = select i1 %a , i1 %cmp , i1 false
1418
+ %and2 = select i1 %and1 , i1 %cmp1 , i1 false
1419
+ ret i1 %and2
1420
+ }
1421
+
1422
+ define i1 @reduce_logical_and_fail2 (i1 %a , i32 %b , i32 %c ) {
1423
+ ; CHECK-LABEL: @reduce_logical_and_fail2(
1424
+ ; CHECK-NEXT: bb:
1425
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[B:%.*]], 6
1426
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp sgt i32 [[C:%.*]], 7
1427
+ ; CHECK-NEXT: [[AND1:%.*]] = select i1 [[A:%.*]], i1 [[CMP]], i1 false
1428
+ ; CHECK-NEXT: [[AND2:%.*]] = select i1 [[AND1]], i1 [[CMP1]], i1 false
1429
+ ; CHECK-NEXT: ret i1 [[AND2]]
1430
+ ;
1431
+ bb:
1432
+ %cmp = icmp slt i32 %b , 6
1433
+ %cmp1 = icmp sgt i32 %c , 7
1434
+ %and1 = select i1 %a , i1 %cmp , i1 false
1435
+ %and2 = select i1 %and1 , i1 %cmp1 , i1 false
1436
+ ret i1 %and2
1437
+ }
1438
+
1439
+ define i1 @reduce_logical_or_fail1 (i1 %a , i32 %b , i32 %c ) {
1440
+ ; CHECK-LABEL: @reduce_logical_or_fail1(
1441
+ ; CHECK-NEXT: bb:
1442
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[B:%.*]], 6
1443
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp sgt i32 [[C:%.*]], [[B]]
1444
+ ; CHECK-NEXT: [[AND1:%.*]] = select i1 [[A:%.*]], i1 true, i1 [[CMP]]
1445
+ ; CHECK-NEXT: [[AND2:%.*]] = select i1 [[AND1]], i1 true, i1 [[CMP1]]
1446
+ ; CHECK-NEXT: ret i1 [[AND2]]
1447
+ ;
1448
+ bb:
1449
+ %cmp = icmp slt i32 %b , 6
1450
+ %cmp1 = icmp sgt i32 %c , %b
1451
+ %and1 = select i1 %a , i1 true , i1 %cmp
1452
+ %and2 = select i1 %and1 , i1 true , i1 %cmp1
1453
+ ret i1 %and2
1454
+ }
1455
+
1456
+ define i1 @reduce_logical_or_fail2 (i1 %a , i32 %b , i32 %c ) {
1457
+ ; CHECK-LABEL: @reduce_logical_or_fail2(
1458
+ ; CHECK-NEXT: bb:
1459
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[B:%.*]], 6
1460
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp sgt i32 [[C:%.*]], 7
1461
+ ; CHECK-NEXT: [[AND1:%.*]] = select i1 [[A:%.*]], i1 true, i1 [[CMP]]
1462
+ ; CHECK-NEXT: [[AND2:%.*]] = select i1 [[AND1]], i1 true, i1 [[CMP1]]
1463
+ ; CHECK-NEXT: ret i1 [[AND2]]
1464
+ ;
1465
+ bb:
1466
+ %cmp = icmp slt i32 %b , 6
1467
+ %cmp1 = icmp sgt i32 %c , 7
1468
+ %and1 = select i1 %a , i1 true , i1 %cmp
1469
+ %and2 = select i1 %and1 , i1 true , i1 %cmp1
1470
+ ret i1 %and2
1471
+ }
1472
+
1473
+ define i1 @reduce_logical_and_multiuse (i1 %a , i32 %b , i32 %c ) {
1474
+ ; CHECK-LABEL: @reduce_logical_and_multiuse(
1475
+ ; CHECK-NEXT: bb:
1476
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[B:%.*]], 6
1477
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp sgt i32 [[C:%.*]], [[B]]
1478
+ ; CHECK-NEXT: [[AND1:%.*]] = select i1 [[A:%.*]], i1 [[CMP1]], i1 false
1479
+ ; CHECK-NEXT: call void @use1(i1 [[AND1]])
1480
+ ; CHECK-NEXT: [[AND2:%.*]] = select i1 [[AND1]], i1 [[CMP]], i1 false
1481
+ ; CHECK-NEXT: ret i1 [[AND2]]
1482
+ ;
1483
+ bb:
1484
+ %cmp = icmp slt i32 %b , 6
1485
+ %cmp1 = icmp sgt i32 %c , %b
1486
+ %and1 = select i1 %a , i1 %cmp1 , i1 false
1487
+ call void @use1 (i1 %and1 )
1488
+ %and2 = select i1 %and1 , i1 %cmp , i1 false
1489
+ ret i1 %and2
1490
+ }
1491
+
1492
+ define i1 @reduce_bitwise_and1 (i1 %a , i32 %b , i32 %c ) {
1493
+ ; CHECK-LABEL: @reduce_bitwise_and1(
1494
+ ; CHECK-NEXT: bb:
1495
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[B:%.*]], 6
1496
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp sgt i32 [[C:%.*]], [[B]]
1497
+ ; CHECK-NEXT: [[AND1:%.*]] = or i1 [[CMP1]], [[A:%.*]]
1498
+ ; CHECK-NEXT: [[AND2:%.*]] = and i1 [[AND1]], [[CMP]]
1499
+ ; CHECK-NEXT: ret i1 [[AND2]]
1500
+ ;
1501
+ bb:
1502
+ %cmp = icmp slt i32 %b , 6
1503
+ %cmp1 = icmp sgt i32 %c , %b
1504
+ %and1 = or i1 %a , %cmp1
1505
+ %and2 = select i1 %and1 , i1 %cmp , i1 false
1506
+ ret i1 %and2
1507
+ }
1508
+
1509
+ define i1 @reduce_bitwise_and2 (i1 %a , i32 %b , i32 %c ) {
1510
+ ; CHECK-LABEL: @reduce_bitwise_and2(
1511
+ ; CHECK-NEXT: bb:
1512
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[B:%.*]], 6
1513
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp sgt i32 [[C:%.*]], [[B]]
1514
+ ; CHECK-NEXT: [[AND1:%.*]] = select i1 [[A:%.*]], i1 [[CMP1]], i1 false
1515
+ ; CHECK-NEXT: [[AND2:%.*]] = or i1 [[AND1]], [[CMP]]
1516
+ ; CHECK-NEXT: ret i1 [[AND2]]
1517
+ ;
1518
+ bb:
1519
+ %cmp = icmp slt i32 %b , 6
1520
+ %cmp1 = icmp sgt i32 %c , %b
1521
+ %and1 = select i1 %a , i1 %cmp1 , i1 false
1522
+ %and2 = or i1 %and1 , %cmp
1523
+ ret i1 %and2
1524
+ }
0 commit comments