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
43 define i1 @zext(i32 %x) {
45 %e1 = zext i32 %x to i64
46 %e2 = zext i32 %x to i64
47 %r = icmp eq i64 %e1, %e2
52 define i1 @zext2(i1 %x) {
54 %e = zext i1 %x to i32
55 %c = icmp ne i32 %e, 0
63 %c = icmp ne i32 %e, 0
68 define i1 @sext(i32 %x) {
70 %e1 = sext i32 %x to i64
71 %e2 = sext i32 %x to i64
72 %r = icmp eq i64 %e1, %e2
77 define i1 @sext2(i1 %x) {
79 %e = sext i1 %x to i32
80 %c = icmp ne i32 %e, 0
88 %c = icmp ne i32 %e, 0
93 define i1 @add(i32 %x, i32 %y) {
99 %c = icmp eq i32 %s, 0
101 ; CHECK: ret i1 false
104 define i1 @add2(i8 %x, i8 %y) {
109 %c = icmp eq i8 %s, 0
111 ; CHECK: ret i1 false
114 define i1 @add3(i8 %x, i8 %y) {
116 %l = zext i8 %x to i32
117 %r = zext i8 %y to i32
119 %c = icmp eq i32 %s, 0
124 define i1 @add4(i32 %x, i32 %y) {
126 %z = add nsw i32 %y, 1
127 %s1 = add nsw i32 %x, %y
128 %s2 = add nsw i32 %x, %z
129 %c = icmp slt i32 %s1, %s2
134 define i1 @add5(i32 %x, i32 %y) {
136 %z = add nuw i32 %y, 1
137 %s1 = add nuw i32 %x, %z
138 %s2 = add nuw i32 %x, %y
139 %c = icmp ugt i32 %s1, %s2
144 define i1 @addpowtwo(i32 %x, i32 %y) {
149 %c = icmp eq i32 %s, 0
151 ; CHECK: ret i1 false
154 define i1 @or(i32 %x) {
157 %c = icmp eq i32 %o, 0
159 ; CHECK: ret i1 false
162 define i1 @shl(i32 %x) {
165 %c = icmp eq i32 %s, 0
167 ; CHECK: ret i1 false
170 define i1 @lshr1(i32 %x) {
173 %c = icmp eq i32 %s, 0
175 ; CHECK: ret i1 false
178 define i1 @lshr2(i32 %x) {
181 %c = icmp ugt i32 %s, 8
183 ; CHECK: ret i1 false
186 define i1 @ashr1(i32 %x) {
189 %c = icmp eq i32 %s, 0
191 ; CHECK: ret i1 false
194 define i1 @ashr2(i32 %x) {
197 %c = icmp slt i32 %s, -5
199 ; CHECK: ret i1 false
202 define i1 @select1(i1 %cond) {
204 %s = select i1 %cond, i32 1, i32 0
205 %c = icmp eq i32 %s, 1
207 ; CHECK: ret i1 %cond
210 define i1 @select2(i1 %cond) {
212 %x = zext i1 %cond to i32
213 %s = select i1 %cond, i32 %x, i32 0
214 %c = icmp ne i32 %s, 0
216 ; CHECK: ret i1 %cond
219 define i1 @select3(i1 %cond) {
221 %x = zext i1 %cond to i32
222 %s = select i1 %cond, i32 1, i32 %x
223 %c = icmp ne i32 %s, 0
225 ; CHECK: ret i1 %cond
228 define i1 @select4(i1 %cond) {
230 %invert = xor i1 %cond, 1
231 %s = select i1 %invert, i32 0, i32 1
232 %c = icmp ne i32 %s, 0
234 ; CHECK: ret i1 %cond
237 define i1 @select5(i32 %x) {
239 %c = icmp eq i32 %x, 0
240 %s = select i1 %c, i32 1, i32 %x
241 %c2 = icmp eq i32 %s, 0
243 ; CHECK: ret i1 false
246 define i1 @select6(i32 %x) {
248 %c = icmp sgt i32 %x, 0
249 %s = select i1 %c, i32 %x, i32 4
250 %c2 = icmp eq i32 %s, 0
255 define i1 @urem1(i32 %X, i32 %Y) {
258 %B = icmp ult i32 %A, %Y
263 define i1 @urem2(i32 %X, i32 %Y) {
266 %B = icmp eq i32 %A, %Y
268 ; CHECK: ret i1 false
271 define i1 @urem3(i32 %X) {
274 %B = icmp ult i32 %A, 15
279 define i1 @urem4(i32 %X) {
282 %B = icmp ult i32 %A, 10
287 define i1 @urem5(i16 %X, i32 %Y) {
289 %A = zext i16 %X to i32
291 %C = icmp slt i32 %B, %Y
296 define i1 @urem6(i32 %X, i32 %Y) {
299 %B = icmp ugt i32 %Y, %A
304 define i1 @srem1(i32 %X) {
307 %B = icmp sgt i32 %A, 5
309 ; CHECK: ret i1 false
314 ; CHECK: ret i1 false
315 define i1 @srem2(i16 %X, i32 %Y) {
316 %A = zext i16 %X to i32
317 %B = add nsw i32 %A, 1
319 %D = icmp slt i32 %C, 0
324 ; CHECK-NEXT: ret i1 false
325 define i1 @srem3(i16 %X, i32 %Y) {
326 %A = zext i16 %X to i32
327 %B = or i32 2147483648, %A
328 %C = sub nsw i32 1, %B
330 %E = icmp slt i32 %D, 0
334 define i1 @udiv1(i32 %X) {
336 %A = udiv i32 %X, 1000000
337 %B = icmp ult i32 %A, 5000
342 define i1 @udiv2(i32 %X, i32 %Y, i32 %Z) {
344 %A = udiv exact i32 10, %Z
345 %B = udiv exact i32 20, %Z
346 %C = icmp ult i32 %A, %B
351 define i1 @udiv3(i32 %X, i32 %Y) {
354 %C = icmp ugt i32 %A, %X
356 ; CHECK: ret i1 false
359 define i1 @udiv4(i32 %X, i32 %Y) {
362 %C = icmp ule i32 %A, %X
367 define i1 @udiv5(i32 %X) {
369 %A = udiv i32 123, %X
370 %C = icmp ugt i32 %A, 124
372 ; CHECK: ret i1 false
376 define i1 @udiv6(i32 %X) nounwind {
379 %C = icmp eq i32 %A, 0
385 define i1 @sdiv1(i32 %X) {
387 %A = sdiv i32 %X, 1000000
388 %B = icmp slt i32 %A, 3000
393 define i1 @or1(i32 %X) {
396 %B = icmp ult i32 %A, 50
398 ; CHECK: ret i1 false
401 define i1 @and1(i32 %X) {
404 %B = icmp ugt i32 %A, 70
406 ; CHECK: ret i1 false
409 define i1 @mul1(i32 %X) {
411 ; Square of a non-zero number is non-zero if there is no overflow.
413 %M = mul nuw i32 %Y, %Y
414 %C = icmp eq i32 %M, 0
416 ; CHECK: ret i1 false
419 define i1 @mul2(i32 %X) {
421 ; Square of a non-zero number is positive if there is no signed overflow.
423 %M = mul nsw i32 %Y, %Y
424 %C = icmp sgt i32 %M, 0
429 define i1 @mul3(i32 %X, i32 %Y) {
431 ; Product of non-negative numbers is non-negative if there is no signed overflow.
432 %XX = mul nsw i32 %X, %X
433 %YY = mul nsw i32 %Y, %Y
434 %M = mul nsw i32 %XX, %YY
435 %C = icmp sge i32 %M, 0
440 define <2 x i1> @vectorselect1(<2 x i1> %cond) {
441 ; CHECK: @vectorselect1
442 %invert = xor <2 x i1> %cond, <i1 1, i1 1>
443 %s = select <2 x i1> %invert, <2 x i32> <i32 0, i32 0>, <2 x i32> <i32 1, i32 1>
444 %c = icmp ne <2 x i32> %s, <i32 0, i32 0>
446 ; CHECK: ret <2 x i1> %cond
450 define <2 x i1> @vectorselectcrash(i32 %arg1) {
451 %tobool40 = icmp ne i32 %arg1, 0
452 %cond43 = select i1 %tobool40, <2 x i16> <i16 -5, i16 66>, <2 x i16> <i16 46, i16 1>
453 %cmp45 = icmp ugt <2 x i16> %cond43, <i16 73, i16 21>
458 define i1 @alloca_compare(i64 %idx) {
459 %sv = alloca { i32, i32, [124 x i32] }
460 %1 = getelementptr inbounds { i32, i32, [124 x i32] }* %sv, i32 0, i32 2, i64 %idx
461 %2 = icmp eq i32* %1, null
463 ; CHECK: alloca_compare
464 ; CHECK: ret i1 false