1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -instsimplify -S | FileCheck %s
3
4define i8 @smax_min_limit(i8 %x) {
5; CHECK-LABEL: @smax_min_limit(
6; CHECK-NEXT:    ret i8 [[X:%.*]]
7;
8  %cmp = icmp sgt i8 %x, -128
9  %sel = select i1 %cmp, i8 %x, i8 -128
10  ret i8 %sel
11}
12
13define i8 @smin_max_limit(i8 %x) {
14; CHECK-LABEL: @smin_max_limit(
15; CHECK-NEXT:    ret i8 [[X:%.*]]
16;
17  %cmp = icmp slt i8 %x, 127
18  %sel = select i1 %cmp, i8 %x, i8 127
19  ret i8 %sel
20}
21
22define <2 x i8> @umax_min_limit(<2 x i8> %x) {
23; CHECK-LABEL: @umax_min_limit(
24; CHECK-NEXT:    ret <2 x i8> [[X:%.*]]
25;
26  %cmp = icmp ugt <2 x i8> %x, zeroinitializer
27  %sel = select <2 x i1> %cmp, <2 x i8> %x, <2 x i8> zeroinitializer
28  ret <2 x i8> %sel
29}
30
31define i8 @umin_max_limit(i8 %x) {
32; CHECK-LABEL: @umin_max_limit(
33; CHECK-NEXT:    ret i8 [[X:%.*]]
34;
35  %cmp = icmp ult i8 %x, 255
36  %sel = select i1 %cmp, i8 %x, i8 255
37  ret i8 %sel
38}
39
40; negative test - wrong limit
41
42define i8 @smax_not_min_limit(i8 %x) {
43; CHECK-LABEL: @smax_not_min_limit(
44; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i8 [[X:%.*]], -127
45; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[CMP]], i8 [[X]], i8 -127
46; CHECK-NEXT:    ret i8 [[SEL]]
47;
48  %cmp = icmp sgt i8 %x, -127
49  %sel = select i1 %cmp, i8 %x, i8 -127
50  ret i8 %sel
51}
52
53; negative test - wrong limit
54
55define i8 @smin_not_min_limit(i8 %x) {
56; CHECK-LABEL: @smin_not_min_limit(
57; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i8 [[X:%.*]], 0
58; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[CMP]], i8 [[X]], i8 0
59; CHECK-NEXT:    ret i8 [[SEL]]
60;
61  %cmp = icmp slt i8 %x, 0
62  %sel = select i1 %cmp, i8 %x, i8 0
63  ret i8 %sel
64}
65
66define i1 @max1(i32 %x, i32 %y) {
67; CHECK-LABEL: @max1(
68; CHECK-NEXT:    ret i1 false
69;
70  %c = icmp sgt i32 %x, %y
71  %m = select i1 %c, i32 %x, i32 %y
72  %r = icmp slt i32 %m, %x
73  ret i1 %r
74}
75
76define i1 @max2(i32 %x, i32 %y) {
77; CHECK-LABEL: @max2(
78; CHECK-NEXT:    ret i1 true
79;
80  %c = icmp sge i32 %x, %y
81  %m = select i1 %c, i32 %x, i32 %y
82  %r = icmp sge i32 %m, %x
83  ret i1 %r
84}
85
86define i1 @max3(i32 %x, i32 %y) {
87; CHECK-LABEL: @max3(
88; CHECK-NEXT:    ret i1 false
89;
90  %c = icmp ugt i32 %x, %y
91  %m = select i1 %c, i32 %x, i32 %y
92  %r = icmp ult i32 %m, %x
93  ret i1 %r
94}
95
96define i1 @max4(i32 %x, i32 %y) {
97; CHECK-LABEL: @max4(
98; CHECK-NEXT:    ret i1 true
99;
100  %c = icmp uge i32 %x, %y
101  %m = select i1 %c, i32 %x, i32 %y
102  %r = icmp uge i32 %m, %x
103  ret i1 %r
104}
105
106define i1 @max5(i32 %x, i32 %y) {
107; CHECK-LABEL: @max5(
108; CHECK-NEXT:    ret i1 false
109;
110  %c = icmp sgt i32 %x, %y
111  %m = select i1 %c, i32 %x, i32 %y
112  %r = icmp sgt i32 %x, %m
113  ret i1 %r
114}
115
116define i1 @max6(i32 %x, i32 %y) {
117; CHECK-LABEL: @max6(
118; CHECK-NEXT:    ret i1 true
119;
120  %c = icmp sge i32 %x, %y
121  %m = select i1 %c, i32 %x, i32 %y
122  %r = icmp sle i32 %x, %m
123  ret i1 %r
124}
125
126define i1 @max7(i32 %x, i32 %y) {
127; CHECK-LABEL: @max7(
128; CHECK-NEXT:    ret i1 false
129;
130  %c = icmp ugt i32 %x, %y
131  %m = select i1 %c, i32 %x, i32 %y
132  %r = icmp ugt i32 %x, %m
133  ret i1 %r
134}
135
136define i1 @max8(i32 %x, i32 %y) {
137; CHECK-LABEL: @max8(
138; CHECK-NEXT:    ret i1 true
139;
140  %c = icmp uge i32 %x, %y
141  %m = select i1 %c, i32 %x, i32 %y
142  %r = icmp ule i32 %x, %m
143  ret i1 %r
144}
145
146define i1 @min1(i32 %x, i32 %y) {
147; CHECK-LABEL: @min1(
148; CHECK-NEXT:    ret i1 false
149;
150  %c = icmp sgt i32 %x, %y
151  %m = select i1 %c, i32 %y, i32 %x
152  %r = icmp sgt i32 %m, %x
153  ret i1 %r
154}
155
156define i1 @min2(i32 %x, i32 %y) {
157; CHECK-LABEL: @min2(
158; CHECK-NEXT:    ret i1 true
159;
160  %c = icmp sge i32 %x, %y
161  %m = select i1 %c, i32 %y, i32 %x
162  %r = icmp sle i32 %m, %x
163  ret i1 %r
164}
165
166define i1 @min3(i32 %x, i32 %y) {
167; CHECK-LABEL: @min3(
168; CHECK-NEXT:    ret i1 false
169;
170  %c = icmp ugt i32 %x, %y
171  %m = select i1 %c, i32 %y, i32 %x
172  %r = icmp ugt i32 %m, %x
173  ret i1 %r
174}
175
176define i1 @min4(i32 %x, i32 %y) {
177; CHECK-LABEL: @min4(
178; CHECK-NEXT:    ret i1 true
179;
180  %c = icmp uge i32 %x, %y
181  %m = select i1 %c, i32 %y, i32 %x
182  %r = icmp ule i32 %m, %x
183  ret i1 %r
184}
185
186define i1 @min5(i32 %x, i32 %y) {
187; CHECK-LABEL: @min5(
188; CHECK-NEXT:    ret i1 false
189;
190  %c = icmp sgt i32 %x, %y
191  %m = select i1 %c, i32 %y, i32 %x
192  %r = icmp slt i32 %x, %m
193  ret i1 %r
194}
195
196define i1 @min6(i32 %x, i32 %y) {
197; CHECK-LABEL: @min6(
198; CHECK-NEXT:    ret i1 true
199;
200  %c = icmp sge i32 %x, %y
201  %m = select i1 %c, i32 %y, i32 %x
202  %r = icmp sge i32 %x, %m
203  ret i1 %r
204}
205
206define i1 @min7(i32 %x, i32 %y) {
207; CHECK-LABEL: @min7(
208; CHECK-NEXT:    ret i1 false
209;
210  %c = icmp ugt i32 %x, %y
211  %m = select i1 %c, i32 %y, i32 %x
212  %r = icmp ult i32 %x, %m
213  ret i1 %r
214}
215
216define i1 @min8(i32 %x, i32 %y) {
217; CHECK-LABEL: @min8(
218; CHECK-NEXT:    ret i1 true
219;
220  %c = icmp uge i32 %x, %y
221  %m = select i1 %c, i32 %y, i32 %x
222  %r = icmp uge i32 %x, %m
223  ret i1 %r
224}
225
226define i1 @maxmin1(i32 %x, i32 %y, i32 %z) {
227; CHECK-LABEL: @maxmin1(
228; CHECK-NEXT:    ret i1 true
229;
230  %c1 = icmp sge i32 %x, %y
231  %max = select i1 %c1, i32 %x, i32 %y
232  %c2 = icmp sge i32 %x, %z
233  %min = select i1 %c2, i32 %z, i32 %x
234  %c = icmp sge i32 %max, %min
235  ret i1 %c
236}
237
238define i1 @maxmin2(i32 %x, i32 %y, i32 %z) {
239; CHECK-LABEL: @maxmin2(
240; CHECK-NEXT:    ret i1 false
241;
242  %c1 = icmp sge i32 %x, %y
243  %max = select i1 %c1, i32 %x, i32 %y
244  %c2 = icmp sge i32 %x, %z
245  %min = select i1 %c2, i32 %z, i32 %x
246  %c = icmp sgt i32 %min, %max
247  ret i1 %c
248}
249
250define i1 @maxmin3(i32 %x, i32 %y, i32 %z) {
251; CHECK-LABEL: @maxmin3(
252; CHECK-NEXT:    ret i1 true
253;
254  %c1 = icmp sge i32 %x, %y
255  %max = select i1 %c1, i32 %x, i32 %y
256  %c2 = icmp sge i32 %x, %z
257  %min = select i1 %c2, i32 %z, i32 %x
258  %c = icmp sle i32 %min, %max
259  ret i1 %c
260}
261
262define i1 @maxmin4(i32 %x, i32 %y, i32 %z) {
263; CHECK-LABEL: @maxmin4(
264; CHECK-NEXT:    ret i1 false
265;
266  %c1 = icmp sge i32 %x, %y
267  %max = select i1 %c1, i32 %x, i32 %y
268  %c2 = icmp sge i32 %x, %z
269  %min = select i1 %c2, i32 %z, i32 %x
270  %c = icmp slt i32 %max, %min
271  ret i1 %c
272}
273
274define i1 @maxmin5(i32 %x, i32 %y, i32 %z) {
275; CHECK-LABEL: @maxmin5(
276; CHECK-NEXT:    ret i1 true
277;
278  %c1 = icmp uge i32 %x, %y
279  %max = select i1 %c1, i32 %x, i32 %y
280  %c2 = icmp uge i32 %x, %z
281  %min = select i1 %c2, i32 %z, i32 %x
282  %c = icmp uge i32 %max, %min
283  ret i1 %c
284}
285
286define i1 @maxmin6(i32 %x, i32 %y, i32 %z) {
287; CHECK-LABEL: @maxmin6(
288; CHECK-NEXT:    ret i1 false
289;
290  %c1 = icmp uge i32 %x, %y
291  %max = select i1 %c1, i32 %x, i32 %y
292  %c2 = icmp uge i32 %x, %z
293  %min = select i1 %c2, i32 %z, i32 %x
294  %c = icmp ugt i32 %min, %max
295  ret i1 %c
296}
297
298define i1 @maxmin7(i32 %x, i32 %y, i32 %z) {
299; CHECK-LABEL: @maxmin7(
300; CHECK-NEXT:    ret i1 true
301;
302  %c1 = icmp uge i32 %x, %y
303  %max = select i1 %c1, i32 %x, i32 %y
304  %c2 = icmp uge i32 %x, %z
305  %min = select i1 %c2, i32 %z, i32 %x
306  %c = icmp ule i32 %min, %max
307  ret i1 %c
308}
309
310define i1 @maxmin8(i32 %x, i32 %y, i32 %z) {
311; CHECK-LABEL: @maxmin8(
312; CHECK-NEXT:    ret i1 false
313;
314  %c1 = icmp uge i32 %x, %y
315  %max = select i1 %c1, i32 %x, i32 %y
316  %c2 = icmp uge i32 %x, %z
317  %min = select i1 %c2, i32 %z, i32 %x
318  %c = icmp ult i32 %max, %min
319  ret i1 %c
320}
321
322define i1 @eqcmp1(i32 %x, i32 %y) {
323; CHECK-LABEL: @eqcmp1(
324; CHECK-NEXT:    [[C:%.*]] = icmp sge i32 [[X:%.*]], [[Y:%.*]]
325; CHECK-NEXT:    ret i1 [[C]]
326;
327  %c = icmp sge i32 %x, %y
328  %max = select i1 %c, i32 %x, i32 %y
329  %r = icmp eq i32 %max, %x
330  ret i1 %r
331}
332
333define i1 @eqcmp2(i32 %x, i32 %y) {
334; CHECK-LABEL: @eqcmp2(
335; CHECK-NEXT:    [[C:%.*]] = icmp sge i32 [[X:%.*]], [[Y:%.*]]
336; CHECK-NEXT:    ret i1 [[C]]
337;
338  %c = icmp sge i32 %x, %y
339  %max = select i1 %c, i32 %x, i32 %y
340  %r = icmp eq i32 %x, %max
341  ret i1 %r
342}
343
344define i1 @eqcmp3(i32 %x, i32 %y) {
345; CHECK-LABEL: @eqcmp3(
346; CHECK-NEXT:    [[C:%.*]] = icmp uge i32 [[X:%.*]], [[Y:%.*]]
347; CHECK-NEXT:    ret i1 [[C]]
348;
349  %c = icmp uge i32 %x, %y
350  %max = select i1 %c, i32 %x, i32 %y
351  %r = icmp eq i32 %max, %x
352  ret i1 %r
353}
354
355define i1 @eqcmp4(i32 %x, i32 %y) {
356; CHECK-LABEL: @eqcmp4(
357; CHECK-NEXT:    [[C:%.*]] = icmp uge i32 [[X:%.*]], [[Y:%.*]]
358; CHECK-NEXT:    ret i1 [[C]]
359;
360  %c = icmp uge i32 %x, %y
361  %max = select i1 %c, i32 %x, i32 %y
362  %r = icmp eq i32 %x, %max
363  ret i1 %r
364}
365