add test to show suboptimal load merging behavior
[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 (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)
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 9, i32 9)
30   %b = call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(i32 %safepoint_token, i32 9, i32 10)
31   %c = call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(i32 %safepoint_token, i32 11, i32 11)
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 (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)
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 9, i32 9)
58   %b = call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(i32 %safepoint_token, i32 9, i32 10)
59   %c = call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(i32 %safepoint_token, i32 11, i32 11)
60
61   ret i1 %call1
62 }
63
64 ; Simple test case to check that we emit the ID field correctly
65 define i1 @test_id() gc "statepoint-example" {
66 ; CHECK-LABEL: test_id
67 entry:
68   %safepoint_token = tail call i32 (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)
69   %call1 = call zeroext i1 @llvm.experimental.gc.result.i1(i32 %safepoint_token)
70   ret i1 %call1
71 }
72
73
74 declare i32 @llvm.experimental.gc.statepoint.p0f_i1f(i64, i32, i1 ()*, i32, i32, ...)
75 declare i1 @llvm.experimental.gc.result.i1(i32)
76 declare i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(i32, i32, i32) #3
77
78 ; CHECK-LABEL: .section .llvm_stackmaps
79 ; CHECK-NEXT:  __LLVM_StackMaps:
80 ; Header
81 ; CHECK-NEXT:   .byte 1
82 ; CHECK-NEXT:   .byte 0
83 ; CHECK-NEXT:   .short 0
84 ; Num Functions
85 ; CHECK-NEXT:   .long 3
86 ; Num LargeConstants
87 ; CHECK-NEXT:   .long 0
88 ; Num Callsites
89 ; CHECK-NEXT:   .long 3
90
91 ; Functions and stack size
92 ; CHECK-NEXT:   .quad test
93 ; CHECK-NEXT:   .quad 40
94 ; CHECK-NEXT:   .quad test_derived_arg
95 ; CHECK-NEXT:   .quad 40
96
97 ;
98 ; test
99 ;
100
101 ; Large Constants
102 ; Statepoint ID only
103 ; CHECK: .quad  0
104
105 ; Callsites
106 ; Constant arguments
107 ; CHECK: .long  .Ltmp1-test
108 ; CHECK: .short 0
109 ; CHECK: .short 11
110 ; SmallConstant (0)
111 ; CHECK: .byte  4
112 ; CHECK: .byte  8
113 ; CHECK: .short 0
114 ; CHECK: .long  0
115 ; SmallConstant (0)
116 ; CHECK: .byte  4
117 ; CHECK: .byte  8
118 ; CHECK: .short 0
119 ; CHECK: .long  0
120 ; SmallConstant (2)
121 ; CHECK: .byte  4
122 ; CHECK: .byte  8
123 ; CHECK: .short 0
124 ; CHECK: .long  2
125 ; Direct Spill Slot [RSP+0]
126 ; CHECK: .byte  2
127 ; CHECK: .byte  8
128 ; CHECK: .short 7
129 ; CHECK: .long  16
130 ; SmallConstant  (0)
131 ; CHECK: .byte  4
132 ; CHECK: .byte  8
133 ; CHECK: .short 0
134 ; CHECK: .long  0
135 ; SmallConstant  (0)
136 ; CHECK: .byte  4
137 ; CHECK: .byte  8
138 ; CHECK: .short 0
139 ; CHECK: .long  0
140 ; SmallConstant  (0)
141 ; CHECK: .byte  4
142 ; CHECK: .byte  8
143 ; CHECK: .short 0
144 ; CHECK: .long  0
145 ; Direct Spill Slot [RSP+16]
146 ; CHECK: .byte  2
147 ; CHECK: .byte  8
148 ; CHECK: .short 7
149 ; CHECK: .long  16
150 ; Direct Spill Slot [RSP+8]
151 ; CHECK: .byte  2
152 ; CHECK: .byte  8
153 ; CHECK: .short 7
154 ; CHECK: .long  8
155 ; Direct Spill Slot [RSP+16]
156 ; CHECK: .byte  2
157 ; CHECK: .byte  8
158 ; CHECK: .short 7
159 ; CHECK: .long  16
160 ; Direct Spill Slot [RSP+16]
161 ; CHECK: .byte  2
162 ; CHECK: .byte  8
163 ; CHECK: .short 7
164 ; CHECK: .long  16
165
166 ; No Padding or LiveOuts
167 ; CHECK: .short 0
168 ; CHECK: .short 0
169 ; CHECK: .align 8
170
171 ;
172 ; test_derived_arg
173 ;
174
175 ; Large Constants
176 ; Statepoint ID only
177 ; CHECK: .quad  0
178
179 ; Callsites
180 ; Constant arguments
181 ; CHECK: .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 ; Direct Spill Slot [RSP+0]
195 ; CHECK: .byte  2
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 ; Direct Spill Slot [RSP+16]
215 ; CHECK: .byte  2
216 ; CHECK: .byte  8
217 ; CHECK: .short 7
218 ; CHECK: .long  16
219 ; Direct Spill Slot [RSP+8]
220 ; CHECK: .byte  2
221 ; CHECK: .byte  8
222 ; CHECK: .short 7
223 ; CHECK: .long  8
224 ; Direct Spill Slot [RSP+16]
225 ; CHECK: .byte  2
226 ; CHECK: .byte  8
227 ; CHECK: .short 7
228 ; CHECK: .long  16
229 ; Direct Spill Slot [RSP+16]
230 ; CHECK: .byte  2
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 ; No large constants
242
243 ; The Statepoint ID:
244 ; CHECK: .quad  237
245
246 ; Instruction Offset
247 ; CHECK: .long  .Ltmp5-test_id
248
249 ; Reserved:
250 ; CHECK: .short 0
251
252 ; NumLocations:
253 ; CHECK: .short 3
254
255 ; StkMapRecord[0]:
256 ; SmallConstant(0):
257 ; CHECK: .byte  4
258 ; CHECK: .byte  8
259 ; CHECK: .short 0
260 ; CHECK: .long  0
261
262 ; StkMapRecord[1]:
263 ; SmallConstant(0):
264 ; CHECK: .byte  4
265 ; CHECK: .byte  8
266 ; CHECK: .short 0
267 ; CHECK: .long  0
268
269 ; StkMapRecord[2]:
270 ; SmallConstant(0):
271 ; CHECK: .byte  4
272 ; CHECK: .byte  8
273 ; CHECK: .short 0
274 ; CHECK: .long  0
275
276 ; No padding or LiveOuts
277 ; CHECK: .short 0
278 ; CHECK: .short 0
279 ; CHECK: .align 8
280