Fold icmp ugt (udiv X, Y), X to false. Spotted by my super-optimizer
[oota-llvm.git] / test / Transforms / InstSimplify / compare.ll
1 ; RUN: opt < %s -instsimplify -S | FileCheck %s
2 target datalayout = "p:32:32"
3
4 define 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
13 define i1 @zext(i32 %x) {
14 ; CHECK: @zext
15   %e1 = zext i32 %x to i64
16   %e2 = zext i32 %x to i64
17   %r = icmp eq i64 %e1, %e2
18   ret i1 %r
19 ; CHECK: ret i1 true
20 }
21
22 define i1 @zext2(i1 %x) {
23 ; CHECK: @zext2
24   %e = zext i1 %x to i32
25   %c = icmp ne i32 %e, 0
26   ret i1 %c
27 ; CHECK: ret i1 %x
28 }
29
30 define i1 @zext3() {
31 ; CHECK: @zext3
32   %e = zext i1 1 to i32
33   %c = icmp ne i32 %e, 0
34   ret i1 %c
35 ; CHECK: ret i1 true
36 }
37
38 define i1 @sext(i32 %x) {
39 ; CHECK: @sext
40   %e1 = sext i32 %x to i64
41   %e2 = sext i32 %x to i64
42   %r = icmp eq i64 %e1, %e2
43   ret i1 %r
44 ; CHECK: ret i1 true
45 }
46
47 define i1 @sext2(i1 %x) {
48 ; CHECK: @sext2
49   %e = sext i1 %x to i32
50   %c = icmp ne i32 %e, 0
51   ret i1 %c
52 ; CHECK: ret i1 %x
53 }
54
55 define i1 @sext3() {
56 ; CHECK: @sext3
57   %e = sext i1 1 to i32
58   %c = icmp ne i32 %e, 0
59   ret i1 %c
60 ; CHECK: ret i1 true
61 }
62
63 define i1 @add(i32 %x, i32 %y) {
64 ; CHECK: @add
65   %l = lshr i32 %x, 1
66   %q = lshr i32 %y, 1
67   %r = or i32 %q, 1
68   %s = add i32 %l, %r
69   %c = icmp eq i32 %s, 0
70   ret i1 %c
71 ; CHECK: ret i1 false
72 }
73
74 define i1 @add2(i8 %x, i8 %y) {
75 ; CHECK: @add2
76   %l = or i8 %x, 128
77   %r = or i8 %y, 129
78   %s = add i8 %l, %r
79   %c = icmp eq i8 %s, 0
80   ret i1 %c
81 ; CHECK: ret i1 false
82 }
83
84 define i1 @add3(i8 %x, i8 %y) {
85 ; CHECK: @add3
86   %l = zext i8 %x to i32
87   %r = zext i8 %y to i32
88   %s = add i32 %l, %r
89   %c = icmp eq i32 %s, 0
90   ret i1 %c
91 ; CHECK: ret i1 %c
92 }
93
94 define i1 @add4(i32 %x, i32 %y) {
95 ; CHECK: @add4
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
100   ret i1 %c
101 ; CHECK: ret i1 true
102 }
103
104 define i1 @add5(i32 %x, i32 %y) {
105 ; CHECK: @add5
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
110   ret i1 %c
111 ; CHECK: ret i1 true
112 }
113
114 define i1 @addpowtwo(i32 %x, i32 %y) {
115 ; CHECK: @addpowtwo
116   %l = lshr i32 %x, 1
117   %r = shl i32 1, %y
118   %s = add i32 %l, %r
119   %c = icmp eq i32 %s, 0
120   ret i1 %c
121 ; CHECK: ret i1 false
122 }
123
124 define i1 @or(i32 %x) {
125 ; CHECK: @or
126   %o = or i32 %x, 1
127   %c = icmp eq i32 %o, 0
128   ret i1 %c
129 ; CHECK: ret i1 false
130 }
131
132 define i1 @shl(i32 %x) {
133 ; CHECK: @shl
134   %s = shl i32 1, %x
135   %c = icmp eq i32 %s, 0
136   ret i1 %c
137 ; CHECK: ret i1 false
138 }
139
140 define i1 @lshr1(i32 %x) {
141 ; CHECK: @lshr1
142   %s = lshr i32 -1, %x
143   %c = icmp eq i32 %s, 0
144   ret i1 %c
145 ; CHECK: ret i1 false
146 }
147
148 define i1 @lshr2(i32 %x) {
149 ; CHECK: @lshr2
150   %s = lshr i32 %x, 30
151   %c = icmp ugt i32 %s, 8
152   ret i1 %c
153 ; CHECK: ret i1 false
154 }
155
156 define i1 @ashr1(i32 %x) {
157 ; CHECK: @ashr1
158   %s = ashr i32 -1, %x
159   %c = icmp eq i32 %s, 0
160   ret i1 %c
161 ; CHECK: ret i1 false
162 }
163
164 define i1 @ashr2(i32 %x) {
165 ; CHECK: @ashr2
166   %s = ashr i32 %x, 30
167   %c = icmp slt i32 %s, -5
168   ret i1 %c
169 ; CHECK: ret i1 false
170 }
171
172 define i1 @select1(i1 %cond) {
173 ; CHECK: @select1
174   %s = select i1 %cond, i32 1, i32 0
175   %c = icmp eq i32 %s, 1
176   ret i1 %c
177 ; CHECK: ret i1 %cond
178 }
179
180 define i1 @select2(i1 %cond) {
181 ; CHECK: @select2
182   %x = zext i1 %cond to i32
183   %s = select i1 %cond, i32 %x, i32 0
184   %c = icmp ne i32 %s, 0
185   ret i1 %c
186 ; CHECK: ret i1 %cond
187 }
188
189 define i1 @select3(i1 %cond) {
190 ; CHECK: @select3
191   %x = zext i1 %cond to i32
192   %s = select i1 %cond, i32 1, i32 %x
193   %c = icmp ne i32 %s, 0
194   ret i1 %c
195 ; CHECK: ret i1 %cond
196 }
197
198 define i1 @select4(i1 %cond) {
199 ; CHECK: @select4
200   %invert = xor i1 %cond, 1
201   %s = select i1 %invert, i32 0, i32 1
202   %c = icmp ne i32 %s, 0
203   ret i1 %c
204 ; CHECK: ret i1 %cond
205 }
206
207 define i1 @urem1(i32 %X, i32 %Y) {
208 ; CHECK: @urem1
209   %A = urem i32 %X, %Y
210   %B = icmp ult i32 %A, %Y
211   ret i1 %B
212 ; CHECK: ret i1 true
213 }
214
215 define i1 @urem2(i32 %X, i32 %Y) {
216 ; CHECK: @urem2
217   %A = urem i32 %X, %Y
218   %B = icmp eq i32 %A, %Y
219   ret i1 %B
220 ; CHECK: ret i1 false
221 }
222
223 define i1 @urem3(i32 %X) {
224 ; CHECK: @urem3
225   %A = urem i32 %X, 10
226   %B = icmp ult i32 %A, 15
227   ret i1 %B
228 ; CHECK: ret i1 true
229 }
230
231 define i1 @urem4(i32 %X) {
232 ; CHECK: @urem4
233   %A = urem i32 %X, 15
234   %B = icmp ult i32 %A, 10
235   ret i1 %B
236 ; CHECK: ret i1 %B
237 }
238
239 define i1 @urem5(i16 %X, i32 %Y) {
240 ; CHECK: @urem5
241   %A = zext i16 %X to i32
242   %B = urem i32 %A, %Y
243   %C = icmp slt i32 %B, %Y
244   ret i1 %C
245 ; CHECK: ret i1 true
246 }
247
248 define i1 @urem6(i32 %X, i32 %Y) {
249 ; CHECK: @urem6
250   %A = urem i32 %X, %Y
251   %B = icmp ugt i32 %Y, %A
252   ret i1 %B
253 ; CHECK: ret i1 true
254 }
255
256 define i1 @srem1(i32 %X) {
257 ; CHECK: @srem1
258   %A = srem i32 %X, -5
259   %B = icmp sgt i32 %A, 5
260   ret i1 %B
261 ; CHECK: ret i1 false
262 }
263
264 ; PR9343 #15
265 ; CHECK: @srem2
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
270   %C = srem i32 %B, %Y
271   %D = icmp slt i32 %C, 0
272   ret i1 %D
273 }
274
275 ; CHECK: @srem3
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
281   %D = srem i32 %C, %Y
282   %E = icmp slt i32 %D, 0
283   ret i1 %E
284 }
285
286 define i1 @udiv1(i32 %X) {
287 ; CHECK: @udiv1
288   %A = udiv i32 %X, 1000000
289   %B = icmp ult i32 %A, 5000
290   ret i1 %B
291 ; CHECK: ret i1 true
292 }
293
294 define i1 @udiv2(i32 %X, i32 %Y, i32 %Z) {
295 ; CHECK: @udiv2
296   %A = udiv exact i32 10, %Z
297   %B = udiv exact i32 20, %Z
298   %C = icmp ult i32 %A, %B
299   ret i1 %C
300 ; CHECK: ret i1 true
301 }
302
303 define i1 @udiv3(i32 %X, i32 %Y) {
304 ; CHECK: @udiv3
305   %A = udiv i32 %X, %Y
306   %C = icmp ugt i32 %A, %X
307   ret i1 %C
308 ; CHECK: ret i1 false
309 }
310
311 define i1 @udiv4(i32 %X, i32 %Y) {
312 ; CHECK: @udiv4
313   %A = udiv i32 %X, %Y
314   %C = icmp ule i32 %A, %X
315   ret i1 %C
316 ; CHECK: ret i1 true
317 }
318
319 define i1 @udiv5(i32 %X) {
320 ; CHECK: @udiv5
321   %A = udiv i32 123, %X
322   %C = icmp ugt i32 %A, 124
323   ret i1 %C
324 ; CHECK: ret i1 false
325 }
326
327 define i1 @sdiv1(i32 %X) {
328 ; CHECK: @sdiv1
329   %A = sdiv i32 %X, 1000000
330   %B = icmp slt i32 %A, 3000
331   ret i1 %B
332 ; CHECK: ret i1 true
333 }
334
335 define i1 @or1(i32 %X) {
336 ; CHECK: @or1
337   %A = or i32 %X, 62
338   %B = icmp ult i32 %A, 50
339   ret i1 %B
340 ; CHECK: ret i1 false
341 }
342
343 define i1 @and1(i32 %X) {
344 ; CHECK: @and1
345   %A = and i32 %X, 62
346   %B = icmp ugt i32 %A, 70
347   ret i1 %B
348 ; CHECK: ret i1 false
349 }
350
351 define i1 @mul1(i32 %X) {
352 ; CHECK: @mul1
353 ; Square of a non-zero number is non-zero if there is no overflow.
354   %Y = or i32 %X, 1
355   %M = mul nuw i32 %Y, %Y
356   %C = icmp eq i32 %M, 0
357   ret i1 %C
358 ; CHECK: ret i1 false
359 }
360
361 define i1 @mul2(i32 %X) {
362 ; CHECK: @mul2
363 ; Square of a non-zero number is positive if there is no signed overflow.
364   %Y = or i32 %X, 1
365   %M = mul nsw i32 %Y, %Y
366   %C = icmp sgt i32 %M, 0
367   ret i1 %C
368 ; CHECK: ret i1 true
369 }
370
371 define i1 @mul3(i32 %X, i32 %Y) {
372 ; CHECK: @mul3
373 ; Product of non-negative numbers is non-negative if there is no signed overflow.
374   %XX = mul nsw i32 %X, %X
375   %YY = mul nsw i32 %Y, %Y
376   %M = mul nsw i32 %XX, %YY
377   %C = icmp sge i32 %M, 0
378   ret i1 %C
379 ; CHECK: ret i1 true
380 }