@@ -1509,3 +1509,107 @@ end:
15091509 ; %arg is within [-16, -8).
15101510 ret void
15111511}
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