XCore target: Enable frames larger than 65535 to be lowered
[oota-llvm.git] / test / CodeGen / XCore / epilogue_prologue.ll
1 ; RUN: llc < %s -march=xcore | FileCheck %s
2 ; RUN: llc < %s -march=xcore -disable-fp-elim | FileCheck %s -check-prefix=CHECKFP
3
4
5 ; CHECKFP-LABEL: f1
6 ; CHECKFP: entsp 2
7 ; CHECKFP-NEXT: stw r10, sp[1]
8 ; CHECKFP-NEXT: ldaw r10, sp[0]
9 ; CHECKFP: set sp, r10
10 ; CHECKFP-NEXT: ldw r10, sp[1]
11 ; CHECKFP-NEXT: retsp 2
12 ;
13 ; CHECK-LABEL: f1
14 ; CHECK: stw lr, sp[0]
15 ; CHECK: ldw lr, sp[0]
16 ; CHECK-NEXT: retsp 0
17 define void @f1() nounwind {
18 entry:
19   tail call void asm sideeffect "", "~{lr}"() nounwind
20   ret void
21 }
22
23
24 ; CHECKFP-LABEL:f3
25 ; CHECKFP: entsp 3
26 ; CHECKFP-NEXT: stw r10, sp[1]
27 ; CHECKFP-NEXT: ldaw r10, sp[0]
28 ; CHECKFP-NEXT: stw [[REG:r[4-9]+]], r10[2]
29 ; CHECKFP-NEXT: mov [[REG]], r0
30 ; CHECKFP-NEXT: extsp 1
31 ; CHECKFP-NEXT: bl f2
32 ; CHECKFP-NEXT: ldaw sp, sp[1]
33 ; CHECKFP-NEXT: mov r0, [[REG]]
34 ; CHECKFP-NEXT: ldw [[REG]], r10[2]
35 ; CHECKFP-NEXT: set sp, r10
36 ; CHECKFP-NEXT: ldw r10, sp[1]
37 ; CHECKFP-NEXT: retsp 3
38 ;
39 ; CHECK-LABEL: f3
40 ; CHECK: entsp 2
41 ; CHECK: stw [[REG:r[4-9]+]], sp[1]
42 ; CHECK: mov [[REG]], r0
43 ; CHECK: bl f2
44 ; CHECK: mov r0, [[REG]]
45 ; CHECK: ldw [[REG]], sp[1]
46 ; CHECK: retsp 2
47 declare void @f2()
48 define i32 @f3(i32 %i) nounwind {
49 entry:
50   call void @f2()
51   ret i32 %i
52 }
53
54
55 ; CHECKFP-LABEL: f4
56 ; CHECKFP: extsp 65535
57 ; CHECKFP-NEXT: .Ltmp{{[0-9]+}}
58 ; CHECKFP-NEXT: .cfi_def_cfa_offset 262140
59 ; CHECKFP-NEXT: extsp 34467
60 ; CHECKFP-NEXT: .Ltmp{{[0-9]+}}
61 ; CHECKFP-NEXT: .cfi_def_cfa_offset 400008
62 ; CHECKFP-NEXT: stw r10, sp[1]
63 ; CHECKFP-NEXT: .Ltmp{{[0-9]+}}
64 ; CHECKFP-NEXT: .cfi_offset 10, -400004
65 ; CHECKFP-NEXT: ldaw r10, sp[0]
66 ; CHECKFP-NEXT: .Ltmp{{[0-9]+}}
67 ; CHECKFP-NEXT: .cfi_def_cfa_register 10
68 ; CHECKFP-NEXT: set sp, r10
69 ; CHECKFP-NEXT: ldw r10, sp[1]
70 ; CHECKFP-NEXT: ldaw sp, sp[65535]
71 ; CHECKFP-NEXT: ldaw sp, sp[34467]
72 ; CHECKFP-NEXT: retsp 0
73 ;
74 ; CHECK-LABEL: f4
75 ; CHECK: extsp 65535
76 ; CHECK-NEXT: .Ltmp{{[0-9]+}}
77 ; CHECK-NEXT: .cfi_def_cfa_offset 262140
78 ; CHECK-NEXT: extsp 34465
79 ; CHECK-NEXT: .Ltmp{{[0-9]+}}
80 ; CHECK-NEXT: .cfi_def_cfa_offset 400000
81 ; CHECK-NEXT: ldaw sp, sp[65535]
82 ; CHECK-NEXT: ldaw sp, sp[34465]
83 ; CHECK-NEXT: retsp 0
84 define void @f4() {
85 entry:
86   %0 = alloca [100000 x i32], align 4
87   ret void
88 }
89
90
91 ; CHECKFP-LABEL: f6
92 ; CHECKFP: entsp 65535
93 ; CHECKFP-NEXT: .Ltmp{{[0-9]+}}
94 ; CHECKFP-NEXT: .cfi_def_cfa_offset 262140
95 ; CHECKFP-NEXT: .Ltmp{{[0-9]+}}
96 ; CHECKFP-NEXT: .cfi_offset 15, 0
97 ; CHECKFP-NEXT: extsp 65535
98 ; CHECKFP-NEXT: .Ltmp{{[0-9]+}}
99 ; CHECKFP-NEXT: .cfi_def_cfa_offset 524280
100 ; CHECKFP-NEXT: extsp 65535
101 ; CHECKFP-NEXT: .Ltmp{{[0-9]+}}
102 ; CHECKFP-NEXT: .cfi_def_cfa_offset 786420
103 ; CHECKFP-NEXT: extsp 3396
104 ; CHECKFP-NEXT: .Ltmp{{[0-9]+}}
105 ; CHECKFP-NEXT: .cfi_def_cfa_offset 800004
106 ; CHECKFP-NEXT: stw r10, sp[1]
107 ; CHECKFP-NEXT: .Ltmp{{[0-9]+}}
108 ; CHECKFP-NEXT: .cfi_offset 10, -800000
109 ; CHECKFP-NEXT: ldaw r10, sp[0]
110 ; CHECKFP-NEXT: .Ltmp{{[0-9]+}}
111 ; CHECKFP-NEXT: .cfi_def_cfa_register 10
112 ; CHECKFP-NEXT: extsp 1
113 ; CHECKFP-NEXT: ldaw r0, r10[2]
114 ; CHECKFP-NEXT: bl f5
115 ; CHECKFP-NEXT: ldaw sp, sp[1]
116 ; CHECKFP-NEXT: set sp, r10
117 ; CHECKFP-NEXT: ldw r10, sp[1]
118 ; CHECKFP-NEXT: ldaw sp, sp[65535]
119 ; CHECKFP-NEXT: ldaw sp, sp[65535]
120 ; CHECKFP-NEXT: ldaw sp, sp[65535]
121 ; CHECKFP-NEXT: retsp 3396
122 ;
123 ; CHECK-LABEL: f6
124 ; CHECK: entsp 65535
125 ; CHECK-NEXT: .Ltmp{{[0-9]+}}
126 ; CHECK-NEXT: .cfi_def_cfa_offset 262140
127 ; CHECK-NEXT: .Ltmp{{[0-9]+}}
128 ; CHECK-NEXT: .cfi_offset 15, 0
129 ; CHECK-NEXT: extsp 65535
130 ; CHECK-NEXT: .Ltmp{{[0-9]+}}
131 ; CHECK-NEXT: .cfi_def_cfa_offset 524280
132 ; CHECK-NEXT: extsp 65535
133 ; CHECK-NEXT: .Ltmp{{[0-9]+}}
134 ; CHECK-NEXT: .cfi_def_cfa_offset 786420
135 ; CHECK-NEXT: extsp 3395
136 ; CHECK-NEXT: .Ltmp{{[0-9]+}}
137 ; CHECK-NEXT: .cfi_def_cfa_offset 800000
138 ; CHECK-NEXT: ldaw r0, sp[1]
139 ; CHECK-NEXT: bl f5
140 ; CHECK-NEXT: ldaw sp, sp[65535]
141 ; CHECK-NEXT: ldaw sp, sp[65535]
142 ; CHECK-NEXT: ldaw sp, sp[65535]
143 ; CHECK-NEXT: retsp 3395
144 declare void @f5(i32*)
145 define void @f6() {
146 entry:
147   %0 = alloca [199999 x i32], align 4
148   %1 = getelementptr inbounds [199999 x i32]* %0, i32 0, i32 0
149   call void @f5(i32* %1)
150   ret void
151 }