@@ -1406,6 +1406,7 @@ define float @fmed3_0_1_undef_f32() {
1406
1406
1407
1407
declare i64 @llvm.amdgcn.icmp.i32 (i32 , i32 , i32 ) nounwind readnone convergent
1408
1408
declare i64 @llvm.amdgcn.icmp.i64 (i64 , i64 , i32 ) nounwind readnone convergent
1409
+ declare i64 @llvm.amdgcn.icmp.i1 (i1 , i1 , i32 ) nounwind readnone convergent
1409
1410
1410
1411
; Make sure there's no crash for invalid input
1411
1412
; CHECK-LABEL: @invalid_nonconstant_icmp_code(
@@ -1815,6 +1816,198 @@ define i64 @fold_icmp_ne_0_zext_icmp_ult_i16(i16 %a, i16 %b) {
1815
1816
ret i64 %mask
1816
1817
}
1817
1818
1819
+ ; 1-bit NE comparisons
1820
+
1821
+ ; CHECK-LABEL: @fold_icmp_i1_ne_0_icmp_eq_i1(
1822
+ ; CHECK-NEXT: icmp
1823
+ ; CHECK-NEXT: call i64 @llvm.amdgcn.icmp.i1(i1 %cmp, i1 false, i32 33)
1824
+ define i64 @fold_icmp_i1_ne_0_icmp_eq_i1 (i32 %a , i32 %b ) {
1825
+ %cmp = icmp eq i32 %a , %b
1826
+ %mask = call i64 @llvm.amdgcn.icmp.i1 (i1 %cmp , i1 false , i32 33 )
1827
+ ret i64 %mask
1828
+ }
1829
+
1830
+ ; CHECK-LABEL: @fold_icmp_i1_ne_0_icmp_ne_i1(
1831
+ ; CHECK-NEXT: icmp
1832
+ ; CHECK-NEXT: call i64 @llvm.amdgcn.icmp.i1(i1 %cmp, i1 false, i32 33)
1833
+ define i64 @fold_icmp_i1_ne_0_icmp_ne_i1 (i32 %a , i32 %b ) {
1834
+ %cmp = icmp ne i32 %a , %b
1835
+ %mask = call i64 @llvm.amdgcn.icmp.i1 (i1 %cmp , i1 false , i32 33 )
1836
+ ret i64 %mask
1837
+ }
1838
+
1839
+ ; CHECK-LABEL: @fold_icmp_i1_ne_0_icmp_sle_i1(
1840
+ ; CHECK-NEXT: icmp
1841
+ ; CHECK-NEXT: call i64 @llvm.amdgcn.icmp.i1(i1 %cmp, i1 false, i32 33)
1842
+ define i64 @fold_icmp_i1_ne_0_icmp_sle_i1 (i32 %a , i32 %b ) {
1843
+ %cmp = icmp sle i32 %a , %b
1844
+ %mask = call i64 @llvm.amdgcn.icmp.i1 (i1 %cmp , i1 false , i32 33 )
1845
+ ret i64 %mask
1846
+ }
1847
+
1848
+ ; CHECK-LABEL: @fold_icmp_i1_ne_0_icmp_ugt_i64(
1849
+ ; CHECK-NEXT: icmp
1850
+ ; CHECK-NEXT: call i64 @llvm.amdgcn.icmp.i1(i1 %cmp, i1 false, i32 33)
1851
+ define i64 @fold_icmp_i1_ne_0_icmp_ugt_i64 (i64 %a , i64 %b ) {
1852
+ %cmp = icmp ugt i64 %a , %b
1853
+ %mask = call i64 @llvm.amdgcn.icmp.i1 (i1 %cmp , i1 false , i32 33 )
1854
+ ret i64 %mask
1855
+ }
1856
+
1857
+ ; CHECK-LABEL: @fold_icmp_i1_ne_0_icmp_ult_swap_i64(
1858
+ ; CHECK-NEXT: icmp
1859
+ ; CHECK-NEXT: call i64 @llvm.amdgcn.icmp.i1(i1 %cmp, i1 false, i32 33)
1860
+ define i64 @fold_icmp_i1_ne_0_icmp_ult_swap_i64 (i64 %a , i64 %b ) {
1861
+ %cmp = icmp ugt i64 %a , %b
1862
+ %mask = call i64 @llvm.amdgcn.icmp.i1 (i1 false , i1 %cmp , i32 33 )
1863
+ ret i64 %mask
1864
+ }
1865
+
1866
+ ; CHECK-LABEL: @fold_icmp_i1_ne_0_fcmp_oeq_f32(
1867
+ ; CHECK-NEXT: fcmp
1868
+ ; CHECK-NEXT: call i64 @llvm.amdgcn.icmp.i1(i1 %cmp, i1 false, i32 33)
1869
+ define i64 @fold_icmp_i1_ne_0_fcmp_oeq_f32 (float %a , float %b ) {
1870
+ %cmp = fcmp oeq float %a , %b
1871
+ %mask = call i64 @llvm.amdgcn.icmp.i1 (i1 %cmp , i1 false , i32 33 )
1872
+ ret i64 %mask
1873
+ }
1874
+
1875
+ ; CHECK-LABEL: @fold_icmp_i1_ne_0_fcmp_une_f32(
1876
+ ; CHECK-NEXT: fcmp
1877
+ ; CHECK-NEXT: call i64 @llvm.amdgcn.icmp.i1(i1 %cmp, i1 false, i32 33)
1878
+ define i64 @fold_icmp_i1_ne_0_fcmp_une_f32 (float %a , float %b ) {
1879
+ %cmp = fcmp une float %a , %b
1880
+ %mask = call i64 @llvm.amdgcn.icmp.i1 (i1 %cmp , i1 false , i32 33 )
1881
+ ret i64 %mask
1882
+ }
1883
+
1884
+ ; CHECK-LABEL: @fold_icmp_i1_ne_0_fcmp_olt_f64(
1885
+ ; CHECK-NEXT: fcmp
1886
+ ; CHECK-NEXT: call i64 @llvm.amdgcn.icmp.i1(i1 %cmp, i1 false, i32 33)
1887
+ define i64 @fold_icmp_i1_ne_0_fcmp_olt_f64 (double %a , double %b ) {
1888
+ %cmp = fcmp olt double %a , %b
1889
+ %mask = call i64 @llvm.amdgcn.icmp.i1 (i1 %cmp , i1 false , i32 33 )
1890
+ ret i64 %mask
1891
+ }
1892
+
1893
+ ; CHECK-LABEL: @fold_icmp_i1_ne_0_icmp_eq_i4(
1894
+ ; CHECK-NEXT: icmp
1895
+ ; CHECK: call i64 @llvm.amdgcn.icmp.i1(i1 %cmp, i1 false, i32 33)
1896
+ define i64 @fold_icmp_i1_ne_0_icmp_eq_i4 (i4 %a , i4 %b ) {
1897
+ %cmp = icmp eq i4 %a , %b
1898
+ %mask = call i64 @llvm.amdgcn.icmp.i1 (i1 %cmp , i1 false , i32 33 )
1899
+ ret i64 %mask
1900
+ }
1901
+
1902
+ ; CHECK-LABEL: @fold_icmp_i1_ne_0_icmp_eq_i8(
1903
+ ; CHECK-NEXT: icmp
1904
+ ; CHECK: call i64 @llvm.amdgcn.icmp.i1(i1 %cmp, i1 false, i32 33)
1905
+ define i64 @fold_icmp_i1_ne_0_icmp_eq_i8 (i8 %a , i8 %b ) {
1906
+ %cmp = icmp eq i8 %a , %b
1907
+ %mask = call i64 @llvm.amdgcn.icmp.i1 (i1 %cmp , i1 false , i32 33 )
1908
+ ret i64 %mask
1909
+ }
1910
+
1911
+ ; CHECK-LABEL: @fold_icmp_i1_ne_0_icmp_eq_i16(
1912
+ ; CHECK-NEXT: icmp
1913
+ ; CHECK: call i64 @llvm.amdgcn.icmp.i1(i1 %cmp, i1 false, i32 33)
1914
+ define i64 @fold_icmp_i1_ne_0_icmp_eq_i16 (i16 %a , i16 %b ) {
1915
+ %cmp = icmp eq i16 %a , %b
1916
+ %mask = call i64 @llvm.amdgcn.icmp.i1 (i1 %cmp , i1 false , i32 33 )
1917
+ ret i64 %mask
1918
+ }
1919
+
1920
+ ; CHECK-LABEL: @fold_icmp_i1_ne_0_icmp_eq_i36(
1921
+ ; CHECK-NEXT: icmp
1922
+ ; CHECK: call i64 @llvm.amdgcn.icmp.i1(i1 %cmp, i1 false, i32 33)
1923
+ define i64 @fold_icmp_i1_ne_0_icmp_eq_i36 (i36 %a , i36 %b ) {
1924
+ %cmp = icmp eq i36 %a , %b
1925
+ %mask = call i64 @llvm.amdgcn.icmp.i1 (i1 %cmp , i1 false , i32 33 )
1926
+ ret i64 %mask
1927
+ }
1928
+
1929
+ ; CHECK-LABEL: @fold_icmp_i1_ne_0_icmp_eq_i128(
1930
+ ; CHECK-NEXT: icmp
1931
+ ; CHECK-NEXT: call i64 @llvm.amdgcn.icmp.i1(i1 %cmp, i1 false, i32 33)
1932
+ define i64 @fold_icmp_i1_ne_0_icmp_eq_i128 (i128 %a , i128 %b ) {
1933
+ %cmp = icmp eq i128 %a , %b
1934
+ %mask = call i64 @llvm.amdgcn.icmp.i1 (i1 %cmp , i1 false , i32 33 )
1935
+ ret i64 %mask
1936
+ }
1937
+
1938
+ ; CHECK-LABEL: @fold_icmp_i1_ne_0_fcmp_oeq_f16(
1939
+ ; CHECK-NEXT: fcmp
1940
+ ; CHECK-NEXT: call i64 @llvm.amdgcn.icmp.i1(i1 %cmp, i1 false, i32 33)
1941
+ define i64 @fold_icmp_i1_ne_0_fcmp_oeq_f16 (half %a , half %b ) {
1942
+ %cmp = fcmp oeq half %a , %b
1943
+ %mask = call i64 @llvm.amdgcn.icmp.i1 (i1 %cmp , i1 false , i32 33 )
1944
+ ret i64 %mask
1945
+ }
1946
+
1947
+ ; CHECK-LABEL: @fold_icmp_i1_ne_0_fcmp_oeq_f128(
1948
+ ; CHECK-NEXT: fcmp
1949
+ ; CHECK-NEXT: call i64 @llvm.amdgcn.icmp.i1(i1 %cmp, i1 false, i32 33)
1950
+ define i64 @fold_icmp_i1_ne_0_fcmp_oeq_f128 (fp128 %a , fp128 %b ) {
1951
+ ;
1952
+ %cmp = fcmp oeq fp128 %a , %b
1953
+ %mask = call i64 @llvm.amdgcn.icmp.i1 (i1 %cmp , i1 false , i32 33 )
1954
+ ret i64 %mask
1955
+ }
1956
+
1957
+ ; CHECK-LABEL: @fold_icmp_i1_ne_0_icmp_slt_i4(
1958
+ ; CHECK-NEXT: icmp
1959
+ ; CHECK-NEXT: call i64 @llvm.amdgcn.icmp.i1(i1 %cmp, i1 false, i32 33)
1960
+ define i64 @fold_icmp_i1_ne_0_icmp_slt_i4 (i4 %a , i4 %b ) {
1961
+ %cmp = icmp slt i4 %a , %b
1962
+ %mask = call i64 @llvm.amdgcn.icmp.i1 (i1 %cmp , i1 false , i32 33 )
1963
+ ret i64 %mask
1964
+ }
1965
+
1966
+ ; CHECK-LABEL: @fold_icmp_i1_ne_0_icmp_slt_i8(
1967
+ ; CHECK-NEXT: icmp
1968
+ ; CHECK-NEXT: call i64 @llvm.amdgcn.icmp.i1(i1 %cmp, i1 false, i32 33)
1969
+ define i64 @fold_icmp_i1_ne_0_icmp_slt_i8 (i8 %a , i8 %b ) {
1970
+ %cmp = icmp slt i8 %a , %b
1971
+ %mask = call i64 @llvm.amdgcn.icmp.i1 (i1 %cmp , i1 false , i32 33 )
1972
+ ret i64 %mask
1973
+ }
1974
+
1975
+ ; CHECK-LABEL: @fold_icmp_i1_ne_0_icmp_slt_i16(
1976
+ ; CHECK-NEXT: icmp
1977
+ ; CHECK-NEXT: call i64 @llvm.amdgcn.icmp.i1(i1 %cmp, i1 false, i32 33)
1978
+ define i64 @fold_icmp_i1_ne_0_icmp_slt_i16 (i16 %a , i16 %b ) {
1979
+ %cmp = icmp slt i16 %a , %b
1980
+ %mask = call i64 @llvm.amdgcn.icmp.i1 (i1 %cmp , i1 false , i32 33 )
1981
+ ret i64 %mask
1982
+ }
1983
+
1984
+ ; CHECK-LABEL: @fold_icmp_i1_ne_0_icmp_ult_i4(
1985
+ ; CHECK-NEXT: icmp
1986
+ ; CHECK-NEXT: call i64 @llvm.amdgcn.icmp.i1(i1 %cmp, i1 false, i32 33)
1987
+ define i64 @fold_icmp_i1_ne_0_icmp_ult_i4 (i4 %a , i4 %b ) {
1988
+ %cmp = icmp ult i4 %a , %b
1989
+ %mask = call i64 @llvm.amdgcn.icmp.i1 (i1 %cmp , i1 false , i32 33 )
1990
+ ret i64 %mask
1991
+ }
1992
+
1993
+ ; CHECK-LABEL: @fold_icmp_i1_ne_0_icmp_ult_i8(
1994
+ ; CHECK-NEXT: icmp
1995
+ ; CHECK-NEXT: call i64 @llvm.amdgcn.icmp.i1(i1 %cmp, i1 false, i32 33)
1996
+ define i64 @fold_icmp_i1_ne_0_icmp_ult_i8 (i8 %a , i8 %b ) {
1997
+ %cmp = icmp ult i8 %a , %b
1998
+ %mask = call i64 @llvm.amdgcn.icmp.i1 (i1 %cmp , i1 false , i32 33 )
1999
+ ret i64 %mask
2000
+ }
2001
+
2002
+ ; CHECK-LABEL: @fold_icmp_i1_ne_0_icmp_ult_i16(
2003
+ ; CHECK-NEXT: icmp
2004
+ ; CHECK-NEXT: call i64 @llvm.amdgcn.icmp.i1(i1 %cmp, i1 false, i32 33)
2005
+ define i64 @fold_icmp_i1_ne_0_icmp_ult_i16 (i16 %a , i16 %b ) {
2006
+ %cmp = icmp ult i16 %a , %b
2007
+ %mask = call i64 @llvm.amdgcn.icmp.i1 (i1 %cmp , i1 false , i32 33 )
2008
+ ret i64 %mask
2009
+ }
2010
+
1818
2011
; --------------------------------------------------------------------
1819
2012
; llvm.amdgcn.fcmp
1820
2013
; --------------------------------------------------------------------
0 commit comments