Skip to content

Commit 1690b9a

Browse files
committed
[ValueTracking] Add tests for computing knownbits from (icmp upred (add/sub nuw X, Y), C); NFC
1 parent b82fd5d commit 1690b9a

File tree

1 file changed

+276
-0
lines changed

1 file changed

+276
-0
lines changed

llvm/test/Transforms/InstCombine/known-bits.ll

Lines changed: 276 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1698,5 +1698,281 @@ define i32 @test_none(float nofpclass(all) %x) {
16981698
ret i32 %and
16991699
}
17001700

1701+
define i8 @test_icmp_add(i8 %n, i8 %n2, i8 %other) {
1702+
; CHECK-LABEL: @test_icmp_add(
1703+
; CHECK-NEXT: entry:
1704+
; CHECK-NEXT: [[N_ADD:%.*]] = add nuw i8 [[N:%.*]], [[N2:%.*]]
1705+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[N_ADD]], 32
1706+
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
1707+
; CHECK: if.then:
1708+
; CHECK-NEXT: [[R:%.*]] = and i8 [[N]], 32
1709+
; CHECK-NEXT: ret i8 [[R]]
1710+
; CHECK: if.else:
1711+
; CHECK-NEXT: ret i8 [[OTHER:%.*]]
1712+
;
1713+
entry:
1714+
%n_add = add nuw i8 %n, %n2
1715+
%cmp = icmp ult i8 %n_add, 32
1716+
br i1 %cmp, label %if.then, label %if.else
1717+
1718+
if.then:
1719+
%r = and i8 %n, 32
1720+
ret i8 %r
1721+
1722+
if.else:
1723+
ret i8 %other
1724+
}
1725+
1726+
define i8 @test_icmp_add_fail_nsw(i8 %n, i8 %n2, i8 %other) {
1727+
; CHECK-LABEL: @test_icmp_add_fail_nsw(
1728+
; CHECK-NEXT: entry:
1729+
; CHECK-NEXT: [[N_ADD:%.*]] = add nsw i8 [[N:%.*]], [[N2:%.*]]
1730+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[N_ADD]], 32
1731+
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
1732+
; CHECK: if.then:
1733+
; CHECK-NEXT: [[R:%.*]] = and i8 [[N]], 32
1734+
; CHECK-NEXT: ret i8 [[R]]
1735+
; CHECK: if.else:
1736+
; CHECK-NEXT: ret i8 [[OTHER:%.*]]
1737+
;
1738+
entry:
1739+
%n_add = add nsw i8 %n, %n2
1740+
%cmp = icmp ult i8 %n_add, 32
1741+
br i1 %cmp, label %if.then, label %if.else
1742+
1743+
if.then:
1744+
%r = and i8 %n, 32
1745+
ret i8 %r
1746+
1747+
if.else:
1748+
ret i8 %other
1749+
}
1750+
1751+
define i8 @test_icmp_add2(i8 %n, i8 %n2, i8 %other) {
1752+
; CHECK-LABEL: @test_icmp_add2(
1753+
; CHECK-NEXT: entry:
1754+
; CHECK-NEXT: [[N_ADD:%.*]] = add nuw nsw i8 [[N:%.*]], [[N2:%.*]]
1755+
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[N_ADD]], 14
1756+
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
1757+
; CHECK: if.then:
1758+
; CHECK-NEXT: ret i8 [[OTHER:%.*]]
1759+
; CHECK: if.else:
1760+
; CHECK-NEXT: [[R:%.*]] = and i8 [[N]], 32
1761+
; CHECK-NEXT: ret i8 [[R]]
1762+
;
1763+
entry:
1764+
%n_add = add nsw nuw i8 %n, %n2
1765+
%cmp = icmp uge i8 %n_add, 15
1766+
br i1 %cmp, label %if.then, label %if.else
1767+
1768+
if.then:
1769+
ret i8 %other
1770+
if.else:
1771+
%r = and i8 %n, 32
1772+
ret i8 %r
1773+
1774+
}
1775+
1776+
define i8 @test_icmp_add_fail_bad_range(i8 %n, i8 %n2, i8 %other) {
1777+
; CHECK-LABEL: @test_icmp_add_fail_bad_range(
1778+
; CHECK-NEXT: entry:
1779+
; CHECK-NEXT: [[N_ADD:%.*]] = add nuw i8 [[N:%.*]], [[N2:%.*]]
1780+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[N_ADD]], 33
1781+
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
1782+
; CHECK: if.then:
1783+
; CHECK-NEXT: [[R:%.*]] = and i8 [[N]], 32
1784+
; CHECK-NEXT: ret i8 [[R]]
1785+
; CHECK: if.else:
1786+
; CHECK-NEXT: ret i8 [[OTHER:%.*]]
1787+
;
1788+
entry:
1789+
%n_add = add nuw i8 %n, %n2
1790+
%cmp = icmp ule i8 %n_add, 32
1791+
br i1 %cmp, label %if.then, label %if.else
1792+
1793+
if.then:
1794+
%r = and i8 %n, 32
1795+
ret i8 %r
1796+
1797+
if.else:
1798+
ret i8 %other
1799+
}
1800+
1801+
define i8 @test_icmp_add_fail_bad_pred(i8 %n, i8 %n2, i8 %other) {
1802+
; CHECK-LABEL: @test_icmp_add_fail_bad_pred(
1803+
; CHECK-NEXT: entry:
1804+
; CHECK-NEXT: [[N_ADD:%.*]] = add nuw i8 [[N:%.*]], [[N2:%.*]]
1805+
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[N_ADD]], 32
1806+
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
1807+
; CHECK: if.then:
1808+
; CHECK-NEXT: [[R:%.*]] = and i8 [[N]], 32
1809+
; CHECK-NEXT: ret i8 [[R]]
1810+
; CHECK: if.else:
1811+
; CHECK-NEXT: ret i8 [[OTHER:%.*]]
1812+
;
1813+
entry:
1814+
%n_add = add nuw i8 %n, %n2
1815+
%cmp = icmp ugt i8 %n_add, 32
1816+
br i1 %cmp, label %if.then, label %if.else
1817+
1818+
if.then:
1819+
%r = and i8 %n, 32
1820+
ret i8 %r
1821+
1822+
if.else:
1823+
ret i8 %other
1824+
}
1825+
1826+
define i8 @test_icmp_sub(i8 %n, i8 %n2, i8 %other) {
1827+
; CHECK-LABEL: @test_icmp_sub(
1828+
; CHECK-NEXT: entry:
1829+
; CHECK-NEXT: [[N_SUB:%.*]] = sub nuw i8 [[N:%.*]], [[N2:%.*]]
1830+
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[N_SUB]], -33
1831+
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
1832+
; CHECK: if.then:
1833+
; CHECK-NEXT: [[R:%.*]] = and i8 [[N]], 32
1834+
; CHECK-NEXT: ret i8 [[R]]
1835+
; CHECK: if.else:
1836+
; CHECK-NEXT: ret i8 [[OTHER:%.*]]
1837+
;
1838+
entry:
1839+
%n_sub = sub nuw i8 %n, %n2
1840+
%cmp = icmp ugt i8 %n_sub, 223
1841+
br i1 %cmp, label %if.then, label %if.else
1842+
1843+
if.then:
1844+
%r = and i8 %n, 32
1845+
ret i8 %r
1846+
1847+
if.else:
1848+
ret i8 %other
1849+
}
1850+
1851+
define i8 @test_icmp_sub_fail_wrong_arg(i8 %n, i8 %n2, i8 %other) {
1852+
; CHECK-LABEL: @test_icmp_sub_fail_wrong_arg(
1853+
; CHECK-NEXT: entry:
1854+
; CHECK-NEXT: [[N_SUB:%.*]] = sub nuw i8 [[N:%.*]], [[N2:%.*]]
1855+
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[N_SUB]], -33
1856+
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
1857+
; CHECK: if.then:
1858+
; CHECK-NEXT: [[R:%.*]] = and i8 [[N2]], 32
1859+
; CHECK-NEXT: ret i8 [[R]]
1860+
; CHECK: if.else:
1861+
; CHECK-NEXT: ret i8 [[OTHER:%.*]]
1862+
;
1863+
entry:
1864+
%n_sub = sub nuw i8 %n, %n2
1865+
%cmp = icmp ugt i8 %n_sub, 223
1866+
br i1 %cmp, label %if.then, label %if.else
1867+
1868+
if.then:
1869+
%r = and i8 %n2, 32
1870+
ret i8 %r
1871+
1872+
if.else:
1873+
ret i8 %other
1874+
}
1875+
1876+
define i8 @test_icmp_sub2(i8 %n, i8 %n2, i8 %other) {
1877+
; CHECK-LABEL: @test_icmp_sub2(
1878+
; CHECK-NEXT: entry:
1879+
; CHECK-NEXT: [[N_SUB:%.*]] = sub nuw i8 [[N:%.*]], [[N2:%.*]]
1880+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[N_SUB]], -31
1881+
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
1882+
; CHECK: if.then:
1883+
; CHECK-NEXT: ret i8 [[OTHER:%.*]]
1884+
; CHECK: if.else:
1885+
; CHECK-NEXT: [[R:%.*]] = and i8 [[N]], 32
1886+
; CHECK-NEXT: ret i8 [[R]]
1887+
;
1888+
entry:
1889+
%n_sub = sub nuw i8 %n, %n2
1890+
%cmp = icmp ule i8 %n_sub, 224
1891+
br i1 %cmp, label %if.then, label %if.else
1892+
1893+
if.then:
1894+
ret i8 %other
1895+
if.else:
1896+
%r = and i8 %n, 32
1897+
ret i8 %r
1898+
1899+
}
1900+
1901+
define i8 @test_icmp_sub2_fail_nsw(i8 %n, i8 %n2, i8 %other) {
1902+
; CHECK-LABEL: @test_icmp_sub2_fail_nsw(
1903+
; CHECK-NEXT: entry:
1904+
; CHECK-NEXT: [[N_SUB:%.*]] = sub nsw i8 [[N:%.*]], [[N2:%.*]]
1905+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[N_SUB]], -31
1906+
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
1907+
; CHECK: if.then:
1908+
; CHECK-NEXT: ret i8 [[OTHER:%.*]]
1909+
; CHECK: if.else:
1910+
; CHECK-NEXT: [[R:%.*]] = and i8 [[N]], 32
1911+
; CHECK-NEXT: ret i8 [[R]]
1912+
;
1913+
entry:
1914+
%n_sub = sub nsw i8 %n, %n2
1915+
%cmp = icmp ule i8 %n_sub, 224
1916+
br i1 %cmp, label %if.then, label %if.else
1917+
1918+
if.then:
1919+
ret i8 %other
1920+
if.else:
1921+
%r = and i8 %n, 32
1922+
ret i8 %r
1923+
1924+
}
1925+
1926+
1927+
define i8 @test_icmp_sub_fail_bad_range(i8 %n, i8 %n2, i8 %other) {
1928+
; CHECK-LABEL: @test_icmp_sub_fail_bad_range(
1929+
; CHECK-NEXT: entry:
1930+
; CHECK-NEXT: [[N_SUB:%.*]] = sub nuw i8 [[N:%.*]], [[N2:%.*]]
1931+
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[N_SUB]], -34
1932+
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
1933+
; CHECK: if.then:
1934+
; CHECK-NEXT: [[R:%.*]] = and i8 [[N]], 32
1935+
; CHECK-NEXT: ret i8 [[R]]
1936+
; CHECK: if.else:
1937+
; CHECK-NEXT: ret i8 [[OTHER:%.*]]
1938+
;
1939+
entry:
1940+
%n_sub = sub nuw i8 %n, %n2
1941+
%cmp = icmp uge i8 %n_sub, 223
1942+
br i1 %cmp, label %if.then, label %if.else
1943+
1944+
if.then:
1945+
%r = and i8 %n, 32
1946+
ret i8 %r
1947+
1948+
if.else:
1949+
ret i8 %other
1950+
}
1951+
1952+
define i8 @test_icmp_sub_fail_bad_pred(i8 %n, i8 %n2, i8 %other) {
1953+
; CHECK-LABEL: @test_icmp_sub_fail_bad_pred(
1954+
; CHECK-NEXT: entry:
1955+
; CHECK-NEXT: [[N_SUB:%.*]] = sub nuw i8 [[N:%.*]], [[N2:%.*]]
1956+
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[N_SUB]], 31
1957+
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
1958+
; CHECK: if.then:
1959+
; CHECK-NEXT: [[R:%.*]] = and i8 [[N]], 32
1960+
; CHECK-NEXT: ret i8 [[R]]
1961+
; CHECK: if.else:
1962+
; CHECK-NEXT: ret i8 [[OTHER:%.*]]
1963+
;
1964+
entry:
1965+
%n_sub = sub nuw i8 %n, %n2
1966+
%cmp = icmp sge i8 %n_sub, 32
1967+
br i1 %cmp, label %if.then, label %if.else
1968+
1969+
if.then:
1970+
%r = and i8 %n, 32
1971+
ret i8 %r
1972+
1973+
if.else:
1974+
ret i8 %other
1975+
}
1976+
17011977
declare void @use(i1)
17021978
declare void @sink(i8)

0 commit comments

Comments
 (0)