Merging r261039:
[oota-llvm.git] / test / CodeGen / X86 / statepoint-stackmap-format.ll
1 ; RUN: llc < %s -mtriple="x86_64-pc-linux-gnu" | FileCheck %s
2 ; RUN: llc < %s -mtriple="x86_64-pc-unknown-elf" | FileCheck %s
3
4 ; This test is a sanity check to ensure statepoints are generating StackMap
5 ; sections correctly.  This is not intended to be a rigorous test of the 
6 ; StackMap format (see the stackmap tests for that).
7
8 target datalayout = "e-i64:64-f80:128-n8:16:32:64-S128"
9
10 declare zeroext i1 @return_i1()
11
12 define i1 @test(i32 addrspace(1)* %ptr_base, i32 %arg)
13   gc "statepoint-example" {
14 ; CHECK-LABEL: test:
15 ; Do we see two spills for the local values and the store to the
16 ; alloca?
17 ; CHECK: subq   $40, %rsp
18 ; CHECK: movq   $0,   24(%rsp)
19 ; CHECK: movq   %rdi, 16(%rsp)
20 ; CHECK: movq   %rax, 8(%rsp)
21 ; CHECK: callq return_i1
22 ; CHECK: addq   $40, %rsp
23 ; CHECK: retq
24 entry:
25   %metadata1 = alloca i32 addrspace(1)*, i32 2, align 8
26   store i32 addrspace(1)* null, i32 addrspace(1)** %metadata1
27   %ptr_derived = getelementptr i32, i32 addrspace(1)* %ptr_base, i32 %arg
28   %safepoint_token = tail call token (i64, i32, i1 ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_i1f(i64 0, i32 0, i1 ()* @return_i1, i32 0, i32 0, i32 0, i32 2, i32 addrspace(1)* %ptr_base, i32 addrspace(1)* null, i32 addrspace(1)* %ptr_base, i32 addrspace(1)* %ptr_derived, i32 addrspace(1)* null)
29   %call1 = call zeroext i1 @llvm.experimental.gc.result.i1(token %safepoint_token)
30   %a = call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token %safepoint_token, i32 9, i32 9)
31   %b = call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token %safepoint_token, i32 9, i32 10)
32   %c = call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token %safepoint_token, i32 11, i32 11)
33
34   ret i1 %call1
35 }
36
37 ; This is similar to the previous test except that we have derived pointer as
38 ; argument to the function. Despite that this can not happen after the
39 ; RewriteSafepointForGC pass, lowering should be able to handle it anyway.
40 define i1 @test_derived_arg(i32 addrspace(1)* %ptr_base,
41                             i32 addrspace(1)* %ptr_derived)
42   gc "statepoint-example" {
43 ; CHECK-LABEL: test_derived_arg
44 ; Do we see two spills for the local values and the store to the
45 ; alloca?
46 ; CHECK: subq   $40, %rsp
47 ; CHECK: movq   $0,   24(%rsp)
48 ; CHECK: movq   %rdi, 16(%rsp)
49 ; CHECK: movq   %rsi, 8(%rsp)
50 ; CHECK: callq return_i1
51 ; CHECK: addq   $40, %rsp
52 ; CHECK: retq
53 entry:
54   %metadata1 = alloca i32 addrspace(1)*, i32 2, align 8
55   store i32 addrspace(1)* null, i32 addrspace(1)** %metadata1
56   %safepoint_token = tail call token (i64, i32, i1 ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_i1f(i64 0, i32 0, i1 ()* @return_i1, i32 0, i32 0, i32 0, i32 2, i32 addrspace(1)* %ptr_base, i32 addrspace(1)* null, i32 addrspace(1)* %ptr_base, i32 addrspace(1)* %ptr_derived, i32 addrspace(1)* null)
57   %call1 = call zeroext i1 @llvm.experimental.gc.result.i1(token %safepoint_token)
58   %a = call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token %safepoint_token, i32 9, i32 9)
59   %b = call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token %safepoint_token, i32 9, i32 10)
60   %c = call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token %safepoint_token, i32 11, i32 11)
61
62   ret i1 %call1
63 }
64
65 ; Simple test case to check that we emit the ID field correctly
66 define i1 @test_id() gc "statepoint-example" {
67 ; CHECK-LABEL: test_id
68 entry:
69   %safepoint_token = tail call token (i64, i32, i1 ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_i1f(i64 237, i32 0, i1 ()* @return_i1, i32 0, i32 0, i32 0, i32 0)
70   %call1 = call zeroext i1 @llvm.experimental.gc.result.i1(token %safepoint_token)
71   ret i1 %call1
72 }
73
74
75 declare token @llvm.experimental.gc.statepoint.p0f_i1f(i64, i32, i1 ()*, i32, i32, ...)
76 declare i1 @llvm.experimental.gc.result.i1(token)
77 declare i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token, i32, i32) #3
78
79 ; CHECK-LABEL: .section .llvm_stackmaps
80 ; CHECK-NEXT:  __LLVM_StackMaps:
81 ; Header
82 ; CHECK-NEXT:   .byte 1
83 ; CHECK-NEXT:   .byte 0
84 ; CHECK-NEXT:   .short 0
85 ; Num Functions
86 ; CHECK-NEXT:   .long 3
87 ; Num LargeConstants
88 ; CHECK-NEXT:   .long 0
89 ; Num Callsites
90 ; CHECK-NEXT:   .long 3
91
92 ; Functions and stack size
93 ; CHECK-NEXT:   .quad test
94 ; CHECK-NEXT:   .quad 40
95 ; CHECK-NEXT:   .quad test_derived_arg
96 ; CHECK-NEXT:   .quad 40
97 ; CHECK-NEXT:   .quad test_id
98 ; CHECK-NEXT:   .quad 8
99
100 ;
101 ; test
102 ;
103
104 ; Statepoint ID
105 ; CHECK-NEXT: .quad     0
106
107 ; Callsites
108 ; Constant arguments
109 ; CHECK-NEXT: .long     .Ltmp1-test
110 ; CHECK: .short 0
111 ; CHECK: .short 11
112 ; SmallConstant (0)
113 ; CHECK: .byte  4
114 ; CHECK: .byte  8
115 ; CHECK: .short 0
116 ; CHECK: .long  0
117 ; SmallConstant (0)
118 ; CHECK: .byte  4
119 ; CHECK: .byte  8
120 ; CHECK: .short 0
121 ; CHECK: .long  0
122 ; SmallConstant (2)
123 ; CHECK: .byte  4
124 ; CHECK: .byte  8
125 ; CHECK: .short 0
126 ; CHECK: .long  2
127 ; Indirect Spill Slot [RSP+0]
128 ; CHECK: .byte  3
129 ; CHECK: .byte  8
130 ; CHECK: .short 7
131 ; CHECK: .long  16
132 ; SmallConstant  (0)
133 ; CHECK: .byte  4
134 ; CHECK: .byte  8
135 ; CHECK: .short 0
136 ; CHECK: .long  0
137 ; SmallConstant  (0)
138 ; CHECK: .byte  4
139 ; CHECK: .byte  8
140 ; CHECK: .short 0
141 ; CHECK: .long  0
142 ; SmallConstant  (0)
143 ; CHECK: .byte  4
144 ; CHECK: .byte  8
145 ; CHECK: .short 0
146 ; CHECK: .long  0
147 ; Indirect Spill Slot [RSP+16]
148 ; CHECK: .byte  3
149 ; CHECK: .byte  8
150 ; CHECK: .short 7
151 ; CHECK: .long  16
152 ; Indirect Spill Slot [RSP+8]
153 ; CHECK: .byte  3
154 ; CHECK: .byte  8
155 ; CHECK: .short 7
156 ; CHECK: .long  8
157 ; Indirect Spill Slot [RSP+16]
158 ; CHECK: .byte  3
159 ; CHECK: .byte  8
160 ; CHECK: .short 7
161 ; CHECK: .long  16
162 ; Indirect Spill Slot [RSP+16]
163 ; CHECK: .byte  3
164 ; CHECK: .byte  8
165 ; CHECK: .short 7
166 ; CHECK: .long  16
167
168 ; No Padding or LiveOuts
169 ; CHECK: .short 0
170 ; CHECK: .short 0
171 ; CHECK: .align 8
172
173 ;
174 ; test_derived_arg
175
176 ; Statepoint ID
177 ; CHECK-NEXT: .quad     0
178
179 ; Callsites
180 ; Constant arguments
181 ; CHECK-NEXT: .long     .Ltmp3-test_derived_arg
182 ; CHECK: .short 0
183 ; CHECK: .short 11
184 ; SmallConstant (0)
185 ; CHECK: .byte  4
186 ; CHECK: .byte  8
187 ; CHECK: .short 0
188 ; CHECK: .long  0
189 ; SmallConstant (2)
190 ; CHECK: .byte  4
191 ; CHECK: .byte  8
192 ; CHECK: .short 0
193 ; CHECK: .long  2
194 ; Indirect Spill Slot [RSP+0]
195 ; CHECK: .byte  3
196 ; CHECK: .byte  8
197 ; CHECK: .short 7
198 ; CHECK: .long  16
199 ; SmallConstant  (0)
200 ; CHECK: .byte  4
201 ; CHECK: .byte  8
202 ; CHECK: .short 0
203 ; CHECK: .long  0
204 ; SmallConstant  (0)
205 ; CHECK: .byte  4
206 ; CHECK: .byte  8
207 ; CHECK: .short 0
208 ; CHECK: .long  0
209 ; SmallConstant  (0)
210 ; CHECK: .byte  4
211 ; CHECK: .byte  8
212 ; CHECK: .short 0
213 ; CHECK: .long  0
214 ; Indirect Spill Slot [RSP+16]
215 ; CHECK: .byte  3
216 ; CHECK: .byte  8
217 ; CHECK: .short 7
218 ; CHECK: .long  16
219 ; Indirect Spill Slot [RSP+8]
220 ; CHECK: .byte  3
221 ; CHECK: .byte  8
222 ; CHECK: .short 7
223 ; CHECK: .long  8
224 ; Indirect Spill Slot [RSP+16]
225 ; CHECK: .byte  3
226 ; CHECK: .byte  8
227 ; CHECK: .short 7
228 ; CHECK: .long  16
229 ; Indirect Spill Slot [RSP+16]
230 ; CHECK: .byte  3
231 ; CHECK: .byte  8
232 ; CHECK: .short 7
233 ; CHECK: .long  16
234
235 ; No Padding or LiveOuts
236 ; CHECK: .short 0
237 ; CHECK: .short 0
238 ; CHECK: .align 8
239
240 ; Records for the test_id function:
241
242 ; The Statepoint ID:
243 ; CHECK-NEXT: .quad     237
244
245 ; Instruction Offset
246 ; CHECK-NEXT: .long     .Ltmp5-test_id
247
248 ; Reserved:
249 ; CHECK: .short 0
250
251 ; NumLocations:
252 ; CHECK: .short 3
253
254 ; StkMapRecord[0]:
255 ; SmallConstant(0):
256 ; CHECK: .byte  4
257 ; CHECK: .byte  8
258 ; CHECK: .short 0
259 ; CHECK: .long  0
260
261 ; StkMapRecord[1]:
262 ; SmallConstant(0):
263 ; CHECK: .byte  4
264 ; CHECK: .byte  8
265 ; CHECK: .short 0
266 ; CHECK: .long  0
267
268 ; StkMapRecord[2]:
269 ; SmallConstant(0):
270 ; CHECK: .byte  4
271 ; CHECK: .byte  8
272 ; CHECK: .short 0
273 ; CHECK: .long  0
274
275 ; No padding or LiveOuts
276 ; CHECK: .short 0
277 ; CHECK: .short 0
278 ; CHECK: .align 8
279