@@ -1303,3 +1303,221 @@ define i1 @logical_or_and_with_common_not_op_variant5(i1 %a) {
13031303 %or = select i1 %a , i1 true , i1 %and
13041304 ret i1 %or
13051305}
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: [[TMP0:%.*]] = and i1 [[CMP1]], [[CMP]]
1313+ ; CHECK-NEXT: [[AND2:%.*]] = select i1 [[A:%.*]], i1 [[TMP0]], 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: [[TMP0:%.*]] = xor i1 [[C:%.*]], true
1328+ ; CHECK-NEXT: [[B:%.*]] = and i1 [[TMP0]], [[B1:%.*]]
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: [[TMP0:%.*]] = and i1 [[CMP]], [[CMP1]]
1345+ ; CHECK-NEXT: [[AND2:%.*]] = select i1 [[A:%.*]], i1 [[TMP0]], 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: [[TMP0:%.*]] = or i1 [[CMP1]], [[CMP]]
1362+ ; CHECK-NEXT: [[AND2:%.*]] = select i1 [[A:%.*]], i1 true, i1 [[TMP0]]
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: [[B:%.*]] = or i1 [[C:%.*]], [[B1:%.*]]
1377+ ; CHECK-NEXT: [[AND3:%.*]] = select i1 [[AND2:%.*]], i1 true, i1 [[B]]
1378+ ; CHECK-NEXT: ret i1 [[AND3]]
1379+ ;
1380+ bb:
1381+ %or = xor i1 %c , %b
1382+ %and1 = select i1 %a , i1 true , i1 %or
1383+ %and2 = select i1 %and1 , i1 true , i1 %b
1384+ ret i1 %and2
1385+ }
1386+
1387+ define i1 @reduce_logical_or3 (i1 %a , i32 %b , i32 noundef %c ) {
1388+ ; CHECK-LABEL: @reduce_logical_or3(
1389+ ; CHECK-NEXT: bb:
1390+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[B:%.*]], 6
1391+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp sgt i32 [[C:%.*]], [[B]]
1392+ ; CHECK-NEXT: [[TMP0:%.*]] = or i1 [[CMP]], [[CMP1]]
1393+ ; CHECK-NEXT: [[AND2:%.*]] = select i1 [[A:%.*]], i1 true, i1 [[TMP0]]
1394+ ; CHECK-NEXT: ret i1 [[AND2]]
1395+ ;
1396+ bb:
1397+ %cmp = icmp slt i32 %b , 6
1398+ %cmp1 = icmp sgt i32 %c , %b
1399+ %and1 = select i1 %a , i1 true , i1 %cmp
1400+ %and2 = select i1 %and1 , i1 true , i1 %cmp1
1401+ ret i1 %and2
1402+ }
1403+
1404+ define i1 @reduce_logical_and_fail1 (i1 %a , i32 %b , i32 %c ) {
1405+ ; CHECK-LABEL: @reduce_logical_and_fail1(
1406+ ; CHECK-NEXT: bb:
1407+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[B:%.*]], 6
1408+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp sgt i32 [[C:%.*]], [[B]]
1409+ ; CHECK-NEXT: [[AND1:%.*]] = select i1 [[A:%.*]], i1 [[CMP]], i1 false
1410+ ; CHECK-NEXT: [[AND2:%.*]] = select i1 [[AND1]], i1 [[CMP1]], i1 false
1411+ ; CHECK-NEXT: ret i1 [[AND2]]
1412+ ;
1413+ bb:
1414+ %cmp = icmp slt i32 %b , 6
1415+ %cmp1 = icmp sgt i32 %c , %b
1416+ %and1 = select i1 %a , i1 %cmp , i1 false
1417+ %and2 = select i1 %and1 , i1 %cmp1 , i1 false
1418+ ret i1 %and2
1419+ }
1420+
1421+ define i1 @reduce_logical_and_fail2 (i1 %a , i32 %b , i32 %c ) {
1422+ ; CHECK-LABEL: @reduce_logical_and_fail2(
1423+ ; CHECK-NEXT: bb:
1424+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[B:%.*]], 6
1425+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp sgt i32 [[C:%.*]], 7
1426+ ; CHECK-NEXT: [[AND1:%.*]] = select i1 [[A:%.*]], i1 [[CMP]], i1 false
1427+ ; CHECK-NEXT: [[AND2:%.*]] = select i1 [[AND1]], i1 [[CMP1]], i1 false
1428+ ; CHECK-NEXT: ret i1 [[AND2]]
1429+ ;
1430+ bb:
1431+ %cmp = icmp slt i32 %b , 6
1432+ %cmp1 = icmp sgt i32 %c , 7
1433+ %and1 = select i1 %a , i1 %cmp , i1 false
1434+ %and2 = select i1 %and1 , i1 %cmp1 , i1 false
1435+ ret i1 %and2
1436+ }
1437+
1438+ define i1 @reduce_logical_or_fail1 (i1 %a , i32 %b , i32 %c ) {
1439+ ; CHECK-LABEL: @reduce_logical_or_fail1(
1440+ ; CHECK-NEXT: bb:
1441+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[B:%.*]], 6
1442+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp sgt i32 [[C:%.*]], [[B]]
1443+ ; CHECK-NEXT: [[AND1:%.*]] = select i1 [[A:%.*]], i1 true, i1 [[CMP]]
1444+ ; CHECK-NEXT: [[AND2:%.*]] = select i1 [[AND1]], i1 true, i1 [[CMP1]]
1445+ ; CHECK-NEXT: ret i1 [[AND2]]
1446+ ;
1447+ bb:
1448+ %cmp = icmp slt i32 %b , 6
1449+ %cmp1 = icmp sgt i32 %c , %b
1450+ %and1 = select i1 %a , i1 true , i1 %cmp
1451+ %and2 = select i1 %and1 , i1 true , i1 %cmp1
1452+ ret i1 %and2
1453+ }
1454+
1455+ define i1 @reduce_logical_or_fail2 (i1 %a , i32 %b , i32 %c ) {
1456+ ; CHECK-LABEL: @reduce_logical_or_fail2(
1457+ ; CHECK-NEXT: bb:
1458+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[B:%.*]], 6
1459+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp sgt i32 [[C:%.*]], 7
1460+ ; CHECK-NEXT: [[AND1:%.*]] = select i1 [[A:%.*]], i1 true, i1 [[CMP]]
1461+ ; CHECK-NEXT: [[AND2:%.*]] = select i1 [[AND1]], i1 true, i1 [[CMP1]]
1462+ ; CHECK-NEXT: ret i1 [[AND2]]
1463+ ;
1464+ bb:
1465+ %cmp = icmp slt i32 %b , 6
1466+ %cmp1 = icmp sgt i32 %c , 7
1467+ %and1 = select i1 %a , i1 true , i1 %cmp
1468+ %and2 = select i1 %and1 , i1 true , i1 %cmp1
1469+ ret i1 %and2
1470+ }
1471+
1472+ define i1 @reduce_logical_and_multiuse (i1 %a , i32 %b , i32 %c ) {
1473+ ; CHECK-LABEL: @reduce_logical_and_multiuse(
1474+ ; CHECK-NEXT: bb:
1475+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[B:%.*]], 6
1476+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp sgt i32 [[C:%.*]], [[B]]
1477+ ; CHECK-NEXT: [[AND1:%.*]] = select i1 [[A:%.*]], i1 [[CMP1]], i1 false
1478+ ; CHECK-NEXT: call void @use1(i1 [[AND1]])
1479+ ; CHECK-NEXT: [[AND2:%.*]] = select i1 [[AND1]], i1 [[CMP]], i1 false
1480+ ; CHECK-NEXT: ret i1 [[AND2]]
1481+ ;
1482+ bb:
1483+ %cmp = icmp slt i32 %b , 6
1484+ %cmp1 = icmp sgt i32 %c , %b
1485+ %and1 = select i1 %a , i1 %cmp1 , i1 false
1486+ call void @use1 (i1 %and1 )
1487+ %and2 = select i1 %and1 , i1 %cmp , i1 false
1488+ ret i1 %and2
1489+ }
1490+
1491+ define i1 @reduce_bitwise_and1 (i1 %a , i32 %b , i32 %c ) {
1492+ ; CHECK-LABEL: @reduce_bitwise_and1(
1493+ ; CHECK-NEXT: bb:
1494+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[B:%.*]], 6
1495+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp sgt i32 [[C:%.*]], [[B]]
1496+ ; CHECK-NEXT: [[AND1:%.*]] = or i1 [[CMP1]], [[A:%.*]]
1497+ ; CHECK-NEXT: [[AND2:%.*]] = and i1 [[AND1]], [[CMP]]
1498+ ; CHECK-NEXT: ret i1 [[AND2]]
1499+ ;
1500+ bb:
1501+ %cmp = icmp slt i32 %b , 6
1502+ %cmp1 = icmp sgt i32 %c , %b
1503+ %and1 = or i1 %a , %cmp1
1504+ %and2 = select i1 %and1 , i1 %cmp , i1 false
1505+ ret i1 %and2
1506+ }
1507+
1508+ define i1 @reduce_bitwise_and2 (i1 %a , i32 %b , i32 %c ) {
1509+ ; CHECK-LABEL: @reduce_bitwise_and2(
1510+ ; CHECK-NEXT: bb:
1511+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[B:%.*]], 6
1512+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp sgt i32 [[C:%.*]], [[B]]
1513+ ; CHECK-NEXT: [[AND1:%.*]] = select i1 [[A:%.*]], i1 [[CMP1]], i1 false
1514+ ; CHECK-NEXT: [[AND2:%.*]] = or i1 [[AND1]], [[CMP]]
1515+ ; CHECK-NEXT: ret i1 [[AND2]]
1516+ ;
1517+ bb:
1518+ %cmp = icmp slt i32 %b , 6
1519+ %cmp1 = icmp sgt i32 %c , %b
1520+ %and1 = select i1 %a , i1 %cmp1 , i1 false
1521+ %and2 = or i1 %and1 , %cmp
1522+ ret i1 %and2
1523+ }
0 commit comments