1; RUN: opt < %s -instsimplify -S | FileCheck %s
2
3; CHECK-LABEL: @foo
4; CHECK:      %[[and:.*]] = and i32 %x, 1
5; CHECK-NEXT: %[[add:.*]] = add i32 %[[and]], -1
6; CHECK-NEXT: ret i32 %[[add]]
7define i32 @foo(i32 %x) {
8 %o = and i32 %x, 1
9 %n = add i32 %o, -1
10 %t = ashr i32 %n, 17
11 ret i32 %t
12}
13
14; CHECK-LABEL: @exact_lshr_eq_both_zero
15; CHECK-NEXT: ret i1 true
16define i1 @exact_lshr_eq_both_zero(i8 %a) {
17 %shr = lshr exact i8 0, %a
18 %cmp = icmp eq i8 %shr, 0
19 ret i1 %cmp
20}
21
22; CHECK-LABEL: @exact_ashr_eq_both_zero
23; CHECK-NEXT: ret i1 true
24define i1 @exact_ashr_eq_both_zero(i8 %a) {
25 %shr = ashr exact i8 0, %a
26 %cmp = icmp eq i8 %shr, 0
27 ret i1 %cmp
28}
29
30; CHECK-LABEL: @nonexact_ashr_eq_both_zero
31; CHECK-NEXT: ret i1 true
32define i1 @nonexact_ashr_eq_both_zero(i8 %a) {
33 %shr = ashr i8 0, %a
34 %cmp = icmp eq i8 %shr, 0
35 ret i1 %cmp
36}
37
38; CHECK-LABEL: @exact_lshr_ne_both_zero
39; CHECK-NEXT: ret i1 false
40define i1 @exact_lshr_ne_both_zero(i8 %a) {
41 %shr = lshr exact i8 0, %a
42 %cmp = icmp ne i8 %shr, 0
43 ret i1 %cmp
44}
45
46; CHECK-LABEL: @exact_ashr_ne_both_zero
47; CHECK-NEXT: ret i1 false
48define i1 @exact_ashr_ne_both_zero(i8 %a) {
49 %shr = ashr exact i8 0, %a
50 %cmp = icmp ne i8 %shr, 0
51 ret i1 %cmp
52}
53
54; CHECK-LABEL: @nonexact_lshr_ne_both_zero
55; CHECK-NEXT: ret i1 false
56define i1 @nonexact_lshr_ne_both_zero(i8 %a) {
57 %shr = lshr i8 0, %a
58 %cmp = icmp ne i8 %shr, 0
59 ret i1 %cmp
60}
61
62; CHECK-LABEL: @nonexact_ashr_ne_both_zero
63; CHECK-NEXT: ret i1 false
64define i1 @nonexact_ashr_ne_both_zero(i8 %a) {
65 %shr = ashr i8 0, %a
66 %cmp = icmp ne i8 %shr, 0
67 ret i1 %cmp
68}
69
70; CHECK-LABEL: @exact_lshr_eq_last_zero
71; CHECK-NEXT: ret i1 false
72define i1 @exact_lshr_eq_last_zero(i8 %a) {
73 %shr = lshr exact i8 128, %a
74 %cmp = icmp eq i8 %shr, 0
75 ret i1 %cmp
76}
77
78; CHECK-LABEL: @exact_ashr_eq_last_zero
79; CHECK-NEXT: ret i1 false
80define i1 @exact_ashr_eq_last_zero(i8 %a) {
81 %shr = ashr exact i8 -128, %a
82 %cmp = icmp eq i8 %shr, 0
83 ret i1 %cmp
84}
85
86; CHECK-LABEL: @nonexact_lshr_eq_both_zero
87; CHECK-NEXT: ret i1 true
88define i1 @nonexact_lshr_eq_both_zero(i8 %a) {
89 %shr = lshr i8 0, %a
90 %cmp = icmp eq i8 %shr, 0
91 ret i1 %cmp
92}
93
94; CHECK-LABEL: @exact_lshr_ne_last_zero
95; CHECK-NEXT: ret i1 true
96define i1 @exact_lshr_ne_last_zero(i8 %a) {
97 %shr = lshr exact i8 128, %a
98 %cmp = icmp ne i8 %shr, 0
99 ret i1 %cmp
100}
101
102; CHECK-LABEL: @exact_ashr_ne_last_zero
103; CHECK-NEXT: ret i1 true
104define i1 @exact_ashr_ne_last_zero(i8 %a) {
105 %shr = ashr exact i8 -128, %a
106 %cmp = icmp ne i8 %shr, 0
107 ret i1 %cmp
108}
109
110; CHECK-LABEL: @nonexact_lshr_eq_last_zero
111; CHECK-NEXT: ret i1 false
112define i1 @nonexact_lshr_eq_last_zero(i8 %a) {
113 %shr = lshr i8 128, %a
114 %cmp = icmp eq i8 %shr, 0
115 ret i1 %cmp
116}
117
118; CHECK-LABEL: @nonexact_ashr_eq_last_zero
119; CHECK-NEXT: ret i1 false
120define i1 @nonexact_ashr_eq_last_zero(i8 %a) {
121 %shr = ashr i8 -128, %a
122 %cmp = icmp eq i8 %shr, 0
123 ret i1 %cmp
124}
125
126; CHECK-LABEL: @nonexact_lshr_ne_last_zero
127; CHECK-NEXT: ret i1 true
128define i1 @nonexact_lshr_ne_last_zero(i8 %a) {
129 %shr = lshr i8 128, %a
130 %cmp = icmp ne i8 %shr, 0
131 ret i1 %cmp
132}
133
134; CHECK-LABEL: @nonexact_ashr_ne_last_zero
135; CHECK-NEXT: ret i1 true
136define i1 @nonexact_ashr_ne_last_zero(i8 %a) {
137 %shr = ashr i8 -128, %a
138 %cmp = icmp ne i8 %shr, 0
139 ret i1 %cmp
140}
141
142; CHECK-LABEL: @lshr_eq_first_zero
143; CHECK-NEXT: ret i1 false
144define i1 @lshr_eq_first_zero(i8 %a) {
145 %shr = lshr i8 0, %a
146 %cmp = icmp eq i8 %shr, 2
147 ret i1 %cmp
148}
149
150; CHECK-LABEL: @ashr_eq_first_zero
151; CHECK-NEXT: ret i1 false
152define i1 @ashr_eq_first_zero(i8 %a) {
153 %shr = ashr i8 0, %a
154 %cmp = icmp eq i8 %shr, 2
155 ret i1 %cmp
156}
157
158; CHECK-LABEL: @lshr_ne_first_zero
159; CHECK-NEXT: ret i1 true
160define i1 @lshr_ne_first_zero(i8 %a) {
161 %shr = lshr i8 0, %a
162 %cmp = icmp ne i8 %shr, 2
163 ret i1 %cmp
164}
165
166; CHECK-LABEL: @ashr_ne_first_zero
167; CHECK-NEXT: ret i1 true
168define i1 @ashr_ne_first_zero(i8 %a) {
169 %shr = ashr i8 0, %a
170 %cmp = icmp ne i8 %shr, 2
171 ret i1 %cmp
172}
173
174; CHECK-LABEL: @ashr_eq_both_minus1
175; CHECK-NEXT: ret i1 true
176define i1 @ashr_eq_both_minus1(i8 %a) {
177 %shr = ashr i8 -1, %a
178 %cmp = icmp eq i8 %shr, -1
179 ret i1 %cmp
180}
181
182; CHECK-LABEL: @ashr_ne_both_minus1
183; CHECK-NEXT: ret i1 false
184define i1 @ashr_ne_both_minus1(i8 %a) {
185 %shr = ashr i8 -1, %a
186 %cmp = icmp ne i8 %shr, -1
187 ret i1 %cmp
188}
189
190; CHECK-LABEL: @exact_ashr_eq_both_minus1
191; CHECK-NEXT: ret i1 true
192define i1 @exact_ashr_eq_both_minus1(i8 %a) {
193 %shr = ashr exact i8 -1, %a
194 %cmp = icmp eq i8 %shr, -1
195 ret i1 %cmp
196}
197
198; CHECK-LABEL: @exact_ashr_ne_both_minus1
199; CHECK-NEXT: ret i1 false
200define i1 @exact_ashr_ne_both_minus1(i8 %a) {
201 %shr = ashr exact i8 -1, %a
202 %cmp = icmp ne i8 %shr, -1
203 ret i1 %cmp
204}
205
206; CHECK-LABEL: @exact_ashr_eq_opposite_msb
207; CHECK-NEXT: ret i1 false
208define i1 @exact_ashr_eq_opposite_msb(i8 %a) {
209 %shr = ashr exact i8 -128, %a
210 %cmp = icmp eq i8 %shr, 1
211 ret i1 %cmp
212}
213
214; CHECK-LABEL: @exact_ashr_eq_noexactlog
215; CHECK-NEXT: ret i1 false
216define i1 @exact_ashr_eq_noexactlog(i8 %a) {
217 %shr = ashr exact i8 -90, %a
218 %cmp = icmp eq i8 %shr, -30
219 ret i1 %cmp
220}
221
222; CHECK-LABEL: @exact_ashr_ne_opposite_msb
223; CHECK-NEXT: ret i1 true
224define i1 @exact_ashr_ne_opposite_msb(i8 %a) {
225 %shr = ashr exact i8 -128, %a
226 %cmp = icmp ne i8 %shr, 1
227 ret i1 %cmp
228}
229
230; CHECK-LABEL: @ashr_eq_opposite_msb
231; CHECK-NEXT: ret i1 false
232define i1 @ashr_eq_opposite_msb(i8 %a) {
233 %shr = ashr i8 -128, %a
234 %cmp = icmp eq i8 %shr, 1
235 ret i1 %cmp
236}
237
238; CHECK-LABEL: @ashr_ne_opposite_msb
239; CHECK-NEXT: ret i1 true
240define i1 @ashr_ne_opposite_msb(i8 %a) {
241 %shr = ashr i8 -128, %a
242 %cmp = icmp ne i8 %shr, 1
243 ret i1 %cmp
244}
245
246; CHECK-LABEL: @exact_ashr_eq_shift_gt
247; CHECK-NEXT : ret i1 false
248define i1 @exact_ashr_eq_shift_gt(i8 %a) {
249 %shr = ashr exact i8 -2, %a
250 %cmp = icmp eq i8 %shr, -8
251 ret i1 %cmp
252}
253
254; CHECK-LABEL: @exact_ashr_ne_shift_gt
255; CHECK-NEXT : ret i1 true
256define i1 @exact_ashr_ne_shift_gt(i8 %a) {
257 %shr = ashr exact i8 -2, %a
258 %cmp = icmp ne i8 %shr, -8
259 ret i1 %cmp
260}
261
262; CHECK-LABEL: @nonexact_ashr_eq_shift_gt
263; CHECK-NEXT : ret i1 false
264define i1 @nonexact_ashr_eq_shift_gt(i8 %a) {
265 %shr = ashr i8 -2, %a
266 %cmp = icmp eq i8 %shr, -8
267 ret i1 %cmp
268}
269
270; CHECK-LABEL: @nonexact_ashr_ne_shift_gt
271; CHECK-NEXT : ret i1 true
272define i1 @nonexact_ashr_ne_shift_gt(i8 %a) {
273 %shr = ashr i8 -2, %a
274 %cmp = icmp ne i8 %shr, -8
275 ret i1 %cmp
276}
277
278; CHECK-LABEL: @exact_lshr_eq_shift_gt
279; CHECK-NEXT: ret i1 false
280define i1 @exact_lshr_eq_shift_gt(i8 %a) {
281 %shr = lshr exact i8 2, %a
282 %cmp = icmp eq i8 %shr, 8
283 ret i1 %cmp
284}
285
286; CHECK-LABEL: @exact_lshr_ne_shift_gt
287; CHECK-NEXT: ret i1 true
288define i1 @exact_lshr_ne_shift_gt(i8 %a) {
289 %shr = lshr exact i8 2, %a
290 %cmp = icmp ne i8 %shr, 8
291 ret i1 %cmp
292}
293
294; CHECK-LABEL: @nonexact_lshr_eq_shift_gt
295; CHECK-NEXT : ret i1 false
296define i1 @nonexact_lshr_eq_shift_gt(i8 %a) {
297 %shr = lshr i8 2, %a
298 %cmp = icmp eq i8 %shr, 8
299 ret i1 %cmp
300}
301
302; CHECK-LABEL: @nonexact_lshr_ne_shift_gt
303; CHECK-NEXT : ret i1 true
304define i1 @nonexact_lshr_ne_shift_gt(i8 %a) {
305 %shr = ashr i8 2, %a
306 %cmp = icmp ne i8 %shr, 8
307 ret i1 %cmp
308}
309
310; CHECK-LABEL: @exact_ashr_ne_noexactlog
311; CHECK-NEXT: ret i1 true
312define i1 @exact_ashr_ne_noexactlog(i8 %a) {
313 %shr = ashr exact i8 -90, %a
314 %cmp = icmp ne i8 %shr, -30
315 ret i1 %cmp
316}
317
318; CHECK-LABEL: @exact_lshr_eq_noexactlog
319; CHECK-NEXT: ret i1 false
320define i1 @exact_lshr_eq_noexactlog(i8 %a) {
321 %shr = lshr exact i8 90, %a
322 %cmp = icmp eq i8 %shr, 30
323 ret i1 %cmp
324}
325
326; CHECK-LABEL: @exact_lshr_ne_noexactlog
327; CHECK-NEXT: ret i1 true
328define i1 @exact_lshr_ne_noexactlog(i8 %a) {
329 %shr = lshr exact i8 90, %a
330 %cmp = icmp ne i8 %shr, 30
331 ret i1 %cmp
332}
333
334; CHECK-LABEL: @exact_lshr_lowbit
335; CHECK-NEXT: ret i32 7
336define i32 @exact_lshr_lowbit(i32 %shiftval) {
337  %shr = lshr exact i32 7, %shiftval
338  ret i32 %shr
339}
340
341; CHECK-LABEL: @exact_ashr_lowbit
342; CHECK-NEXT: ret i32 7
343define i32 @exact_ashr_lowbit(i32 %shiftval) {
344  %shr = ashr exact i32 7, %shiftval
345  ret i32 %shr
346}
347