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 @urem1(i32 %X, i32 %Y) {
210 %B = icmp ult i32 %A, %Y
215 define i1 @urem2(i32 %X, i32 %Y) {
218 %B = icmp eq i32 %A, %Y
220 ; CHECK: ret i1 false
223 define i1 @urem3(i32 %X) {
226 %B = icmp ult i32 %A, 15
231 define i1 @urem4(i32 %X) {
234 %B = icmp ult i32 %A, 10
239 define i1 @urem5(i16 %X, i32 %Y) {
241 %A = zext i16 %X to i32
243 %C = icmp slt i32 %B, %Y
248 define i1 @urem6(i32 %X, i32 %Y) {
251 %B = icmp ugt i32 %Y, %A
256 define i1 @srem1(i32 %X) {
259 %B = icmp sgt i32 %A, 5
261 ; CHECK: ret i1 false
266 ; CHECK: ret i1 false
267 define i1 @srem2(i16 %X, i32 %Y) {
268 %A = zext i16 %X to i32
269 %B = add nsw i32 %A, 1
271 %D = icmp slt i32 %C, 0
276 ; CHECK-NEXT: ret i1 false
277 define i1 @srem3(i16 %X, i32 %Y) {
278 %A = zext i16 %X to i32
279 %B = or i32 2147483648, %A
280 %C = sub nsw i32 1, %B
282 %E = icmp slt i32 %D, 0
287 ; CHECK-NEXT: ret i1 false
288 define i1 @srem4(i16 %X, i32 %Y) {
289 %A = zext i16 %X to i32
290 %B = or i32 2147483648, %A
291 %C = sub nsw i32 %A, %B
293 %E = icmp slt i32 %D, 0
297 define i1 @udiv1(i32 %X) {
299 %A = udiv i32 %X, 1000000
300 %B = icmp ult i32 %A, 5000
305 define i1 @udiv2(i32 %X, i32 %Y, i32 %Z) {
307 %A = udiv exact i32 10, %Z
308 %B = udiv exact i32 20, %Z
309 %C = icmp ult i32 %A, %B
314 define i1 @sdiv1(i32 %X) {
316 %A = sdiv i32 %X, 1000000
317 %B = icmp slt i32 %A, 3000
322 define i1 @or1(i32 %X) {
325 %B = icmp ult i32 %A, 50
327 ; CHECK: ret i1 false
330 define i1 @and1(i32 %X) {
333 %B = icmp ugt i32 %A, 70
335 ; CHECK: ret i1 false