Skip to content

Commit 986fc2c

Browse files
committed
pre-commit tests
1 parent 3d91a71 commit 986fc2c

File tree

1 file changed

+345
-0
lines changed

1 file changed

+345
-0
lines changed
Lines changed: 345 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,345 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2+
; RUN: opt < %s -passes=instcombine -S | FileCheck %s
3+
4+
; smax(smin(X, MinC), MaxC) -> smin(smax(X, MaxC), MinC)
5+
; umax(umin(X, MinC), MaxC) -> umin(smax(X, MaxC), MinC)
6+
7+
8+
define i16 @smax_smin(i16 %x) {
9+
; CHECK-LABEL: define i16 @smax_smin(
10+
; CHECK-SAME: i16 [[X:%.*]]) {
11+
; CHECK-NEXT: [[MIN:%.*]] = call i16 @llvm.smin.i16(i16 [[X]], i16 255)
12+
; CHECK-NEXT: [[MAX:%.*]] = call i16 @llvm.smax.i16(i16 [[MIN]], i16 -1)
13+
; CHECK-NEXT: ret i16 [[MAX]]
14+
;
15+
%min = call i16 @llvm.smin.i16(i16 %x, i16 255)
16+
%max = call i16 @llvm.smax.i16(i16 %min, i16 -1)
17+
ret i16 %max
18+
}
19+
20+
define i16 @umax_umin(i16 %x) {
21+
; CHECK-LABEL: define i16 @umax_umin(
22+
; CHECK-SAME: i16 [[X:%.*]]) {
23+
; CHECK-NEXT: [[MIN:%.*]] = call i16 @llvm.umin.i16(i16 [[X]], i16 255)
24+
; CHECK-NEXT: [[MAX:%.*]] = call i16 @llvm.umax.i16(i16 [[MIN]], i16 63)
25+
; CHECK-NEXT: ret i16 [[MAX]]
26+
;
27+
%min = call i16 @llvm.umin.i16(i16 %x, i16 255)
28+
%max = call i16 @llvm.umax.i16(i16 %min, i16 63)
29+
ret i16 %max
30+
}
31+
32+
define i16 @smax_smin_commute0(i16 %x) {
33+
; CHECK-LABEL: define i16 @smax_smin_commute0(
34+
; CHECK-SAME: i16 [[X:%.*]]) {
35+
; CHECK-NEXT: [[MIN:%.*]] = call i16 @llvm.smin.i16(i16 [[X]], i16 127)
36+
; CHECK-NEXT: [[MAX:%.*]] = call i16 @llvm.smax.i16(i16 [[MIN]], i16 -128)
37+
; CHECK-NEXT: ret i16 [[MAX]]
38+
;
39+
%min = call i16 @llvm.smin.i16(i16 %x, i16 127)
40+
%max = call i16 @llvm.smax.i16(i16 %min, i16 -128)
41+
ret i16 %max
42+
}
43+
44+
define i16 @umax_umin_commute0(i16 %x) {
45+
; CHECK-LABEL: define i16 @umax_umin_commute0(
46+
; CHECK-SAME: i16 [[X:%.*]]) {
47+
; CHECK-NEXT: [[MIN:%.*]] = call i16 @llvm.umin.i16(i16 [[X]], i16 255)
48+
; CHECK-NEXT: [[MAX:%.*]] = call i16 @llvm.umax.i16(i16 [[MIN]], i16 127)
49+
; CHECK-NEXT: ret i16 [[MAX]]
50+
;
51+
%min = call i16 @llvm.umin.i16(i16 %x, i16 255)
52+
%max = call i16 @llvm.umax.i16(i16 %min, i16 127)
53+
ret i16 %max
54+
}
55+
56+
define i16 @smax_smin_commute1(i16 %x) {
57+
; CHECK-LABEL: define i16 @smax_smin_commute1(
58+
; CHECK-SAME: i16 [[X:%.*]]) {
59+
; CHECK-NEXT: [[MIN:%.*]] = call i16 @llvm.smin.i16(i16 [[X]], i16 127)
60+
; CHECK-NEXT: [[MAX:%.*]] = call i16 @llvm.smax.i16(i16 [[MIN]], i16 -128)
61+
; CHECK-NEXT: ret i16 [[MAX]]
62+
;
63+
%min = call i16 @llvm.smin.i16(i16 127, i16 %x)
64+
%max = call i16 @llvm.smax.i16(i16 %min, i16 -128)
65+
ret i16 %max
66+
}
67+
68+
define i16 @umax_umin_commute1(i16 %x) {
69+
; CHECK-LABEL: define i16 @umax_umin_commute1(
70+
; CHECK-SAME: i16 [[X:%.*]]) {
71+
; CHECK-NEXT: [[MIN:%.*]] = call i16 @llvm.umin.i16(i16 [[X]], i16 255)
72+
; CHECK-NEXT: [[MAX:%.*]] = call i16 @llvm.umax.i16(i16 [[MIN]], i16 127)
73+
; CHECK-NEXT: ret i16 [[MAX]]
74+
;
75+
%min = call i16 @llvm.umin.i16(i16 255, i16 %x)
76+
%max = call i16 @llvm.umax.i16(i16 %min, i16 127)
77+
ret i16 %max
78+
}
79+
80+
define i16 @smax_smin_commute2(i16 %x) {
81+
; CHECK-LABEL: define i16 @smax_smin_commute2(
82+
; CHECK-SAME: i16 [[X:%.*]]) {
83+
; CHECK-NEXT: [[MIN:%.*]] = call i16 @llvm.smin.i16(i16 [[X]], i16 127)
84+
; CHECK-NEXT: [[MAX:%.*]] = call i16 @llvm.smax.i16(i16 [[MIN]], i16 -128)
85+
; CHECK-NEXT: ret i16 [[MAX]]
86+
;
87+
%min = call i16 @llvm.smin.i16(i16 %x, i16 127)
88+
%max = call i16 @llvm.smax.i16(i16 -128, i16 %min)
89+
ret i16 %max
90+
}
91+
92+
define i16 @umax_umin_commute2(i16 %x) {
93+
; CHECK-LABEL: define i16 @umax_umin_commute2(
94+
; CHECK-SAME: i16 [[X:%.*]]) {
95+
; CHECK-NEXT: [[MIN:%.*]] = call i16 @llvm.umin.i16(i16 [[X]], i16 255)
96+
; CHECK-NEXT: [[MAX:%.*]] = call i16 @llvm.umax.i16(i16 [[MIN]], i16 127)
97+
; CHECK-NEXT: ret i16 [[MAX]]
98+
;
99+
%min = call i16 @llvm.umin.i16(i16 %x, i16 255)
100+
%max = call i16 @llvm.umax.i16(i16 127, i16 %min)
101+
ret i16 %max
102+
}
103+
104+
define i16 @smax_smin_commute3(i16 %x) {
105+
; CHECK-LABEL: define i16 @smax_smin_commute3(
106+
; CHECK-SAME: i16 [[X:%.*]]) {
107+
; CHECK-NEXT: [[MIN:%.*]] = call i16 @llvm.smin.i16(i16 [[X]], i16 127)
108+
; CHECK-NEXT: [[MAX:%.*]] = call i16 @llvm.smax.i16(i16 [[MIN]], i16 -128)
109+
; CHECK-NEXT: ret i16 [[MAX]]
110+
;
111+
%min = call i16 @llvm.smin.i16(i16 %x, i16 127)
112+
%max = call i16 @llvm.smax.i16(i16 %min, i16 -128)
113+
ret i16 %max
114+
}
115+
116+
define i16 @umax_umin_commute3(i16 %x) {
117+
; CHECK-LABEL: define i16 @umax_umin_commute3(
118+
; CHECK-SAME: i16 [[X:%.*]]) {
119+
; CHECK-NEXT: [[MIN:%.*]] = call i16 @llvm.umin.i16(i16 [[X]], i16 255)
120+
; CHECK-NEXT: [[MAX:%.*]] = call i16 @llvm.umax.i16(i16 [[MIN]], i16 127)
121+
; CHECK-NEXT: ret i16 [[MAX]]
122+
;
123+
%min = call i16 @llvm.umin.i16(i16 %x, i16 255)
124+
%max = call i16 @llvm.umax.i16(i16 %min, i16 127)
125+
ret i16 %max
126+
}
127+
128+
define <2 x i16> @smax_smin_v2i16(<2 x i16> %x) {
129+
; CHECK-LABEL: define <2 x i16> @smax_smin_v2i16(
130+
; CHECK-SAME: <2 x i16> [[X:%.*]]) {
131+
; CHECK-NEXT: [[MIN:%.*]] = call <2 x i16> @llvm.smin.v2i16(<2 x i16> [[X]], <2 x i16> splat (i16 127))
132+
; CHECK-NEXT: [[MAX:%.*]] = call <2 x i16> @llvm.smax.v2i16(<2 x i16> [[MIN]], <2 x i16> splat (i16 -128))
133+
; CHECK-NEXT: ret <2 x i16> [[MAX]]
134+
;
135+
%min = call <2 x i16> @llvm.smin.v2i16(<2 x i16> %x, <2 x i16> splat (i16 127))
136+
%max = call <2 x i16> @llvm.smax.v2i16(<2 x i16> %min, <2 x i16> splat (i16 -128))
137+
ret <2 x i16> %max
138+
}
139+
140+
define <2 x i16> @umax_umin_v2i16(<2 x i16> %x) {
141+
; CHECK-LABEL: define <2 x i16> @umax_umin_v2i16(
142+
; CHECK-SAME: <2 x i16> [[X:%.*]]) {
143+
; CHECK-NEXT: [[MIN:%.*]] = call <2 x i16> @llvm.umin.v2i16(<2 x i16> [[X]], <2 x i16> splat (i16 255))
144+
; CHECK-NEXT: [[MAX:%.*]] = call <2 x i16> @llvm.umax.v2i16(<2 x i16> [[MIN]], <2 x i16> splat (i16 127))
145+
; CHECK-NEXT: ret <2 x i16> [[MAX]]
146+
;
147+
%min = call <2 x i16> @llvm.umin.v2i16(<2 x i16> %x, <2 x i16> splat (i16 255))
148+
%max = call <2 x i16> @llvm.umax.v2i16(<2 x i16> %min, <2 x i16> splat (i16 127))
149+
ret <2 x i16> %max
150+
}
151+
152+
define <2 x i8> @smax_smin_v2i16_nonsplat_1(<2 x i8> %a) {
153+
; CHECK-LABEL: define <2 x i8> @smax_smin_v2i16_nonsplat_1(
154+
; CHECK-SAME: <2 x i8> [[A:%.*]]) {
155+
; CHECK-NEXT: [[MIN:%.*]] = call <2 x i8> @llvm.smin.v2i8(<2 x i8> [[A]], <2 x i8> <i8 20, i8 10>)
156+
; CHECK-NEXT: [[MAX:%.*]] = call <2 x i8> @llvm.smax.v2i8(<2 x i8> [[MIN]], <2 x i8> <i8 10, i8 0>)
157+
; CHECK-NEXT: ret <2 x i8> [[MAX]]
158+
;
159+
%min = call <2 x i8> @llvm.smin(<2 x i8> %a, <2 x i8> <i8 20, i8 10>)
160+
%max = call <2 x i8> @llvm.smax(<2 x i8> %min, <2 x i8> <i8 10, i8 0>)
161+
ret <2 x i8> %max
162+
}
163+
164+
define <2 x i16> @umax_umin_v2i16_nonsplat_1(<2 x i16> %a) {
165+
; CHECK-LABEL: define <2 x i16> @umax_umin_v2i16_nonsplat_1(
166+
; CHECK-SAME: <2 x i16> [[A:%.*]]) {
167+
; CHECK-NEXT: [[MIN:%.*]] = call <2 x i16> @llvm.umin.v2i16(<2 x i16> [[A]], <2 x i16> <i16 20, i16 10>)
168+
; CHECK-NEXT: [[MAX:%.*]] = call <2 x i16> @llvm.umax.v2i16(<2 x i16> [[MIN]], <2 x i16> <i16 10, i16 1>)
169+
; CHECK-NEXT: ret <2 x i16> [[MAX]]
170+
;
171+
%min = call <2 x i16> @llvm.umin(<2 x i16> %a, <2 x i16> <i16 20, i16 10>)
172+
%max = call <2 x i16> @llvm.umax(<2 x i16> %min, <2 x i16> <i16 10, i16 1>)
173+
ret <2 x i16> %max
174+
}
175+
176+
define <2 x i8> @smax_smin_v2i16_nonsplat_2(<2 x i8> %a) {
177+
; CHECK-LABEL: define <2 x i8> @smax_smin_v2i16_nonsplat_2(
178+
; CHECK-SAME: <2 x i8> [[A:%.*]]) {
179+
; CHECK-NEXT: [[MIN:%.*]] = call <2 x i8> @llvm.smin.v2i8(<2 x i8> [[A]], <2 x i8> <i8 0, i8 10>)
180+
; CHECK-NEXT: [[MAX:%.*]] = call <2 x i8> @llvm.smax.v2i8(<2 x i8> [[MIN]], <2 x i8> <i8 10, i8 0>)
181+
; CHECK-NEXT: ret <2 x i8> [[MAX]]
182+
;
183+
%min = call <2 x i8> @llvm.smin(<2 x i8> %a, <2 x i8> <i8 0, i8 10>)
184+
%max = call <2 x i8> @llvm.smax(<2 x i8> %min, <2 x i8> <i8 10, i8 0>)
185+
ret <2 x i8> %max
186+
}
187+
188+
define <2 x i16> @umax_umin_v2i16_nonsplat_2(<2 x i16> %a) {
189+
; CHECK-LABEL: define <2 x i16> @umax_umin_v2i16_nonsplat_2(
190+
; CHECK-SAME: <2 x i16> [[A:%.*]]) {
191+
; CHECK-NEXT: [[MIN:%.*]] = call <2 x i16> @llvm.umin.v2i16(<2 x i16> [[A]], <2 x i16> <i16 1, i16 10>)
192+
; CHECK-NEXT: [[MAX:%.*]] = call <2 x i16> @llvm.umax.v2i16(<2 x i16> [[MIN]], <2 x i16> <i16 10, i16 1>)
193+
; CHECK-NEXT: ret <2 x i16> [[MAX]]
194+
;
195+
%min = call <2 x i16> @llvm.umin(<2 x i16> %a, <2 x i16> <i16 1, i16 10>)
196+
%max = call <2 x i16> @llvm.umax(<2 x i16> %min, <2 x i16> <i16 10, i16 1>)
197+
ret <2 x i16> %max
198+
}
199+
200+
declare void @use(i16)
201+
202+
define i16 @smax_smin_used(i16 %x) {
203+
; CHECK-LABEL: define i16 @smax_smin_used(
204+
; CHECK-SAME: i16 [[X:%.*]]) {
205+
; CHECK-NEXT: [[MIN:%.*]] = call i16 @llvm.smin.i16(i16 [[X]], i16 127)
206+
; CHECK-NEXT: [[MAX:%.*]] = call i16 @llvm.smax.i16(i16 [[MIN]], i16 -128)
207+
; CHECK-NEXT: call void @use(i16 [[MIN]])
208+
; CHECK-NEXT: ret i16 [[MAX]]
209+
;
210+
%min = call i16 @llvm.smin.i16(i16 %x, i16 127)
211+
%max = call i16 @llvm.smax.i16(i16 %min, i16 -128)
212+
call void @use(i16 %min)
213+
ret i16 %max
214+
}
215+
216+
define i16 @umax_umin_used(i16 %x) {
217+
; CHECK-LABEL: define i16 @umax_umin_used(
218+
; CHECK-SAME: i16 [[X:%.*]]) {
219+
; CHECK-NEXT: [[MIN:%.*]] = call i16 @llvm.umin.i16(i16 [[X]], i16 255)
220+
; CHECK-NEXT: [[MAX:%.*]] = call i16 @llvm.umax.i16(i16 [[MIN]], i16 127)
221+
; CHECK-NEXT: call void @use(i16 [[MIN]])
222+
; CHECK-NEXT: ret i16 [[MAX]]
223+
;
224+
%min = call i16 @llvm.umin.i16(i16 %x, i16 255)
225+
%max = call i16 @llvm.umax.i16(i16 %min, i16 127)
226+
call void @use(i16 %min)
227+
ret i16 %max
228+
}
229+
230+
231+
define i16 @smax_smin_i16_limits(i16 %x) {
232+
; CHECK-LABEL: define i16 @smax_smin_i16_limits(
233+
; CHECK-SAME: i16 [[X:%.*]]) {
234+
; CHECK-NEXT: ret i16 [[X]]
235+
;
236+
%min = call i16 @llvm.smin.i16(i16 %x, i16 32767)
237+
%max = call i16 @llvm.smax.i16(i16 %min, i16 -32768)
238+
ret i16 %max
239+
}
240+
241+
define i16 @umax_umin_i16_limits(i16 %x) {
242+
; CHECK-LABEL: define i16 @umax_umin_i16_limits(
243+
; CHECK-SAME: i16 [[X:%.*]]) {
244+
; CHECK-NEXT: ret i16 [[X]]
245+
;
246+
%min = call i16 @llvm.umin.i16(i16 %x, i16 65535)
247+
%max = call i16 @llvm.umax.i16(i16 %min, i16 0)
248+
ret i16 %max
249+
}
250+
251+
define i16 @min_smax_smin_nested(i16 %x) {
252+
; CHECK-LABEL: define i16 @min_smax_smin_nested(
253+
; CHECK-SAME: i16 [[X:%.*]]) {
254+
; CHECK-NEXT: [[MIN1:%.*]] = call i16 @llvm.smin.i16(i16 [[X]], i16 255)
255+
; CHECK-NEXT: [[TMP1:%.*]] = call i16 @llvm.smax.i16(i16 [[MIN1]], i16 -128)
256+
; CHECK-NEXT: [[MIN2:%.*]] = call i16 @llvm.smin.i16(i16 [[TMP1]], i16 127)
257+
; CHECK-NEXT: ret i16 [[MIN2]]
258+
;
259+
%min1 = call i16 @llvm.smin.i16(i16 %x, i16 255)
260+
%max = call i16 @llvm.smax.i16(i16 %min1, i16 -128)
261+
%min2 = call i16 @llvm.smin.i16(i16 %max, i16 127)
262+
ret i16 %min2
263+
}
264+
265+
define i16 @umax_umin_nested(i16 %x) {
266+
; CHECK-LABEL: define i16 @umax_umin_nested(
267+
; CHECK-SAME: i16 [[X:%.*]]) {
268+
; CHECK-NEXT: [[MIN1:%.*]] = call i16 @llvm.umin.i16(i16 [[X]], i16 255)
269+
; CHECK-NEXT: [[MAX:%.*]] = call i16 @llvm.umax.i16(i16 [[MIN1]], i16 63)
270+
; CHECK-NEXT: [[MIN2:%.*]] = call i16 @llvm.umin.i16(i16 [[MAX]], i16 127)
271+
; CHECK-NEXT: ret i16 [[MIN2]]
272+
;
273+
%min1 = call i16 @llvm.umin.i16(i16 %x, i16 255)
274+
%max = call i16 @llvm.umax.i16(i16 %min1, i16 63)
275+
%min2 = call i16 @llvm.umin.i16(i16 %max, i16 127)
276+
ret i16 %min2
277+
}
278+
279+
define i16 @smax_smin_cmax_sgt_cmin(i16 %x) {
280+
; CHECK-LABEL: define i16 @smax_smin_cmax_sgt_cmin(
281+
; CHECK-SAME: i16 [[X:%.*]]) {
282+
; CHECK-NEXT: ret i16 127
283+
;
284+
%min = call i16 @llvm.smin.i16(i16 %x, i16 126)
285+
%max = call i16 @llvm.smax.i16(i16 %min, i16 127)
286+
ret i16 %max
287+
}
288+
289+
define i16 @umax_umin_cmax_ugt_cmin(i16 %x) {
290+
; CHECK-LABEL: define i16 @umax_umin_cmax_ugt_cmin(
291+
; CHECK-SAME: i16 [[X:%.*]]) {
292+
; CHECK-NEXT: ret i16 127
293+
;
294+
%min = call i16 @llvm.umin.i16(i16 %x, i16 126)
295+
%max = call i16 @llvm.umax.i16(i16 %min, i16 127)
296+
ret i16 %max
297+
}
298+
299+
define i16 @smax_smin_variables(i16 %x, i16 %y, i16 %z) {
300+
; CHECK-LABEL: define i16 @smax_smin_variables(
301+
; CHECK-SAME: i16 [[X:%.*]], i16 [[Y:%.*]], i16 [[Z:%.*]]) {
302+
; CHECK-NEXT: [[MIN:%.*]] = call i16 @llvm.smin.i16(i16 [[X]], i16 [[Y]])
303+
; CHECK-NEXT: [[MAX:%.*]] = call i16 @llvm.smax.i16(i16 [[MIN]], i16 [[Z]])
304+
; CHECK-NEXT: ret i16 [[MAX]]
305+
;
306+
%min = call i16 @llvm.smin.i16(i16 %x, i16 %y)
307+
%max = call i16 @llvm.smax.i16(i16 %min, i16 %z)
308+
ret i16 %max
309+
}
310+
311+
define i16 @umax_umin_variables(i16 %x, i16 %y, i16 %z) {
312+
; CHECK-LABEL: define i16 @umax_umin_variables(
313+
; CHECK-SAME: i16 [[X:%.*]], i16 [[Y:%.*]], i16 [[Z:%.*]]) {
314+
; CHECK-NEXT: [[MIN:%.*]] = call i16 @llvm.umin.i16(i16 [[X]], i16 [[Y]])
315+
; CHECK-NEXT: [[MAX:%.*]] = call i16 @llvm.umax.i16(i16 [[MIN]], i16 [[Z]])
316+
; CHECK-NEXT: ret i16 [[MAX]]
317+
;
318+
%min = call i16 @llvm.umin.i16(i16 %x, i16 %y)
319+
%max = call i16 @llvm.umax.i16(i16 %min, i16 %z)
320+
ret i16 %max
321+
}
322+
323+
define i16 @smin_smax(i16 %x) {
324+
; CHECK-LABEL: define i16 @smin_smax(
325+
; CHECK-SAME: i16 [[X:%.*]]) {
326+
; CHECK-NEXT: [[MAX:%.*]] = call i16 @llvm.smax.i16(i16 [[X]], i16 -128)
327+
; CHECK-NEXT: [[MIN:%.*]] = call i16 @llvm.smin.i16(i16 [[MAX]], i16 127)
328+
; CHECK-NEXT: ret i16 [[MIN]]
329+
;
330+
%max = call i16 @llvm.smax.i16(i16 %x, i16 -128)
331+
%min = call i16 @llvm.smin.i16(i16 %max, i16 127)
332+
ret i16 %min
333+
}
334+
335+
define i16 @umin_umax(i16 %x) {
336+
; CHECK-LABEL: define i16 @umin_umax(
337+
; CHECK-SAME: i16 [[X:%.*]]) {
338+
; CHECK-NEXT: [[MAX:%.*]] = call i16 @llvm.umax.i16(i16 [[X]], i16 127)
339+
; CHECK-NEXT: [[MIN:%.*]] = call i16 @llvm.umin.i16(i16 [[MAX]], i16 255)
340+
; CHECK-NEXT: ret i16 [[MIN]]
341+
;
342+
%max = call i16 @llvm.umax.i16(i16 %x, i16 127)
343+
%min = call i16 @llvm.umin.i16(i16 %max, i16 255)
344+
ret i16 %min
345+
}

0 commit comments

Comments
 (0)