Liveness Analysis Pass
[oota-llvm.git] / test / CodeGen / X86 / anyregcc.ll
1 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -disable-fp-elim | FileCheck %s
2
3 ; Stackmap Header: no constants - 6 callsites
4 ; CHECK-LABEL: .section __LLVM_STACKMAPS,__llvm_stackmaps
5 ; CHECK-NEXT:  __LLVM_StackMaps:
6 ; Header
7 ; CHECK-NEXT:   .long   0
8 ; Num Constants
9 ; CHECK-NEXT:   .long   0
10 ; Num Callsites
11 ; CHECK-NEXT:   .long   8
12
13 ; test
14 ; CHECK-LABEL:  .long   L{{.*}}-_test
15 ; CHECK-NEXT:   .short  0
16 ; 3 locations
17 ; CHECK-NEXT:   .short  3
18 ; Loc 0: Register
19 ; CHECK-NEXT:   .byte 1
20 ; CHECK-NEXT:   .byte 4
21 ; CHECK-NEXT:   .short {{[0-9]+}}
22 ; CHECK-NEXT:   .long 0
23 ; Loc 1: Register
24 ; CHECK-NEXT:   .byte 1
25 ; CHECK-NEXT:   .byte 4
26 ; CHECK-NEXT:   .short {{[0-9]+}}
27 ; CHECK-NEXT:   .long 0
28 ; Loc 2: Constant 3
29 ; CHECK-NEXT:   .byte 4
30 ; CHECK-NEXT:   .byte 8
31 ; CHECK-NEXT:   .short  0
32 ; CHECK-NEXT:   .long 3
33 define i64 @test() nounwind ssp uwtable {
34 entry:
35   call anyregcc void (i32, i32, i8*, i32, ...)* @llvm.experimental.patchpoint.void(i32 0, i32 15, i8* null, i32 2, i32 1, i32 2, i64 3)
36   ret i64 0
37 }
38
39 ; property access 1 - %obj is an anyreg call argument and should therefore be in a register
40 ; CHECK-LABEL:  .long   L{{.*}}-_property_access1
41 ; CHECK-NEXT:   .short  0
42 ; 2 locations
43 ; CHECK-NEXT:   .short  2
44 ; Loc 0: Register <-- this is the return register
45 ; CHECK-NEXT:   .byte 1
46 ; CHECK-NEXT:   .byte 8
47 ; CHECK-NEXT:   .short {{[0-9]+}}
48 ; CHECK-NEXT:   .long 0
49 ; Loc 1: Register
50 ; CHECK-NEXT:   .byte 1
51 ; CHECK-NEXT:   .byte 8
52 ; CHECK-NEXT:   .short {{[0-9]+}}
53 ; CHECK-NEXT:   .long 0
54 define i64 @property_access1(i8* %obj) nounwind ssp uwtable {
55 entry:
56   %f = inttoptr i64 12297829382473034410 to i8*
57   %ret = call anyregcc i64 (i32, i32, i8*, i32, ...)* @llvm.experimental.patchpoint.i64(i32 1, i32 15, i8* %f, i32 1, i8* %obj)
58   ret i64 %ret
59 }
60
61 ; property access 2 - %obj is an anyreg call argument and should therefore be in a register
62 ; CHECK-LABEL:  .long   L{{.*}}-_property_access2
63 ; CHECK-NEXT:   .short  0
64 ; 2 locations
65 ; CHECK-NEXT:   .short  2
66 ; Loc 0: Register <-- this is the return register
67 ; CHECK-NEXT:   .byte 1
68 ; CHECK-NEXT:   .byte 8
69 ; CHECK-NEXT:   .short {{[0-9]+}}
70 ; CHECK-NEXT:   .long 0
71 ; Loc 1: Register
72 ; CHECK-NEXT:   .byte 1
73 ; CHECK-NEXT:   .byte 8
74 ; CHECK-NEXT:   .short {{[0-9]+}}
75 ; CHECK-NEXT:   .long 0
76 define i64 @property_access2() nounwind ssp uwtable {
77 entry:
78   %obj = alloca i64, align 8
79   %f = inttoptr i64 12297829382473034410 to i8*
80   %ret = call anyregcc i64 (i32, i32, i8*, i32, ...)* @llvm.experimental.patchpoint.i64(i32 2, i32 15, i8* %f, i32 1, i64* %obj)
81   ret i64 %ret
82 }
83
84 ; property access 3 - %obj is a frame index
85 ; CHECK-LABEL:  .long   L{{.*}}-_property_access3
86 ; CHECK-NEXT:   .short  0
87 ; 2 locations
88 ; CHECK-NEXT:   .short  2
89 ; Loc 0: Register <-- this is the return register
90 ; CHECK-NEXT:   .byte 1
91 ; CHECK-NEXT:   .byte 8
92 ; CHECK-NEXT:   .short {{[0-9]+}}
93 ; CHECK-NEXT:   .long 0
94 ; Loc 1: Direct RBP - ofs
95 ; CHECK-NEXT:   .byte 2
96 ; CHECK-NEXT:   .byte 8
97 ; CHECK-NEXT:   .short 6
98 ; CHECK-NEXT:   .long
99 define i64 @property_access3() nounwind ssp uwtable {
100 entry:
101   %obj = alloca i64, align 8
102   %f = inttoptr i64 12297829382473034410 to i8*
103   %ret = call anyregcc i64 (i32, i32, i8*, i32, ...)* @llvm.experimental.patchpoint.i64(i32 3, i32 15, i8* %f, i32 0, i64* %obj)
104   ret i64 %ret
105 }
106
107 ; anyreg_test1
108 ; CHECK-LABEL:  .long   L{{.*}}-_anyreg_test1
109 ; CHECK-NEXT:   .short  0
110 ; 14 locations
111 ; CHECK-NEXT:   .short  14
112 ; Loc 0: Register <-- this is the return register
113 ; CHECK-NEXT:   .byte 1
114 ; CHECK-NEXT:   .byte 8
115 ; CHECK-NEXT:   .short {{[0-9]+}}
116 ; CHECK-NEXT:   .long 0
117 ; Loc 1: Register
118 ; CHECK-NEXT:   .byte 1
119 ; CHECK-NEXT:   .byte 8
120 ; CHECK-NEXT:   .short {{[0-9]+}}
121 ; CHECK-NEXT:   .long 0
122 ; Loc 2: Register
123 ; CHECK-NEXT:   .byte 1
124 ; CHECK-NEXT:   .byte 8
125 ; CHECK-NEXT:   .short {{[0-9]+}}
126 ; CHECK-NEXT:   .long 0
127 ; Loc 3: Register
128 ; CHECK-NEXT:   .byte 1
129 ; CHECK-NEXT:   .byte 8
130 ; CHECK-NEXT:   .short {{[0-9]+}}
131 ; CHECK-NEXT:   .long 0
132 ; Loc 4: Register
133 ; CHECK-NEXT:   .byte 1
134 ; CHECK-NEXT:   .byte 8
135 ; CHECK-NEXT:   .short {{[0-9]+}}
136 ; CHECK-NEXT:   .long 0
137 ; Loc 5: Register
138 ; CHECK-NEXT:   .byte 1
139 ; CHECK-NEXT:   .byte 8
140 ; CHECK-NEXT:   .short {{[0-9]+}}
141 ; CHECK-NEXT:   .long 0
142 ; Loc 6: Register
143 ; CHECK-NEXT:   .byte 1
144 ; CHECK-NEXT:   .byte 8
145 ; CHECK-NEXT:   .short {{[0-9]+}}
146 ; CHECK-NEXT:   .long 0
147 ; Loc 7: Register
148 ; CHECK-NEXT:   .byte 1
149 ; CHECK-NEXT:   .byte 8
150 ; CHECK-NEXT:   .short {{[0-9]+}}
151 ; CHECK-NEXT:   .long 0
152 ; Loc 8: Register
153 ; CHECK-NEXT:   .byte 1
154 ; CHECK-NEXT:   .byte 8
155 ; CHECK-NEXT:   .short {{[0-9]+}}
156 ; CHECK-NEXT:   .long 0
157 ; Loc 9: Register
158 ; CHECK-NEXT:   .byte 1
159 ; CHECK-NEXT:   .byte 8
160 ; CHECK-NEXT:   .short {{[0-9]+}}
161 ; CHECK-NEXT:   .long 0
162 ; Loc 10: Register
163 ; CHECK-NEXT:   .byte 1
164 ; CHECK-NEXT:   .byte 8
165 ; CHECK-NEXT:   .short {{[0-9]+}}
166 ; CHECK-NEXT:   .long 0
167 ; Loc 11: Register
168 ; CHECK-NEXT:   .byte 1
169 ; CHECK-NEXT:   .byte 8
170 ; CHECK-NEXT:   .short {{[0-9]+}}
171 ; CHECK-NEXT:   .long 0
172 ; Loc 12: Register
173 ; CHECK-NEXT:   .byte 1
174 ; CHECK-NEXT:   .byte 8
175 ; CHECK-NEXT:   .short {{[0-9]+}}
176 ; CHECK-NEXT:   .long 0
177 ; Loc 13: Register
178 ; CHECK-NEXT:   .byte 1
179 ; CHECK-NEXT:   .byte 8
180 ; CHECK-NEXT:   .short {{[0-9]+}}
181 ; CHECK-NEXT:   .long 0
182 define i64 @anyreg_test1(i8* %a1, i8* %a2, i8* %a3, i8* %a4, i8* %a5, i8* %a6, i8* %a7, i8* %a8, i8* %a9, i8* %a10, i8* %a11, i8* %a12, i8* %a13) nounwind ssp uwtable {
183 entry:
184   %f = inttoptr i64 12297829382473034410 to i8*
185   %ret = call anyregcc i64 (i32, i32, i8*, i32, ...)* @llvm.experimental.patchpoint.i64(i32 4, i32 15, i8* %f, i32 13, i8* %a1, i8* %a2, i8* %a3, i8* %a4, i8* %a5, i8* %a6, i8* %a7, i8* %a8, i8* %a9, i8* %a10, i8* %a11, i8* %a12, i8* %a13)
186   ret i64 %ret
187 }
188
189 ; anyreg_test2
190 ; CHECK-LABEL:  .long   L{{.*}}-_anyreg_test2
191 ; CHECK-NEXT:   .short  0
192 ; 14 locations
193 ; CHECK-NEXT:   .short  14
194 ; Loc 0: Register <-- this is the return register
195 ; CHECK-NEXT:   .byte 1
196 ; CHECK-NEXT:   .byte 8
197 ; CHECK-NEXT:   .short {{[0-9]+}}
198 ; CHECK-NEXT:   .long 0
199 ; Loc 1: Register
200 ; CHECK-NEXT:   .byte 1
201 ; CHECK-NEXT:   .byte 8
202 ; CHECK-NEXT:   .short {{[0-9]+}}
203 ; CHECK-NEXT:   .long 0
204 ; Loc 2: Register
205 ; CHECK-NEXT:   .byte 1
206 ; CHECK-NEXT:   .byte 8
207 ; CHECK-NEXT:   .short {{[0-9]+}}
208 ; CHECK-NEXT:   .long 0
209 ; Loc 3: Register
210 ; CHECK-NEXT:   .byte 1
211 ; CHECK-NEXT:   .byte 8
212 ; CHECK-NEXT:   .short {{[0-9]+}}
213 ; CHECK-NEXT:   .long 0
214 ; Loc 4: Register
215 ; CHECK-NEXT:   .byte 1
216 ; CHECK-NEXT:   .byte 8
217 ; CHECK-NEXT:   .short {{[0-9]+}}
218 ; CHECK-NEXT:   .long 0
219 ; Loc 5: Register
220 ; CHECK-NEXT:   .byte 1
221 ; CHECK-NEXT:   .byte 8
222 ; CHECK-NEXT:   .short {{[0-9]+}}
223 ; CHECK-NEXT:   .long 0
224 ; Loc 6: Register
225 ; CHECK-NEXT:   .byte 1
226 ; CHECK-NEXT:   .byte 8
227 ; CHECK-NEXT:   .short {{[0-9]+}}
228 ; CHECK-NEXT:   .long 0
229 ; Loc 7: Register
230 ; CHECK-NEXT:   .byte 1
231 ; CHECK-NEXT:   .byte 8
232 ; CHECK-NEXT:   .short {{[0-9]+}}
233 ; CHECK-NEXT:   .long 0
234 ; Loc 8: Register
235 ; CHECK-NEXT:   .byte 1
236 ; CHECK-NEXT:   .byte 8
237 ; CHECK-NEXT:   .short {{[0-9]+}}
238 ; CHECK-NEXT:   .long 0
239 ; Loc 9: Register
240 ; CHECK-NEXT:   .byte 1
241 ; CHECK-NEXT:   .byte 8
242 ; CHECK-NEXT:   .short {{[0-9]+}}
243 ; CHECK-NEXT:   .long 0
244 ; Loc 10: Register
245 ; CHECK-NEXT:   .byte 1
246 ; CHECK-NEXT:   .byte 8
247 ; CHECK-NEXT:   .short {{[0-9]+}}
248 ; CHECK-NEXT:   .long 0
249 ; Loc 11: Register
250 ; CHECK-NEXT:   .byte 1
251 ; CHECK-NEXT:   .byte 8
252 ; CHECK-NEXT:   .short {{[0-9]+}}
253 ; CHECK-NEXT:   .long 0
254 ; Loc 12: Register
255 ; CHECK-NEXT:   .byte 1
256 ; CHECK-NEXT:   .byte 8
257 ; CHECK-NEXT:   .short {{[0-9]+}}
258 ; CHECK-NEXT:   .long 0
259 ; Loc 13: Register
260 ; CHECK-NEXT:   .byte 1
261 ; CHECK-NEXT:   .byte 8
262 ; CHECK-NEXT:   .short {{[0-9]+}}
263 ; CHECK-NEXT:   .long 0
264 define i64 @anyreg_test2(i8* %a1, i8* %a2, i8* %a3, i8* %a4, i8* %a5, i8* %a6, i8* %a7, i8* %a8, i8* %a9, i8* %a10, i8* %a11, i8* %a12, i8* %a13) nounwind ssp uwtable {
265 entry:
266   %f = inttoptr i64 12297829382473034410 to i8*
267   %ret = call anyregcc i64 (i32, i32, i8*, i32, ...)* @llvm.experimental.patchpoint.i64(i32 5, i32 15, i8* %f, i32 8, i8* %a1, i8* %a2, i8* %a3, i8* %a4, i8* %a5, i8* %a6, i8* %a7, i8* %a8, i8* %a9, i8* %a10, i8* %a11, i8* %a12, i8* %a13)
268   ret i64 %ret
269 }
270
271 ; Test spilling the return value of an anyregcc call.
272 ;
273 ; <rdar://problem/15432754> [JS] Assertion: "Folded a def to a non-store!"
274 ;
275 ; CHECK-LABEL: .long L{{.*}}-_patchpoint_spilldef
276 ; CHECK-NEXT: .short 0
277 ; CHECK-NEXT: .short 3
278 ; Loc 0: Register (some register that will be spilled to the stack)
279 ; CHECK-NEXT: .byte  1
280 ; CHECK-NEXT: .byte  8
281 ; CHECK-NEXT: .short {{[0-9]+}}
282 ; CHECK-NEXT: .long  0
283 ; Loc 1: Register RDI
284 ; CHECK-NEXT: .byte  1
285 ; CHECK-NEXT: .byte  8
286 ; CHECK-NEXT: .short 5
287 ; CHECK-NEXT: .long  0
288 ; Loc 1: Register RSI
289 ; CHECK-NEXT: .byte  1
290 ; CHECK-NEXT: .byte  8
291 ; CHECK-NEXT: .short 4
292 ; CHECK-NEXT: .long  0
293 define i64 @patchpoint_spilldef(i64 %p1, i64 %p2, i64 %p3, i64 %p4) {
294 entry:
295   %result = tail call anyregcc i64 (i32, i32, i8*, i32, ...)* @llvm.experimental.patchpoint.i64(i32 12, i32 15, i8* inttoptr (i64 0 to i8*), i32 2, i64 %p1, i64 %p2)
296   tail call void asm sideeffect "nop", "~{ax},~{bx},~{cx},~{dx},~{bp},~{si},~{di},~{r8},~{r9},~{r10},~{r11},~{r12},~{r13},~{r14},~{r15}"() nounwind
297   ret i64 %result
298 }
299
300 ; Test spilling the arguments of an anyregcc call.
301 ;
302 ; <rdar://problem/15487687> [JS] AnyRegCC argument ends up being spilled
303 ;
304 ; CHECK-LABEL: .long L{{.*}}-_patchpoint_spillargs
305 ; CHECK-NEXT: .short 0
306 ; CHECK-NEXT: .short 5
307 ; Loc 0: Return a register
308 ; CHECK-NEXT: .byte  1
309 ; CHECK-NEXT: .byte  8
310 ; CHECK-NEXT: .short {{[0-9]+}}
311 ; CHECK-NEXT: .long  0
312 ; Loc 1: Arg0 in a Register
313 ; CHECK-NEXT: .byte  1
314 ; CHECK-NEXT: .byte  8
315 ; CHECK-NEXT: .short {{[0-9]+}}
316 ; CHECK-NEXT: .long  0
317 ; Loc 2: Arg1 in a Register
318 ; CHECK-NEXT: .byte  1
319 ; CHECK-NEXT: .byte  8
320 ; CHECK-NEXT: .short {{[0-9]+}}
321 ; CHECK-NEXT: .long  0
322 ; Loc 3: Arg2 spilled to RBP +
323 ; CHECK-NEXT: .byte  3
324 ; CHECK-NEXT: .byte  8
325 ; CHECK-NEXT: .short 6
326 ; CHECK-NEXT: .long
327 ; Loc 4: Arg3 spilled to RBP +
328 ; CHECK-NEXT: .byte  3
329 ; CHECK-NEXT: .byte  8
330 ; CHECK-NEXT: .short 6
331 ; CHECK-NEXT: .long
332 define i64 @patchpoint_spillargs(i64 %p1, i64 %p2, i64 %p3, i64 %p4) {
333 entry:
334   tail call void asm sideeffect "nop", "~{ax},~{bx},~{cx},~{dx},~{bp},~{si},~{di},~{r8},~{r9},~{r10},~{r11},~{r12},~{r13},~{r14},~{r15}"() nounwind
335   %result = tail call anyregcc i64 (i32, i32, i8*, i32, ...)* @llvm.experimental.patchpoint.i64(i32 13, i32 15, i8* inttoptr (i64 0 to i8*), i32 2, i64 %p1, i64 %p2, i64 %p3, i64 %p4)
336   ret i64 %result
337 }
338
339 declare void @llvm.experimental.patchpoint.void(i32, i32, i8*, i32, ...)
340 declare i64 @llvm.experimental.patchpoint.i64(i32, i32, i8*, i32, ...)