Mercurial > hg > Members > tobaru > cbc > CbC_llvm
comparison test/CodeGen/AArch64/tail-call.ll @ 0:95c75e76d11b
LLVM 3.4
author | Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 12 Dec 2013 13:56:28 +0900 |
parents | |
children | 54457678186b |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:95c75e76d11b |
---|---|
1 ; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu -tailcallopt | FileCheck %s | |
2 | |
3 declare fastcc void @callee_stack0() | |
4 declare fastcc void @callee_stack8([8 x i32], i64) | |
5 declare fastcc void @callee_stack16([8 x i32], i64, i64) | |
6 | |
7 define fastcc void @caller_to0_from0() nounwind { | |
8 ; CHECK-LABEL: caller_to0_from0: | |
9 ; CHECK-NEXT: // BB | |
10 tail call fastcc void @callee_stack0() | |
11 ret void | |
12 ; CHECK-NEXT: b callee_stack0 | |
13 } | |
14 | |
15 define fastcc void @caller_to0_from8([8 x i32], i64) { | |
16 ; CHECK-LABEL: caller_to0_from8: | |
17 | |
18 tail call fastcc void @callee_stack0() | |
19 ret void | |
20 ; CHECK: add sp, sp, #16 | |
21 ; CHECK-NEXT: b callee_stack0 | |
22 } | |
23 | |
24 define fastcc void @caller_to8_from0() { | |
25 ; CHECK-LABEL: caller_to8_from0: | |
26 ; CHECK: sub sp, sp, #32 | |
27 | |
28 ; Key point is that the "42" should go #16 below incoming stack | |
29 ; pointer (we didn't have arg space to reuse). | |
30 tail call fastcc void @callee_stack8([8 x i32] undef, i64 42) | |
31 ret void | |
32 ; CHECK: str {{x[0-9]+}}, [sp, #16] | |
33 ; CHECK-NEXT: add sp, sp, #16 | |
34 ; CHECK-NEXT: b callee_stack8 | |
35 } | |
36 | |
37 define fastcc void @caller_to8_from8([8 x i32], i64 %a) { | |
38 ; CHECK-LABEL: caller_to8_from8: | |
39 ; CHECK: sub sp, sp, #16 | |
40 | |
41 ; Key point is that the "%a" should go where at SP on entry. | |
42 tail call fastcc void @callee_stack8([8 x i32] undef, i64 42) | |
43 ret void | |
44 ; CHECK: str {{x[0-9]+}}, [sp, #16] | |
45 ; CHECK-NEXT: add sp, sp, #16 | |
46 ; CHECK-NEXT: b callee_stack8 | |
47 } | |
48 | |
49 define fastcc void @caller_to16_from8([8 x i32], i64 %a) { | |
50 ; CHECK-LABEL: caller_to16_from8: | |
51 ; CHECK: sub sp, sp, #16 | |
52 | |
53 ; Important point is that the call reuses the "dead" argument space | |
54 ; above %a on the stack. If it tries to go below incoming-SP then the | |
55 ; callee will not deallocate the space, even in fastcc. | |
56 tail call fastcc void @callee_stack16([8 x i32] undef, i64 42, i64 2) | |
57 ; CHECK: str {{x[0-9]+}}, [sp, #24] | |
58 ; CHECK: str {{x[0-9]+}}, [sp, #16] | |
59 ; CHECK: add sp, sp, #16 | |
60 ; CHECK: b callee_stack16 | |
61 ret void | |
62 } | |
63 | |
64 | |
65 define fastcc void @caller_to8_from24([8 x i32], i64 %a, i64 %b, i64 %c) { | |
66 ; CHECK-LABEL: caller_to8_from24: | |
67 ; CHECK: sub sp, sp, #16 | |
68 | |
69 ; Key point is that the "%a" should go where at #16 above SP on entry. | |
70 tail call fastcc void @callee_stack8([8 x i32] undef, i64 42) | |
71 ret void | |
72 ; CHECK: str {{x[0-9]+}}, [sp, #32] | |
73 ; CHECK-NEXT: add sp, sp, #32 | |
74 ; CHECK-NEXT: b callee_stack8 | |
75 } | |
76 | |
77 | |
78 define fastcc void @caller_to16_from16([8 x i32], i64 %a, i64 %b) { | |
79 ; CHECK-LABEL: caller_to16_from16: | |
80 ; CHECK: sub sp, sp, #16 | |
81 | |
82 ; Here we want to make sure that both loads happen before the stores: | |
83 ; otherwise either %a or %b will be wrongly clobbered. | |
84 tail call fastcc void @callee_stack16([8 x i32] undef, i64 %b, i64 %a) | |
85 ret void | |
86 | |
87 ; CHECK: ldr x0, | |
88 ; CHECK: ldr x1, | |
89 ; CHECK: str x1, | |
90 ; CHECK: str x0, | |
91 | |
92 ; CHECK: add sp, sp, #16 | |
93 ; CHECK: b callee_stack16 | |
94 } |