1; 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
13define 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
22define 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
30define 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
38define 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
47define 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
55define 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
63define 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
74define 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
84define 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
94define 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
104define 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
114define 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
124define 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
132define 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
140define 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
148define 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
156define 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
164define 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
172define 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
180define 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
189define 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
198define 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
207define 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
215define 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
223define 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
231define 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
239define 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
248define 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
256define 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
267define 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
277define 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
286define 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
294define 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
303define i1 @sdiv1(i32 %X) {
304; CHECK: @sdiv1
305  %A = sdiv i32 %X, 1000000
306  %B = icmp slt i32 %A, 3000
307  ret i1 %B
308; CHECK: ret i1 true
309}
310
311define i1 @or1(i32 %X) {
312; CHECK: @or1
313  %A = or i32 %X, 62
314  %B = icmp ult i32 %A, 50
315  ret i1 %B
316; CHECK: ret i1 false
317}
318
319define i1 @and1(i32 %X) {
320; CHECK: @and1
321  %A = and i32 %X, 62
322  %B = icmp ugt i32 %A, 70
323  ret i1 %B
324; CHECK: ret i1 false
325}
326