blob: 60f5990840b16389afd448801014ff1b43de085a [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
Duncan Sands9d32f602011-01-20 13:21:55 +000033define i1 @zext(i32 %x) {
34; CHECK: @zext
35 %e1 = zext i32 %x to i64
36 %e2 = zext i32 %x to i64
37 %r = icmp eq i64 %e1, %e2
38 ret i1 %r
39; CHECK: ret i1 true
40}
41
42define i1 @zext2(i1 %x) {
43; CHECK: @zext2
44 %e = zext i1 %x to i32
45 %c = icmp ne i32 %e, 0
46 ret i1 %c
47; CHECK: ret i1 %x
48}
49
Duncan Sandsd70d1a52011-01-25 09:38:29 +000050define i1 @zext3() {
51; CHECK: @zext3
52 %e = zext i1 1 to i32
53 %c = icmp ne i32 %e, 0
54 ret i1 %c
55; CHECK: ret i1 true
56}
57
Duncan Sands9d32f602011-01-20 13:21:55 +000058define i1 @sext(i32 %x) {
59; CHECK: @sext
60 %e1 = sext i32 %x to i64
61 %e2 = sext i32 %x to i64
62 %r = icmp eq i64 %e1, %e2
63 ret i1 %r
64; CHECK: ret i1 true
65}
66
67define i1 @sext2(i1 %x) {
68; CHECK: @sext2
69 %e = sext i1 %x to i32
70 %c = icmp ne i32 %e, 0
71 ret i1 %c
72; CHECK: ret i1 %x
73}
Duncan Sandsd70d1a52011-01-25 09:38:29 +000074
75define i1 @sext3() {
76; CHECK: @sext3
77 %e = sext i1 1 to i32
78 %c = icmp ne i32 %e, 0
79 ret i1 %c
80; CHECK: ret i1 true
81}
82
83define i1 @add(i32 %x, i32 %y) {
Duncan Sands227fba12011-01-25 15:14:15 +000084; CHECK: @add
Duncan Sandsd70d1a52011-01-25 09:38:29 +000085 %l = lshr i32 %x, 1
Duncan Sands227fba12011-01-25 15:14:15 +000086 %q = lshr i32 %y, 1
87 %r = or i32 %q, 1
Duncan Sandsd70d1a52011-01-25 09:38:29 +000088 %s = add i32 %l, %r
89 %c = icmp eq i32 %s, 0
90 ret i1 %c
Duncan Sands227fba12011-01-25 15:14:15 +000091; CHECK: ret i1 false
Duncan Sandsd70d1a52011-01-25 09:38:29 +000092}
93
94define i1 @add2(i8 %x, i8 %y) {
95; CHECK: @add2
96 %l = or i8 %x, 128
97 %r = or i8 %y, 129
98 %s = add i8 %l, %r
99 %c = icmp eq i8 %s, 0
100 ret i1 %c
101; CHECK: ret i1 false
102}
103
Duncan Sands227fba12011-01-25 15:14:15 +0000104define i1 @add3(i8 %x, i8 %y) {
105; CHECK: @add3
106 %l = zext i8 %x to i32
107 %r = zext i8 %y to i32
108 %s = add i32 %l, %r
109 %c = icmp eq i32 %s, 0
110 ret i1 %c
111; CHECK: ret i1 %c
112}
113
Duncan Sands52fb8462011-02-13 17:15:40 +0000114define i1 @add4(i32 %x, i32 %y) {
115; CHECK: @add4
116 %z = add nsw i32 %y, 1
117 %s1 = add nsw i32 %x, %y
118 %s2 = add nsw i32 %x, %z
119 %c = icmp slt i32 %s1, %s2
120 ret i1 %c
121; CHECK: ret i1 true
122}
123
124define i1 @add5(i32 %x, i32 %y) {
125; CHECK: @add5
126 %z = add nuw i32 %y, 1
127 %s1 = add nuw i32 %x, %z
128 %s2 = add nuw i32 %x, %y
129 %c = icmp ugt i32 %s1, %s2
130 ret i1 %c
131; CHECK: ret i1 true
132}
133
Duncan Sandsd70d1a52011-01-25 09:38:29 +0000134define i1 @addpowtwo(i32 %x, i32 %y) {
135; CHECK: @addpowtwo
136 %l = lshr i32 %x, 1
137 %r = shl i32 1, %y
138 %s = add i32 %l, %r
139 %c = icmp eq i32 %s, 0
140 ret i1 %c
141; CHECK: ret i1 false
142}
143
144define i1 @or(i32 %x) {
145; CHECK: @or
146 %o = or i32 %x, 1
147 %c = icmp eq i32 %o, 0
148 ret i1 %c
149; CHECK: ret i1 false
150}
Duncan Sands91367822011-01-29 13:27:00 +0000151
152define i1 @shl(i32 %x) {
153; CHECK: @shl
154 %s = shl i32 1, %x
155 %c = icmp eq i32 %s, 0
156 ret i1 %c
157; CHECK: ret i1 false
158}
159
Nick Lewycky3a73e342011-03-04 07:00:57 +0000160define i1 @lshr1(i32 %x) {
161; CHECK: @lshr1
Duncan Sands91367822011-01-29 13:27:00 +0000162 %s = lshr i32 -1, %x
163 %c = icmp eq i32 %s, 0
164 ret i1 %c
165; CHECK: ret i1 false
166}
167
Nick Lewycky3a73e342011-03-04 07:00:57 +0000168define i1 @lshr2(i32 %x) {
169; CHECK: @lshr2
170 %s = lshr i32 %x, 30
171 %c = icmp ugt i32 %s, 8
172 ret i1 %c
173; CHECK: ret i1 false
174}
175
176define i1 @ashr1(i32 %x) {
177; CHECK: @ashr1
Duncan Sands91367822011-01-29 13:27:00 +0000178 %s = ashr i32 -1, %x
179 %c = icmp eq i32 %s, 0
180 ret i1 %c
181; CHECK: ret i1 false
182}
Duncan Sands50ca4d32011-02-03 09:37:39 +0000183
Nick Lewycky3a73e342011-03-04 07:00:57 +0000184define i1 @ashr2(i32 %x) {
185; CHECK: @ashr2
186 %s = ashr i32 %x, 30
187 %c = icmp slt i32 %s, -5
188 ret i1 %c
189; CHECK: ret i1 false
190}
191
Duncan Sands50ca4d32011-02-03 09:37:39 +0000192define i1 @select1(i1 %cond) {
193; CHECK: @select1
194 %s = select i1 %cond, i32 1, i32 0
195 %c = icmp eq i32 %s, 1
196 ret i1 %c
197; CHECK: ret i1 %cond
198}
199
200define i1 @select2(i1 %cond) {
201; CHECK: @select2
202 %x = zext i1 %cond to i32
203 %s = select i1 %cond, i32 %x, i32 0
204 %c = icmp ne i32 %s, 0
205 ret i1 %c
206; CHECK: ret i1 %cond
207}
208
209define i1 @select3(i1 %cond) {
210; CHECK: @select3
211 %x = zext i1 %cond to i32
212 %s = select i1 %cond, i32 1, i32 %x
213 %c = icmp ne i32 %s, 0
214 ret i1 %c
215; CHECK: ret i1 %cond
216}
217
218define i1 @select4(i1 %cond) {
219; CHECK: @select4
220 %invert = xor i1 %cond, 1
221 %s = select i1 %invert, i32 0, i32 1
222 %c = icmp ne i32 %s, 0
223 ret i1 %c
224; CHECK: ret i1 %cond
225}
Nick Lewycky88cd0aa2011-03-01 08:15:50 +0000226
Duncan Sands6dc9e2b2011-10-30 19:56:36 +0000227define i1 @select5(i32 %x) {
228; CHECK: @select5
229 %c = icmp eq i32 %x, 0
230 %s = select i1 %c, i32 1, i32 %x
231 %c2 = icmp eq i32 %s, 0
232 ret i1 %c2
233; CHECK: ret i1 false
234}
235
236define i1 @select6(i32 %x) {
237; CHECK: @select6
238 %c = icmp sgt i32 %x, 0
239 %s = select i1 %c, i32 %x, i32 4
240 %c2 = icmp eq i32 %s, 0
241 ret i1 %c2
242; CHECK: ret i1 %c2
243}
244
Nick Lewycky88cd0aa2011-03-01 08:15:50 +0000245define i1 @urem1(i32 %X, i32 %Y) {
246; CHECK: @urem1
247 %A = urem i32 %X, %Y
248 %B = icmp ult i32 %A, %Y
249 ret i1 %B
250; CHECK: ret i1 true
251}
252
253define i1 @urem2(i32 %X, i32 %Y) {
254; CHECK: @urem2
255 %A = urem i32 %X, %Y
256 %B = icmp eq i32 %A, %Y
257 ret i1 %B
Benjamin Kramer7bff3e72011-03-09 22:07:31 +0000258; CHECK: ret i1 false
Nick Lewycky88cd0aa2011-03-01 08:15:50 +0000259}
Nick Lewycky3a73e342011-03-04 07:00:57 +0000260
261define i1 @urem3(i32 %X) {
262; CHECK: @urem3
263 %A = urem i32 %X, 10
264 %B = icmp ult i32 %A, 15
265 ret i1 %B
266; CHECK: ret i1 true
267}
268
269define i1 @urem4(i32 %X) {
270; CHECK: @urem4
271 %A = urem i32 %X, 15
272 %B = icmp ult i32 %A, 10
273 ret i1 %B
274; CHECK: ret i1 %B
275}
276
Nick Lewycky78679272011-03-04 10:06:52 +0000277define i1 @urem5(i16 %X, i32 %Y) {
278; CHECK: @urem5
279 %A = zext i16 %X to i32
280 %B = urem i32 %A, %Y
281 %C = icmp slt i32 %B, %Y
282 ret i1 %C
283; CHECK: ret i1 true
284}
285
Nick Lewycky84dd4fa2011-03-09 06:26:03 +0000286define i1 @urem6(i32 %X, i32 %Y) {
287; CHECK: @urem6
288 %A = urem i32 %X, %Y
289 %B = icmp ugt i32 %Y, %A
290 ret i1 %B
291; CHECK: ret i1 true
292}
293
Nick Lewycky3a73e342011-03-04 07:00:57 +0000294define i1 @srem1(i32 %X) {
295; CHECK: @srem1
296 %A = srem i32 %X, -5
297 %B = icmp sgt i32 %A, 5
298 ret i1 %B
299; CHECK: ret i1 false
300}
301
Nick Lewyckyb69050a2011-03-11 09:00:19 +0000302; PR9343 #15
303; CHECK: @srem2
304; CHECK: ret i1 false
305define i1 @srem2(i16 %X, i32 %Y) {
306 %A = zext i16 %X to i32
307 %B = add nsw i32 %A, 1
308 %C = srem i32 %B, %Y
309 %D = icmp slt i32 %C, 0
310 ret i1 %D
311}
Benjamin Kramer14b2a592011-03-12 17:18:11 +0000312
313; CHECK: @srem3
314; CHECK-NEXT: ret i1 false
315define i1 @srem3(i16 %X, i32 %Y) {
316 %A = zext i16 %X to i32
317 %B = or i32 2147483648, %A
318 %C = sub nsw i32 1, %B
319 %D = srem i32 %C, %Y
320 %E = icmp slt i32 %D, 0
321 ret i1 %E
322}
323
Nick Lewycky3a73e342011-03-04 07:00:57 +0000324define i1 @udiv1(i32 %X) {
325; CHECK: @udiv1
326 %A = udiv i32 %X, 1000000
327 %B = icmp ult i32 %A, 5000
328 ret i1 %B
329; CHECK: ret i1 true
330}
331
Nick Lewycky58bfcdb2011-03-05 05:19:11 +0000332define i1 @udiv2(i32 %X, i32 %Y, i32 %Z) {
333; CHECK: @udiv2
334 %A = udiv exact i32 10, %Z
335 %B = udiv exact i32 20, %Z
336 %C = icmp ult i32 %A, %B
337 ret i1 %C
338; CHECK: ret i1 true
339}
340
Duncan Sandsc65c7472011-10-28 18:17:44 +0000341define i1 @udiv3(i32 %X, i32 %Y) {
342; CHECK: @udiv3
343 %A = udiv i32 %X, %Y
344 %C = icmp ugt i32 %A, %X
345 ret i1 %C
346; CHECK: ret i1 false
347}
348
349define i1 @udiv4(i32 %X, i32 %Y) {
350; CHECK: @udiv4
351 %A = udiv i32 %X, %Y
352 %C = icmp ule i32 %A, %X
353 ret i1 %C
354; CHECK: ret i1 true
355}
356
357define i1 @udiv5(i32 %X) {
358; CHECK: @udiv5
359 %A = udiv i32 123, %X
360 %C = icmp ugt i32 %A, 124
361 ret i1 %C
362; CHECK: ret i1 false
363}
364
Eli Friedman7781ae52011-11-08 21:08:02 +0000365; PR11340
366define i1 @udiv6(i32 %X) nounwind {
367; CHECK: @udiv6
368 %A = udiv i32 1, %X
369 %C = icmp eq i32 %A, 0
370 ret i1 %C
371; CHECK: ret i1 %C
372}
373
374
Nick Lewycky3a73e342011-03-04 07:00:57 +0000375define i1 @sdiv1(i32 %X) {
376; CHECK: @sdiv1
377 %A = sdiv i32 %X, 1000000
378 %B = icmp slt i32 %A, 3000
379 ret i1 %B
380; CHECK: ret i1 true
381}
382
383define i1 @or1(i32 %X) {
384; CHECK: @or1
385 %A = or i32 %X, 62
386 %B = icmp ult i32 %A, 50
387 ret i1 %B
388; CHECK: ret i1 false
389}
390
391define i1 @and1(i32 %X) {
392; CHECK: @and1
393 %A = and i32 %X, 62
394 %B = icmp ugt i32 %A, 70
395 ret i1 %B
396; CHECK: ret i1 false
397}
Duncan Sands32a43cc2011-10-27 19:16:21 +0000398
399define i1 @mul1(i32 %X) {
400; CHECK: @mul1
401; Square of a non-zero number is non-zero if there is no overflow.
402 %Y = or i32 %X, 1
403 %M = mul nuw i32 %Y, %Y
404 %C = icmp eq i32 %M, 0
405 ret i1 %C
406; CHECK: ret i1 false
407}
408
409define i1 @mul2(i32 %X) {
410; CHECK: @mul2
411; Square of a non-zero number is positive if there is no signed overflow.
412 %Y = or i32 %X, 1
413 %M = mul nsw i32 %Y, %Y
414 %C = icmp sgt i32 %M, 0
415 ret i1 %C
416; CHECK: ret i1 true
417}
418
419define i1 @mul3(i32 %X, i32 %Y) {
420; CHECK: @mul3
421; Product of non-negative numbers is non-negative if there is no signed overflow.
422 %XX = mul nsw i32 %X, %X
423 %YY = mul nsw i32 %Y, %Y
424 %M = mul nsw i32 %XX, %YY
425 %C = icmp sge i32 %M, 0
426 ret i1 %C
427; CHECK: ret i1 true
428}
Duncan Sandsedfb9312012-02-10 14:26:42 +0000429
430define <2 x i1> @vectorselect1(<2 x i1> %cond) {
431; CHECK: @vectorselect1
432 %invert = xor <2 x i1> %cond, <i1 1, i1 1>
433 %s = select <2 x i1> %invert, <2 x i32> <i32 0, i32 0>, <2 x i32> <i32 1, i32 1>
434 %c = icmp ne <2 x i32> %s, <i32 0, i32 0>
435 ret <2 x i1> %c
436; CHECK: ret <2 x i1> %cond
437}
Duncan Sandsaa97bb52012-02-10 14:31:24 +0000438
439define <2 x i1> @vectorselectcrash(i32 %arg1) { ; PR11948
440 %tobool40 = icmp ne i32 %arg1, 0
441 %cond43 = select i1 %tobool40, <2 x i16> <i16 -5, i16 66>, <2 x i16> <i16 46, i16 1>
442 %cmp45 = icmp ugt <2 x i16> %cond43, <i16 73, i16 21>
443 ret <2 x i1> %cmp45
444}