[InstCombine] Signed saturation patterns
[llvm-complete.git] / test / Transforms / InstSimplify / maxmin.ll
blob3fcbfec2f63add321353d542084bfae86dc76bbc
1 ; NOTE: Assertions have been autogenerated by update_test_checks.py
2 ; RUN: opt < %s -instsimplify -S | FileCheck %s
4 define i1 @max1(i32 %x, i32 %y) {
5 ; CHECK-LABEL: @max1(
6 ; CHECK:         ret i1 false
8   %c = icmp sgt i32 %x, %y
9   %m = select i1 %c, i32 %x, i32 %y
10   %r = icmp slt i32 %m, %x
11   ret i1 %r
14 define i1 @max2(i32 %x, i32 %y) {
15 ; CHECK-LABEL: @max2(
16 ; CHECK:         ret i1 true
18   %c = icmp sge i32 %x, %y
19   %m = select i1 %c, i32 %x, i32 %y
20   %r = icmp sge i32 %m, %x
21   ret i1 %r
24 define i1 @max3(i32 %x, i32 %y) {
25 ; CHECK-LABEL: @max3(
26 ; CHECK:         ret i1 false
28   %c = icmp ugt i32 %x, %y
29   %m = select i1 %c, i32 %x, i32 %y
30   %r = icmp ult i32 %m, %x
31   ret i1 %r
34 define i1 @max4(i32 %x, i32 %y) {
35 ; CHECK-LABEL: @max4(
36 ; CHECK:         ret i1 true
38   %c = icmp uge i32 %x, %y
39   %m = select i1 %c, i32 %x, i32 %y
40   %r = icmp uge i32 %m, %x
41   ret i1 %r
44 define i1 @max5(i32 %x, i32 %y) {
45 ; CHECK-LABEL: @max5(
46 ; CHECK:         ret i1 false
48   %c = icmp sgt i32 %x, %y
49   %m = select i1 %c, i32 %x, i32 %y
50   %r = icmp sgt i32 %x, %m
51   ret i1 %r
54 define i1 @max6(i32 %x, i32 %y) {
55 ; CHECK-LABEL: @max6(
56 ; CHECK:         ret i1 true
58   %c = icmp sge i32 %x, %y
59   %m = select i1 %c, i32 %x, i32 %y
60   %r = icmp sle i32 %x, %m
61   ret i1 %r
64 define i1 @max7(i32 %x, i32 %y) {
65 ; CHECK-LABEL: @max7(
66 ; CHECK:         ret i1 false
68   %c = icmp ugt i32 %x, %y
69   %m = select i1 %c, i32 %x, i32 %y
70   %r = icmp ugt i32 %x, %m
71   ret i1 %r
74 define i1 @max8(i32 %x, i32 %y) {
75 ; CHECK-LABEL: @max8(
76 ; CHECK:         ret i1 true
78   %c = icmp uge i32 %x, %y
79   %m = select i1 %c, i32 %x, i32 %y
80   %r = icmp ule i32 %x, %m
81   ret i1 %r
84 define i1 @min1(i32 %x, i32 %y) {
85 ; CHECK-LABEL: @min1(
86 ; CHECK:         ret i1 false
88   %c = icmp sgt i32 %x, %y
89   %m = select i1 %c, i32 %y, i32 %x
90   %r = icmp sgt i32 %m, %x
91   ret i1 %r
94 define i1 @min2(i32 %x, i32 %y) {
95 ; CHECK-LABEL: @min2(
96 ; CHECK:         ret i1 true
98   %c = icmp sge i32 %x, %y
99   %m = select i1 %c, i32 %y, i32 %x
100   %r = icmp sle i32 %m, %x
101   ret i1 %r
104 define i1 @min3(i32 %x, i32 %y) {
105 ; CHECK-LABEL: @min3(
106 ; CHECK:         ret i1 false
108   %c = icmp ugt i32 %x, %y
109   %m = select i1 %c, i32 %y, i32 %x
110   %r = icmp ugt i32 %m, %x
111   ret i1 %r
114 define i1 @min4(i32 %x, i32 %y) {
115 ; CHECK-LABEL: @min4(
116 ; CHECK:         ret i1 true
118   %c = icmp uge i32 %x, %y
119   %m = select i1 %c, i32 %y, i32 %x
120   %r = icmp ule i32 %m, %x
121   ret i1 %r
124 define i1 @min5(i32 %x, i32 %y) {
125 ; CHECK-LABEL: @min5(
126 ; CHECK:         ret i1 false
128   %c = icmp sgt i32 %x, %y
129   %m = select i1 %c, i32 %y, i32 %x
130   %r = icmp slt i32 %x, %m
131   ret i1 %r
134 define i1 @min6(i32 %x, i32 %y) {
135 ; CHECK-LABEL: @min6(
136 ; CHECK:         ret i1 true
138   %c = icmp sge i32 %x, %y
139   %m = select i1 %c, i32 %y, i32 %x
140   %r = icmp sge i32 %x, %m
141   ret i1 %r
144 define i1 @min7(i32 %x, i32 %y) {
145 ; CHECK-LABEL: @min7(
146 ; CHECK:         ret i1 false
148   %c = icmp ugt i32 %x, %y
149   %m = select i1 %c, i32 %y, i32 %x
150   %r = icmp ult i32 %x, %m
151   ret i1 %r
154 define i1 @min8(i32 %x, i32 %y) {
155 ; CHECK-LABEL: @min8(
156 ; CHECK:         ret i1 true
158   %c = icmp uge i32 %x, %y
159   %m = select i1 %c, i32 %y, i32 %x
160   %r = icmp uge i32 %x, %m
161   ret i1 %r
164 define i1 @maxmin1(i32 %x, i32 %y, i32 %z) {
165 ; CHECK-LABEL: @maxmin1(
166 ; CHECK:         ret i1 true
168   %c1 = icmp sge i32 %x, %y
169   %max = select i1 %c1, i32 %x, i32 %y
170   %c2 = icmp sge i32 %x, %z
171   %min = select i1 %c2, i32 %z, i32 %x
172   %c = icmp sge i32 %max, %min
173   ret i1 %c
176 define i1 @maxmin2(i32 %x, i32 %y, i32 %z) {
177 ; CHECK-LABEL: @maxmin2(
178 ; CHECK:         ret i1 false
180   %c1 = icmp sge i32 %x, %y
181   %max = select i1 %c1, i32 %x, i32 %y
182   %c2 = icmp sge i32 %x, %z
183   %min = select i1 %c2, i32 %z, i32 %x
184   %c = icmp sgt i32 %min, %max
185   ret i1 %c
188 define i1 @maxmin3(i32 %x, i32 %y, i32 %z) {
189 ; CHECK-LABEL: @maxmin3(
190 ; CHECK:         ret i1 true
192   %c1 = icmp sge i32 %x, %y
193   %max = select i1 %c1, i32 %x, i32 %y
194   %c2 = icmp sge i32 %x, %z
195   %min = select i1 %c2, i32 %z, i32 %x
196   %c = icmp sle i32 %min, %max
197   ret i1 %c
200 define i1 @maxmin4(i32 %x, i32 %y, i32 %z) {
201 ; CHECK-LABEL: @maxmin4(
202 ; CHECK:         ret i1 false
204   %c1 = icmp sge i32 %x, %y
205   %max = select i1 %c1, i32 %x, i32 %y
206   %c2 = icmp sge i32 %x, %z
207   %min = select i1 %c2, i32 %z, i32 %x
208   %c = icmp slt i32 %max, %min
209   ret i1 %c
212 define i1 @maxmin5(i32 %x, i32 %y, i32 %z) {
213 ; CHECK-LABEL: @maxmin5(
214 ; CHECK:         ret i1 true
216   %c1 = icmp uge i32 %x, %y
217   %max = select i1 %c1, i32 %x, i32 %y
218   %c2 = icmp uge i32 %x, %z
219   %min = select i1 %c2, i32 %z, i32 %x
220   %c = icmp uge i32 %max, %min
221   ret i1 %c
224 define i1 @maxmin6(i32 %x, i32 %y, i32 %z) {
225 ; CHECK-LABEL: @maxmin6(
226 ; CHECK:         ret i1 false
228   %c1 = icmp uge i32 %x, %y
229   %max = select i1 %c1, i32 %x, i32 %y
230   %c2 = icmp uge i32 %x, %z
231   %min = select i1 %c2, i32 %z, i32 %x
232   %c = icmp ugt i32 %min, %max
233   ret i1 %c
236 define i1 @maxmin7(i32 %x, i32 %y, i32 %z) {
237 ; CHECK-LABEL: @maxmin7(
238 ; CHECK:         ret i1 true
240   %c1 = icmp uge i32 %x, %y
241   %max = select i1 %c1, i32 %x, i32 %y
242   %c2 = icmp uge i32 %x, %z
243   %min = select i1 %c2, i32 %z, i32 %x
244   %c = icmp ule i32 %min, %max
245   ret i1 %c
248 define i1 @maxmin8(i32 %x, i32 %y, i32 %z) {
249 ; CHECK-LABEL: @maxmin8(
250 ; CHECK:         ret i1 false
252   %c1 = icmp uge i32 %x, %y
253   %max = select i1 %c1, i32 %x, i32 %y
254   %c2 = icmp uge i32 %x, %z
255   %min = select i1 %c2, i32 %z, i32 %x
256   %c = icmp ult i32 %max, %min
257   ret i1 %c
260 define i1 @eqcmp1(i32 %x, i32 %y) {
261 ; CHECK-LABEL: @eqcmp1(
262 ; CHECK:         [[C:%.*]] = icmp sge i32 %x, %y
263 ; CHECK-NEXT:    ret i1 [[C]]
265   %c = icmp sge i32 %x, %y
266   %max = select i1 %c, i32 %x, i32 %y
267   %r = icmp eq i32 %max, %x
268   ret i1 %r
271 define i1 @eqcmp2(i32 %x, i32 %y) {
272 ; CHECK-LABEL: @eqcmp2(
273 ; CHECK:         [[C:%.*]] = icmp sge i32 %x, %y
274 ; CHECK-NEXT:    ret i1 [[C]]
276   %c = icmp sge i32 %x, %y
277   %max = select i1 %c, i32 %x, i32 %y
278   %r = icmp eq i32 %x, %max
279   ret i1 %r
282 define i1 @eqcmp3(i32 %x, i32 %y) {
283 ; CHECK-LABEL: @eqcmp3(
284 ; CHECK:         [[C:%.*]] = icmp uge i32 %x, %y
285 ; CHECK-NEXT:    ret i1 [[C]]
287   %c = icmp uge i32 %x, %y
288   %max = select i1 %c, i32 %x, i32 %y
289   %r = icmp eq i32 %max, %x
290   ret i1 %r
293 define i1 @eqcmp4(i32 %x, i32 %y) {
294 ; CHECK-LABEL: @eqcmp4(
295 ; CHECK:         [[C:%.*]] = icmp uge i32 %x, %y
296 ; CHECK-NEXT:    ret i1 [[C]]
298   %c = icmp uge i32 %x, %y
299   %max = select i1 %c, i32 %x, i32 %y
300   %r = icmp eq i32 %x, %max
301   ret i1 %r