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 @zext(i32 %x) {
15 %e1 = zext i32 %x to i64
16 %e2 = zext i32 %x to i64
17 %r = icmp eq i64 %e1, %e2
22 define i1 @zext2(i1 %x) {
24 %e = zext i1 %x to i32
25 %c = icmp ne i32 %e, 0
33 %c = icmp ne i32 %e, 0
38 define i1 @sext(i32 %x) {
40 %e1 = sext i32 %x to i64
41 %e2 = sext i32 %x to i64
42 %r = icmp eq i64 %e1, %e2
47 define i1 @sext2(i1 %x) {
49 %e = sext i1 %x to i32
50 %c = icmp ne i32 %e, 0
58 %c = icmp ne i32 %e, 0
63 define i1 @add(i32 %x, i32 %y) {
69 %c = icmp eq i32 %s, 0
74 define i1 @add2(i8 %x, i8 %y) {
84 define i1 @add3(i8 %x, i8 %y) {
86 %l = zext i8 %x to i32
87 %r = zext i8 %y to i32
89 %c = icmp eq i32 %s, 0
94 define i1 @add4(i32 %x, i32 %y) {
96 %z = add nsw i32 %y, 1
97 %s1 = add nsw i32 %x, %y
98 %s2 = add nsw i32 %x, %z
99 %c = icmp slt i32 %s1, %s2
104 define i1 @add5(i32 %x, i32 %y) {
106 %z = add nuw i32 %y, 1
107 %s1 = add nuw i32 %x, %z
108 %s2 = add nuw i32 %x, %y
109 %c = icmp ugt i32 %s1, %s2
114 define i1 @addpowtwo(i32 %x, i32 %y) {
119 %c = icmp eq i32 %s, 0
121 ; CHECK: ret i1 false
124 define i1 @or(i32 %x) {
127 %c = icmp eq i32 %o, 0
129 ; CHECK: ret i1 false
132 define i1 @shl(i32 %x) {
135 %c = icmp eq i32 %s, 0
137 ; CHECK: ret i1 false
140 define i1 @lshr1(i32 %x) {
143 %c = icmp eq i32 %s, 0
145 ; CHECK: ret i1 false
148 define i1 @lshr2(i32 %x) {
151 %c = icmp ugt i32 %s, 8
153 ; CHECK: ret i1 false
156 define i1 @ashr1(i32 %x) {
159 %c = icmp eq i32 %s, 0
161 ; CHECK: ret i1 false
164 define i1 @ashr2(i32 %x) {
167 %c = icmp slt i32 %s, -5
169 ; CHECK: ret i1 false
172 define i1 @select1(i1 %cond) {
174 %s = select i1 %cond, i32 1, i32 0
175 %c = icmp eq i32 %s, 1
177 ; CHECK: ret i1 %cond
180 define i1 @select2(i1 %cond) {
182 %x = zext i1 %cond to i32
183 %s = select i1 %cond, i32 %x, i32 0
184 %c = icmp ne i32 %s, 0
186 ; CHECK: ret i1 %cond
189 define i1 @select3(i1 %cond) {
191 %x = zext i1 %cond to i32
192 %s = select i1 %cond, i32 1, i32 %x
193 %c = icmp ne i32 %s, 0
195 ; CHECK: ret i1 %cond
198 define i1 @select4(i1 %cond) {
200 %invert = xor i1 %cond, 1
201 %s = select i1 %invert, i32 0, i32 1
202 %c = icmp ne i32 %s, 0
204 ; CHECK: ret i1 %cond
207 define i1 @select5(i32 %x) {
209 %c = icmp eq i32 %x, 0
210 %s = select i1 %c, i32 1, i32 %x
211 %c2 = icmp eq i32 %s, 0
213 ; CHECK: ret i1 false
216 define i1 @select6(i32 %x) {
218 %c = icmp sgt i32 %x, 0
219 %s = select i1 %c, i32 %x, i32 4
220 %c2 = icmp eq i32 %s, 0
225 define i1 @urem1(i32 %X, i32 %Y) {
228 %B = icmp ult i32 %A, %Y
233 define i1 @urem2(i32 %X, i32 %Y) {
236 %B = icmp eq i32 %A, %Y
238 ; CHECK: ret i1 false
241 define i1 @urem3(i32 %X) {
244 %B = icmp ult i32 %A, 15
249 define i1 @urem4(i32 %X) {
252 %B = icmp ult i32 %A, 10
257 define i1 @urem5(i16 %X, i32 %Y) {
259 %A = zext i16 %X to i32
261 %C = icmp slt i32 %B, %Y
266 define i1 @urem6(i32 %X, i32 %Y) {
269 %B = icmp ugt i32 %Y, %A
274 define i1 @srem1(i32 %X) {
277 %B = icmp sgt i32 %A, 5
279 ; CHECK: ret i1 false
284 ; CHECK: ret i1 false
285 define i1 @srem2(i16 %X, i32 %Y) {
286 %A = zext i16 %X to i32
287 %B = add nsw i32 %A, 1
289 %D = icmp slt i32 %C, 0
294 ; CHECK-NEXT: ret i1 false
295 define i1 @srem3(i16 %X, i32 %Y) {
296 %A = zext i16 %X to i32
297 %B = or i32 2147483648, %A
298 %C = sub nsw i32 1, %B
300 %E = icmp slt i32 %D, 0
304 define i1 @udiv1(i32 %X) {
306 %A = udiv i32 %X, 1000000
307 %B = icmp ult i32 %A, 5000
312 define i1 @udiv2(i32 %X, i32 %Y, i32 %Z) {
314 %A = udiv exact i32 10, %Z
315 %B = udiv exact i32 20, %Z
316 %C = icmp ult i32 %A, %B
321 define i1 @udiv3(i32 %X, i32 %Y) {
324 %C = icmp ugt i32 %A, %X
326 ; CHECK: ret i1 false
329 define i1 @udiv4(i32 %X, i32 %Y) {
332 %C = icmp ule i32 %A, %X
337 define i1 @udiv5(i32 %X) {
339 %A = udiv i32 123, %X
340 %C = icmp ugt i32 %A, 124
342 ; CHECK: ret i1 false
346 define i1 @udiv6(i32 %X) nounwind {
349 %C = icmp eq i32 %A, 0
355 define i1 @sdiv1(i32 %X) {
357 %A = sdiv i32 %X, 1000000
358 %B = icmp slt i32 %A, 3000
363 define i1 @or1(i32 %X) {
366 %B = icmp ult i32 %A, 50
368 ; CHECK: ret i1 false
371 define i1 @and1(i32 %X) {
374 %B = icmp ugt i32 %A, 70
376 ; CHECK: ret i1 false
379 define i1 @mul1(i32 %X) {
381 ; Square of a non-zero number is non-zero if there is no overflow.
383 %M = mul nuw i32 %Y, %Y
384 %C = icmp eq i32 %M, 0
386 ; CHECK: ret i1 false
389 define i1 @mul2(i32 %X) {
391 ; Square of a non-zero number is positive if there is no signed overflow.
393 %M = mul nsw i32 %Y, %Y
394 %C = icmp sgt i32 %M, 0
399 define i1 @mul3(i32 %X, i32 %Y) {
401 ; Product of non-negative numbers is non-negative if there is no signed overflow.
402 %XX = mul nsw i32 %X, %X
403 %YY = mul nsw i32 %Y, %Y
404 %M = mul nsw i32 %XX, %YY
405 %C = icmp sge i32 %M, 0
410 define <2 x i1> @vectorselect1(<2 x i1> %cond) {
411 ; CHECK: @vectorselect1
412 %invert = xor <2 x i1> %cond, <i1 1, i1 1>
413 %s = select <2 x i1> %invert, <2 x i32> <i32 0, i32 0>, <2 x i32> <i32 1, i32 1>
414 %c = icmp ne <2 x i32> %s, <i32 0, i32 0>
416 ; CHECK: ret <2 x i1> %cond