@@ -1509,3 +1509,107 @@ end:
1509
1509
; %arg is within [-16, -8).
1510
1510
ret void
1511
1511
}
1512
+
1513
+ define void @test_trunc_bittest (i8 %a ) {
1514
+ ; CHECK-LABEL: @test_trunc_bittest(
1515
+ ; CHECK-NEXT: [[TRUNC:%.*]] = trunc i8 [[A:%.*]] to i1
1516
+ ; CHECK-NEXT: br i1 [[TRUNC]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
1517
+ ; CHECK: if.true:
1518
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp ne i8 [[A]], 0
1519
+ ; CHECK-NEXT: call void @check1(i1 [[CMP1]])
1520
+ ; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i8 [[A]], 0
1521
+ ; CHECK-NEXT: call void @check1(i1 [[CMP2]])
1522
+ ; CHECK-NEXT: ret void
1523
+ ; CHECK: if.false:
1524
+ ; CHECK-NEXT: ret void
1525
+ ;
1526
+ %trunc = trunc i8 %a to i1
1527
+ br i1 %trunc , label %if.true , label %if.false
1528
+
1529
+ if.true:
1530
+ %cmp1 = icmp ne i8 %a , 0
1531
+ call void @check1 (i1 %cmp1 )
1532
+ %cmp2 = icmp eq i8 %a , 0
1533
+ call void @check1 (i1 %cmp2 )
1534
+ ret void
1535
+
1536
+ if.false:
1537
+ ret void
1538
+ }
1539
+
1540
+ define void @test_trunc_not_bittest (i8 %a ) {
1541
+ ; CHECK-LABEL: @test_trunc_not_bittest(
1542
+ ; CHECK-NEXT: [[TRUNC:%.*]] = trunc i8 [[A:%.*]] to i1
1543
+ ; CHECK-NEXT: [[NOT:%.*]] = xor i1 [[TRUNC]], true
1544
+ ; CHECK-NEXT: br i1 [[NOT]], label [[IF_FALSE:%.*]], label [[IF_TRUE:%.*]]
1545
+ ; CHECK: if.true:
1546
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp ne i8 [[A]], -1
1547
+ ; CHECK-NEXT: call void @check1(i1 [[CMP1]])
1548
+ ; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i8 [[A]], -1
1549
+ ; CHECK-NEXT: call void @check1(i1 [[CMP2]])
1550
+ ; CHECK-NEXT: ret void
1551
+ ; CHECK: if.false:
1552
+ ; CHECK-NEXT: ret void
1553
+ ;
1554
+ %trunc = trunc i8 %a to i1
1555
+ %not = xor i1 %trunc , true
1556
+ br i1 %not , label %if.true , label %if.false
1557
+
1558
+ if.true:
1559
+ %cmp1 = icmp ne i8 %a , -1
1560
+ call void @check1 (i1 %cmp1 )
1561
+ %cmp2 = icmp eq i8 %a , -1
1562
+ call void @check1 (i1 %cmp2 )
1563
+ ret void
1564
+
1565
+ if.false:
1566
+ ret void
1567
+ }
1568
+
1569
+ define void @test_icmp_trunc (i8 %a ) {
1570
+ ; CHECK-LABEL: @test_icmp_trunc(
1571
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp ne i8 [[A:%.*]], 0
1572
+ ; CHECK-NEXT: br i1 [[CMP1]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
1573
+ ; CHECK: if.true:
1574
+ ; CHECK-NEXT: [[TRUNC:%.*]] = trunc i8 [[A]] to i1
1575
+ ; CHECK-NEXT: call void @check1(i1 [[TRUNC]])
1576
+ ; CHECK-NEXT: ret void
1577
+ ; CHECK: if.false:
1578
+ ; CHECK-NEXT: ret void
1579
+ ;
1580
+ %cmp1 = icmp ne i8 %a , 0
1581
+ br i1 %cmp1 , label %if.true , label %if.false
1582
+
1583
+ if.true:
1584
+ %trunc = trunc i8 %a to i1
1585
+ call void @check1 (i1 %trunc )
1586
+ ret void
1587
+
1588
+ if.false:
1589
+ ret void
1590
+ }
1591
+
1592
+ define void @test_icmp_trunc_not (i8 %a ) {
1593
+ ; CHECK-LABEL: @test_icmp_trunc_not(
1594
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[A:%.*]], -1
1595
+ ; CHECK-NEXT: br i1 [[CMP1]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
1596
+ ; CHECK: if.true:
1597
+ ; CHECK-NEXT: [[TRUNC:%.*]] = trunc i8 [[A]] to i1
1598
+ ; CHECK-NEXT: [[NOT:%.*]] = xor i1 [[TRUNC]], true
1599
+ ; CHECK-NEXT: call void @check1(i1 [[TRUNC]])
1600
+ ; CHECK-NEXT: ret void
1601
+ ; CHECK: if.false:
1602
+ ; CHECK-NEXT: ret void
1603
+ ;
1604
+ %cmp1 = icmp eq i8 %a , -1
1605
+ br i1 %cmp1 , label %if.true , label %if.false
1606
+
1607
+ if.true:
1608
+ %trunc = trunc i8 %a to i1
1609
+ %not = xor i1 %trunc , true
1610
+ call void @check1 (i1 %trunc )
1611
+ ret void
1612
+
1613
+ if.false:
1614
+ ret void
1615
+ }
0 commit comments