85aea19e6956ed9b049a0979c8ec53019b1d9783
[oota-llvm.git] / test / Transforms / InstSimplify / compare.ll
1 ; RUN: opt < %s -instsimplify -S | FileCheck %s
2 target datalayout = "p:32:32"
3
4 define i1 @ptrtoint() {
5 ; CHECK: @ptrtoint
6   %a = alloca i8
7   %tmp = ptrtoint i8* %a to i32
8   %r = icmp eq i32 %tmp, 0
9   ret i1 %r
10 ; CHECK: ret i1 false
11 }
12
13 define i1 @bitcast() {
14 ; CHECK: @bitcast
15   %a = alloca i32
16   %b = alloca i64
17   %x = bitcast i32* %a to i8*
18   %y = bitcast i64* %b to i8*
19   %cmp = icmp eq i8* %x, %y
20   ret i1 %cmp
21 ; CHECK-NEXT: ret i1 false
22 }
23
24 define i1 @gep() {
25 ; CHECK: @gep
26   %a = alloca [3 x i8], align 8
27   %x = getelementptr inbounds [3 x i8]* %a, i32 0, i32 0
28   %cmp = icmp eq i8* %x, null
29   ret i1 %cmp
30 ; CHECK-NEXT: ret i1 false
31 }
32
33 define i1 @gep2() {
34 ; CHECK: @gep2
35   %a = alloca [3 x i8], align 8
36   %x = getelementptr inbounds [3 x i8]* %a, i32 0, i32 0
37   %y = getelementptr inbounds [3 x i8]* %a, i32 0, i32 0
38   %cmp = icmp eq i8* %x, %y
39   ret i1 %cmp
40 ; CHECK-NEXT: ret i1 true
41 }
42
43 ; PR11238
44 %t = type { i32, i32 }
45 @y = global %t zeroinitializer, align 8
46
47 define i1 @gep3() {
48 ; CHECK: @gep3
49   %x = alloca %t, align 8
50   %a = getelementptr %t* %x, i64 0, i32 0
51   %b = getelementptr %t* %x, i64 0, i32 1
52   %equal = icmp eq i32* %a, %b
53   ret i1 %equal
54 ; CHECK-NEXT: ret i1 false
55 }
56
57 define i1 @gep4() {
58 ; CHECK: @gep4
59   %x = alloca %t, align 8
60   %a = getelementptr %t* @y, i64 0, i32 0
61   %b = getelementptr %t* @y, i64 0, i32 1
62   %equal = icmp eq i32* %a, %b
63   ret i1 %equal
64 ; CHECK-NEXT: ret i1 false
65 }
66
67 define i1 @gep5() {
68 ; CHECK: @gep5
69   %x = alloca %t, align 8
70   %a = getelementptr inbounds %t* %x, i64 0, i32 1
71   %b = getelementptr %t* @y, i64 0, i32 0
72   %equal = icmp eq i32* %a, %b
73   ret i1 %equal
74 ; CHECK-NEXT: ret i1 false
75 }
76
77 define i1 @gep6(%t* %x) {
78 ; Same as @gep3 but potentially null.
79 ; CHECK: @gep6
80   %a = getelementptr %t* %x, i64 0, i32 0
81   %b = getelementptr %t* %x, i64 0, i32 1
82   %equal = icmp eq i32* %a, %b
83   ret i1 %equal
84 ; CHECK-NEXT: ret i1 false
85 }
86
87 define i1 @zext(i32 %x) {
88 ; CHECK: @zext
89   %e1 = zext i32 %x to i64
90   %e2 = zext i32 %x to i64
91   %r = icmp eq i64 %e1, %e2
92   ret i1 %r
93 ; CHECK: ret i1 true
94 }
95
96 define i1 @zext2(i1 %x) {
97 ; CHECK: @zext2
98   %e = zext i1 %x to i32
99   %c = icmp ne i32 %e, 0
100   ret i1 %c
101 ; CHECK: ret i1 %x
102 }
103
104 define i1 @zext3() {
105 ; CHECK: @zext3
106   %e = zext i1 1 to i32
107   %c = icmp ne i32 %e, 0
108   ret i1 %c
109 ; CHECK: ret i1 true
110 }
111
112 define i1 @sext(i32 %x) {
113 ; CHECK: @sext
114   %e1 = sext i32 %x to i64
115   %e2 = sext i32 %x to i64
116   %r = icmp eq i64 %e1, %e2
117   ret i1 %r
118 ; CHECK: ret i1 true
119 }
120
121 define i1 @sext2(i1 %x) {
122 ; CHECK: @sext2
123   %e = sext i1 %x to i32
124   %c = icmp ne i32 %e, 0
125   ret i1 %c
126 ; CHECK: ret i1 %x
127 }
128
129 define i1 @sext3() {
130 ; CHECK: @sext3
131   %e = sext i1 1 to i32
132   %c = icmp ne i32 %e, 0
133   ret i1 %c
134 ; CHECK: ret i1 true
135 }
136
137 define i1 @add(i32 %x, i32 %y) {
138 ; CHECK: @add
139   %l = lshr i32 %x, 1
140   %q = lshr i32 %y, 1
141   %r = or i32 %q, 1
142   %s = add i32 %l, %r
143   %c = icmp eq i32 %s, 0
144   ret i1 %c
145 ; CHECK: ret i1 false
146 }
147
148 define i1 @add2(i8 %x, i8 %y) {
149 ; CHECK: @add2
150   %l = or i8 %x, 128
151   %r = or i8 %y, 129
152   %s = add i8 %l, %r
153   %c = icmp eq i8 %s, 0
154   ret i1 %c
155 ; CHECK: ret i1 false
156 }
157
158 define i1 @add3(i8 %x, i8 %y) {
159 ; CHECK: @add3
160   %l = zext i8 %x to i32
161   %r = zext i8 %y to i32
162   %s = add i32 %l, %r
163   %c = icmp eq i32 %s, 0
164   ret i1 %c
165 ; CHECK: ret i1 %c
166 }
167
168 define i1 @add4(i32 %x, i32 %y) {
169 ; CHECK: @add4
170   %z = add nsw i32 %y, 1
171   %s1 = add nsw i32 %x, %y
172   %s2 = add nsw i32 %x, %z
173   %c = icmp slt i32 %s1, %s2
174   ret i1 %c
175 ; CHECK: ret i1 true
176 }
177
178 define i1 @add5(i32 %x, i32 %y) {
179 ; CHECK: @add5
180   %z = add nuw i32 %y, 1
181   %s1 = add nuw i32 %x, %z
182   %s2 = add nuw i32 %x, %y
183   %c = icmp ugt i32 %s1, %s2
184   ret i1 %c
185 ; CHECK: ret i1 true
186 }
187
188 define i1 @addpowtwo(i32 %x, i32 %y) {
189 ; CHECK: @addpowtwo
190   %l = lshr i32 %x, 1
191   %r = shl i32 1, %y
192   %s = add i32 %l, %r
193   %c = icmp eq i32 %s, 0
194   ret i1 %c
195 ; CHECK: ret i1 false
196 }
197
198 define i1 @or(i32 %x) {
199 ; CHECK: @or
200   %o = or i32 %x, 1
201   %c = icmp eq i32 %o, 0
202   ret i1 %c
203 ; CHECK: ret i1 false
204 }
205
206 define i1 @shl(i32 %x) {
207 ; CHECK: @shl
208   %s = shl i32 1, %x
209   %c = icmp eq i32 %s, 0
210   ret i1 %c
211 ; CHECK: ret i1 false
212 }
213
214 define i1 @lshr1(i32 %x) {
215 ; CHECK: @lshr1
216   %s = lshr i32 -1, %x
217   %c = icmp eq i32 %s, 0
218   ret i1 %c
219 ; CHECK: ret i1 false
220 }
221
222 define i1 @lshr2(i32 %x) {
223 ; CHECK: @lshr2
224   %s = lshr i32 %x, 30
225   %c = icmp ugt i32 %s, 8
226   ret i1 %c
227 ; CHECK: ret i1 false
228 }
229
230 define i1 @ashr1(i32 %x) {
231 ; CHECK: @ashr1
232   %s = ashr i32 -1, %x
233   %c = icmp eq i32 %s, 0
234   ret i1 %c
235 ; CHECK: ret i1 false
236 }
237
238 define i1 @ashr2(i32 %x) {
239 ; CHECK: @ashr2
240   %s = ashr i32 %x, 30
241   %c = icmp slt i32 %s, -5
242   ret i1 %c
243 ; CHECK: ret i1 false
244 }
245
246 define i1 @select1(i1 %cond) {
247 ; CHECK: @select1
248   %s = select i1 %cond, i32 1, i32 0
249   %c = icmp eq i32 %s, 1
250   ret i1 %c
251 ; CHECK: ret i1 %cond
252 }
253
254 define i1 @select2(i1 %cond) {
255 ; CHECK: @select2
256   %x = zext i1 %cond to i32
257   %s = select i1 %cond, i32 %x, i32 0
258   %c = icmp ne i32 %s, 0
259   ret i1 %c
260 ; CHECK: ret i1 %cond
261 }
262
263 define i1 @select3(i1 %cond) {
264 ; CHECK: @select3
265   %x = zext i1 %cond to i32
266   %s = select i1 %cond, i32 1, i32 %x
267   %c = icmp ne i32 %s, 0
268   ret i1 %c
269 ; CHECK: ret i1 %cond
270 }
271
272 define i1 @select4(i1 %cond) {
273 ; CHECK: @select4
274   %invert = xor i1 %cond, 1
275   %s = select i1 %invert, i32 0, i32 1
276   %c = icmp ne i32 %s, 0
277   ret i1 %c
278 ; CHECK: ret i1 %cond
279 }
280
281 define i1 @select5(i32 %x) {
282 ; CHECK: @select5
283   %c = icmp eq i32 %x, 0
284   %s = select i1 %c, i32 1, i32 %x
285   %c2 = icmp eq i32 %s, 0
286   ret i1 %c2
287 ; CHECK: ret i1 false
288 }
289
290 define i1 @select6(i32 %x) {
291 ; CHECK: @select6
292   %c = icmp sgt i32 %x, 0
293   %s = select i1 %c, i32 %x, i32 4
294   %c2 = icmp eq i32 %s, 0
295   ret i1 %c2
296 ; CHECK: ret i1 %c2
297 }
298
299 define i1 @urem1(i32 %X, i32 %Y) {
300 ; CHECK: @urem1
301   %A = urem i32 %X, %Y
302   %B = icmp ult i32 %A, %Y
303   ret i1 %B
304 ; CHECK: ret i1 true
305 }
306
307 define i1 @urem2(i32 %X, i32 %Y) {
308 ; CHECK: @urem2
309   %A = urem i32 %X, %Y
310   %B = icmp eq i32 %A, %Y
311   ret i1 %B
312 ; CHECK: ret i1 false
313 }
314
315 define i1 @urem3(i32 %X) {
316 ; CHECK: @urem3
317   %A = urem i32 %X, 10
318   %B = icmp ult i32 %A, 15
319   ret i1 %B
320 ; CHECK: ret i1 true
321 }
322
323 define i1 @urem4(i32 %X) {
324 ; CHECK: @urem4
325   %A = urem i32 %X, 15
326   %B = icmp ult i32 %A, 10
327   ret i1 %B
328 ; CHECK: ret i1 %B
329 }
330
331 define i1 @urem5(i16 %X, i32 %Y) {
332 ; CHECK: @urem5
333   %A = zext i16 %X to i32
334   %B = urem i32 %A, %Y
335   %C = icmp slt i32 %B, %Y
336   ret i1 %C
337 ; CHECK: ret i1 true
338 }
339
340 define i1 @urem6(i32 %X, i32 %Y) {
341 ; CHECK: @urem6
342   %A = urem i32 %X, %Y
343   %B = icmp ugt i32 %Y, %A
344   ret i1 %B
345 ; CHECK: ret i1 true
346 }
347
348 define i1 @srem1(i32 %X) {
349 ; CHECK: @srem1
350   %A = srem i32 %X, -5
351   %B = icmp sgt i32 %A, 5
352   ret i1 %B
353 ; CHECK: ret i1 false
354 }
355
356 ; PR9343 #15
357 ; CHECK: @srem2
358 ; CHECK: ret i1 false
359 define i1 @srem2(i16 %X, i32 %Y) {
360   %A = zext i16 %X to i32
361   %B = add nsw i32 %A, 1
362   %C = srem i32 %B, %Y
363   %D = icmp slt i32 %C, 0
364   ret i1 %D
365 }
366
367 ; CHECK: @srem3
368 ; CHECK-NEXT: ret i1 false
369 define i1 @srem3(i16 %X, i32 %Y) {
370   %A = zext i16 %X to i32
371   %B = or i32 2147483648, %A
372   %C = sub nsw i32 1, %B
373   %D = srem i32 %C, %Y
374   %E = icmp slt i32 %D, 0
375   ret i1 %E
376 }
377
378 define i1 @udiv1(i32 %X) {
379 ; CHECK: @udiv1
380   %A = udiv i32 %X, 1000000
381   %B = icmp ult i32 %A, 5000
382   ret i1 %B
383 ; CHECK: ret i1 true
384 }
385
386 define i1 @udiv2(i32 %X, i32 %Y, i32 %Z) {
387 ; CHECK: @udiv2
388   %A = udiv exact i32 10, %Z
389   %B = udiv exact i32 20, %Z
390   %C = icmp ult i32 %A, %B
391   ret i1 %C
392 ; CHECK: ret i1 true
393 }
394
395 define i1 @udiv3(i32 %X, i32 %Y) {
396 ; CHECK: @udiv3
397   %A = udiv i32 %X, %Y
398   %C = icmp ugt i32 %A, %X
399   ret i1 %C
400 ; CHECK: ret i1 false
401 }
402
403 define i1 @udiv4(i32 %X, i32 %Y) {
404 ; CHECK: @udiv4
405   %A = udiv i32 %X, %Y
406   %C = icmp ule i32 %A, %X
407   ret i1 %C
408 ; CHECK: ret i1 true
409 }
410
411 define i1 @udiv5(i32 %X) {
412 ; CHECK: @udiv5
413   %A = udiv i32 123, %X
414   %C = icmp ugt i32 %A, 124
415   ret i1 %C
416 ; CHECK: ret i1 false
417 }
418
419 ; PR11340
420 define i1 @udiv6(i32 %X) nounwind {
421 ; CHECK: @udiv6
422   %A = udiv i32 1, %X
423   %C = icmp eq i32 %A, 0
424   ret i1 %C
425 ; CHECK: ret i1 %C
426 }
427
428
429 define i1 @sdiv1(i32 %X) {
430 ; CHECK: @sdiv1
431   %A = sdiv i32 %X, 1000000
432   %B = icmp slt i32 %A, 3000
433   ret i1 %B
434 ; CHECK: ret i1 true
435 }
436
437 define i1 @or1(i32 %X) {
438 ; CHECK: @or1
439   %A = or i32 %X, 62
440   %B = icmp ult i32 %A, 50
441   ret i1 %B
442 ; CHECK: ret i1 false
443 }
444
445 define i1 @and1(i32 %X) {
446 ; CHECK: @and1
447   %A = and i32 %X, 62
448   %B = icmp ugt i32 %A, 70
449   ret i1 %B
450 ; CHECK: ret i1 false
451 }
452
453 define i1 @mul1(i32 %X) {
454 ; CHECK: @mul1
455 ; Square of a non-zero number is non-zero if there is no overflow.
456   %Y = or i32 %X, 1
457   %M = mul nuw i32 %Y, %Y
458   %C = icmp eq i32 %M, 0
459   ret i1 %C
460 ; CHECK: ret i1 false
461 }
462
463 define i1 @mul2(i32 %X) {
464 ; CHECK: @mul2
465 ; Square of a non-zero number is positive if there is no signed overflow.
466   %Y = or i32 %X, 1
467   %M = mul nsw i32 %Y, %Y
468   %C = icmp sgt i32 %M, 0
469   ret i1 %C
470 ; CHECK: ret i1 true
471 }
472
473 define i1 @mul3(i32 %X, i32 %Y) {
474 ; CHECK: @mul3
475 ; Product of non-negative numbers is non-negative if there is no signed overflow.
476   %XX = mul nsw i32 %X, %X
477   %YY = mul nsw i32 %Y, %Y
478   %M = mul nsw i32 %XX, %YY
479   %C = icmp sge i32 %M, 0
480   ret i1 %C
481 ; CHECK: ret i1 true
482 }
483
484 define <2 x i1> @vectorselect1(<2 x i1> %cond) {
485 ; CHECK: @vectorselect1
486   %invert = xor <2 x i1> %cond, <i1 1, i1 1>
487   %s = select <2 x i1> %invert, <2 x i32> <i32 0, i32 0>, <2 x i32> <i32 1, i32 1>
488   %c = icmp ne <2 x i32> %s, <i32 0, i32 0>
489   ret <2 x i1> %c
490 ; CHECK: ret <2 x i1> %cond
491 }
492
493 ; PR11948
494 define <2 x i1> @vectorselectcrash(i32 %arg1) {
495   %tobool40 = icmp ne i32 %arg1, 0
496   %cond43 = select i1 %tobool40, <2 x i16> <i16 -5, i16 66>, <2 x i16> <i16 46, i16 1>
497   %cmp45 = icmp ugt <2 x i16> %cond43, <i16 73, i16 21>
498   ret <2 x i1> %cmp45
499 }
500
501 ; PR12013
502 define i1 @alloca_compare(i64 %idx) {
503   %sv = alloca { i32, i32, [124 x i32] }
504   %1 = getelementptr inbounds { i32, i32, [124 x i32] }* %sv, i32 0, i32 2, i64 %idx
505   %2 = icmp eq i32* %1, null
506   ret i1 %2
507   ; CHECK: alloca_compare
508   ; CHECK: ret i1 false
509 }
510
511 ; PR12075
512 define i1 @infinite_gep() {
513   ret i1 1
514
515 unreachableblock:
516   %X = getelementptr i32 *%X, i32 1
517   %Y = icmp eq i32* %X, null
518   ret i1 %Y
519 }