Follow up to d0858bffa11, add missing REQUIRES x86
[llvm-project.git] / llvm / test / Transforms / InstSimplify / maxmin.ll
blob048850796744d5a3b1dbc0366412626a50a7b878
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -passes=instsimplify -S | FileCheck %s
4 define i8 @smax_min_limit(i8 %x) {
5 ; CHECK-LABEL: @smax_min_limit(
6 ; CHECK-NEXT:    ret i8 [[X:%.*]]
8   %cmp = icmp sgt i8 %x, -128
9   %sel = select i1 %cmp, i8 %x, i8 -128
10   ret i8 %sel
13 define i8 @smin_max_limit(i8 %x) {
14 ; CHECK-LABEL: @smin_max_limit(
15 ; CHECK-NEXT:    ret i8 [[X:%.*]]
17   %cmp = icmp slt i8 %x, 127
18   %sel = select i1 %cmp, i8 %x, i8 127
19   ret i8 %sel
22 define <2 x i8> @umax_min_limit(<2 x i8> %x) {
23 ; CHECK-LABEL: @umax_min_limit(
24 ; CHECK-NEXT:    ret <2 x i8> [[X:%.*]]
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
31 define i8 @umin_max_limit(i8 %x) {
32 ; CHECK-LABEL: @umin_max_limit(
33 ; CHECK-NEXT:    ret i8 [[X:%.*]]
35   %cmp = icmp ult i8 %x, 255
36   %sel = select i1 %cmp, i8 %x, i8 255
37   ret i8 %sel
40 ; negative test - wrong limit
42 define 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]]
48   %cmp = icmp sgt i8 %x, -127
49   %sel = select i1 %cmp, i8 %x, i8 -127
50   ret i8 %sel
53 ; negative test - wrong limit
55 define 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]]
61   %cmp = icmp slt i8 %x, 0
62   %sel = select i1 %cmp, i8 %x, i8 0
63   ret i8 %sel
66 define i1 @max1(i32 %x, i32 %y) {
67 ; CHECK-LABEL: @max1(
68 ; CHECK-NEXT:    ret i1 false
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
76 define i1 @max2(i32 %x, i32 %y) {
77 ; CHECK-LABEL: @max2(
78 ; CHECK-NEXT:    ret i1 true
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
86 define i1 @max3(i32 %x, i32 %y) {
87 ; CHECK-LABEL: @max3(
88 ; CHECK-NEXT:    ret i1 false
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
96 define i1 @max4(i32 %x, i32 %y) {
97 ; CHECK-LABEL: @max4(
98 ; CHECK-NEXT:    ret i1 true
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
106 define i1 @max5(i32 %x, i32 %y) {
107 ; CHECK-LABEL: @max5(
108 ; CHECK-NEXT:    ret i1 false
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
116 define i1 @max6(i32 %x, i32 %y) {
117 ; CHECK-LABEL: @max6(
118 ; CHECK-NEXT:    ret i1 true
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
126 define i1 @max7(i32 %x, i32 %y) {
127 ; CHECK-LABEL: @max7(
128 ; CHECK-NEXT:    ret i1 false
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
136 define i1 @max8(i32 %x, i32 %y) {
137 ; CHECK-LABEL: @max8(
138 ; CHECK-NEXT:    ret i1 true
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
146 define i1 @min1(i32 %x, i32 %y) {
147 ; CHECK-LABEL: @min1(
148 ; CHECK-NEXT:    ret i1 false
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
156 define i1 @min2(i32 %x, i32 %y) {
157 ; CHECK-LABEL: @min2(
158 ; CHECK-NEXT:    ret i1 true
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
166 define i1 @min3(i32 %x, i32 %y) {
167 ; CHECK-LABEL: @min3(
168 ; CHECK-NEXT:    ret i1 false
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
176 define i1 @min4(i32 %x, i32 %y) {
177 ; CHECK-LABEL: @min4(
178 ; CHECK-NEXT:    ret i1 true
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
186 define i1 @min5(i32 %x, i32 %y) {
187 ; CHECK-LABEL: @min5(
188 ; CHECK-NEXT:    ret i1 false
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
196 define i1 @min6(i32 %x, i32 %y) {
197 ; CHECK-LABEL: @min6(
198 ; CHECK-NEXT:    ret i1 true
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
206 define i1 @min7(i32 %x, i32 %y) {
207 ; CHECK-LABEL: @min7(
208 ; CHECK-NEXT:    ret i1 false
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
216 define i1 @min8(i32 %x, i32 %y) {
217 ; CHECK-LABEL: @min8(
218 ; CHECK-NEXT:    ret i1 true
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
226 define i1 @maxmin1(i32 %x, i32 %y, i32 %z) {
227 ; CHECK-LABEL: @maxmin1(
228 ; CHECK-NEXT:    ret i1 true
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
238 define i1 @maxmin2(i32 %x, i32 %y, i32 %z) {
239 ; CHECK-LABEL: @maxmin2(
240 ; CHECK-NEXT:    ret i1 false
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
250 define i1 @maxmin3(i32 %x, i32 %y, i32 %z) {
251 ; CHECK-LABEL: @maxmin3(
252 ; CHECK-NEXT:    ret i1 true
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
262 define i1 @maxmin4(i32 %x, i32 %y, i32 %z) {
263 ; CHECK-LABEL: @maxmin4(
264 ; CHECK-NEXT:    ret i1 false
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
274 define i1 @maxmin5(i32 %x, i32 %y, i32 %z) {
275 ; CHECK-LABEL: @maxmin5(
276 ; CHECK-NEXT:    ret i1 true
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
286 define i1 @maxmin6(i32 %x, i32 %y, i32 %z) {
287 ; CHECK-LABEL: @maxmin6(
288 ; CHECK-NEXT:    ret i1 false
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
298 define i1 @maxmin7(i32 %x, i32 %y, i32 %z) {
299 ; CHECK-LABEL: @maxmin7(
300 ; CHECK-NEXT:    ret i1 true
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
310 define i1 @maxmin8(i32 %x, i32 %y, i32 %z) {
311 ; CHECK-LABEL: @maxmin8(
312 ; CHECK-NEXT:    ret i1 false
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
322 define 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]]
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
333 define 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]]
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
344 define 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]]
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
355 define 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]]
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