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