blob: e15bfaa84f612ee80220a2a4163abfa5fdbf7f55 [file] [log] [blame]
Duncan Sands9d32f602011-01-20 13:21:55 +00001; RUN: opt < %s -instsimplify -S | FileCheck %s
2target datalayout = "p:32:32"
3
4define 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
Benjamin Kramerfd8779a2012-02-16 13:49:39 +000013define 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
24define 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
Eli Friedman2c3acb02012-02-18 03:29:25 +000033define 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
Nick Lewyckyf7087ea2012-02-26 02:09:49 +000043; PR11238
44%gept = type { i32, i32 }
45@gepy = global %gept zeroinitializer, align 8
46@gepz = extern_weak global %gept
47
48define i1 @gep3() {
49; CHECK: @gep3
50 %x = alloca %gept, align 8
51 %a = getelementptr %gept* %x, i64 0, i32 0
52 %b = getelementptr %gept* %x, i64 0, i32 1
53 %equal = icmp eq i32* %a, %b
54 ret i1 %equal
55; CHECK-NEXT: ret i1 false
56}
57
58define i1 @gep4() {
59; CHECK: @gep4
60 %x = alloca %gept, align 8
61 %a = getelementptr %gept* @gepy, i64 0, i32 0
62 %b = getelementptr %gept* @gepy, i64 0, i32 1
63 %equal = icmp eq i32* %a, %b
64 ret i1 %equal
65; CHECK-NEXT: ret i1 false
66}
67
68define i1 @gep5() {
69; CHECK: @gep5
70 %x = alloca %gept, align 8
71 %a = getelementptr inbounds %gept* %x, i64 0, i32 1
72 %b = getelementptr %gept* @gepy, i64 0, i32 0
73 %equal = icmp eq i32* %a, %b
74 ret i1 %equal
75; CHECK-NEXT: ret i1 false
76}
77
78define i1 @gep6(%gept* %x) {
79; Same as @gep3 but potentially null.
80; CHECK: @gep6
81 %a = getelementptr %gept* %x, i64 0, i32 0
82 %b = getelementptr %gept* %x, i64 0, i32 1
83 %equal = icmp eq i32* %a, %b
84 ret i1 %equal
85; CHECK-NEXT: ret i1 false
86}
87
88define i1 @gep7(%gept* %x) {
89; CHECK: @gep7
90 %a = getelementptr %gept* %x, i64 0, i32 0
91 %b = getelementptr %gept* @gepz, i64 0, i32 0
92 %equal = icmp eq i32* %a, %b
93 ret i1 %equal
94; CHECK: ret i1 %equal
95}
96
97define i1 @gep8(%gept* %x) {
98; CHECK: @gep8
99 %a = getelementptr %gept* %x, i32 1
100 %b = getelementptr %gept* %x, i32 -1
101 %equal = icmp ugt %gept* %a, %b
102 ret i1 %equal
103; CHECK: ret i1 %equal
104}
105
Duncan Sands9d32f602011-01-20 13:21:55 +0000106define i1 @zext(i32 %x) {
107; CHECK: @zext
108 %e1 = zext i32 %x to i64
109 %e2 = zext i32 %x to i64
110 %r = icmp eq i64 %e1, %e2
111 ret i1 %r
112; CHECK: ret i1 true
113}
114
115define i1 @zext2(i1 %x) {
116; CHECK: @zext2
117 %e = zext i1 %x to i32
118 %c = icmp ne i32 %e, 0
119 ret i1 %c
120; CHECK: ret i1 %x
121}
122
Duncan Sandsd70d1a52011-01-25 09:38:29 +0000123define i1 @zext3() {
124; CHECK: @zext3
125 %e = zext i1 1 to i32
126 %c = icmp ne i32 %e, 0
127 ret i1 %c
128; CHECK: ret i1 true
129}
130
Duncan Sands9d32f602011-01-20 13:21:55 +0000131define i1 @sext(i32 %x) {
132; CHECK: @sext
133 %e1 = sext i32 %x to i64
134 %e2 = sext i32 %x to i64
135 %r = icmp eq i64 %e1, %e2
136 ret i1 %r
137; CHECK: ret i1 true
138}
139
140define i1 @sext2(i1 %x) {
141; CHECK: @sext2
142 %e = sext i1 %x to i32
143 %c = icmp ne i32 %e, 0
144 ret i1 %c
145; CHECK: ret i1 %x
146}
Duncan Sandsd70d1a52011-01-25 09:38:29 +0000147
148define i1 @sext3() {
149; CHECK: @sext3
150 %e = sext i1 1 to i32
151 %c = icmp ne i32 %e, 0
152 ret i1 %c
153; CHECK: ret i1 true
154}
155
156define i1 @add(i32 %x, i32 %y) {
Duncan Sands227fba12011-01-25 15:14:15 +0000157; CHECK: @add
Duncan Sandsd70d1a52011-01-25 09:38:29 +0000158 %l = lshr i32 %x, 1
Duncan Sands227fba12011-01-25 15:14:15 +0000159 %q = lshr i32 %y, 1
160 %r = or i32 %q, 1
Duncan Sandsd70d1a52011-01-25 09:38:29 +0000161 %s = add i32 %l, %r
162 %c = icmp eq i32 %s, 0
163 ret i1 %c
Duncan Sands227fba12011-01-25 15:14:15 +0000164; CHECK: ret i1 false
Duncan Sandsd70d1a52011-01-25 09:38:29 +0000165}
166
167define i1 @add2(i8 %x, i8 %y) {
168; CHECK: @add2
169 %l = or i8 %x, 128
170 %r = or i8 %y, 129
171 %s = add i8 %l, %r
172 %c = icmp eq i8 %s, 0
173 ret i1 %c
174; CHECK: ret i1 false
175}
176
Duncan Sands227fba12011-01-25 15:14:15 +0000177define i1 @add3(i8 %x, i8 %y) {
178; CHECK: @add3
179 %l = zext i8 %x to i32
180 %r = zext i8 %y to i32
181 %s = add i32 %l, %r
182 %c = icmp eq i32 %s, 0
183 ret i1 %c
184; CHECK: ret i1 %c
185}
186
Duncan Sands52fb8462011-02-13 17:15:40 +0000187define i1 @add4(i32 %x, i32 %y) {
188; CHECK: @add4
189 %z = add nsw i32 %y, 1
190 %s1 = add nsw i32 %x, %y
191 %s2 = add nsw i32 %x, %z
192 %c = icmp slt i32 %s1, %s2
193 ret i1 %c
194; CHECK: ret i1 true
195}
196
197define i1 @add5(i32 %x, i32 %y) {
198; CHECK: @add5
199 %z = add nuw i32 %y, 1
200 %s1 = add nuw i32 %x, %z
201 %s2 = add nuw i32 %x, %y
202 %c = icmp ugt i32 %s1, %s2
203 ret i1 %c
204; CHECK: ret i1 true
205}
206
Duncan Sandsd70d1a52011-01-25 09:38:29 +0000207define i1 @addpowtwo(i32 %x, i32 %y) {
208; CHECK: @addpowtwo
209 %l = lshr i32 %x, 1
210 %r = shl i32 1, %y
211 %s = add i32 %l, %r
212 %c = icmp eq i32 %s, 0
213 ret i1 %c
214; CHECK: ret i1 false
215}
216
217define i1 @or(i32 %x) {
218; CHECK: @or
219 %o = or i32 %x, 1
220 %c = icmp eq i32 %o, 0
221 ret i1 %c
222; CHECK: ret i1 false
223}
Duncan Sands91367822011-01-29 13:27:00 +0000224
225define i1 @shl(i32 %x) {
226; CHECK: @shl
227 %s = shl i32 1, %x
228 %c = icmp eq i32 %s, 0
229 ret i1 %c
230; CHECK: ret i1 false
231}
232
Nick Lewycky3a73e342011-03-04 07:00:57 +0000233define i1 @lshr1(i32 %x) {
234; CHECK: @lshr1
Duncan Sands91367822011-01-29 13:27:00 +0000235 %s = lshr i32 -1, %x
236 %c = icmp eq i32 %s, 0
237 ret i1 %c
238; CHECK: ret i1 false
239}
240
Nick Lewycky3a73e342011-03-04 07:00:57 +0000241define i1 @lshr2(i32 %x) {
242; CHECK: @lshr2
243 %s = lshr i32 %x, 30
244 %c = icmp ugt i32 %s, 8
245 ret i1 %c
246; CHECK: ret i1 false
247}
248
249define i1 @ashr1(i32 %x) {
250; CHECK: @ashr1
Duncan Sands91367822011-01-29 13:27:00 +0000251 %s = ashr i32 -1, %x
252 %c = icmp eq i32 %s, 0
253 ret i1 %c
254; CHECK: ret i1 false
255}
Duncan Sands50ca4d32011-02-03 09:37:39 +0000256
Nick Lewycky3a73e342011-03-04 07:00:57 +0000257define i1 @ashr2(i32 %x) {
258; CHECK: @ashr2
259 %s = ashr i32 %x, 30
260 %c = icmp slt i32 %s, -5
261 ret i1 %c
262; CHECK: ret i1 false
263}
264
Duncan Sands50ca4d32011-02-03 09:37:39 +0000265define i1 @select1(i1 %cond) {
266; CHECK: @select1
267 %s = select i1 %cond, i32 1, i32 0
268 %c = icmp eq i32 %s, 1
269 ret i1 %c
270; CHECK: ret i1 %cond
271}
272
273define i1 @select2(i1 %cond) {
274; CHECK: @select2
275 %x = zext i1 %cond to i32
276 %s = select i1 %cond, i32 %x, i32 0
277 %c = icmp ne i32 %s, 0
278 ret i1 %c
279; CHECK: ret i1 %cond
280}
281
282define i1 @select3(i1 %cond) {
283; CHECK: @select3
284 %x = zext i1 %cond to i32
285 %s = select i1 %cond, i32 1, i32 %x
286 %c = icmp ne i32 %s, 0
287 ret i1 %c
288; CHECK: ret i1 %cond
289}
290
291define i1 @select4(i1 %cond) {
292; CHECK: @select4
293 %invert = xor i1 %cond, 1
294 %s = select i1 %invert, i32 0, i32 1
295 %c = icmp ne i32 %s, 0
296 ret i1 %c
297; CHECK: ret i1 %cond
298}
Nick Lewycky88cd0aa2011-03-01 08:15:50 +0000299
Duncan Sands6dc9e2b2011-10-30 19:56:36 +0000300define i1 @select5(i32 %x) {
301; CHECK: @select5
302 %c = icmp eq i32 %x, 0
303 %s = select i1 %c, i32 1, i32 %x
304 %c2 = icmp eq i32 %s, 0
305 ret i1 %c2
306; CHECK: ret i1 false
307}
308
309define i1 @select6(i32 %x) {
310; CHECK: @select6
311 %c = icmp sgt i32 %x, 0
312 %s = select i1 %c, i32 %x, i32 4
313 %c2 = icmp eq i32 %s, 0
314 ret i1 %c2
315; CHECK: ret i1 %c2
316}
317
Nick Lewycky88cd0aa2011-03-01 08:15:50 +0000318define i1 @urem1(i32 %X, i32 %Y) {
319; CHECK: @urem1
320 %A = urem i32 %X, %Y
321 %B = icmp ult i32 %A, %Y
322 ret i1 %B
323; CHECK: ret i1 true
324}
325
326define i1 @urem2(i32 %X, i32 %Y) {
327; CHECK: @urem2
328 %A = urem i32 %X, %Y
329 %B = icmp eq i32 %A, %Y
330 ret i1 %B
Benjamin Kramer7bff3e72011-03-09 22:07:31 +0000331; CHECK: ret i1 false
Nick Lewycky88cd0aa2011-03-01 08:15:50 +0000332}
Nick Lewycky3a73e342011-03-04 07:00:57 +0000333
334define i1 @urem3(i32 %X) {
335; CHECK: @urem3
336 %A = urem i32 %X, 10
337 %B = icmp ult i32 %A, 15
338 ret i1 %B
339; CHECK: ret i1 true
340}
341
342define i1 @urem4(i32 %X) {
343; CHECK: @urem4
344 %A = urem i32 %X, 15
345 %B = icmp ult i32 %A, 10
346 ret i1 %B
347; CHECK: ret i1 %B
348}
349
Nick Lewycky78679272011-03-04 10:06:52 +0000350define i1 @urem5(i16 %X, i32 %Y) {
351; CHECK: @urem5
352 %A = zext i16 %X to i32
353 %B = urem i32 %A, %Y
354 %C = icmp slt i32 %B, %Y
355 ret i1 %C
356; CHECK: ret i1 true
357}
358
Nick Lewycky84dd4fa2011-03-09 06:26:03 +0000359define i1 @urem6(i32 %X, i32 %Y) {
360; CHECK: @urem6
361 %A = urem i32 %X, %Y
362 %B = icmp ugt i32 %Y, %A
363 ret i1 %B
364; CHECK: ret i1 true
365}
366
Nick Lewycky3a73e342011-03-04 07:00:57 +0000367define i1 @srem1(i32 %X) {
368; CHECK: @srem1
369 %A = srem i32 %X, -5
370 %B = icmp sgt i32 %A, 5
371 ret i1 %B
372; CHECK: ret i1 false
373}
374
Nick Lewyckyb69050a2011-03-11 09:00:19 +0000375; PR9343 #15
376; CHECK: @srem2
377; CHECK: ret i1 false
378define i1 @srem2(i16 %X, i32 %Y) {
379 %A = zext i16 %X to i32
380 %B = add nsw i32 %A, 1
381 %C = srem i32 %B, %Y
382 %D = icmp slt i32 %C, 0
383 ret i1 %D
384}
Benjamin Kramer14b2a592011-03-12 17:18:11 +0000385
386; CHECK: @srem3
387; CHECK-NEXT: ret i1 false
388define i1 @srem3(i16 %X, i32 %Y) {
389 %A = zext i16 %X to i32
390 %B = or i32 2147483648, %A
391 %C = sub nsw i32 1, %B
392 %D = srem i32 %C, %Y
393 %E = icmp slt i32 %D, 0
394 ret i1 %E
395}
396
Nick Lewycky3a73e342011-03-04 07:00:57 +0000397define i1 @udiv1(i32 %X) {
398; CHECK: @udiv1
399 %A = udiv i32 %X, 1000000
400 %B = icmp ult i32 %A, 5000
401 ret i1 %B
402; CHECK: ret i1 true
403}
404
Nick Lewycky58bfcdb2011-03-05 05:19:11 +0000405define i1 @udiv2(i32 %X, i32 %Y, i32 %Z) {
406; CHECK: @udiv2
407 %A = udiv exact i32 10, %Z
408 %B = udiv exact i32 20, %Z
409 %C = icmp ult i32 %A, %B
410 ret i1 %C
411; CHECK: ret i1 true
412}
413
Duncan Sandsc65c7472011-10-28 18:17:44 +0000414define i1 @udiv3(i32 %X, i32 %Y) {
415; CHECK: @udiv3
416 %A = udiv i32 %X, %Y
417 %C = icmp ugt i32 %A, %X
418 ret i1 %C
419; CHECK: ret i1 false
420}
421
422define i1 @udiv4(i32 %X, i32 %Y) {
423; CHECK: @udiv4
424 %A = udiv i32 %X, %Y
425 %C = icmp ule i32 %A, %X
426 ret i1 %C
427; CHECK: ret i1 true
428}
429
430define i1 @udiv5(i32 %X) {
431; CHECK: @udiv5
432 %A = udiv i32 123, %X
433 %C = icmp ugt i32 %A, 124
434 ret i1 %C
435; CHECK: ret i1 false
436}
437
Eli Friedman7781ae52011-11-08 21:08:02 +0000438; PR11340
439define i1 @udiv6(i32 %X) nounwind {
440; CHECK: @udiv6
441 %A = udiv i32 1, %X
442 %C = icmp eq i32 %A, 0
443 ret i1 %C
444; CHECK: ret i1 %C
445}
446
447
Nick Lewycky3a73e342011-03-04 07:00:57 +0000448define i1 @sdiv1(i32 %X) {
449; CHECK: @sdiv1
450 %A = sdiv i32 %X, 1000000
451 %B = icmp slt i32 %A, 3000
452 ret i1 %B
453; CHECK: ret i1 true
454}
455
456define i1 @or1(i32 %X) {
457; CHECK: @or1
458 %A = or i32 %X, 62
459 %B = icmp ult i32 %A, 50
460 ret i1 %B
461; CHECK: ret i1 false
462}
463
464define i1 @and1(i32 %X) {
465; CHECK: @and1
466 %A = and i32 %X, 62
467 %B = icmp ugt i32 %A, 70
468 ret i1 %B
469; CHECK: ret i1 false
470}
Duncan Sands32a43cc2011-10-27 19:16:21 +0000471
472define i1 @mul1(i32 %X) {
473; CHECK: @mul1
474; Square of a non-zero number is non-zero if there is no overflow.
475 %Y = or i32 %X, 1
476 %M = mul nuw i32 %Y, %Y
477 %C = icmp eq i32 %M, 0
478 ret i1 %C
479; CHECK: ret i1 false
480}
481
482define i1 @mul2(i32 %X) {
483; CHECK: @mul2
484; Square of a non-zero number is positive if there is no signed overflow.
485 %Y = or i32 %X, 1
486 %M = mul nsw i32 %Y, %Y
487 %C = icmp sgt i32 %M, 0
488 ret i1 %C
489; CHECK: ret i1 true
490}
491
492define i1 @mul3(i32 %X, i32 %Y) {
493; CHECK: @mul3
494; Product of non-negative numbers is non-negative if there is no signed overflow.
495 %XX = mul nsw i32 %X, %X
496 %YY = mul nsw i32 %Y, %Y
497 %M = mul nsw i32 %XX, %YY
498 %C = icmp sge i32 %M, 0
499 ret i1 %C
500; CHECK: ret i1 true
501}
Duncan Sandsedfb9312012-02-10 14:26:42 +0000502
503define <2 x i1> @vectorselect1(<2 x i1> %cond) {
504; CHECK: @vectorselect1
505 %invert = xor <2 x i1> %cond, <i1 1, i1 1>
506 %s = select <2 x i1> %invert, <2 x i32> <i32 0, i32 0>, <2 x i32> <i32 1, i32 1>
507 %c = icmp ne <2 x i32> %s, <i32 0, i32 0>
508 ret <2 x i1> %c
509; CHECK: ret <2 x i1> %cond
510}
Duncan Sandsaa97bb52012-02-10 14:31:24 +0000511
Chris Lattnerb053fc12012-02-20 00:42:49 +0000512; PR11948
513define <2 x i1> @vectorselectcrash(i32 %arg1) {
Duncan Sandsaa97bb52012-02-10 14:31:24 +0000514 %tobool40 = icmp ne i32 %arg1, 0
515 %cond43 = select i1 %tobool40, <2 x i16> <i16 -5, i16 66>, <2 x i16> <i16 46, i16 1>
516 %cmp45 = icmp ugt <2 x i16> %cond43, <i16 73, i16 21>
517 ret <2 x i1> %cmp45
518}
Chris Lattnerb053fc12012-02-20 00:42:49 +0000519
520; PR12013
521define i1 @alloca_compare(i64 %idx) {
522 %sv = alloca { i32, i32, [124 x i32] }
523 %1 = getelementptr inbounds { i32, i32, [124 x i32] }* %sv, i32 0, i32 2, i64 %idx
524 %2 = icmp eq i32* %1, null
525 ret i1 %2
526 ; CHECK: alloca_compare
527 ; CHECK: ret i1 false
528}
Chris Lattner009e2652012-02-24 19:01:58 +0000529
530; PR12075
531define i1 @infinite_gep() {
532 ret i1 1
533
534unreachableblock:
535 %X = getelementptr i32 *%X, i32 1
536 %Y = icmp eq i32* %X, null
537 ret i1 %Y
538}