Skip to content

Commit 2f45b56

Browse files
committed
[InstSimplify] Add pre-commit tests for PR65905. NFC.
1 parent 1c8c365 commit 2f45b56

File tree

2 files changed

+326
-0
lines changed

2 files changed

+326
-0
lines changed

llvm/test/Transforms/InstSimplify/compare.ll

Lines changed: 221 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1919,6 +1919,227 @@ define i1 @tautological8(i32 %A, i32 %B) {
19191919
ret i1 %D
19201920
}
19211921

1922+
define i1 @tautological9(i32 %A) {
1923+
; CHECK-LABEL: @tautological9(
1924+
; CHECK-NEXT: [[C1:%.*]] = and i32 [[A:%.*]], 1
1925+
; CHECK-NEXT: [[C2:%.*]] = and i32 [[A]], 3
1926+
; CHECK-NEXT: [[D:%.*]] = icmp ugt i32 [[C1]], [[C2]]
1927+
; CHECK-NEXT: ret i1 [[D]]
1928+
;
1929+
%C1 = and i32 %A, 1
1930+
%C2 = and i32 %A, 3
1931+
%D = icmp ugt i32 %C1, %C2
1932+
ret i1 %D
1933+
}
1934+
1935+
define <2 x i1> @tautological9_vec(<2 x i32> %A) {
1936+
; CHECK-LABEL: @tautological9_vec(
1937+
; CHECK-NEXT: [[C1:%.*]] = and <2 x i32> [[A:%.*]], <i32 1, i32 1>
1938+
; CHECK-NEXT: [[C2:%.*]] = and <2 x i32> [[A]], <i32 3, i32 3>
1939+
; CHECK-NEXT: [[D:%.*]] = icmp ugt <2 x i32> [[C1]], [[C2]]
1940+
; CHECK-NEXT: ret <2 x i1> [[D]]
1941+
;
1942+
%C1 = and <2 x i32> %A, <i32 1, i32 1>
1943+
%C2 = and <2 x i32> %A, <i32 3, i32 3>
1944+
%D = icmp ugt <2 x i32> %C1, %C2
1945+
ret <2 x i1> %D
1946+
}
1947+
1948+
define i1 @tautological10(i32 %A) {
1949+
; CHECK-LABEL: @tautological10(
1950+
; CHECK-NEXT: [[C1:%.*]] = and i32 [[A:%.*]], 1
1951+
; CHECK-NEXT: [[C2:%.*]] = and i32 [[A]], 3
1952+
; CHECK-NEXT: [[D:%.*]] = icmp ule i32 [[C1]], [[C2]]
1953+
; CHECK-NEXT: ret i1 [[D]]
1954+
;
1955+
%C1 = and i32 %A, 1
1956+
%C2 = and i32 %A, 3
1957+
%D = icmp ule i32 %C1, %C2
1958+
ret i1 %D
1959+
}
1960+
1961+
define i1 @tautological11(i32 %A) {
1962+
; CHECK-LABEL: @tautological11(
1963+
; CHECK-NEXT: [[C1:%.*]] = or i32 [[A:%.*]], 1
1964+
; CHECK-NEXT: [[C2:%.*]] = or i32 [[A]], 3
1965+
; CHECK-NEXT: [[D:%.*]] = icmp ule i32 [[C1]], [[C2]]
1966+
; CHECK-NEXT: ret i1 [[D]]
1967+
;
1968+
%C1 = or i32 %A, 1
1969+
%C2 = or i32 %A, 3
1970+
%D = icmp ule i32 %C1, %C2
1971+
ret i1 %D
1972+
}
1973+
1974+
define i1 @tautological12(i32 %A) {
1975+
; CHECK-LABEL: @tautological12(
1976+
; CHECK-NEXT: [[C1:%.*]] = or i32 [[A:%.*]], 1
1977+
; CHECK-NEXT: [[C2:%.*]] = or i32 [[A]], 3
1978+
; CHECK-NEXT: [[D:%.*]] = icmp ugt i32 [[C1]], [[C2]]
1979+
; CHECK-NEXT: ret i1 [[D]]
1980+
;
1981+
%C1 = or i32 %A, 1
1982+
%C2 = or i32 %A, 3
1983+
%D = icmp ugt i32 %C1, %C2
1984+
ret i1 %D
1985+
}
1986+
1987+
define i1 @tautological13(i32 %A) {
1988+
; CHECK-LABEL: @tautological13(
1989+
; CHECK-NEXT: [[C1:%.*]] = or i32 [[A:%.*]], 1
1990+
; CHECK-NEXT: [[C2:%.*]] = or i32 [[A]], 3
1991+
; CHECK-NEXT: [[D:%.*]] = icmp ult i32 [[C2]], [[C1]]
1992+
; CHECK-NEXT: ret i1 [[D]]
1993+
;
1994+
%C1 = or i32 %A, 1
1995+
%C2 = or i32 %A, 3
1996+
%D = icmp ult i32 %C2, %C1
1997+
ret i1 %D
1998+
}
1999+
2000+
define i1 @tautological14(i32 %A) {
2001+
; CHECK-LABEL: @tautological14(
2002+
; CHECK-NEXT: [[C1:%.*]] = or i32 [[A:%.*]], 1
2003+
; CHECK-NEXT: [[C2:%.*]] = or i32 [[A]], 3
2004+
; CHECK-NEXT: [[D:%.*]] = icmp uge i32 [[C2]], [[C1]]
2005+
; CHECK-NEXT: ret i1 [[D]]
2006+
;
2007+
%C1 = or i32 %A, 1
2008+
%C2 = or i32 %A, 3
2009+
%D = icmp uge i32 %C2, %C1
2010+
ret i1 %D
2011+
}
2012+
2013+
define i1 @tautological15(i32 %A) {
2014+
; CHECK-LABEL: @tautological15(
2015+
; CHECK-NEXT: [[C1:%.*]] = and i32 [[A:%.*]], 1
2016+
; CHECK-NEXT: [[C2:%.*]] = and i32 [[A]], 3
2017+
; CHECK-NEXT: [[D:%.*]] = icmp uge i32 [[C2]], [[C1]]
2018+
; CHECK-NEXT: ret i1 [[D]]
2019+
;
2020+
%C1 = and i32 %A, 1
2021+
%C2 = and i32 %A, 3
2022+
%D = icmp uge i32 %C2, %C1
2023+
ret i1 %D
2024+
}
2025+
2026+
define i1 @tautological16(i32 %A) {
2027+
; CHECK-LABEL: @tautological16(
2028+
; CHECK-NEXT: [[C1:%.*]] = and i32 [[A:%.*]], 1
2029+
; CHECK-NEXT: [[C2:%.*]] = and i32 [[A]], 3
2030+
; CHECK-NEXT: [[D:%.*]] = icmp ult i32 [[C2]], [[C1]]
2031+
; CHECK-NEXT: ret i1 [[D]]
2032+
;
2033+
%C1 = and i32 %A, 1
2034+
%C2 = and i32 %A, 3
2035+
%D = icmp ult i32 %C2, %C1
2036+
ret i1 %D
2037+
}
2038+
2039+
define i1 @tautological9_negative(i32 %A) {
2040+
; CHECK-LABEL: @tautological9_negative(
2041+
; CHECK-NEXT: [[C1:%.*]] = and i32 [[A:%.*]], 1
2042+
; CHECK-NEXT: [[C2:%.*]] = and i32 [[A]], 2
2043+
; CHECK-NEXT: [[D:%.*]] = icmp ugt i32 [[C1]], [[C2]]
2044+
; CHECK-NEXT: ret i1 [[D]]
2045+
;
2046+
%C1 = and i32 %A, 1
2047+
%C2 = and i32 %A, 2
2048+
%D = icmp ugt i32 %C1, %C2
2049+
ret i1 %D
2050+
}
2051+
2052+
define i1 @tautological10_negative(i32 %A) {
2053+
; CHECK-LABEL: @tautological10_negative(
2054+
; CHECK-NEXT: [[C1:%.*]] = and i32 [[A:%.*]], 1
2055+
; CHECK-NEXT: [[C2:%.*]] = and i32 [[A]], 2
2056+
; CHECK-NEXT: [[D:%.*]] = icmp ule i32 [[C1]], [[C2]]
2057+
; CHECK-NEXT: ret i1 [[D]]
2058+
;
2059+
%C1 = and i32 %A, 1
2060+
%C2 = and i32 %A, 2
2061+
%D = icmp ule i32 %C1, %C2
2062+
ret i1 %D
2063+
}
2064+
2065+
define i1 @tautological11_negative(i32 %A) {
2066+
; CHECK-LABEL: @tautological11_negative(
2067+
; CHECK-NEXT: [[C1:%.*]] = or i32 [[A:%.*]], 1
2068+
; CHECK-NEXT: [[C2:%.*]] = or i32 [[A]], 2
2069+
; CHECK-NEXT: [[D:%.*]] = icmp ule i32 [[C1]], [[C2]]
2070+
; CHECK-NEXT: ret i1 [[D]]
2071+
;
2072+
%C1 = or i32 %A, 1
2073+
%C2 = or i32 %A, 2
2074+
%D = icmp ule i32 %C1, %C2
2075+
ret i1 %D
2076+
}
2077+
2078+
define i1 @tautological12_negative(i32 %A) {
2079+
; CHECK-LABEL: @tautological12_negative(
2080+
; CHECK-NEXT: [[C1:%.*]] = or i32 [[A:%.*]], 1
2081+
; CHECK-NEXT: [[C2:%.*]] = or i32 [[A]], 2
2082+
; CHECK-NEXT: [[D:%.*]] = icmp ugt i32 [[C1]], [[C2]]
2083+
; CHECK-NEXT: ret i1 [[D]]
2084+
;
2085+
%C1 = or i32 %A, 1
2086+
%C2 = or i32 %A, 2
2087+
%D = icmp ugt i32 %C1, %C2
2088+
ret i1 %D
2089+
}
2090+
2091+
define i1 @tautological13_negative(i32 %A) {
2092+
; CHECK-LABEL: @tautological13_negative(
2093+
; CHECK-NEXT: [[C1:%.*]] = or i32 [[A:%.*]], 1
2094+
; CHECK-NEXT: [[C2:%.*]] = or i32 [[A]], 2
2095+
; CHECK-NEXT: [[D:%.*]] = icmp ult i32 [[C2]], [[C1]]
2096+
; CHECK-NEXT: ret i1 [[D]]
2097+
;
2098+
%C1 = or i32 %A, 1
2099+
%C2 = or i32 %A, 2
2100+
%D = icmp ult i32 %C2, %C1
2101+
ret i1 %D
2102+
}
2103+
2104+
define i1 @tautological14_negative(i32 %A) {
2105+
; CHECK-LABEL: @tautological14_negative(
2106+
; CHECK-NEXT: [[C1:%.*]] = or i32 [[A:%.*]], 1
2107+
; CHECK-NEXT: [[C2:%.*]] = or i32 [[A]], 2
2108+
; CHECK-NEXT: [[D:%.*]] = icmp uge i32 [[C2]], [[C1]]
2109+
; CHECK-NEXT: ret i1 [[D]]
2110+
;
2111+
%C1 = or i32 %A, 1
2112+
%C2 = or i32 %A, 2
2113+
%D = icmp uge i32 %C2, %C1
2114+
ret i1 %D
2115+
}
2116+
2117+
define i1 @tautological15_negative(i32 %A) {
2118+
; CHECK-LABEL: @tautological15_negative(
2119+
; CHECK-NEXT: [[C1:%.*]] = and i32 [[A:%.*]], 1
2120+
; CHECK-NEXT: [[C2:%.*]] = and i32 [[A]], 2
2121+
; CHECK-NEXT: [[D:%.*]] = icmp uge i32 [[C2]], [[C1]]
2122+
; CHECK-NEXT: ret i1 [[D]]
2123+
;
2124+
%C1 = and i32 %A, 1
2125+
%C2 = and i32 %A, 2
2126+
%D = icmp uge i32 %C2, %C1
2127+
ret i1 %D
2128+
}
2129+
2130+
define i1 @tautological16_negative(i32 %A) {
2131+
; CHECK-LABEL: @tautological16_negative(
2132+
; CHECK-NEXT: [[C1:%.*]] = and i32 [[A:%.*]], 1
2133+
; CHECK-NEXT: [[C2:%.*]] = and i32 [[A]], 2
2134+
; CHECK-NEXT: [[D:%.*]] = icmp ult i32 [[C2]], [[C1]]
2135+
; CHECK-NEXT: ret i1 [[D]]
2136+
;
2137+
%C1 = and i32 %A, 1
2138+
%C2 = and i32 %A, 2
2139+
%D = icmp ult i32 %C2, %C1
2140+
ret i1 %D
2141+
}
2142+
19222143
declare void @helper_i1(i1)
19232144
; Series of tests for icmp s[lt|ge] (or A, B), A and icmp s[gt|le] A, (or A, B)
19242145
define void @icmp_slt_sge_or(i32 %Ax, i32 %Bx) {

llvm/test/Transforms/InstSimplify/maxmin_intrinsics.ll

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2332,3 +2332,108 @@ false:
23322332
%m2 = call i8 @llvm.smin.i8(i8 %x, i8 %y)
23332333
ret i8 %m2
23342334
}
2335+
2336+
; Tests from PR65833
2337+
define i8 @umin_and_mask(i8 %x) {
2338+
; CHECK-LABEL: @umin_and_mask(
2339+
; CHECK-NEXT: [[AND1:%.*]] = and i8 [[X:%.*]], 1
2340+
; CHECK-NEXT: [[AND2:%.*]] = and i8 [[X]], 3
2341+
; CHECK-NEXT: [[VAL:%.*]] = call i8 @llvm.umin.i8(i8 [[AND1]], i8 [[AND2]])
2342+
; CHECK-NEXT: ret i8 [[VAL]]
2343+
;
2344+
%and1 = and i8 %x, 1
2345+
%and2 = and i8 %x, 3
2346+
%val = call i8 @llvm.umin.i8(i8 %and1, i8 %and2)
2347+
ret i8 %val
2348+
}
2349+
2350+
define i8 @umax_and_mask(i8 %x) {
2351+
; CHECK-LABEL: @umax_and_mask(
2352+
; CHECK-NEXT: [[AND1:%.*]] = and i8 [[X:%.*]], 1
2353+
; CHECK-NEXT: [[AND2:%.*]] = and i8 [[X]], 3
2354+
; CHECK-NEXT: [[VAL:%.*]] = call i8 @llvm.umax.i8(i8 [[AND1]], i8 [[AND2]])
2355+
; CHECK-NEXT: ret i8 [[VAL]]
2356+
;
2357+
%and1 = and i8 %x, 1
2358+
%and2 = and i8 %x, 3
2359+
%val = call i8 @llvm.umax.i8(i8 %and1, i8 %and2)
2360+
ret i8 %val
2361+
}
2362+
2363+
define i8 @umin_or_mask(i8 %x) {
2364+
; CHECK-LABEL: @umin_or_mask(
2365+
; CHECK-NEXT: [[AND1:%.*]] = or i8 [[X:%.*]], 1
2366+
; CHECK-NEXT: [[AND2:%.*]] = or i8 [[X]], 3
2367+
; CHECK-NEXT: [[VAL:%.*]] = call i8 @llvm.umin.i8(i8 [[AND1]], i8 [[AND2]])
2368+
; CHECK-NEXT: ret i8 [[VAL]]
2369+
;
2370+
%and1 = or i8 %x, 1
2371+
%and2 = or i8 %x, 3
2372+
%val = call i8 @llvm.umin.i8(i8 %and1, i8 %and2)
2373+
ret i8 %val
2374+
}
2375+
2376+
define i8 @umax_or_mask(i8 %x) {
2377+
; CHECK-LABEL: @umax_or_mask(
2378+
; CHECK-NEXT: [[AND1:%.*]] = or i8 [[X:%.*]], 1
2379+
; CHECK-NEXT: [[AND2:%.*]] = or i8 [[X]], 3
2380+
; CHECK-NEXT: [[VAL:%.*]] = call i8 @llvm.umax.i8(i8 [[AND1]], i8 [[AND2]])
2381+
; CHECK-NEXT: ret i8 [[VAL]]
2382+
;
2383+
%and1 = or i8 %x, 1
2384+
%and2 = or i8 %x, 3
2385+
%val = call i8 @llvm.umax.i8(i8 %and1, i8 %and2)
2386+
ret i8 %val
2387+
}
2388+
2389+
define i8 @umin_and_mask_negative(i8 %x) {
2390+
; CHECK-LABEL: @umin_and_mask_negative(
2391+
; CHECK-NEXT: [[AND1:%.*]] = and i8 [[X:%.*]], 1
2392+
; CHECK-NEXT: [[AND2:%.*]] = and i8 [[X]], 2
2393+
; CHECK-NEXT: [[VAL:%.*]] = call i8 @llvm.umin.i8(i8 [[AND1]], i8 [[AND2]])
2394+
; CHECK-NEXT: ret i8 [[VAL]]
2395+
;
2396+
%and1 = and i8 %x, 1
2397+
%and2 = and i8 %x, 2
2398+
%val = call i8 @llvm.umin.i8(i8 %and1, i8 %and2)
2399+
ret i8 %val
2400+
}
2401+
2402+
define i8 @umax_and_mask_negative(i8 %x) {
2403+
; CHECK-LABEL: @umax_and_mask_negative(
2404+
; CHECK-NEXT: [[AND1:%.*]] = and i8 [[X:%.*]], 1
2405+
; CHECK-NEXT: [[AND2:%.*]] = and i8 [[X]], 2
2406+
; CHECK-NEXT: [[VAL:%.*]] = call i8 @llvm.umax.i8(i8 [[AND1]], i8 [[AND2]])
2407+
; CHECK-NEXT: ret i8 [[VAL]]
2408+
;
2409+
%and1 = and i8 %x, 1
2410+
%and2 = and i8 %x, 2
2411+
%val = call i8 @llvm.umax.i8(i8 %and1, i8 %and2)
2412+
ret i8 %val
2413+
}
2414+
2415+
define i8 @umin_or_mask_negative(i8 %x) {
2416+
; CHECK-LABEL: @umin_or_mask_negative(
2417+
; CHECK-NEXT: [[AND1:%.*]] = or i8 [[X:%.*]], 1
2418+
; CHECK-NEXT: [[AND2:%.*]] = or i8 [[X]], 2
2419+
; CHECK-NEXT: [[VAL:%.*]] = call i8 @llvm.umin.i8(i8 [[AND1]], i8 [[AND2]])
2420+
; CHECK-NEXT: ret i8 [[VAL]]
2421+
;
2422+
%and1 = or i8 %x, 1
2423+
%and2 = or i8 %x, 2
2424+
%val = call i8 @llvm.umin.i8(i8 %and1, i8 %and2)
2425+
ret i8 %val
2426+
}
2427+
2428+
define i8 @umax_or_mask_negative(i8 %x) {
2429+
; CHECK-LABEL: @umax_or_mask_negative(
2430+
; CHECK-NEXT: [[AND1:%.*]] = or i8 [[X:%.*]], 1
2431+
; CHECK-NEXT: [[AND2:%.*]] = or i8 [[X]], 2
2432+
; CHECK-NEXT: [[VAL:%.*]] = call i8 @llvm.umax.i8(i8 [[AND1]], i8 [[AND2]])
2433+
; CHECK-NEXT: ret i8 [[VAL]]
2434+
;
2435+
%and1 = or i8 %x, 1
2436+
%and2 = or i8 %x, 2
2437+
%val = call i8 @llvm.umax.i8(i8 %and1, i8 %and2)
2438+
ret i8 %val
2439+
}

0 commit comments

Comments
 (0)