@@ -1866,3 +1866,219 @@ define void @cmyk_commute11(i8 %r, i8 %g, i8 %b) {
1866
1866
call void @use4 (i8 %ck , i8 %mk , i8 %yk , i8 %k )
1867
1867
ret void
1868
1868
}
1869
+
1870
+ define i8 @smax_offset (i8 %x ) {
1871
+ ; CHECK-LABEL: @smax_offset(
1872
+ ; CHECK-NEXT: [[A:%.*]] = add nsw i8 [[X:%.*]], 3
1873
+ ; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[A]], i8 -124)
1874
+ ; CHECK-NEXT: ret i8 [[M]]
1875
+ ;
1876
+ %a = add nsw i8 %x , 3
1877
+ %m = call i8 @llvm.smax.i8 (i8 %a , i8 -124 )
1878
+ ret i8 %m
1879
+ }
1880
+
1881
+ define i8 @smax_offset_limit (i8 %x ) {
1882
+ ; CHECK-LABEL: @smax_offset_limit(
1883
+ ; CHECK-NEXT: [[A:%.*]] = add nsw i8 [[X:%.*]], 3
1884
+ ; CHECK-NEXT: ret i8 [[A]]
1885
+ ;
1886
+ %a = add nsw i8 %x , 3
1887
+ %m = call i8 @llvm.smax.i8 (i8 %a , i8 -125 )
1888
+ ret i8 %m
1889
+ }
1890
+
1891
+ define i8 @smax_offset_overflow (i8 %x ) {
1892
+ ; CHECK-LABEL: @smax_offset_overflow(
1893
+ ; CHECK-NEXT: [[A:%.*]] = add nsw i8 [[X:%.*]], 3
1894
+ ; CHECK-NEXT: ret i8 [[A]]
1895
+ ;
1896
+ %a = add nsw i8 %x , 3
1897
+ %m = call i8 @llvm.smax.i8 (i8 %a , i8 -126 )
1898
+ ret i8 %m
1899
+ }
1900
+
1901
+ define i8 @smax_offset_may_wrap (i8 %x ) {
1902
+ ; CHECK-LABEL: @smax_offset_may_wrap(
1903
+ ; CHECK-NEXT: [[A:%.*]] = add i8 [[X:%.*]], 3
1904
+ ; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[A]], i8 -124)
1905
+ ; CHECK-NEXT: ret i8 [[M]]
1906
+ ;
1907
+ %a = add i8 %x , 3
1908
+ %m = call i8 @llvm.smax.i8 (i8 %a , i8 -124 )
1909
+ ret i8 %m
1910
+ }
1911
+
1912
+ define i8 @smax_offset_uses (i8 %x ) {
1913
+ ; CHECK-LABEL: @smax_offset_uses(
1914
+ ; CHECK-NEXT: [[A:%.*]] = add nsw i8 [[X:%.*]], 3
1915
+ ; CHECK-NEXT: call void @use(i8 [[A]])
1916
+ ; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[A]], i8 -124)
1917
+ ; CHECK-NEXT: ret i8 [[M]]
1918
+ ;
1919
+ %a = add nsw i8 %x , 3
1920
+ call void @use (i8 %a )
1921
+ %m = call i8 @llvm.smax.i8 (i8 %a , i8 -124 )
1922
+ ret i8 %m
1923
+ }
1924
+
1925
+ define <3 x i8 > @smin_offset (<3 x i8 > %x ) {
1926
+ ; CHECK-LABEL: @smin_offset(
1927
+ ; CHECK-NEXT: [[A:%.*]] = add nsw <3 x i8> [[X:%.*]], <i8 124, i8 124, i8 124>
1928
+ ; CHECK-NEXT: [[M:%.*]] = call <3 x i8> @llvm.smin.v3i8(<3 x i8> [[A]], <3 x i8> <i8 -3, i8 -3, i8 -3>)
1929
+ ; CHECK-NEXT: ret <3 x i8> [[M]]
1930
+ ;
1931
+ %a = add nsw <3 x i8 > %x , <i8 124 , i8 124 , i8 124 >
1932
+ %m = call <3 x i8 > @llvm.smin.v3i8 (<3 x i8 > %a , <3 x i8 > <i8 -3 , i8 -3 , i8 -3 >)
1933
+ ret <3 x i8 > %m
1934
+ }
1935
+
1936
+ define i8 @smin_offset_limit (i8 %x ) {
1937
+ ; CHECK-LABEL: @smin_offset_limit(
1938
+ ; CHECK-NEXT: ret i8 -3
1939
+ ;
1940
+ %a = add nsw i8 %x , 125
1941
+ %m = call i8 @llvm.smin.i8 (i8 %a , i8 -3 )
1942
+ ret i8 %m
1943
+ }
1944
+
1945
+ define i8 @smin_offset_overflow (i8 %x ) {
1946
+ ; CHECK-LABEL: @smin_offset_overflow(
1947
+ ; CHECK-NEXT: ret i8 -3
1948
+ ;
1949
+ %a = add nsw i8 %x , 126
1950
+ %m = call i8 @llvm.smin.i8 (i8 %a , i8 -3 )
1951
+ ret i8 %m
1952
+ }
1953
+
1954
+ define i8 @smin_offset_may_wrap (i8 %x ) {
1955
+ ; CHECK-LABEL: @smin_offset_may_wrap(
1956
+ ; CHECK-NEXT: [[A:%.*]] = add nuw i8 [[X:%.*]], 124
1957
+ ; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[A]], i8 -3)
1958
+ ; CHECK-NEXT: ret i8 [[M]]
1959
+ ;
1960
+ %a = add nuw i8 %x , 124
1961
+ %m = call i8 @llvm.smin.i8 (i8 %a , i8 -3 )
1962
+ ret i8 %m
1963
+ }
1964
+
1965
+ define i8 @smin_offset_uses (i8 %x ) {
1966
+ ; CHECK-LABEL: @smin_offset_uses(
1967
+ ; CHECK-NEXT: [[A:%.*]] = add nsw i8 [[X:%.*]], 124
1968
+ ; CHECK-NEXT: call void @use(i8 [[A]])
1969
+ ; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[A]], i8 -3)
1970
+ ; CHECK-NEXT: ret i8 [[M]]
1971
+ ;
1972
+ %a = add nsw i8 %x , 124
1973
+ call void @use (i8 %a )
1974
+ %m = call i8 @llvm.smin.i8 (i8 %a , i8 -3 )
1975
+ ret i8 %m
1976
+ }
1977
+
1978
+ define <3 x i8 > @umax_offset (<3 x i8 > %x ) {
1979
+ ; CHECK-LABEL: @umax_offset(
1980
+ ; CHECK-NEXT: [[A:%.*]] = add nuw <3 x i8> [[X:%.*]], <i8 3, i8 3, i8 3>
1981
+ ; CHECK-NEXT: [[M:%.*]] = call <3 x i8> @llvm.umax.v3i8(<3 x i8> [[A]], <3 x i8> <i8 4, i8 4, i8 4>)
1982
+ ; CHECK-NEXT: ret <3 x i8> [[M]]
1983
+ ;
1984
+ %a = add nuw <3 x i8 > %x , <i8 3 , i8 3 , i8 3 >
1985
+ %m = call <3 x i8 > @llvm.umax.v3i8 (<3 x i8 > %a , <3 x i8 > <i8 4 , i8 4 , i8 4 >)
1986
+ ret <3 x i8 > %m
1987
+ }
1988
+
1989
+ define i8 @umax_offset_limit (i8 %x ) {
1990
+ ; CHECK-LABEL: @umax_offset_limit(
1991
+ ; CHECK-NEXT: [[A:%.*]] = add nuw i8 [[X:%.*]], 3
1992
+ ; CHECK-NEXT: ret i8 [[A]]
1993
+ ;
1994
+ %a = add nuw i8 %x , 3
1995
+ %m = call i8 @llvm.umax.i8 (i8 %a , i8 3 )
1996
+ ret i8 %m
1997
+ }
1998
+
1999
+ define i8 @umax_offset_overflow (i8 %x ) {
2000
+ ; CHECK-LABEL: @umax_offset_overflow(
2001
+ ; CHECK-NEXT: [[A:%.*]] = add nuw i8 [[X:%.*]], 3
2002
+ ; CHECK-NEXT: ret i8 [[A]]
2003
+ ;
2004
+ %a = add nuw i8 %x , 3
2005
+ %m = call i8 @llvm.umax.i8 (i8 %a , i8 2 )
2006
+ ret i8 %m
2007
+ }
2008
+
2009
+ define i8 @umax_offset_may_wrap (i8 %x ) {
2010
+ ; CHECK-LABEL: @umax_offset_may_wrap(
2011
+ ; CHECK-NEXT: [[A:%.*]] = add i8 [[X:%.*]], 3
2012
+ ; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[A]], i8 4)
2013
+ ; CHECK-NEXT: ret i8 [[M]]
2014
+ ;
2015
+ %a = add i8 %x , 3
2016
+ %m = call i8 @llvm.umax.i8 (i8 %a , i8 4 )
2017
+ ret i8 %m
2018
+ }
2019
+
2020
+ define i8 @umax_offset_uses (i8 %x ) {
2021
+ ; CHECK-LABEL: @umax_offset_uses(
2022
+ ; CHECK-NEXT: [[A:%.*]] = add nuw i8 [[X:%.*]], 3
2023
+ ; CHECK-NEXT: call void @use(i8 [[A]])
2024
+ ; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[A]], i8 4)
2025
+ ; CHECK-NEXT: ret i8 [[M]]
2026
+ ;
2027
+ %a = add nuw i8 %x , 3
2028
+ call void @use (i8 %a )
2029
+ %m = call i8 @llvm.umax.i8 (i8 %a , i8 4 )
2030
+ ret i8 %m
2031
+ }
2032
+
2033
+ define i8 @umin_offset (i8 %x ) {
2034
+ ; CHECK-LABEL: @umin_offset(
2035
+ ; CHECK-NEXT: [[A:%.*]] = add nuw i8 [[X:%.*]], -5
2036
+ ; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[A]], i8 -4)
2037
+ ; CHECK-NEXT: ret i8 [[M]]
2038
+ ;
2039
+ %a = add nuw i8 %x , 251
2040
+ %m = call i8 @llvm.umin.i8 (i8 %a , i8 252 )
2041
+ ret i8 %m
2042
+ }
2043
+
2044
+ define i8 @umin_offset_limit (i8 %x ) {
2045
+ ; CHECK-LABEL: @umin_offset_limit(
2046
+ ; CHECK-NEXT: ret i8 -4
2047
+ ;
2048
+ %a = add nuw i8 %x , 252
2049
+ %m = call i8 @llvm.umin.i8 (i8 %a , i8 252 )
2050
+ ret i8 %m
2051
+ }
2052
+
2053
+ define i8 @umin_offset_overflow (i8 %x ) {
2054
+ ; CHECK-LABEL: @umin_offset_overflow(
2055
+ ; CHECK-NEXT: ret i8 -4
2056
+ ;
2057
+ %a = add nuw i8 %x , 253
2058
+ %m = call i8 @llvm.umin.i8 (i8 %a , i8 252 )
2059
+ ret i8 %m
2060
+ }
2061
+
2062
+ define i8 @umin_offset_may_wrap (i8 %x ) {
2063
+ ; CHECK-LABEL: @umin_offset_may_wrap(
2064
+ ; CHECK-NEXT: [[A:%.*]] = add nsw i8 [[X:%.*]], -5
2065
+ ; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[A]], i8 -4)
2066
+ ; CHECK-NEXT: ret i8 [[M]]
2067
+ ;
2068
+ %a = add nsw i8 %x , 251
2069
+ %m = call i8 @llvm.umin.i8 (i8 %a , i8 252 )
2070
+ ret i8 %m
2071
+ }
2072
+
2073
+ define i8 @umin_offset_uses (i8 %x ) {
2074
+ ; CHECK-LABEL: @umin_offset_uses(
2075
+ ; CHECK-NEXT: [[A:%.*]] = add nuw i8 [[X:%.*]], -5
2076
+ ; CHECK-NEXT: call void @use(i8 [[A]])
2077
+ ; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[A]], i8 -4)
2078
+ ; CHECK-NEXT: ret i8 [[M]]
2079
+ ;
2080
+ %a = add nuw i8 %x , 251
2081
+ call void @use (i8 %a )
2082
+ %m = call i8 @llvm.umin.i8 (i8 %a , i8 252 )
2083
+ ret i8 %m
2084
+ }
0 commit comments