1 ; RUN: opt < %s -instsimplify -S | FileCheck %s
4 ; CHECK: %[[and:.*]] = and i32 %x, 1
5 ; CHECK-NEXT: %[[add:.*]] = add i32 %[[and]], -1
6 ; CHECK-NEXT: ret i32 %[[add]]
7 define i32 @foo(i32 %x) {
14 ; CHECK-LABEL: @exact_lshr_eq_both_zero
15 ; CHECK-NEXT: ret i1 true
16 define i1 @exact_lshr_eq_both_zero(i8 %a) {
17 %shr = lshr exact i8 0, %a
18 %cmp = icmp eq i8 %shr, 0
22 ; CHECK-LABEL: @exact_ashr_eq_both_zero
23 ; CHECK-NEXT: ret i1 true
24 define i1 @exact_ashr_eq_both_zero(i8 %a) {
25 %shr = ashr exact i8 0, %a
26 %cmp = icmp eq i8 %shr, 0
30 ; CHECK-LABEL: @nonexact_ashr_eq_both_zero
31 ; CHECK-NEXT: ret i1 true
32 define i1 @nonexact_ashr_eq_both_zero(i8 %a) {
34 %cmp = icmp eq i8 %shr, 0
38 ; CHECK-LABEL: @exact_lshr_ne_both_zero
39 ; CHECK-NEXT: ret i1 false
40 define i1 @exact_lshr_ne_both_zero(i8 %a) {
41 %shr = lshr exact i8 0, %a
42 %cmp = icmp ne i8 %shr, 0
46 ; CHECK-LABEL: @exact_ashr_ne_both_zero
47 ; CHECK-NEXT: ret i1 false
48 define i1 @exact_ashr_ne_both_zero(i8 %a) {
49 %shr = ashr exact i8 0, %a
50 %cmp = icmp ne i8 %shr, 0
54 ; CHECK-LABEL: @nonexact_lshr_ne_both_zero
55 ; CHECK-NEXT: ret i1 false
56 define i1 @nonexact_lshr_ne_both_zero(i8 %a) {
58 %cmp = icmp ne i8 %shr, 0
62 ; CHECK-LABEL: @nonexact_ashr_ne_both_zero
63 ; CHECK-NEXT: ret i1 false
64 define i1 @nonexact_ashr_ne_both_zero(i8 %a) {
66 %cmp = icmp ne i8 %shr, 0
70 ; CHECK-LABEL: @exact_lshr_eq_last_zero
71 ; CHECK-NEXT: ret i1 false
72 define i1 @exact_lshr_eq_last_zero(i8 %a) {
73 %shr = lshr exact i8 128, %a
74 %cmp = icmp eq i8 %shr, 0
78 ; CHECK-LABEL: @exact_ashr_eq_last_zero
79 ; CHECK-NEXT: ret i1 false
80 define i1 @exact_ashr_eq_last_zero(i8 %a) {
81 %shr = ashr exact i8 -128, %a
82 %cmp = icmp eq i8 %shr, 0
86 ; CHECK-LABEL: @nonexact_lshr_eq_both_zero
87 ; CHECK-NEXT: ret i1 true
88 define i1 @nonexact_lshr_eq_both_zero(i8 %a) {
90 %cmp = icmp eq i8 %shr, 0
94 ; CHECK-LABEL: @exact_lshr_ne_last_zero
95 ; CHECK-NEXT: ret i1 true
96 define i1 @exact_lshr_ne_last_zero(i8 %a) {
97 %shr = lshr exact i8 128, %a
98 %cmp = icmp ne i8 %shr, 0
102 ; CHECK-LABEL: @exact_ashr_ne_last_zero
103 ; CHECK-NEXT: ret i1 true
104 define i1 @exact_ashr_ne_last_zero(i8 %a) {
105 %shr = ashr exact i8 -128, %a
106 %cmp = icmp ne i8 %shr, 0
110 ; CHECK-LABEL: @nonexact_lshr_eq_last_zero
111 ; CHECK-NEXT: ret i1 false
112 define i1 @nonexact_lshr_eq_last_zero(i8 %a) {
113 %shr = lshr i8 128, %a
114 %cmp = icmp eq i8 %shr, 0
118 ; CHECK-LABEL: @nonexact_ashr_eq_last_zero
119 ; CHECK-NEXT: ret i1 false
120 define i1 @nonexact_ashr_eq_last_zero(i8 %a) {
121 %shr = ashr i8 -128, %a
122 %cmp = icmp eq i8 %shr, 0
126 ; CHECK-LABEL: @nonexact_lshr_ne_last_zero
127 ; CHECK-NEXT: ret i1 true
128 define i1 @nonexact_lshr_ne_last_zero(i8 %a) {
129 %shr = lshr i8 128, %a
130 %cmp = icmp ne i8 %shr, 0
134 ; CHECK-LABEL: @nonexact_ashr_ne_last_zero
135 ; CHECK-NEXT: ret i1 true
136 define i1 @nonexact_ashr_ne_last_zero(i8 %a) {
137 %shr = ashr i8 -128, %a
138 %cmp = icmp ne i8 %shr, 0
142 ; CHECK-LABEL: @lshr_eq_first_zero
143 ; CHECK-NEXT: ret i1 false
144 define i1 @lshr_eq_first_zero(i8 %a) {
146 %cmp = icmp eq i8 %shr, 2
150 ; CHECK-LABEL: @ashr_eq_first_zero
151 ; CHECK-NEXT: ret i1 false
152 define i1 @ashr_eq_first_zero(i8 %a) {
154 %cmp = icmp eq i8 %shr, 2
158 ; CHECK-LABEL: @lshr_ne_first_zero
159 ; CHECK-NEXT: ret i1 true
160 define i1 @lshr_ne_first_zero(i8 %a) {
162 %cmp = icmp ne i8 %shr, 2
166 ; CHECK-LABEL: @ashr_ne_first_zero
167 ; CHECK-NEXT: ret i1 true
168 define i1 @ashr_ne_first_zero(i8 %a) {
170 %cmp = icmp ne i8 %shr, 2
174 ; CHECK-LABEL: @ashr_eq_both_minus1
175 ; CHECK-NEXT: ret i1 true
176 define i1 @ashr_eq_both_minus1(i8 %a) {
177 %shr = ashr i8 -1, %a
178 %cmp = icmp eq i8 %shr, -1
182 ; CHECK-LABEL: @ashr_ne_both_minus1
183 ; CHECK-NEXT: ret i1 false
184 define i1 @ashr_ne_both_minus1(i8 %a) {
185 %shr = ashr i8 -1, %a
186 %cmp = icmp ne i8 %shr, -1
190 ; CHECK-LABEL: @exact_ashr_eq_both_minus1
191 ; CHECK-NEXT: ret i1 true
192 define i1 @exact_ashr_eq_both_minus1(i8 %a) {
193 %shr = ashr exact i8 -1, %a
194 %cmp = icmp eq i8 %shr, -1
198 ; CHECK-LABEL: @exact_ashr_ne_both_minus1
199 ; CHECK-NEXT: ret i1 false
200 define i1 @exact_ashr_ne_both_minus1(i8 %a) {
201 %shr = ashr exact i8 -1, %a
202 %cmp = icmp ne i8 %shr, -1
206 ; CHECK-LABEL: @exact_ashr_eq_opposite_msb
207 ; CHECK-NEXT: ret i1 false
208 define i1 @exact_ashr_eq_opposite_msb(i8 %a) {
209 %shr = ashr exact i8 -128, %a
210 %cmp = icmp eq i8 %shr, 1
214 ; CHECK-LABEL: @exact_ashr_eq_noexactlog
215 ; CHECK-NEXT: ret i1 false
216 define i1 @exact_ashr_eq_noexactlog(i8 %a) {
217 %shr = ashr exact i8 -90, %a
218 %cmp = icmp eq i8 %shr, -30
222 ; CHECK-LABEL: @exact_ashr_ne_opposite_msb
223 ; CHECK-NEXT: ret i1 true
224 define i1 @exact_ashr_ne_opposite_msb(i8 %a) {
225 %shr = ashr exact i8 -128, %a
226 %cmp = icmp ne i8 %shr, 1
230 ; CHECK-LABEL: @ashr_eq_opposite_msb
231 ; CHECK-NEXT: ret i1 false
232 define i1 @ashr_eq_opposite_msb(i8 %a) {
233 %shr = ashr i8 -128, %a
234 %cmp = icmp eq i8 %shr, 1
238 ; CHECK-LABEL: @ashr_ne_opposite_msb
239 ; CHECK-NEXT: ret i1 true
240 define i1 @ashr_ne_opposite_msb(i8 %a) {
241 %shr = ashr i8 -128, %a
242 %cmp = icmp ne i8 %shr, 1
246 ; CHECK-LABEL: @exact_ashr_eq_shift_gt
247 ; CHECK-NEXT: ret i1 false
248 define i1 @exact_ashr_eq_shift_gt(i8 %a) {
249 %shr = ashr exact i8 -2, %a
250 %cmp = icmp eq i8 %shr, -8
254 ; CHECK-LABEL: @exact_ashr_ne_shift_gt
255 ; CHECK-NEXT: ret i1 true
256 define i1 @exact_ashr_ne_shift_gt(i8 %a) {
257 %shr = ashr exact i8 -2, %a
258 %cmp = icmp ne i8 %shr, -8
262 ; CHECK-LABEL: @nonexact_ashr_eq_shift_gt
263 ; CHECK-NEXT: ret i1 false
264 define i1 @nonexact_ashr_eq_shift_gt(i8 %a) {
265 %shr = ashr i8 -2, %a
266 %cmp = icmp eq i8 %shr, -8
270 ; CHECK-LABEL: @nonexact_ashr_ne_shift_gt
271 ; CHECK-NEXT: ret i1 true
272 define i1 @nonexact_ashr_ne_shift_gt(i8 %a) {
273 %shr = ashr i8 -2, %a
274 %cmp = icmp ne i8 %shr, -8
278 ; CHECK-LABEL: @exact_lshr_eq_shift_gt
279 ; CHECK-NEXT: ret i1 false
280 define i1 @exact_lshr_eq_shift_gt(i8 %a) {
281 %shr = lshr exact i8 2, %a
282 %cmp = icmp eq i8 %shr, 8
286 ; CHECK-LABEL: @exact_lshr_ne_shift_gt
287 ; CHECK-NEXT: ret i1 true
288 define i1 @exact_lshr_ne_shift_gt(i8 %a) {
289 %shr = lshr exact i8 2, %a
290 %cmp = icmp ne i8 %shr, 8
294 ; CHECK-LABEL: @nonexact_lshr_eq_shift_gt
295 ; CHECK-NEXT: ret i1 false
296 define i1 @nonexact_lshr_eq_shift_gt(i8 %a) {
298 %cmp = icmp eq i8 %shr, 8
302 ; CHECK-LABEL: @nonexact_lshr_ne_shift_gt
303 ; CHECK-NEXT: ret i1 true
304 define i1 @nonexact_lshr_ne_shift_gt(i8 %a) {
306 %cmp = icmp ne i8 %shr, 8
310 ; CHECK-LABEL: @exact_ashr_ne_noexactlog
311 ; CHECK-NEXT: ret i1 true
312 define i1 @exact_ashr_ne_noexactlog(i8 %a) {
313 %shr = ashr exact i8 -90, %a
314 %cmp = icmp ne i8 %shr, -30
318 ; CHECK-LABEL: @exact_lshr_eq_noexactlog
319 ; CHECK-NEXT: ret i1 false
320 define i1 @exact_lshr_eq_noexactlog(i8 %a) {
321 %shr = lshr exact i8 90, %a
322 %cmp = icmp eq i8 %shr, 30
326 ; CHECK-LABEL: @exact_lshr_ne_noexactlog
327 ; CHECK-NEXT: ret i1 true
328 define i1 @exact_lshr_ne_noexactlog(i8 %a) {
329 %shr = lshr exact i8 90, %a
330 %cmp = icmp ne i8 %shr, 30
334 ; CHECK-LABEL: @exact_lshr_lowbit
335 ; CHECK-NEXT: ret i32 7
336 define i32 @exact_lshr_lowbit(i32 %shiftval) {
337 %shr = lshr exact i32 7, %shiftval
341 ; CHECK-LABEL: @exact_ashr_lowbit
342 ; CHECK-NEXT: ret i32 7
343 define i32 @exact_ashr_lowbit(i32 %shiftval) {
344 %shr = ashr exact i32 7, %shiftval