@@ -1718,3 +1718,141 @@ define i32 @sub_if_uge_multiuse_cmp_store_i32(i32 %x, i32 %y, ptr %z) {
1718
1718
%sub = sub nuw i32 %x , %select
1719
1719
ret i32 %sub
1720
1720
}
1721
+
1722
+ define i8 @sub_if_uge_C_i8 (i8 zeroext %x ) {
1723
+ ; CHECK-LABEL: sub_if_uge_C_i8:
1724
+ ; CHECK: # %bb.0:
1725
+ ; CHECK-NEXT: sltiu a1, a0, 13
1726
+ ; CHECK-NEXT: addi a1, a1, -1
1727
+ ; CHECK-NEXT: andi a1, a1, -13
1728
+ ; CHECK-NEXT: add a0, a0, a1
1729
+ ; CHECK-NEXT: ret
1730
+ %cmp = icmp ugt i8 %x , 12
1731
+ %sub = add i8 %x , -13
1732
+ %conv4 = select i1 %cmp , i8 %sub , i8 %x
1733
+ ret i8 %conv4
1734
+ }
1735
+
1736
+ define i16 @sub_if_uge_C_i16 (i16 zeroext %x ) {
1737
+ ; CHECK-LABEL: sub_if_uge_C_i16:
1738
+ ; CHECK: # %bb.0:
1739
+ ; CHECK-NEXT: sltiu a1, a0, 251
1740
+ ; CHECK-NEXT: addi a1, a1, -1
1741
+ ; CHECK-NEXT: andi a1, a1, -251
1742
+ ; CHECK-NEXT: add a0, a0, a1
1743
+ ; CHECK-NEXT: ret
1744
+ %cmp = icmp ugt i16 %x , 250
1745
+ %sub = add i16 %x , -251
1746
+ %conv4 = select i1 %cmp , i16 %sub , i16 %x
1747
+ ret i16 %conv4
1748
+ }
1749
+
1750
+ define i32 @sub_if_uge_C_i32 (i32 signext %x ) {
1751
+ ; CHECK-LABEL: sub_if_uge_C_i32:
1752
+ ; CHECK: # %bb.0:
1753
+ ; CHECK-NEXT: lui a1, 16
1754
+ ; CHECK-NEXT: lui a2, 1048560
1755
+ ; CHECK-NEXT: addi a1, a1, -16
1756
+ ; CHECK-NEXT: sltu a1, a1, a0
1757
+ ; CHECK-NEXT: neg a1, a1
1758
+ ; CHECK-NEXT: addi a2, a2, 15
1759
+ ; CHECK-NEXT: and a1, a1, a2
1760
+ ; CHECK-NEXT: add a0, a0, a1
1761
+ ; CHECK-NEXT: ret
1762
+ %cmp = icmp ugt i32 %x , 65520
1763
+ %sub = add i32 %x , -65521
1764
+ %cond = select i1 %cmp , i32 %sub , i32 %x
1765
+ ret i32 %cond
1766
+ }
1767
+
1768
+ define i64 @sub_if_uge_C_i64 (i64 %x ) {
1769
+ ; CHECK-LABEL: sub_if_uge_C_i64:
1770
+ ; CHECK: # %bb.0:
1771
+ ; CHECK-NEXT: li a2, 1
1772
+ ; CHECK-NEXT: beq a1, a2, .LBB60_2
1773
+ ; CHECK-NEXT: # %bb.1:
1774
+ ; CHECK-NEXT: sltiu a2, a1, 2
1775
+ ; CHECK-NEXT: xori a2, a2, 1
1776
+ ; CHECK-NEXT: j .LBB60_3
1777
+ ; CHECK-NEXT: .LBB60_2:
1778
+ ; CHECK-NEXT: lui a2, 172127
1779
+ ; CHECK-NEXT: addi a2, a2, 511
1780
+ ; CHECK-NEXT: sltu a2, a2, a0
1781
+ ; CHECK-NEXT: .LBB60_3:
1782
+ ; CHECK-NEXT: neg a2, a2
1783
+ ; CHECK-NEXT: andi a3, a2, -2
1784
+ ; CHECK-NEXT: add a1, a1, a3
1785
+ ; CHECK-NEXT: lui a3, 876449
1786
+ ; CHECK-NEXT: addi a3, a3, -512
1787
+ ; CHECK-NEXT: and a2, a2, a3
1788
+ ; CHECK-NEXT: add a2, a0, a2
1789
+ ; CHECK-NEXT: sltu a0, a2, a0
1790
+ ; CHECK-NEXT: add a1, a1, a0
1791
+ ; CHECK-NEXT: mv a0, a2
1792
+ ; CHECK-NEXT: ret
1793
+ %cmp = icmp ugt i64 %x , 4999999999
1794
+ %sub = add i64 %x , -5000000000
1795
+ %cond = select i1 %cmp , i64 %sub , i64 %x
1796
+ ret i64 %cond
1797
+ }
1798
+
1799
+ define i32 @sub_if_uge_C_multiuse_cmp_i32 (i32 signext %x , ptr %z ) {
1800
+ ; CHECK-LABEL: sub_if_uge_C_multiuse_cmp_i32:
1801
+ ; CHECK: # %bb.0:
1802
+ ; CHECK-NEXT: lui a2, 16
1803
+ ; CHECK-NEXT: lui a3, 1048560
1804
+ ; CHECK-NEXT: addi a2, a2, -16
1805
+ ; CHECK-NEXT: sltu a2, a2, a0
1806
+ ; CHECK-NEXT: neg a4, a2
1807
+ ; CHECK-NEXT: addi a3, a3, 15
1808
+ ; CHECK-NEXT: and a3, a4, a3
1809
+ ; CHECK-NEXT: add a0, a0, a3
1810
+ ; CHECK-NEXT: sw a2, 0(a1)
1811
+ ; CHECK-NEXT: ret
1812
+ %cmp = icmp ugt i32 %x , 65520
1813
+ %conv = zext i1 %cmp to i32
1814
+ store i32 %conv , ptr %z , align 4
1815
+ %sub = add i32 %x , -65521
1816
+ %cond = select i1 %cmp , i32 %sub , i32 %x
1817
+ ret i32 %cond
1818
+ }
1819
+
1820
+ define i32 @sub_if_uge_C_multiuse_sub_i32 (i32 signext %x , ptr %z ) {
1821
+ ; CHECK-LABEL: sub_if_uge_C_multiuse_sub_i32:
1822
+ ; CHECK: # %bb.0:
1823
+ ; CHECK-NEXT: lui a2, 1048560
1824
+ ; CHECK-NEXT: lui a3, 16
1825
+ ; CHECK-NEXT: addi a2, a2, 15
1826
+ ; CHECK-NEXT: add a2, a0, a2
1827
+ ; CHECK-NEXT: addi a3, a3, -16
1828
+ ; CHECK-NEXT: sw a2, 0(a1)
1829
+ ; CHECK-NEXT: bltu a3, a0, .LBB62_2
1830
+ ; CHECK-NEXT: # %bb.1:
1831
+ ; CHECK-NEXT: mv a2, a0
1832
+ ; CHECK-NEXT: .LBB62_2:
1833
+ ; CHECK-NEXT: mv a0, a2
1834
+ ; CHECK-NEXT: ret
1835
+ %sub = add i32 %x , -65521
1836
+ store i32 %sub , ptr %z , align 4
1837
+ %cmp = icmp ugt i32 %x , 65520
1838
+ %cond = select i1 %cmp , i32 %sub , i32 %x
1839
+ ret i32 %cond
1840
+ }
1841
+
1842
+ define i32 @sub_if_uge_C_swapped_i32 (i32 %x ) {
1843
+ ; CHECK-LABEL: sub_if_uge_C_swapped_i32:
1844
+ ; CHECK: # %bb.0:
1845
+ ; CHECK-NEXT: lui a1, 16
1846
+ ; CHECK-NEXT: lui a2, 1048560
1847
+ ; CHECK-NEXT: addi a1, a1, -15
1848
+ ; CHECK-NEXT: sltu a1, a0, a1
1849
+ ; CHECK-NEXT: addi a1, a1, -1
1850
+ ; CHECK-NEXT: addi a2, a2, 15
1851
+ ; CHECK-NEXT: and a1, a1, a2
1852
+ ; CHECK-NEXT: add a0, a0, a1
1853
+ ; CHECK-NEXT: ret
1854
+ %cmp = icmp ult i32 %x , 65521
1855
+ %sub = add i32 %x , -65521
1856
+ %cond = select i1 %cmp , i32 %x , i32 %sub
1857
+ ret i32 %cond
1858
+ }
0 commit comments