@@ -1438,3 +1438,103 @@ define i1 @ne_optimized_highbits_cmp_todo_overlapping(i32 %x, i32 %y) {
1438
1438
%r = or i1 %cmp_hi , %cmp_lo
1439
1439
ret i1 %r
1440
1440
}
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