[AArch64] Fix bug in prolog clobbering live reg when shrink wrapping.
[oota-llvm.git] / test / CodeGen / AArch64 / fast-isel-shift.ll
1 ; RUN: llc -fast-isel -fast-isel-abort=1 -mtriple=aarch64-apple-darwin -verify-machineinstrs < %s | FileCheck %s
2
3 ; CHECK-LABEL: asr_zext_i1_i16
4 ; CHECK:       uxth {{w[0-9]*}}, wzr
5 define zeroext i16 @asr_zext_i1_i16(i1 %b) {
6   %1 = zext i1 %b to i16
7   %2 = ashr i16 %1, 1
8   ret i16 %2
9 }
10
11 ; CHECK-LABEL: asr_sext_i1_i16
12 ; CHECK:       sbfx [[REG1:w[0-9]+]], {{w[0-9]*}}, #0, #1
13 ; CHECK-NEXT:  sxth {{w[0-9]*}}, [[REG1]]
14 define signext i16 @asr_sext_i1_i16(i1 %b) {
15   %1 = sext i1 %b to i16
16   %2 = ashr i16 %1, 1
17   ret i16 %2
18 }
19
20 ; CHECK-LABEL: asr_zext_i1_i32
21 ; CHECK:       mov {{w[0-9]*}}, wzr
22 define i32 @asr_zext_i1_i32(i1 %b) {
23   %1 = zext i1 %b to i32
24   %2 = ashr i32 %1, 1
25   ret i32 %2
26 }
27
28 ; CHECK-LABEL: asr_sext_i1_i32
29 ; CHECK:       sbfx  {{w[0-9]*}}, {{w[0-9]*}}, #0, #1
30 define i32 @asr_sext_i1_i32(i1 %b) {
31   %1 = sext i1 %b to i32
32   %2 = ashr i32 %1, 1
33   ret i32 %2
34 }
35
36 ; CHECK-LABEL: asr_zext_i1_i64
37 ; CHECK:       mov {{x[0-9]*}}, xzr
38 define i64 @asr_zext_i1_i64(i1 %b) {
39   %1 = zext i1 %b to i64
40   %2 = ashr i64 %1, 1
41   ret i64 %2
42 }
43
44 ; CHECK-LABEL: asr_sext_i1_i64
45 ; CHECK:       sbfx {{x[0-9]*}}, {{x[0-9]*}}, #0, #1
46 define i64 @asr_sext_i1_i64(i1 %b) {
47   %1 = sext i1 %b to i64
48   %2 = ashr i64 %1, 1
49   ret i64 %2
50 }
51
52 ; CHECK-LABEL: lsr_zext_i1_i16
53 ; CHECK:       uxth {{w[0-9]*}}, wzr
54 define zeroext i16 @lsr_zext_i1_i16(i1 %b) {
55   %1 = zext i1 %b to i16
56   %2 = lshr i16 %1, 1
57   ret i16 %2
58 }
59
60 ; CHECK-LABEL: lsr_sext_i1_i16
61 ; CHECK:       sbfx [[REG1:w[0-9]+]], {{w[0-9]*}}, #0, #1
62 ; CHECK-NEXT:  ubfx [[REG2:w[0-9]+]], [[REG1]], #1, #15
63 ; CHECK-NEXT:  sxth {{w[0-9]*}}, [[REG2]]
64 define signext i16 @lsr_sext_i1_i16(i1 %b) {
65   %1 = sext i1 %b to i16
66   %2 = lshr i16 %1, 1
67   ret i16 %2
68 }
69
70 ; CHECK-LABEL: lsr_zext_i1_i32
71 ; CHECK:       mov {{w[0-9]*}}, wzr
72 define i32 @lsr_zext_i1_i32(i1 %b) {
73   %1 = zext i1 %b to i32
74   %2 = lshr i32 %1, 1
75   ret i32 %2
76 }
77
78 ; CHECK-LABEL: lsr_sext_i1_i32
79 ; CHECK:       sbfx [[REG1:w[0-9]+]], {{w[0-9]*}}, #0, #1
80 ; CHECK-NEXT:  lsr {{w[0-9]*}}, [[REG1:w[0-9]+]], #1
81 define i32 @lsr_sext_i1_i32(i1 %b) {
82   %1 = sext i1 %b to i32
83   %2 = lshr i32 %1, 1
84   ret i32 %2
85 }
86
87 ; CHECK-LABEL: lsr_zext_i1_i64
88 ; CHECK:       mov {{x[0-9]*}}, xzr
89 define i64 @lsr_zext_i1_i64(i1 %b) {
90   %1 = zext i1 %b to i64
91   %2 = lshr i64 %1, 1
92   ret i64 %2
93 }
94
95 ; CHECK-LABEL: lsl_zext_i1_i16
96 ; CHECK:       ubfiz {{w[0-9]*}}, {{w[0-9]*}}, #4, #1
97 define zeroext i16 @lsl_zext_i1_i16(i1 %b) {
98   %1 = zext i1 %b to i16
99   %2 = shl i16 %1, 4
100   ret i16 %2
101 }
102
103 ; CHECK-LABEL: lsl_sext_i1_i16
104 ; CHECK:       sbfiz {{w[0-9]*}}, {{w[0-9]*}}, #4, #1
105 define signext i16 @lsl_sext_i1_i16(i1 %b) {
106   %1 = sext i1 %b to i16
107   %2 = shl i16 %1, 4
108   ret i16 %2
109 }
110
111 ; CHECK-LABEL: lsl_zext_i1_i32
112 ; CHECK:       ubfiz {{w[0-9]*}}, {{w[0-9]*}}, #4, #1
113 define i32 @lsl_zext_i1_i32(i1 %b) {
114   %1 = zext i1 %b to i32
115   %2 = shl i32 %1, 4
116   ret i32 %2
117 }
118
119 ; CHECK-LABEL: lsl_sext_i1_i32
120 ; CHECK:       sbfiz {{w[0-9]*}}, {{w[0-9]*}}, #4, #1
121 define i32 @lsl_sext_i1_i32(i1 %b) {
122   %1 = sext i1 %b to i32
123   %2 = shl i32 %1, 4
124   ret i32 %2
125 }
126
127 ; CHECK-LABEL: lsl_zext_i1_i64
128 ; CHECK:       ubfiz {{x[0-9]*}}, {{x[0-9]*}}, #4, #1
129 define i64 @lsl_zext_i1_i64(i1 %b) {
130   %1 = zext i1 %b to i64
131   %2 = shl i64 %1, 4
132   ret i64 %2
133 }
134
135 ; CHECK-LABEL: lsl_sext_i1_i64
136 ; CHECK:       sbfiz {{x[0-9]*}}, {{x[0-9]*}}, #4, #1
137 define i64 @lsl_sext_i1_i64(i1 %b) {
138   %1 = sext i1 %b to i64
139   %2 = shl i64 %1, 4
140   ret i64 %2
141 }
142
143 ; CHECK-LABEL: lslv_i8
144 ; CHECK:       and [[REG1:w[0-9]+]], w1, #0xff
145 ; CHECK-NEXT:  lsl [[REG2:w[0-9]+]], w0, [[REG1]]
146 ; CHECK-NEXT:  and {{w[0-9]+}}, [[REG2]], #0xff
147 define zeroext i8 @lslv_i8(i8 %a, i8 %b) {
148   %1 = shl i8 %a, %b
149   ret i8 %1
150 }
151
152 ; CHECK-LABEL: lsl_i8
153 ; CHECK:       ubfiz {{w[0-9]*}}, {{w[0-9]*}}, #4, #4
154 define zeroext i8 @lsl_i8(i8 %a) {
155   %1 = shl i8 %a, 4
156   ret i8 %1
157 }
158
159 ; CHECK-LABEL: lsl_zext_i8_i16
160 ; CHECK:       ubfiz {{w[0-9]*}}, {{w[0-9]*}}, #4, #8
161 define zeroext i16 @lsl_zext_i8_i16(i8 %b) {
162   %1 = zext i8 %b to i16
163   %2 = shl i16 %1, 4
164   ret i16 %2
165 }
166
167 ; CHECK-LABEL: lsl_sext_i8_i16
168 ; CHECK:       sbfiz {{w[0-9]*}}, {{w[0-9]*}}, #4, #8
169 define signext i16 @lsl_sext_i8_i16(i8 %b) {
170   %1 = sext i8 %b to i16
171   %2 = shl i16 %1, 4
172   ret i16 %2
173 }
174
175 ; CHECK-LABEL: lsl_zext_i8_i32
176 ; CHECK:       ubfiz {{w[0-9]*}}, {{w[0-9]*}}, #4, #8
177 define i32 @lsl_zext_i8_i32(i8 %b) {
178   %1 = zext i8 %b to i32
179   %2 = shl i32 %1, 4
180   ret i32 %2
181 }
182
183 ; CHECK-LABEL: lsl_sext_i8_i32
184 ; CHECK:       sbfiz {{w[0-9]*}}, {{w[0-9]*}}, #4, #8
185 define i32 @lsl_sext_i8_i32(i8 %b) {
186   %1 = sext i8 %b to i32
187   %2 = shl i32 %1, 4
188   ret i32 %2
189 }
190
191 ; CHECK-LABEL: lsl_zext_i8_i64
192 ; CHECK:       ubfiz {{x[0-9]*}}, {{x[0-9]*}}, #4, #8
193 define i64 @lsl_zext_i8_i64(i8 %b) {
194   %1 = zext i8 %b to i64
195   %2 = shl i64 %1, 4
196   ret i64 %2
197 }
198
199 ; CHECK-LABEL: lsl_sext_i8_i64
200 ; CHECK:       sbfiz {{x[0-9]*}}, {{x[0-9]*}}, #4, #8
201 define i64 @lsl_sext_i8_i64(i8 %b) {
202   %1 = sext i8 %b to i64
203   %2 = shl i64 %1, 4
204   ret i64 %2
205 }
206
207 ; CHECK-LABEL: lslv_i16
208 ; CHECK:       and [[REG1:w[0-9]+]], w1, #0xffff
209 ; CHECK-NEXT:  lsl [[REG2:w[0-9]+]], w0, [[REG1]]
210 ; CHECK-NEXT:  and {{w[0-9]+}}, [[REG2]], #0xffff
211 define zeroext i16 @lslv_i16(i16 %a, i16 %b) {
212   %1 = shl i16 %a, %b
213   ret i16 %1
214 }
215
216 ; CHECK-LABEL: lsl_i16
217 ; CHECK:       ubfiz {{w[0-9]*}}, {{w[0-9]*}}, #8, #8
218 define zeroext i16 @lsl_i16(i16 %a) {
219   %1 = shl i16 %a, 8
220   ret i16 %1
221 }
222
223 ; CHECK-LABEL: lsl_zext_i16_i32
224 ; CHECK:       ubfiz {{w[0-9]*}}, {{w[0-9]*}}, #8, #16
225 define i32 @lsl_zext_i16_i32(i16 %b) {
226   %1 = zext i16 %b to i32
227   %2 = shl i32 %1, 8
228   ret i32 %2
229 }
230
231 ; CHECK-LABEL: lsl_sext_i16_i32
232 ; CHECK:       sbfiz {{w[0-9]*}}, {{w[0-9]*}}, #8, #16
233 define i32 @lsl_sext_i16_i32(i16 %b) {
234   %1 = sext i16 %b to i32
235   %2 = shl i32 %1, 8
236   ret i32 %2
237 }
238
239 ; CHECK-LABEL: lsl_zext_i16_i64
240 ; CHECK:       ubfiz {{x[0-9]*}}, {{x[0-9]*}}, #8, #16
241 define i64 @lsl_zext_i16_i64(i16 %b) {
242   %1 = zext i16 %b to i64
243   %2 = shl i64 %1, 8
244   ret i64 %2
245 }
246
247 ; CHECK-LABEL: lsl_sext_i16_i64
248 ; CHECK:       sbfiz {{x[0-9]*}}, {{x[0-9]*}}, #8, #16
249 define i64 @lsl_sext_i16_i64(i16 %b) {
250   %1 = sext i16 %b to i64
251   %2 = shl i64 %1, 8
252   ret i64 %2
253 }
254
255 ; CHECK-LABEL: lslv_i32
256 ; CHECK:       lsl {{w[0-9]*}}, w0, w1
257 define zeroext i32 @lslv_i32(i32 %a, i32 %b) {
258   %1 = shl i32 %a, %b
259   ret i32 %1
260 }
261
262 ; CHECK-LABEL: lsl_i32
263 ; CHECK:       lsl {{w[0-9]*}}, {{w[0-9]*}}, #16
264 define zeroext i32 @lsl_i32(i32 %a) {
265   %1 = shl i32 %a, 16
266   ret i32 %1
267 }
268
269 ; CHECK-LABEL: lsl_zext_i32_i64
270 ; CHECK:       ubfiz {{x[0-9]+}}, {{x[0-9]+}}, #16, #32
271 define i64 @lsl_zext_i32_i64(i32 %b) {
272   %1 = zext i32 %b to i64
273   %2 = shl i64 %1, 16
274   ret i64 %2
275 }
276
277 ; CHECK-LABEL: lsl_sext_i32_i64
278 ; CHECK:       sbfiz {{x[0-9]+}}, {{x[0-9]+}}, #16, #32
279 define i64 @lsl_sext_i32_i64(i32 %b) {
280   %1 = sext i32 %b to i64
281   %2 = shl i64 %1, 16
282   ret i64 %2
283 }
284
285 ; CHECK-LABEL: lslv_i64
286 ; CHECK:       lsl {{x[0-9]*}}, x0, x1
287 define i64 @lslv_i64(i64 %a, i64 %b) {
288   %1 = shl i64 %a, %b
289   ret i64 %1
290 }
291
292 ; CHECK-LABEL: lsl_i64
293 ; CHECK:       lsl {{x[0-9]*}}, {{x[0-9]*}}, #32
294 define i64 @lsl_i64(i64 %a) {
295   %1 = shl i64 %a, 32
296   ret i64 %1
297 }
298
299 ; CHECK-LABEL: lsrv_i8
300 ; CHECK:       and [[REG1:w[0-9]+]], w0, #0xff
301 ; CHECK-NEXT:  and [[REG2:w[0-9]+]], w1, #0xff
302 ; CHECK-NEXT:  lsr [[REG3:w[0-9]+]], [[REG1]], [[REG2]]
303 ; CHECK-NEXT:  and {{w[0-9]+}}, [[REG3]], #0xff
304 define zeroext i8 @lsrv_i8(i8 %a, i8 %b) {
305   %1 = lshr i8 %a, %b
306   ret i8 %1
307 }
308
309 ; CHECK-LABEL: lsr_i8
310 ; CHECK:       ubfx {{w[0-9]*}}, {{w[0-9]*}}, #4, #4
311 define zeroext i8 @lsr_i8(i8 %a) {
312   %1 = lshr i8 %a, 4
313   ret i8 %1
314 }
315
316 ; CHECK-LABEL: lsr_zext_i8_i16
317 ; CHECK:       ubfx {{w[0-9]*}}, {{w[0-9]*}}, #4, #4
318 define zeroext i16 @lsr_zext_i8_i16(i8 %b) {
319   %1 = zext i8 %b to i16
320   %2 = lshr i16 %1, 4
321   ret i16 %2
322 }
323
324 ; CHECK-LABEL: lsr_sext_i8_i16
325 ; CHECK:       sxtb [[REG:w[0-9]+]], w0
326 ; CHECK-NEXT:  ubfx {{w[0-9]*}}, [[REG]], #4, #12
327 define signext i16 @lsr_sext_i8_i16(i8 %b) {
328   %1 = sext i8 %b to i16
329   %2 = lshr i16 %1, 4
330   ret i16 %2
331 }
332
333 ; CHECK-LABEL: lsr_zext_i8_i32
334 ; CHECK:       ubfx {{w[0-9]*}}, {{w[0-9]*}}, #4, #4
335 define i32 @lsr_zext_i8_i32(i8 %b) {
336   %1 = zext i8 %b to i32
337   %2 = lshr i32 %1, 4
338   ret i32 %2
339 }
340
341 ; CHECK-LABEL: lsr_sext_i8_i32
342 ; CHECK:       sxtb [[REG:w[0-9]+]], w0
343 ; CHECK-NEXT:  lsr {{w[0-9]*}}, [[REG]], #4
344 define i32 @lsr_sext_i8_i32(i8 %b) {
345   %1 = sext i8 %b to i32
346   %2 = lshr i32 %1, 4
347   ret i32 %2
348 }
349
350 ; CHECK-LABEL: lsrv_i16
351 ; CHECK:       and [[REG1:w[0-9]+]], w0, #0xffff
352 ; CHECK-NEXT:  and [[REG2:w[0-9]+]], w1, #0xffff
353 ; CHECK-NEXT:  lsr [[REG3:w[0-9]+]], [[REG1]], [[REG2]]
354 ; CHECK-NEXT:  and {{w[0-9]+}}, [[REG3]], #0xffff
355 define zeroext i16 @lsrv_i16(i16 %a, i16 %b) {
356   %1 = lshr i16 %a, %b
357   ret i16 %1
358 }
359
360 ; CHECK-LABEL: lsr_i16
361 ; CHECK:       ubfx {{w[0-9]*}}, {{w[0-9]*}}, #8, #8
362 define zeroext i16 @lsr_i16(i16 %a) {
363   %1 = lshr i16 %a, 8
364   ret i16 %1
365 }
366
367 ; CHECK-LABEL: lsrv_i32
368 ; CHECK:       lsr {{w[0-9]*}}, w0, w1
369 define zeroext i32 @lsrv_i32(i32 %a, i32 %b) {
370   %1 = lshr i32 %a, %b
371   ret i32 %1
372 }
373
374 ; CHECK-LABEL: lsr_i32
375 ; CHECK:       lsr {{w[0-9]*}}, {{w[0-9]*}}, #16
376 define zeroext i32 @lsr_i32(i32 %a) {
377   %1 = lshr i32 %a, 16
378   ret i32 %1
379 }
380
381 ; CHECK-LABEL: lsrv_i64
382 ; CHECK:       lsr {{x[0-9]*}}, x0, x1
383 define i64 @lsrv_i64(i64 %a, i64 %b) {
384   %1 = lshr i64 %a, %b
385   ret i64 %1
386 }
387
388 ; CHECK-LABEL: lsr_i64
389 ; CHECK:       lsr {{x[0-9]*}}, {{x[0-9]*}}, #32
390 define i64 @lsr_i64(i64 %a) {
391   %1 = lshr i64 %a, 32
392   ret i64 %1
393 }
394
395 ; CHECK-LABEL: asrv_i8
396 ; CHECK:       sxtb [[REG1:w[0-9]+]], w0
397 ; CHECK-NEXT:  and  [[REG2:w[0-9]+]], w1, #0xff
398 ; CHECK-NEXT:  asr  [[REG3:w[0-9]+]], [[REG1]], [[REG2]]
399 ; CHECK-NEXT:  and  {{w[0-9]+}}, [[REG3]], #0xff
400 define zeroext i8 @asrv_i8(i8 %a, i8 %b) {
401   %1 = ashr i8 %a, %b
402   ret i8 %1
403 }
404
405 ; CHECK-LABEL: asr_i8
406 ; CHECK:       sbfx {{w[0-9]*}}, {{w[0-9]*}}, #4, #4
407 define zeroext i8 @asr_i8(i8 %a) {
408   %1 = ashr i8 %a, 4
409   ret i8 %1
410 }
411
412 ; CHECK-LABEL: asr_zext_i8_i16
413 ; CHECK:       ubfx {{w[0-9]*}}, {{w[0-9]*}}, #4, #4
414 define zeroext i16 @asr_zext_i8_i16(i8 %b) {
415   %1 = zext i8 %b to i16
416   %2 = ashr i16 %1, 4
417   ret i16 %2
418 }
419
420 ; CHECK-LABEL: asr_sext_i8_i16
421 ; CHECK:       sbfx {{w[0-9]*}}, {{w[0-9]*}}, #4, #4
422 define signext i16 @asr_sext_i8_i16(i8 %b) {
423   %1 = sext i8 %b to i16
424   %2 = ashr i16 %1, 4
425   ret i16 %2
426 }
427
428 ; CHECK-LABEL: asr_zext_i8_i32
429 ; CHECK:       ubfx {{w[0-9]*}}, {{w[0-9]*}}, #4, #4
430 define i32 @asr_zext_i8_i32(i8 %b) {
431   %1 = zext i8 %b to i32
432   %2 = ashr i32 %1, 4
433   ret i32 %2
434 }
435
436 ; CHECK-LABEL: asr_sext_i8_i32
437 ; CHECK:       sbfx {{w[0-9]*}}, {{w[0-9]*}}, #4, #4
438 define i32 @asr_sext_i8_i32(i8 %b) {
439   %1 = sext i8 %b to i32
440   %2 = ashr i32 %1, 4
441   ret i32 %2
442 }
443
444 ; CHECK-LABEL: asrv_i16
445 ; CHECK:       sxth [[REG1:w[0-9]+]], w0
446 ; CHECK-NEXT:  and  [[REG2:w[0-9]+]], w1, #0xffff
447 ; CHECK-NEXT:  asr  [[REG3:w[0-9]+]], [[REG1]], [[REG2]]
448 ; CHECK-NEXT:  and  {{w[0-9]+}}, [[REG3]], #0xffff
449 define zeroext i16 @asrv_i16(i16 %a, i16 %b) {
450   %1 = ashr i16 %a, %b
451   ret i16 %1
452 }
453
454 ; CHECK-LABEL: asr_i16
455 ; CHECK:       sbfx {{w[0-9]*}}, {{w[0-9]*}}, #8, #8
456 define zeroext i16 @asr_i16(i16 %a) {
457   %1 = ashr i16 %a, 8
458   ret i16 %1
459 }
460
461 ; CHECK-LABEL: asrv_i32
462 ; CHECK:       asr {{w[0-9]*}}, w0, w1
463 define zeroext i32 @asrv_i32(i32 %a, i32 %b) {
464   %1 = ashr i32 %a, %b
465   ret i32 %1
466 }
467
468 ; CHECK-LABEL: asr_i32
469 ; CHECK:       asr {{w[0-9]*}}, {{w[0-9]*}}, #16
470 define zeroext i32 @asr_i32(i32 %a) {
471   %1 = ashr i32 %a, 16
472   ret i32 %1
473 }
474
475 ; CHECK-LABEL: asrv_i64
476 ; CHECK:       asr {{x[0-9]*}}, x0, x1
477 define i64 @asrv_i64(i64 %a, i64 %b) {
478   %1 = ashr i64 %a, %b
479   ret i64 %1
480 }
481
482 ; CHECK-LABEL: asr_i64
483 ; CHECK:       asr {{x[0-9]*}}, {{x[0-9]*}}, #32
484 define i64 @asr_i64(i64 %a) {
485   %1 = ashr i64 %a, 32
486   ret i64 %1
487 }
488
489 ; CHECK-LABEL: shift_test1
490 ; CHECK:       ubfiz {{w[0-9]*}}, {{w[0-9]*}}, #4, #4
491 ; CHECK-NEXT:  sbfx  {{w[0-9]*}}, {{w[0-9]*}}, #4, #4
492 define i32 @shift_test1(i8 %a) {
493   %1 = shl i8 %a, 4
494   %2 = ashr i8 %1, 4
495   %3 = sext i8 %2 to i32
496   ret i32 %3
497 }
498
499 ; Test zero shifts
500
501 ; CHECK-LABEL: shl_zero
502 ; CHECK-NOT:   lsl
503 define i32 @shl_zero(i32 %a) {
504   %1 = shl i32 %a, 0
505   ret i32 %1
506 }
507
508 ; CHECK-LABEL: lshr_zero
509 ; CHECK-NOT:   lsr
510 define i32 @lshr_zero(i32 %a) {
511   %1 = lshr i32 %a, 0
512   ret i32 %1
513 }
514
515 ; CHECK-LABEL: ashr_zero
516 ; CHECK-NOT:   asr
517 define i32 @ashr_zero(i32 %a) {
518   %1 = ashr i32 %a, 0
519   ret i32 %1
520 }
521
522 ; CHECK-LABEL: shl_zext_zero
523 ; CHECK:       ubfx x0, x0, #0, #32
524 define i64 @shl_zext_zero(i32 %a) {
525   %1 = zext i32 %a to i64
526   %2 = shl i64 %1, 0
527   ret i64 %2
528 }
529
530 ; CHECK-LABEL: lshr_zext_zero
531 ; CHECK:       ubfx x0, x0, #0, #32
532 define i64 @lshr_zext_zero(i32 %a) {
533   %1 = zext i32 %a to i64
534   %2 = lshr i64 %1, 0
535   ret i64 %2
536 }
537
538 ; CHECK-LABEL: ashr_zext_zero
539 ; CHECK:       ubfx x0, x0, #0, #32
540 define i64 @ashr_zext_zero(i32 %a) {
541   %1 = zext i32 %a to i64
542   %2 = ashr i64 %1, 0
543   ret i64 %2
544 }
545