Mercurial > hg > CbC > CbC_llvm
comparison test/Transforms/InstCombine/compare-3way.ll @ 121:803732b1fca8
LLVM 5.0
author | kono |
---|---|
date | Fri, 27 Oct 2017 17:07:41 +0900 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
120:1172e4bd9c6f | 121:803732b1fca8 |
---|---|
1 ; RUN: opt -S -instcombine < %s | FileCheck %s | |
2 | |
3 declare void @use(i32) | |
4 | |
5 ; These 18 exercise all combinations of signed comparison | |
6 ; for each of the three values produced by your typical | |
7 ; 3way compare function (-1, 0, 1) | |
8 | |
9 define void @test_low_sgt(i64 %a, i64 %b) { | |
10 ; CHECK-LABEL: @test_low_sgt | |
11 ; CHECK: [[TMP1:%.*]] = icmp slt i64 %a, %b | |
12 ; CHECK: br i1 [[TMP1]], label %normal, label %unreached | |
13 %eq = icmp eq i64 %a, %b | |
14 %slt = icmp slt i64 %a, %b | |
15 %. = select i1 %slt, i32 -1, i32 1 | |
16 %result = select i1 %eq, i32 0, i32 %. | |
17 %cmp = icmp sgt i32 %result, -1 | |
18 br i1 %cmp, label %unreached, label %normal | |
19 normal: | |
20 ret void | |
21 unreached: | |
22 call void @use(i32 %result) | |
23 ret void | |
24 } | |
25 | |
26 define void @test_low_slt(i64 %a, i64 %b) { | |
27 ; CHECK-LABEL: @test_low_slt | |
28 ; CHECK: br i1 false, label %unreached, label %normal | |
29 %eq = icmp eq i64 %a, %b | |
30 %slt = icmp slt i64 %a, %b | |
31 %. = select i1 %slt, i32 -1, i32 1 | |
32 %result = select i1 %eq, i32 0, i32 %. | |
33 %cmp = icmp slt i32 %result, -1 | |
34 br i1 %cmp, label %unreached, label %normal | |
35 normal: | |
36 ret void | |
37 unreached: | |
38 call void @use(i32 %result) | |
39 ret void | |
40 } | |
41 | |
42 define void @test_low_sge(i64 %a, i64 %b) { | |
43 ; CHECK-LABEL: @test_low_sge | |
44 ; CHECK: br i1 true, label %unreached, label %normal | |
45 %eq = icmp eq i64 %a, %b | |
46 %slt = icmp slt i64 %a, %b | |
47 %. = select i1 %slt, i32 -1, i32 1 | |
48 %result = select i1 %eq, i32 0, i32 %. | |
49 %cmp = icmp sge i32 %result, -1 | |
50 br i1 %cmp, label %unreached, label %normal | |
51 normal: | |
52 ret void | |
53 unreached: | |
54 call void @use(i32 %result) | |
55 ret void | |
56 } | |
57 | |
58 define void @test_low_sle(i64 %a, i64 %b) { | |
59 ; CHECK-LABEL: @test_low_sle | |
60 ; CHECK: [[TMP1:%.*]] = icmp slt i64 %a, %b | |
61 ; CHECK: br i1 [[TMP1]], label %unreached, label %normal | |
62 %eq = icmp eq i64 %a, %b | |
63 %slt = icmp slt i64 %a, %b | |
64 %. = select i1 %slt, i32 -1, i32 1 | |
65 %result = select i1 %eq, i32 0, i32 %. | |
66 %cmp = icmp sle i32 %result, -1 | |
67 br i1 %cmp, label %unreached, label %normal | |
68 normal: | |
69 ret void | |
70 unreached: | |
71 call void @use(i32 %result) | |
72 ret void | |
73 } | |
74 | |
75 define void @test_low_ne(i64 %a, i64 %b) { | |
76 ; CHECK-LABEL: @test_low_ne | |
77 ; CHECK: [[TMP1:%.*]] = icmp slt i64 %a, %b | |
78 ; CHECK: br i1 [[TMP1]], label %normal, label %unreached | |
79 %eq = icmp eq i64 %a, %b | |
80 %slt = icmp slt i64 %a, %b | |
81 %. = select i1 %slt, i32 -1, i32 1 | |
82 %result = select i1 %eq, i32 0, i32 %. | |
83 %cmp = icmp ne i32 %result, -1 | |
84 br i1 %cmp, label %unreached, label %normal | |
85 normal: | |
86 ret void | |
87 unreached: | |
88 call void @use(i32 %result) | |
89 ret void | |
90 } | |
91 | |
92 define void @test_low_eq(i64 %a, i64 %b) { | |
93 ; CHECK-LABEL: @test_low_eq | |
94 ; CHECK: [[TMP1:%.*]] = icmp slt i64 %a, %b | |
95 ; CHECK: br i1 [[TMP1]], label %unreached, label %normal | |
96 %eq = icmp eq i64 %a, %b | |
97 %slt = icmp slt i64 %a, %b | |
98 %. = select i1 %slt, i32 -1, i32 1 | |
99 %result = select i1 %eq, i32 0, i32 %. | |
100 %cmp = icmp eq i32 %result, -1 | |
101 br i1 %cmp, label %unreached, label %normal | |
102 normal: | |
103 ret void | |
104 unreached: | |
105 call void @use(i32 %result) | |
106 ret void | |
107 } | |
108 | |
109 define void @test_mid_sgt(i64 %a, i64 %b) { | |
110 ; CHECK-LABEL: @test_mid_sgt | |
111 ; CHECK: [[TMP1:%.*]] = icmp sgt i64 %a, %b | |
112 ; CHECK: br i1 [[TMP1]], label %unreached, label %normal | |
113 %eq = icmp eq i64 %a, %b | |
114 %slt = icmp slt i64 %a, %b | |
115 %. = select i1 %slt, i32 -1, i32 1 | |
116 %result = select i1 %eq, i32 0, i32 %. | |
117 %cmp = icmp sgt i32 %result, 0 | |
118 br i1 %cmp, label %unreached, label %normal | |
119 normal: | |
120 ret void | |
121 unreached: | |
122 call void @use(i32 %result) | |
123 ret void | |
124 } | |
125 | |
126 define void @test_mid_slt(i64 %a, i64 %b) { | |
127 ; CHECK-LABEL: @test_mid_slt | |
128 ; CHECK: [[TMP1:%.*]] = icmp slt i64 %a, %b | |
129 ; CHECK: br i1 [[TMP1]], label %unreached, label %normal | |
130 %eq = icmp eq i64 %a, %b | |
131 %slt = icmp slt i64 %a, %b | |
132 %. = select i1 %slt, i32 -1, i32 1 | |
133 %result = select i1 %eq, i32 0, i32 %. | |
134 %cmp = icmp slt i32 %result, 0 | |
135 br i1 %cmp, label %unreached, label %normal | |
136 normal: | |
137 ret void | |
138 unreached: | |
139 call void @use(i32 %result) | |
140 ret void | |
141 } | |
142 | |
143 define void @test_mid_sge(i64 %a, i64 %b) { | |
144 ; CHECK-LABEL: @test_mid_sge | |
145 ; CHECK: [[TMP1:%.*]] = icmp slt i64 %a, %b | |
146 ; CHECK: br i1 [[TMP1]], label %normal, label %unreached | |
147 %eq = icmp eq i64 %a, %b | |
148 %slt = icmp slt i64 %a, %b | |
149 %. = select i1 %slt, i32 -1, i32 1 | |
150 %result = select i1 %eq, i32 0, i32 %. | |
151 %cmp = icmp sge i32 %result, 0 | |
152 br i1 %cmp, label %unreached, label %normal | |
153 normal: | |
154 ret void | |
155 unreached: | |
156 call void @use(i32 %result) | |
157 ret void | |
158 } | |
159 | |
160 define void @test_mid_sle(i64 %a, i64 %b) { | |
161 ; CHECK-LABEL: @test_mid_sle | |
162 ; CHECK: [[TMP1:%.*]] = icmp sgt i64 %a, %b | |
163 ; CHECK: br i1 [[TMP1]], label %normal, label %unreached | |
164 %eq = icmp eq i64 %a, %b | |
165 %slt = icmp slt i64 %a, %b | |
166 %. = select i1 %slt, i32 -1, i32 1 | |
167 %result = select i1 %eq, i32 0, i32 %. | |
168 %cmp = icmp sle i32 %result, 0 | |
169 br i1 %cmp, label %unreached, label %normal | |
170 normal: | |
171 ret void | |
172 unreached: | |
173 call void @use(i32 %result) | |
174 ret void | |
175 } | |
176 | |
177 define void @test_mid_ne(i64 %a, i64 %b) { | |
178 ; CHECK-LABEL: @test_mid_ne | |
179 ; CHECK: [[TMP1:%.*]] = icmp eq i64 %a, %b | |
180 ; CHECK: br i1 [[TMP1]], label %normal, label %unreached | |
181 %eq = icmp eq i64 %a, %b | |
182 %slt = icmp slt i64 %a, %b | |
183 %. = select i1 %slt, i32 -1, i32 1 | |
184 %result = select i1 %eq, i32 0, i32 %. | |
185 %cmp = icmp ne i32 %result, 0 | |
186 br i1 %cmp, label %unreached, label %normal | |
187 normal: | |
188 ret void | |
189 unreached: | |
190 call void @use(i32 %result) | |
191 ret void | |
192 } | |
193 | |
194 define void @test_mid_eq(i64 %a, i64 %b) { | |
195 ; CHECK-LABEL: @test_mid_eq | |
196 ; CHECK: icmp eq i64 %a, %b | |
197 ; CHECK: br i1 %eq, label %unreached, label %normal | |
198 %eq = icmp eq i64 %a, %b | |
199 %slt = icmp slt i64 %a, %b | |
200 %. = select i1 %slt, i32 -1, i32 1 | |
201 %result = select i1 %eq, i32 0, i32 %. | |
202 %cmp = icmp eq i32 %result, 0 | |
203 br i1 %cmp, label %unreached, label %normal | |
204 normal: | |
205 ret void | |
206 unreached: | |
207 call void @use(i32 %result) | |
208 ret void | |
209 } | |
210 | |
211 define void @test_high_sgt(i64 %a, i64 %b) { | |
212 ; CHECK-LABEL: @test_high_sgt | |
213 ; CHECK: br i1 false, label %unreached, label %normal | |
214 %eq = icmp eq i64 %a, %b | |
215 %slt = icmp slt i64 %a, %b | |
216 %. = select i1 %slt, i32 -1, i32 1 | |
217 %result = select i1 %eq, i32 0, i32 %. | |
218 %cmp = icmp sgt i32 %result, 1 | |
219 br i1 %cmp, label %unreached, label %normal | |
220 normal: | |
221 ret void | |
222 unreached: | |
223 call void @use(i32 %result) | |
224 ret void | |
225 } | |
226 | |
227 define void @test_high_slt(i64 %a, i64 %b) { | |
228 ; CHECK-LABEL: @test_high_slt | |
229 ; CHECK: [[TMP1:%.*]] = icmp sgt i64 %a, %b | |
230 ; CHECK: br i1 [[TMP1]], label %normal, label %unreached | |
231 %eq = icmp eq i64 %a, %b | |
232 %slt = icmp slt i64 %a, %b | |
233 %. = select i1 %slt, i32 -1, i32 1 | |
234 %result = select i1 %eq, i32 0, i32 %. | |
235 %cmp = icmp slt i32 %result, 1 | |
236 br i1 %cmp, label %unreached, label %normal | |
237 normal: | |
238 ret void | |
239 unreached: | |
240 call void @use(i32 %result) | |
241 ret void | |
242 } | |
243 | |
244 define void @test_high_sge(i64 %a, i64 %b) { | |
245 ; CHECK-LABEL: @test_high_sge | |
246 ; CHECK: [[TMP1:%.*]] = icmp sgt i64 %a, %b | |
247 ; CHECK: br i1 [[TMP1]], label %unreached, label %normal | |
248 %eq = icmp eq i64 %a, %b | |
249 %slt = icmp slt i64 %a, %b | |
250 %. = select i1 %slt, i32 -1, i32 1 | |
251 %result = select i1 %eq, i32 0, i32 %. | |
252 %cmp = icmp sge i32 %result, 1 | |
253 br i1 %cmp, label %unreached, label %normal | |
254 normal: | |
255 ret void | |
256 unreached: | |
257 call void @use(i32 %result) | |
258 ret void | |
259 } | |
260 | |
261 define void @test_high_sle(i64 %a, i64 %b) { | |
262 ; CHECK-LABEL: @test_high_sle | |
263 ; CHECK: br i1 true, label %unreached, label %normal | |
264 %eq = icmp eq i64 %a, %b | |
265 %slt = icmp slt i64 %a, %b | |
266 %. = select i1 %slt, i32 -1, i32 1 | |
267 %result = select i1 %eq, i32 0, i32 %. | |
268 %cmp = icmp sle i32 %result, 1 | |
269 br i1 %cmp, label %unreached, label %normal | |
270 normal: | |
271 ret void | |
272 unreached: | |
273 call void @use(i32 %result) | |
274 ret void | |
275 } | |
276 | |
277 define void @test_high_ne(i64 %a, i64 %b) { | |
278 ; CHECK-LABEL: @test_high_ne | |
279 ; CHECK: [[TMP1:%.*]] = icmp sgt i64 %a, %b | |
280 ; CHECK: br i1 [[TMP1]], label %normal, label %unreached | |
281 %eq = icmp eq i64 %a, %b | |
282 %slt = icmp slt i64 %a, %b | |
283 %. = select i1 %slt, i32 -1, i32 1 | |
284 %result = select i1 %eq, i32 0, i32 %. | |
285 %cmp = icmp ne i32 %result, 1 | |
286 br i1 %cmp, label %unreached, label %normal | |
287 normal: | |
288 ret void | |
289 unreached: | |
290 call void @use(i32 %result) | |
291 ret void | |
292 } | |
293 | |
294 define void @test_high_eq(i64 %a, i64 %b) { | |
295 ; CHECK-LABEL: @test_high_eq | |
296 ; CHECK: [[TMP1:%.*]] = icmp sgt i64 %a, %b | |
297 ; CHECK: br i1 [[TMP1]], label %unreached, label %normal | |
298 %eq = icmp eq i64 %a, %b | |
299 %slt = icmp slt i64 %a, %b | |
300 %. = select i1 %slt, i32 -1, i32 1 | |
301 %result = select i1 %eq, i32 0, i32 %. | |
302 %cmp = icmp eq i32 %result, 1 | |
303 br i1 %cmp, label %unreached, label %normal | |
304 normal: | |
305 ret void | |
306 unreached: | |
307 call void @use(i32 %result) | |
308 ret void | |
309 } | |
310 | |
311 ; These five make sure we didn't accidentally hard code one of the | |
312 ; produced values | |
313 | |
314 define void @non_standard_low(i64 %a, i64 %b) { | |
315 ; CHECK-LABEL: @non_standard_low | |
316 ; CHECK: [[TMP1:%.*]] = icmp slt i64 %a, %b | |
317 ; CHECK: br i1 [[TMP1]], label %unreached, label %normal | |
318 %eq = icmp eq i64 %a, %b | |
319 %slt = icmp slt i64 %a, %b | |
320 %. = select i1 %slt, i32 -3, i32 -1 | |
321 %result = select i1 %eq, i32 -2, i32 %. | |
322 %cmp = icmp eq i32 %result, -3 | |
323 br i1 %cmp, label %unreached, label %normal | |
324 normal: | |
325 ret void | |
326 unreached: | |
327 call void @use(i32 %result) | |
328 ret void | |
329 } | |
330 | |
331 define void @non_standard_mid(i64 %a, i64 %b) { | |
332 ; CHECK-LABEL: @non_standard_mid | |
333 ; CHECK: icmp eq i64 %a, %b | |
334 ; CHECK: br i1 %eq, label %unreached, label %normal | |
335 %eq = icmp eq i64 %a, %b | |
336 %slt = icmp slt i64 %a, %b | |
337 %. = select i1 %slt, i32 -3, i32 -1 | |
338 %result = select i1 %eq, i32 -2, i32 %. | |
339 %cmp = icmp eq i32 %result, -2 | |
340 br i1 %cmp, label %unreached, label %normal | |
341 normal: | |
342 ret void | |
343 unreached: | |
344 call void @use(i32 %result) | |
345 ret void | |
346 } | |
347 | |
348 define void @non_standard_high(i64 %a, i64 %b) { | |
349 ; CHECK-LABEL: @non_standard_high | |
350 ; CHECK: [[TMP1:%.*]] = icmp sgt i64 %a, %b | |
351 ; CHECK: br i1 [[TMP1]], label %unreached, label %normal | |
352 %eq = icmp eq i64 %a, %b | |
353 %slt = icmp slt i64 %a, %b | |
354 %. = select i1 %slt, i32 -3, i32 -1 | |
355 %result = select i1 %eq, i32 -2, i32 %. | |
356 %cmp = icmp eq i32 %result, -1 | |
357 br i1 %cmp, label %unreached, label %normal | |
358 normal: | |
359 ret void | |
360 unreached: | |
361 call void @use(i32 %result) | |
362 ret void | |
363 } | |
364 | |
365 define void @non_standard_bound1(i64 %a, i64 %b) { | |
366 ; CHECK-LABEL: @non_standard_bound1 | |
367 ; CHECK: br i1 false, label %unreached, label %normal | |
368 %eq = icmp eq i64 %a, %b | |
369 %slt = icmp slt i64 %a, %b | |
370 %. = select i1 %slt, i32 -3, i32 -1 | |
371 %result = select i1 %eq, i32 -2, i32 %. | |
372 %cmp = icmp eq i32 %result, -20 | |
373 br i1 %cmp, label %unreached, label %normal | |
374 normal: | |
375 ret void | |
376 unreached: | |
377 call void @use(i32 %result) | |
378 ret void | |
379 } | |
380 | |
381 define void @non_standard_bound2(i64 %a, i64 %b) { | |
382 ; CHECK-LABEL: @non_standard_bound2 | |
383 ; CHECK: br i1 false, label %unreached, label %normal | |
384 %eq = icmp eq i64 %a, %b | |
385 %slt = icmp slt i64 %a, %b | |
386 %. = select i1 %slt, i32 -3, i32 -1 | |
387 %result = select i1 %eq, i32 -2, i32 %. | |
388 %cmp = icmp eq i32 %result, 0 | |
389 br i1 %cmp, label %unreached, label %normal | |
390 normal: | |
391 ret void | |
392 unreached: | |
393 call void @use(i32 %result) | |
394 ret void | |
395 } |