@@ -895,11 +895,9 @@ define i32 @or_not_and_extra_not_use1(i32 %a, i32 %b, i32 %c) {
895
895
; CHECK-LABEL: @or_not_and_extra_not_use1(
896
896
; CHECK-NEXT: [[OR1:%.*]] = or i32 [[A:%.*]], [[B:%.*]]
897
897
; CHECK-NEXT: [[NOT1:%.*]] = xor i32 [[OR1]], -1
898
- ; CHECK-NEXT: [[AND1:%.*]] = and i32 [[NOT1]], [[C:%.*]]
899
- ; CHECK-NEXT: [[OR2:%.*]] = or i32 [[A]], [[C]]
900
- ; CHECK-NEXT: [[NOT2:%.*]] = xor i32 [[OR2]], -1
901
- ; CHECK-NEXT: [[AND2:%.*]] = and i32 [[NOT2]], [[B]]
902
- ; CHECK-NEXT: [[OR3:%.*]] = or i32 [[AND1]], [[AND2]]
898
+ ; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[B]], [[C:%.*]]
899
+ ; CHECK-NEXT: [[TMP2:%.*]] = xor i32 [[A]], -1
900
+ ; CHECK-NEXT: [[OR3:%.*]] = and i32 [[TMP1]], [[TMP2]]
903
901
; CHECK-NEXT: call void @use(i32 [[NOT1]])
904
902
; CHECK-NEXT: ret i32 [[OR3]]
905
903
;
@@ -942,10 +940,9 @@ define i32 @or_not_and_extra_and_use1(i32 %a, i32 %b, i32 %c) {
942
940
; CHECK-NEXT: [[OR1:%.*]] = or i32 [[A:%.*]], [[B:%.*]]
943
941
; CHECK-NEXT: [[NOT1:%.*]] = xor i32 [[OR1]], -1
944
942
; CHECK-NEXT: [[AND1:%.*]] = and i32 [[NOT1]], [[C:%.*]]
945
- ; CHECK-NEXT: [[OR2:%.*]] = or i32 [[A]], [[C]]
946
- ; CHECK-NEXT: [[NOT2:%.*]] = xor i32 [[OR2]], -1
947
- ; CHECK-NEXT: [[AND2:%.*]] = and i32 [[NOT2]], [[B]]
948
- ; CHECK-NEXT: [[OR3:%.*]] = or i32 [[AND1]], [[AND2]]
943
+ ; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[B]], [[C]]
944
+ ; CHECK-NEXT: [[TMP2:%.*]] = xor i32 [[A]], -1
945
+ ; CHECK-NEXT: [[OR3:%.*]] = and i32 [[TMP1]], [[TMP2]]
949
946
; CHECK-NEXT: call void @use(i32 [[AND1]])
950
947
; CHECK-NEXT: ret i32 [[OR3]]
951
948
;
@@ -1615,9 +1612,10 @@ define i32 @or_and_not_not_extra_not_use1(i32 %a, i32 %b, i32 %c) {
1615
1612
; CHECK-LABEL: @or_and_not_not_extra_not_use1(
1616
1613
; CHECK-NEXT: [[OR1:%.*]] = or i32 [[B:%.*]], [[A:%.*]]
1617
1614
; CHECK-NEXT: [[NOT1:%.*]] = xor i32 [[OR1]], -1
1618
- ; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[C:%.*]], [[B]]
1619
- ; CHECK-NEXT: [[TMP2:%.*]] = or i32 [[TMP1]], [[A]]
1620
- ; CHECK-NEXT: [[OR3:%.*]] = xor i32 [[TMP2]], -1
1615
+ ; CHECK-NEXT: [[OR2:%.*]] = or i32 [[A]], [[C:%.*]]
1616
+ ; CHECK-NEXT: [[NOT2:%.*]] = xor i32 [[OR2]], -1
1617
+ ; CHECK-NEXT: [[AND:%.*]] = and i32 [[NOT2]], [[B]]
1618
+ ; CHECK-NEXT: [[OR3:%.*]] = or i32 [[AND]], [[NOT1]]
1621
1619
; CHECK-NEXT: call void @use(i32 [[NOT1]])
1622
1620
; CHECK-NEXT: ret i32 [[OR3]]
1623
1621
;
@@ -1633,12 +1631,11 @@ define i32 @or_and_not_not_extra_not_use1(i32 %a, i32 %b, i32 %c) {
1633
1631
1634
1632
define i32 @or_and_not_not_extra_not_use2 (i32 %a , i32 %b , i32 %c ) {
1635
1633
; CHECK-LABEL: @or_and_not_not_extra_not_use2(
1636
- ; CHECK-NEXT: [[OR1:%.*]] = or i32 [[B:%.*]], [[A:%.*]]
1637
- ; CHECK-NEXT: [[NOT1:%.*]] = xor i32 [[OR1]], -1
1638
- ; CHECK-NEXT: [[OR2:%.*]] = or i32 [[A]], [[C:%.*]]
1634
+ ; CHECK-NEXT: [[OR2:%.*]] = or i32 [[A:%.*]], [[C:%.*]]
1639
1635
; CHECK-NEXT: [[NOT2:%.*]] = xor i32 [[OR2]], -1
1640
- ; CHECK-NEXT: [[AND:%.*]] = and i32 [[NOT2]], [[B]]
1641
- ; CHECK-NEXT: [[OR3:%.*]] = or i32 [[AND]], [[NOT1]]
1636
+ ; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[C]], [[B:%.*]]
1637
+ ; CHECK-NEXT: [[TMP2:%.*]] = or i32 [[TMP1]], [[A]]
1638
+ ; CHECK-NEXT: [[OR3:%.*]] = xor i32 [[TMP2]], -1
1642
1639
; CHECK-NEXT: call void @use(i32 [[NOT2]])
1643
1640
; CHECK-NEXT: ret i32 [[OR3]]
1644
1641
;
@@ -1654,12 +1651,12 @@ define i32 @or_and_not_not_extra_not_use2(i32 %a, i32 %b, i32 %c) {
1654
1651
1655
1652
define i32 @or_and_not_not_extra_and_use (i32 %a , i32 %b , i32 %c ) {
1656
1653
; CHECK-LABEL: @or_and_not_not_extra_and_use(
1657
- ; CHECK-NEXT: [[OR1:%.*]] = or i32 [[B:%.*]], [[A:%.*]]
1658
- ; CHECK-NEXT: [[NOT1:%.*]] = xor i32 [[OR1]], -1
1659
- ; CHECK-NEXT: [[OR2:%.*]] = or i32 [[A]], [[C:%.*]]
1654
+ ; CHECK-NEXT: [[OR2:%.*]] = or i32 [[A:%.*]], [[C:%.*]]
1660
1655
; CHECK-NEXT: [[NOT2:%.*]] = xor i32 [[OR2]], -1
1661
- ; CHECK-NEXT: [[AND:%.*]] = and i32 [[NOT2]], [[B]]
1662
- ; CHECK-NEXT: [[OR3:%.*]] = or i32 [[AND]], [[NOT1]]
1656
+ ; CHECK-NEXT: [[AND:%.*]] = and i32 [[NOT2]], [[B:%.*]]
1657
+ ; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[C]], [[B]]
1658
+ ; CHECK-NEXT: [[TMP2:%.*]] = or i32 [[TMP1]], [[A]]
1659
+ ; CHECK-NEXT: [[OR3:%.*]] = xor i32 [[TMP2]], -1
1663
1660
; CHECK-NEXT: call void @use(i32 [[AND]])
1664
1661
; CHECK-NEXT: ret i32 [[OR3]]
1665
1662
;
@@ -1676,9 +1673,11 @@ define i32 @or_and_not_not_extra_and_use(i32 %a, i32 %b, i32 %c) {
1676
1673
define i32 @or_and_not_not_extra_or_use1 (i32 %a , i32 %b , i32 %c ) {
1677
1674
; CHECK-LABEL: @or_and_not_not_extra_or_use1(
1678
1675
; CHECK-NEXT: [[OR1:%.*]] = or i32 [[B:%.*]], [[A:%.*]]
1679
- ; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[C:%.*]], [[B]]
1680
- ; CHECK-NEXT: [[TMP2:%.*]] = or i32 [[TMP1]], [[A]]
1681
- ; CHECK-NEXT: [[OR3:%.*]] = xor i32 [[TMP2]], -1
1676
+ ; CHECK-NEXT: [[NOT1:%.*]] = xor i32 [[OR1]], -1
1677
+ ; CHECK-NEXT: [[OR2:%.*]] = or i32 [[A]], [[C:%.*]]
1678
+ ; CHECK-NEXT: [[NOT2:%.*]] = xor i32 [[OR2]], -1
1679
+ ; CHECK-NEXT: [[AND:%.*]] = and i32 [[NOT2]], [[B]]
1680
+ ; CHECK-NEXT: [[OR3:%.*]] = or i32 [[AND]], [[NOT1]]
1682
1681
; CHECK-NEXT: call void @use(i32 [[OR1]])
1683
1682
; CHECK-NEXT: ret i32 [[OR3]]
1684
1683
;
@@ -1711,6 +1710,8 @@ define i32 @or_and_not_not_extra_or_use2(i32 %a, i32 %b, i32 %c) {
1711
1710
ret i32 %or3
1712
1711
}
1713
1712
1713
+ ; Check the use limit. It can be adjusted in the future in terms of
1714
+ ; LHS and RHS uses distribution to be more flexible.
1714
1715
define i32 @or_and_not_not_2_extra_uses (i32 %a , i32 %b , i32 %c ) {
1715
1716
; CHECK-LABEL: @or_and_not_not_2_extra_uses(
1716
1717
; CHECK-NEXT: [[OR1:%.*]] = or i32 [[B:%.*]], [[A:%.*]]
0 commit comments