Don't assert with private type info variables.
[oota-llvm.git] / test / CodeGen / XCore / llvm-intrinsics.ll
1 ; RUN: llc < %s -march=xcore | FileCheck %s
2
3 declare i8* @llvm.frameaddress(i32) nounwind readnone
4 declare i8* @llvm.returnaddress(i32) nounwind
5 declare i8* @llvm.eh.dwarf.cfa(i32) nounwind
6 declare void @llvm.eh.return.i32(i32, i8*) nounwind
7 declare void @llvm.eh.unwind.init() nounwind
8
9 define i8* @FA0() nounwind {
10 entry:
11 ; CHECK-LABEL: FA0
12 ; CHECK: ldaw r0, sp[0]
13 ; CHECK-NEXT: retsp 0
14   %0 = call i8* @llvm.frameaddress(i32 0)
15   ret i8* %0
16 }
17
18 define i8* @FA1() nounwind {
19 entry:
20 ; CHECK-LABEL: FA1
21 ; CHECK: entsp 100
22 ; CHECK-NEXT: ldaw r0, sp[0]
23 ; CHECK-NEXT: retsp 100
24   %0 = alloca [100 x i32]
25   %1 = call i8* @llvm.frameaddress(i32 0)
26   ret i8* %1
27 }
28
29 define i8* @RA0() nounwind {
30 entry:
31 ; CHECK-LABEL: RA0
32 ; CHECK: stw lr, sp[0]
33 ; CHECK-NEXT: ldw r0, sp[0]
34 ; CHECK-NEXT: ldw lr, sp[0]
35 ; CHECK-NEXT: retsp 0
36   %0 = call i8* @llvm.returnaddress(i32 0)
37   ret i8* %0
38 }
39
40 define i8* @RA1() nounwind {
41 entry:
42 ; CHECK-LABEL: RA1
43 ; CHECK: entsp 100
44 ; CHECK-NEXT: ldw r0, sp[100]
45 ; CHECK-NEXT: retsp 100
46   %0 = alloca [100 x i32]
47   %1 = call i8* @llvm.returnaddress(i32 0)
48   ret i8* %1
49 }
50
51 ; test FRAME_TO_ARGS_OFFSET lowering
52 define i8* @FTAO0() nounwind {
53 entry:
54 ; CHECK-LABEL: FTAO0
55 ; CHECK: ldc r0, 0
56 ; CHECK-NEXT: ldaw r1, sp[0]
57 ; CHECK-NEXT: add r0, r1, r0
58 ; CHECK-NEXT: retsp 0
59   %0 = call i8* @llvm.eh.dwarf.cfa(i32 0)
60   ret i8* %0
61 }
62
63 define i8* @FTAO1() nounwind {
64 entry:
65 ; CHECK-LABEL: FTAO1
66 ; CHECK: entsp 100
67 ; CHECK-NEXT: ldc r0, 400
68 ; CHECK-NEXT: ldaw r1, sp[0]
69 ; CHECK-NEXT: add r0, r1, r0
70 ; CHECK-NEXT: retsp 100
71   %0 = alloca [100 x i32]
72   %1 = call i8* @llvm.eh.dwarf.cfa(i32 0)
73   ret i8* %1
74 }
75
76 define i8* @EH0(i32 %offset, i8* %handler) {
77 entry:
78 ; CHECK-LABEL: EH0
79 ; CHECK: ldc r2, 0
80 ; CHECK-NEXT: ldaw r3, sp[0]
81 ; CHECK-NEXT: add r2, r3, r2
82 ; CHECK-NEXT: add r2, r2, r0
83 ; CHECK-NEXT: mov r3, r1
84 ; CHECK-NEXT: set sp, r2
85 ; CHECK-NEXT: bau r3
86   call void @llvm.eh.return.i32(i32 %offset, i8* %handler)
87   unreachable
88 }
89
90 declare void @foo(...)
91 define i8* @EH1(i32 %offset, i8* %handler) {
92 entry:
93 ; CHECK-LABEL: EH1
94 ; CHECK: entsp 3
95 ; CHECK: stw r4, sp[2]
96 ; CHECK: stw r5, sp[1]
97 ; CHECK: mov r4, r1
98 ; CHECK-NEXT: mov r5, r0
99 ; CHECK-NEXT: bl foo
100 ; CHECK-NEXT: ldc r0, 12
101 ; CHECK-NEXT: ldaw r1, sp[0]
102 ; CHECK-NEXT: add r0, r1, r0
103 ; CHECK-NEXT: add r2, r0, r5
104 ; CHECK-NEXT: mov r3, r4
105 ; CHECK-NEXT: ldw r5, sp[1]
106 ; CHECK-NEXT: ldw r4, sp[2]
107 ; CHECK-NEXT: set sp, r2
108 ; CHECK-NEXT: bau r3
109   call void (...)* @foo()
110   call void @llvm.eh.return.i32(i32 %offset, i8* %handler)
111   unreachable
112 }
113
114 @offset = external constant i32
115 @handler = external constant i8
116 define i8* @EH2(i32 %r0, i32 %r1, i32 %r2, i32 %r3) {
117 entry:
118 ; CHECK-LABEL: EH2
119 ; CHECK: entsp 1
120 ; CHECK: bl foo
121 ; CHECK-NEXT: ldw r0, cp[offset]
122 ; CHECK-NEXT: ldc r1, 4
123 ; CHECK-NEXT: ldaw r2, sp[0]
124 ; CHECK-NEXT: add r1, r2, r1
125 ; CHECK-NEXT: add r2, r1, r0
126 ; CHECK-NEXT: ldaw r11, cp[handler]
127 ; CHECK-NEXT: mov r3, r11
128 ; CHECK-NEXT: set sp, r2
129 ; CHECK-NEXT: bau r3
130   call void (...)* @foo()
131   %0 = load i32* @offset
132   call void @llvm.eh.return.i32(i32 %0, i8* @handler)
133   unreachable
134 }
135
136
137 ; FP: spill FP+SR+R4:9 = entsp 2 + 6
138 ; CHECKFP-LABEL: Unwind0:
139 ; CHECKFP: entsp 8
140 ; CHECKFP: stw r10, sp[1]
141 ; CHECKFP: ldaw r10, sp[0]
142 ; CHECKFP: stw r4, r10[7]
143 ; CHECKFP: stw r5, r10[6]
144 ; CHECKFP: stw r6, r10[5]`
145 ; CHECKFP: stw r7, r10[4]
146 ; CHECKFP: stw r8, r10[3]
147 ; CHECKFP: stw r9, r10[2]
148 ; CHECKFP: ldw r9, r10[2]
149 ; CHECKFP: ldw r8, r10[3]
150 ; CHECKFP: ldw r7, r10[4]
151 ; CHECKFP: ldw r6, r10[5]
152 ; CHECKFP: ldw r5, r10[6]
153 ; CHECKFP: ldw r4, r10[7]
154 ; CHECKFP: set sp, r10
155 ; CHECKFP: ldw r10, sp[1]
156 ; CHECKFP: retsp 8
157 ;
158 ; !FP: spill R4:10 = entsp 7
159 ; CHECK-LABEL: Unwind0:
160 ; CHECK: entsp 7
161 ; CHECK: stw r4, sp[6]
162 ; CHECK: stw r5, sp[5]
163 ; CHECK: stw r6, sp[4]
164 ; CHECK: stw r7, sp[3]
165 ; CHECK: stw r8, sp[2]
166 ; CHECK: stw r9, sp[1]
167 ; CHECK: stw r10, sp[0]
168 ; CHECK: ldw r10, sp[0]
169 ; CHECK: ldw r9, sp[1]
170 ; CHECK: ldw r8, sp[2]
171 ; CHECK: ldw r7, sp[3]
172 ; CHECK: ldw r6, sp[4]
173 ; CHECK: ldw r5, sp[5]
174 ; CHECK: ldw r4, sp[6]
175 ; CHECK: retsp 7
176 define void @Unwind0() {
177   call void @llvm.eh.unwind.init()
178   ret void
179 }
180
181
182 ; FP: spill FP+SR+R4:9+LR = entsp 2 + 6 + extsp 1
183 ; CHECKFP-LABEL: Unwind1:
184 ; CHECKFP: entsp 8
185 ; CHECKFP: stw r10, sp[1]
186 ; CHECKFP: ldaw r10, sp[0]
187 ; CHECKFP: stw r4, r10[7]
188 ; CHECKFP: stw r5, r10[6]
189 ; CHECKFP: stw r6, r10[5]
190 ; CHECKFP: stw r7, r10[4]
191 ; CHECKFP: stw r8, r10[3]
192 ; CHECKFP: stw r9, r10[2]
193 ; CHECKFP: extsp 1
194 ; CHECKFP: bl foo
195 ; CHECKFP: ldaw sp, sp[1]
196 ; CHECKFP: ldw r9, r10[2]
197 ; CHECKFP: ldw r8, r10[3]
198 ; CHECKFP: ldw r7, r10[4]
199 ; CHECKFP: ldw r6, r10[5]
200 ; CHECKFP: ldw r5, r10[6]
201 ; CHECKFP: ldw r4, r10[7]
202 ; CHECKFP: set sp, r10
203 ; CHECKFP: ldw r10, sp[1]
204 ; CHECKFP: retsp 8
205 ;
206 ; !FP: spill R4:10+LR = entsp 7 + 1
207 ; CHECK-LABEL: Unwind1:
208 ; CHECK: entsp 8
209 ; CHECK: stw r4, sp[7]
210 ; CHECK: stw r5, sp[6]
211 ; CHECK: stw r6, sp[5]
212 ; CHECK: stw r7, sp[4]
213 ; CHECK: stw r8, sp[3]
214 ; CHECK: stw r9, sp[2]
215 ; CHECK: stw r10, sp[1]
216 ; CHECK: bl foo
217 ; CHECK: ldw r10, sp[1]
218 ; CHECK: ldw r9, sp[2]
219 ; CHECK: ldw r8, sp[3]
220 ; CHECK: ldw r7, sp[4]
221 ; CHECK: ldw r6, sp[5]
222 ; CHECK: ldw r5, sp[6]
223 ; CHECK: ldw r4, sp[7]
224 ; CHECK: retsp 8
225 define void @Unwind1() {
226   call void (...)* @foo()
227   call void @llvm.eh.unwind.init()
228   ret void
229 }