@@ -1438,3 +1438,103 @@ define i1 @ne_optimized_highbits_cmp_todo_overlapping(i32 %x, i32 %y) {
14381438 %r = or i1 %cmp_hi , %cmp_lo
14391439 ret i1 %r
14401440}
1441+
1442+ define i1 @and_trunc_i1 (i8 %a1 , i8 %a2 ) {
1443+ ; CHECK-LABEL: @and_trunc_i1(
1444+ ; CHECK-NEXT: [[XOR:%.*]] = xor i8 [[A1:%.*]], [[A2:%.*]]
1445+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[XOR]], 2
1446+ ; CHECK-NEXT: [[LOBIT:%.*]] = trunc i8 [[XOR]] to i1
1447+ ; CHECK-NEXT: [[LOBIT_INV:%.*]] = xor i1 [[LOBIT]], true
1448+ ; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP]], [[LOBIT_INV]]
1449+ ; CHECK-NEXT: ret i1 [[AND]]
1450+ ;
1451+ %xor = xor i8 %a1 , %a2
1452+ %cmp = icmp ult i8 %xor , 2
1453+ %lobit = trunc i8 %xor to i1
1454+ %lobit.inv = xor i1 %lobit , true
1455+ %and = and i1 %cmp , %lobit.inv
1456+ ret i1 %and
1457+ }
1458+
1459+ define i1 @and_trunc_i1_wrong_const (i8 %a1 , i8 %a2 ) {
1460+ ; CHECK-LABEL: @and_trunc_i1_wrong_const(
1461+ ; CHECK-NEXT: [[XOR:%.*]] = xor i8 [[A1:%.*]], [[A2:%.*]]
1462+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[XOR]], 4
1463+ ; CHECK-NEXT: [[LOBIT:%.*]] = trunc i8 [[XOR]] to i1
1464+ ; CHECK-NEXT: [[LOBIT_INV:%.*]] = xor i1 [[LOBIT]], true
1465+ ; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP]], [[LOBIT_INV]]
1466+ ; CHECK-NEXT: ret i1 [[AND]]
1467+ ;
1468+ %xor = xor i8 %a1 , %a2
1469+ %cmp = icmp ult i8 %xor , 4
1470+ %lobit = trunc i8 %xor to i1
1471+ %lobit.inv = xor i1 %lobit , true
1472+ %and = and i1 %cmp , %lobit.inv
1473+ ret i1 %and
1474+ }
1475+
1476+ define i1 @and_trunc_i1_wrong_operands (i8 %a1 , i8 %a2 , i8 %a3 ) {
1477+ ; CHECK-LABEL: @and_trunc_i1_wrong_operands(
1478+ ; CHECK-NEXT: [[XOR:%.*]] = xor i8 [[A1:%.*]], [[A2:%.*]]
1479+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[XOR]], 2
1480+ ; CHECK-NEXT: [[XOR2:%.*]] = xor i8 [[A1]], [[A3:%.*]]
1481+ ; CHECK-NEXT: [[LOBIT:%.*]] = trunc i8 [[XOR2]] to i1
1482+ ; CHECK-NEXT: [[LOBIT_INV:%.*]] = xor i1 [[LOBIT]], true
1483+ ; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP]], [[LOBIT_INV]]
1484+ ; CHECK-NEXT: ret i1 [[AND]]
1485+ ;
1486+ %xor = xor i8 %a1 , %a2
1487+ %cmp = icmp ult i8 %xor , 2
1488+ %xor2 = xor i8 %a1 , %a3
1489+ %lobit = trunc i8 %xor2 to i1
1490+ %lobit.inv = xor i1 %lobit , true
1491+ %and = and i1 %cmp , %lobit.inv
1492+ ret i1 %and
1493+ }
1494+
1495+ define i1 @or_trunc_i1 (i64 %a1 , i64 %a2 ) {
1496+ ; CHECK-LABEL: @or_trunc_i1(
1497+ ; CHECK-NEXT: [[XOR:%.*]] = xor i64 [[A2:%.*]], [[A1:%.*]]
1498+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i64 [[XOR]], 1
1499+ ; CHECK-NEXT: [[TRUNC:%.*]] = trunc i64 [[XOR]] to i1
1500+ ; CHECK-NEXT: [[OR:%.*]] = or i1 [[CMP]], [[TRUNC]]
1501+ ; CHECK-NEXT: ret i1 [[OR]]
1502+ ;
1503+ %xor = xor i64 %a2 , %a1
1504+ %cmp = icmp ugt i64 %xor , 1
1505+ %trunc = trunc i64 %xor to i1
1506+ %or = or i1 %cmp , %trunc
1507+ ret i1 %or
1508+ }
1509+
1510+ define i1 @or_trunc_i1_wrong_const (i64 %a1 , i64 %a2 ) {
1511+ ; CHECK-LABEL: @or_trunc_i1_wrong_const(
1512+ ; CHECK-NEXT: [[XOR:%.*]] = xor i64 [[A2:%.*]], [[A1:%.*]]
1513+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i64 [[XOR]], 2
1514+ ; CHECK-NEXT: [[TRUNC:%.*]] = trunc i64 [[XOR]] to i1
1515+ ; CHECK-NEXT: [[OR:%.*]] = or i1 [[CMP]], [[TRUNC]]
1516+ ; CHECK-NEXT: ret i1 [[OR]]
1517+ ;
1518+ %xor = xor i64 %a2 , %a1
1519+ %cmp = icmp ugt i64 %xor , 2
1520+ %trunc = trunc i64 %xor to i1
1521+ %or = or i1 %cmp , %trunc
1522+ ret i1 %or
1523+ }
1524+
1525+ define i1 @or_trunc_i1_wrong_operands (i64 %a1 , i64 %a2 , i64 %a3 ) {
1526+ ; CHECK-LABEL: @or_trunc_i1_wrong_operands(
1527+ ; CHECK-NEXT: [[XOR:%.*]] = xor i64 [[A2:%.*]], [[A1:%.*]]
1528+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i64 [[XOR]], 1
1529+ ; CHECK-NEXT: [[XOR2:%.*]] = xor i64 [[A3:%.*]], [[A1]]
1530+ ; CHECK-NEXT: [[TRUNC:%.*]] = trunc i64 [[XOR2]] to i1
1531+ ; CHECK-NEXT: [[OR:%.*]] = or i1 [[CMP]], [[TRUNC]]
1532+ ; CHECK-NEXT: ret i1 [[OR]]
1533+ ;
1534+ %xor = xor i64 %a2 , %a1
1535+ %cmp = icmp ugt i64 %xor , 1
1536+ %xor2 = xor i64 %a3 , %a1
1537+ %trunc = trunc i64 %xor2 to i1
1538+ %or = or i1 %cmp , %trunc
1539+ ret i1 %or
1540+ }
0 commit comments