Merging r258325:
[oota-llvm.git] / test / Transforms / InstSimplify / maxmin.ll
1 ; RUN: opt < %s -instsimplify -S | FileCheck %s
2
3 define i1 @max1(i32 %x, i32 %y) {
4 ; CHECK-LABEL: @max1(
5   %c = icmp sgt i32 %x, %y
6   %m = select i1 %c, i32 %x, i32 %y
7   %r = icmp slt i32 %m, %x
8   ret i1 %r
9 ; CHECK: ret i1 false
10 }
11
12 define i1 @max2(i32 %x, i32 %y) {
13 ; CHECK-LABEL: @max2(
14   %c = icmp sge i32 %x, %y
15   %m = select i1 %c, i32 %x, i32 %y
16   %r = icmp sge i32 %m, %x
17   ret i1 %r
18 ; CHECK: ret i1 true
19 }
20
21 define i1 @max3(i32 %x, i32 %y) {
22 ; CHECK-LABEL: @max3(
23   %c = icmp ugt i32 %x, %y
24   %m = select i1 %c, i32 %x, i32 %y
25   %r = icmp ult i32 %m, %x
26   ret i1 %r
27 ; CHECK: ret i1 false
28 }
29
30 define i1 @max4(i32 %x, i32 %y) {
31 ; CHECK-LABEL: @max4(
32   %c = icmp uge i32 %x, %y
33   %m = select i1 %c, i32 %x, i32 %y
34   %r = icmp uge i32 %m, %x
35   ret i1 %r
36 ; CHECK: ret i1 true
37 }
38
39 define i1 @max5(i32 %x, i32 %y) {
40 ; CHECK-LABEL: @max5(
41   %c = icmp sgt i32 %x, %y
42   %m = select i1 %c, i32 %x, i32 %y
43   %r = icmp sgt i32 %x, %m
44   ret i1 %r
45 ; CHECK: ret i1 false
46 }
47
48 define i1 @max6(i32 %x, i32 %y) {
49 ; CHECK-LABEL: @max6(
50   %c = icmp sge i32 %x, %y
51   %m = select i1 %c, i32 %x, i32 %y
52   %r = icmp sle i32 %x, %m
53   ret i1 %r
54 ; CHECK: ret i1 true
55 }
56
57 define i1 @max7(i32 %x, i32 %y) {
58 ; CHECK-LABEL: @max7(
59   %c = icmp ugt i32 %x, %y
60   %m = select i1 %c, i32 %x, i32 %y
61   %r = icmp ugt i32 %x, %m
62   ret i1 %r
63 ; CHECK: ret i1 false
64 }
65
66 define i1 @max8(i32 %x, i32 %y) {
67 ; CHECK-LABEL: @max8(
68   %c = icmp uge i32 %x, %y
69   %m = select i1 %c, i32 %x, i32 %y
70   %r = icmp ule i32 %x, %m
71   ret i1 %r
72 ; CHECK: ret i1 true
73 }
74
75 define i1 @min1(i32 %x, i32 %y) {
76 ; CHECK-LABEL: @min1(
77   %c = icmp sgt i32 %x, %y
78   %m = select i1 %c, i32 %y, i32 %x
79   %r = icmp sgt i32 %m, %x
80   ret i1 %r
81 ; CHECK: ret i1 false
82 }
83
84 define i1 @min2(i32 %x, i32 %y) {
85 ; CHECK-LABEL: @min2(
86   %c = icmp sge i32 %x, %y
87   %m = select i1 %c, i32 %y, i32 %x
88   %r = icmp sle i32 %m, %x
89   ret i1 %r
90 ; CHECK: ret i1 true
91 }
92
93 define i1 @min3(i32 %x, i32 %y) {
94 ; CHECK-LABEL: @min3(
95   %c = icmp ugt i32 %x, %y
96   %m = select i1 %c, i32 %y, i32 %x
97   %r = icmp ugt i32 %m, %x
98   ret i1 %r
99 ; CHECK: ret i1 false
100 }
101
102 define i1 @min4(i32 %x, i32 %y) {
103 ; CHECK-LABEL: @min4(
104   %c = icmp uge i32 %x, %y
105   %m = select i1 %c, i32 %y, i32 %x
106   %r = icmp ule i32 %m, %x
107   ret i1 %r
108 ; CHECK: ret i1 true
109 }
110
111 define i1 @min5(i32 %x, i32 %y) {
112 ; CHECK-LABEL: @min5(
113   %c = icmp sgt i32 %x, %y
114   %m = select i1 %c, i32 %y, i32 %x
115   %r = icmp slt i32 %x, %m
116   ret i1 %r
117 ; CHECK: ret i1 false
118 }
119
120 define i1 @min6(i32 %x, i32 %y) {
121 ; CHECK-LABEL: @min6(
122   %c = icmp sge i32 %x, %y
123   %m = select i1 %c, i32 %y, i32 %x
124   %r = icmp sge i32 %x, %m
125   ret i1 %r
126 ; CHECK: ret i1 true
127 }
128
129 define i1 @min7(i32 %x, i32 %y) {
130 ; CHECK-LABEL: @min7(
131   %c = icmp ugt i32 %x, %y
132   %m = select i1 %c, i32 %y, i32 %x
133   %r = icmp ult i32 %x, %m
134   ret i1 %r
135 ; CHECK: ret i1 false
136 }
137
138 define i1 @min8(i32 %x, i32 %y) {
139 ; CHECK-LABEL: @min8(
140   %c = icmp uge i32 %x, %y
141   %m = select i1 %c, i32 %y, i32 %x
142   %r = icmp uge i32 %x, %m
143   ret i1 %r
144 ; CHECK: ret i1 true
145 }
146
147 define i1 @maxmin1(i32 %x, i32 %y, i32 %z) {
148 ; CHECK-LABEL: @maxmin1(
149   %c1 = icmp sge i32 %x, %y
150   %max = select i1 %c1, i32 %x, i32 %y
151   %c2 = icmp sge i32 %x, %z
152   %min = select i1 %c2, i32 %z, i32 %x
153   %c = icmp sge i32 %max, %min
154   ret i1 %c
155 ; CHECK: ret i1 true
156 }
157
158 define i1 @maxmin2(i32 %x, i32 %y, i32 %z) {
159 ; CHECK-LABEL: @maxmin2(
160   %c1 = icmp sge i32 %x, %y
161   %max = select i1 %c1, i32 %x, i32 %y
162   %c2 = icmp sge i32 %x, %z
163   %min = select i1 %c2, i32 %z, i32 %x
164   %c = icmp sgt i32 %min, %max
165   ret i1 %c
166 ; CHECK: ret i1 false
167 }
168
169 define i1 @maxmin3(i32 %x, i32 %y, i32 %z) {
170 ; CHECK-LABEL: @maxmin3(
171   %c1 = icmp sge i32 %x, %y
172   %max = select i1 %c1, i32 %x, i32 %y
173   %c2 = icmp sge i32 %x, %z
174   %min = select i1 %c2, i32 %z, i32 %x
175   %c = icmp sle i32 %min, %max
176   ret i1 %c
177 ; CHECK: ret i1 true
178 }
179
180 define i1 @maxmin4(i32 %x, i32 %y, i32 %z) {
181 ; CHECK-LABEL: @maxmin4(
182   %c1 = icmp sge i32 %x, %y
183   %max = select i1 %c1, i32 %x, i32 %y
184   %c2 = icmp sge i32 %x, %z
185   %min = select i1 %c2, i32 %z, i32 %x
186   %c = icmp slt i32 %max, %min
187   ret i1 %c
188 ; CHECK: ret i1 false
189 }
190
191 define i1 @maxmin5(i32 %x, i32 %y, i32 %z) {
192 ; CHECK-LABEL: @maxmin5(
193   %c1 = icmp uge i32 %x, %y
194   %max = select i1 %c1, i32 %x, i32 %y
195   %c2 = icmp uge i32 %x, %z
196   %min = select i1 %c2, i32 %z, i32 %x
197   %c = icmp uge i32 %max, %min
198   ret i1 %c
199 ; CHECK: ret i1 true
200 }
201
202 define i1 @maxmin6(i32 %x, i32 %y, i32 %z) {
203 ; CHECK-LABEL: @maxmin6(
204   %c1 = icmp uge i32 %x, %y
205   %max = select i1 %c1, i32 %x, i32 %y
206   %c2 = icmp uge i32 %x, %z
207   %min = select i1 %c2, i32 %z, i32 %x
208   %c = icmp ugt i32 %min, %max
209   ret i1 %c
210 ; CHECK: ret i1 false
211 }
212
213 define i1 @maxmin7(i32 %x, i32 %y, i32 %z) {
214 ; CHECK-LABEL: @maxmin7(
215   %c1 = icmp uge i32 %x, %y
216   %max = select i1 %c1, i32 %x, i32 %y
217   %c2 = icmp uge i32 %x, %z
218   %min = select i1 %c2, i32 %z, i32 %x
219   %c = icmp ule i32 %min, %max
220   ret i1 %c
221 ; CHECK: ret i1 true
222 }
223
224 define i1 @maxmin8(i32 %x, i32 %y, i32 %z) {
225 ; CHECK-LABEL: @maxmin8(
226   %c1 = icmp uge i32 %x, %y
227   %max = select i1 %c1, i32 %x, i32 %y
228   %c2 = icmp uge i32 %x, %z
229   %min = select i1 %c2, i32 %z, i32 %x
230   %c = icmp ult i32 %max, %min
231   ret i1 %c
232 ; CHECK: ret i1 false
233 }
234
235 define i1 @eqcmp1(i32 %x, i32 %y) {
236 ; CHECK-LABEL: @eqcmp1(
237   %c = icmp sge i32 %x, %y
238   %max = select i1 %c, i32 %x, i32 %y
239   %r = icmp eq i32 %max, %x
240   ret i1 %r
241 ; CHECK: ret i1 %c
242 }
243
244 define i1 @eqcmp2(i32 %x, i32 %y) {
245 ; CHECK-LABEL: @eqcmp2(
246   %c = icmp sge i32 %x, %y
247   %max = select i1 %c, i32 %x, i32 %y
248   %r = icmp eq i32 %x, %max
249   ret i1 %r
250 ; CHECK: ret i1 %c
251 }
252
253 define i1 @eqcmp3(i32 %x, i32 %y) {
254 ; CHECK-LABEL: @eqcmp3(
255   %c = icmp uge i32 %x, %y
256   %max = select i1 %c, i32 %x, i32 %y
257   %r = icmp eq i32 %max, %x
258   ret i1 %r
259 ; CHECK: ret i1 %c
260 }
261
262 define i1 @eqcmp4(i32 %x, i32 %y) {
263 ; CHECK-LABEL: @eqcmp4(
264   %c = icmp uge i32 %x, %y
265   %max = select i1 %c, i32 %x, i32 %y
266   %r = icmp eq i32 %x, %max
267   ret i1 %r
268 ; CHECK: ret i1 %c
269 }