1 ; RUN: opt < %s -instsimplify -S | FileCheck %s
2 target datalayout = "p:32:32"
4 define i1 @ptrtoint() {
7 %tmp = ptrtoint i8* %a to i32
8 %r = icmp eq i32 %tmp, 0
13 define i1 @bitcast() {
17 %x = bitcast i32* %a to i8*
18 %y = bitcast i64* %b to i8*
19 %cmp = icmp eq i8* %x, %y
21 ; CHECK-NEXT: ret i1 false
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
30 ; CHECK-NEXT: ret i1 false
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
40 ; CHECK-NEXT: ret i1 true
44 %t = type { i32, i32 }
45 @y = global %t zeroinitializer, align 8
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
54 ; CHECK-NEXT: ret i1 false
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
64 ; CHECK-NEXT: ret i1 false
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
74 ; CHECK-NEXT: ret i1 false
77 define i1 @gep6(%t* %x) {
78 ; Same as @gep3 but potentially null.
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
84 ; CHECK-NEXT: ret i1 false
87 define i1 @zext(i32 %x) {
89 %e1 = zext i32 %x to i64
90 %e2 = zext i32 %x to i64
91 %r = icmp eq i64 %e1, %e2
96 define i1 @zext2(i1 %x) {
98 %e = zext i1 %x to i32
99 %c = icmp ne i32 %e, 0
106 %e = zext i1 1 to i32
107 %c = icmp ne i32 %e, 0
112 define i1 @sext(i32 %x) {
114 %e1 = sext i32 %x to i64
115 %e2 = sext i32 %x to i64
116 %r = icmp eq i64 %e1, %e2
121 define i1 @sext2(i1 %x) {
123 %e = sext i1 %x to i32
124 %c = icmp ne i32 %e, 0
131 %e = sext i1 1 to i32
132 %c = icmp ne i32 %e, 0
137 define i1 @add(i32 %x, i32 %y) {
143 %c = icmp eq i32 %s, 0
145 ; CHECK: ret i1 false
148 define i1 @add2(i8 %x, i8 %y) {
153 %c = icmp eq i8 %s, 0
155 ; CHECK: ret i1 false
158 define i1 @add3(i8 %x, i8 %y) {
160 %l = zext i8 %x to i32
161 %r = zext i8 %y to i32
163 %c = icmp eq i32 %s, 0
168 define i1 @add4(i32 %x, i32 %y) {
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
178 define i1 @add5(i32 %x, i32 %y) {
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
188 define i1 @addpowtwo(i32 %x, i32 %y) {
193 %c = icmp eq i32 %s, 0
195 ; CHECK: ret i1 false
198 define i1 @or(i32 %x) {
201 %c = icmp eq i32 %o, 0
203 ; CHECK: ret i1 false
206 define i1 @shl(i32 %x) {
209 %c = icmp eq i32 %s, 0
211 ; CHECK: ret i1 false
214 define i1 @lshr1(i32 %x) {
217 %c = icmp eq i32 %s, 0
219 ; CHECK: ret i1 false
222 define i1 @lshr2(i32 %x) {
225 %c = icmp ugt i32 %s, 8
227 ; CHECK: ret i1 false
230 define i1 @ashr1(i32 %x) {
233 %c = icmp eq i32 %s, 0
235 ; CHECK: ret i1 false
238 define i1 @ashr2(i32 %x) {
241 %c = icmp slt i32 %s, -5
243 ; CHECK: ret i1 false
246 define i1 @select1(i1 %cond) {
248 %s = select i1 %cond, i32 1, i32 0
249 %c = icmp eq i32 %s, 1
251 ; CHECK: ret i1 %cond
254 define i1 @select2(i1 %cond) {
256 %x = zext i1 %cond to i32
257 %s = select i1 %cond, i32 %x, i32 0
258 %c = icmp ne i32 %s, 0
260 ; CHECK: ret i1 %cond
263 define i1 @select3(i1 %cond) {
265 %x = zext i1 %cond to i32
266 %s = select i1 %cond, i32 1, i32 %x
267 %c = icmp ne i32 %s, 0
269 ; CHECK: ret i1 %cond
272 define i1 @select4(i1 %cond) {
274 %invert = xor i1 %cond, 1
275 %s = select i1 %invert, i32 0, i32 1
276 %c = icmp ne i32 %s, 0
278 ; CHECK: ret i1 %cond
281 define i1 @select5(i32 %x) {
283 %c = icmp eq i32 %x, 0
284 %s = select i1 %c, i32 1, i32 %x
285 %c2 = icmp eq i32 %s, 0
287 ; CHECK: ret i1 false
290 define i1 @select6(i32 %x) {
292 %c = icmp sgt i32 %x, 0
293 %s = select i1 %c, i32 %x, i32 4
294 %c2 = icmp eq i32 %s, 0
299 define i1 @urem1(i32 %X, i32 %Y) {
302 %B = icmp ult i32 %A, %Y
307 define i1 @urem2(i32 %X, i32 %Y) {
310 %B = icmp eq i32 %A, %Y
312 ; CHECK: ret i1 false
315 define i1 @urem3(i32 %X) {
318 %B = icmp ult i32 %A, 15
323 define i1 @urem4(i32 %X) {
326 %B = icmp ult i32 %A, 10
331 define i1 @urem5(i16 %X, i32 %Y) {
333 %A = zext i16 %X to i32
335 %C = icmp slt i32 %B, %Y
340 define i1 @urem6(i32 %X, i32 %Y) {
343 %B = icmp ugt i32 %Y, %A
348 define i1 @srem1(i32 %X) {
351 %B = icmp sgt i32 %A, 5
353 ; CHECK: ret i1 false
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
363 %D = icmp slt i32 %C, 0
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
374 %E = icmp slt i32 %D, 0
378 define i1 @udiv1(i32 %X) {
380 %A = udiv i32 %X, 1000000
381 %B = icmp ult i32 %A, 5000
386 define i1 @udiv2(i32 %X, i32 %Y, i32 %Z) {
388 %A = udiv exact i32 10, %Z
389 %B = udiv exact i32 20, %Z
390 %C = icmp ult i32 %A, %B
395 define i1 @udiv3(i32 %X, i32 %Y) {
398 %C = icmp ugt i32 %A, %X
400 ; CHECK: ret i1 false
403 define i1 @udiv4(i32 %X, i32 %Y) {
406 %C = icmp ule i32 %A, %X
411 define i1 @udiv5(i32 %X) {
413 %A = udiv i32 123, %X
414 %C = icmp ugt i32 %A, 124
416 ; CHECK: ret i1 false
420 define i1 @udiv6(i32 %X) nounwind {
423 %C = icmp eq i32 %A, 0
429 define i1 @sdiv1(i32 %X) {
431 %A = sdiv i32 %X, 1000000
432 %B = icmp slt i32 %A, 3000
437 define i1 @or1(i32 %X) {
440 %B = icmp ult i32 %A, 50
442 ; CHECK: ret i1 false
445 define i1 @and1(i32 %X) {
448 %B = icmp ugt i32 %A, 70
450 ; CHECK: ret i1 false
453 define i1 @mul1(i32 %X) {
455 ; Square of a non-zero number is non-zero if there is no overflow.
457 %M = mul nuw i32 %Y, %Y
458 %C = icmp eq i32 %M, 0
460 ; CHECK: ret i1 false
463 define i1 @mul2(i32 %X) {
465 ; Square of a non-zero number is positive if there is no signed overflow.
467 %M = mul nsw i32 %Y, %Y
468 %C = icmp sgt i32 %M, 0
473 define i1 @mul3(i32 %X, i32 %Y) {
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
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>
490 ; CHECK: ret <2 x i1> %cond
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>
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
507 ; CHECK: alloca_compare
508 ; CHECK: ret i1 false
512 define i1 @infinite_gep() {
516 %X = getelementptr i32 *%X, i32 1
517 %Y = icmp eq i32* %X, null