1; RUN: llc < %s | FileCheck %s
2; Check that we can lower a use of an alloca both as a deopt value (where the
3; exact meaning is up to the consumer of the stackmap) and as an explicit spill
4; slot used for GC.
5
6target datalayout = "e-i64:64-f80:128-n8:16:32:64-S128"
7target triple = "x86_64-pc-linux-gnu"
8
9declare zeroext i1 @return_i1()
10
11; Can we handle an explicit relocation slot (in the form of an alloca) given
12; to the statepoint?
13define i32 addrspace(1)* @test(i32 addrspace(1)* %ptr) gc "statepoint-example" {
14; CHECK-LABEL: test
15; CHECK: pushq  %rax
16; CHECK: movq   %rdi, (%rsp)
17; CHECK: callq return_i1
18; CHECK: movq   (%rsp), %rax
19; CHECK: popq   %rcx
20; CHECK: retq
21entry:
22  %alloca = alloca i32 addrspace(1)*, align 8
23  store i32 addrspace(1)* %ptr, i32 addrspace(1)** %alloca
24  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 0, i32 addrspace(1)** %alloca)
25  %rel = load i32 addrspace(1)*, i32 addrspace(1)** %alloca
26  ret i32 addrspace(1)* %rel
27}
28
29; Can we handle an alloca as a deopt value?
30define i32 addrspace(1)* @test2(i32 addrspace(1)* %ptr) gc "statepoint-example" {
31; CHECK-LABEL: test2
32; CHECK: pushq  %rax
33; CHECK: movq   %rdi, (%rsp)
34; CHECK: callq return_i1
35; CHECK: xorl   %eax, %eax
36; CHECK: popq   %rcx
37; CHECK: retq
38entry:
39  %alloca = alloca i32 addrspace(1)*, align 8
40  store i32 addrspace(1)* %ptr, i32 addrspace(1)** %alloca
41  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 1, i32 addrspace(1)** %alloca)
42  ret i32 addrspace(1)* null
43}
44
45declare token @llvm.experimental.gc.statepoint.p0f_i1f(i64, i32, i1 ()*, i32, i32, ...)
46
47
48; CHECK-LABEL: .section .llvm_stackmaps
49; CHECK-NEXT:  __LLVM_StackMaps:
50; Header
51; CHECK-NEXT:   .byte 2
52; CHECK-NEXT:   .byte 0
53; CHECK-NEXT:   .short 0
54; Num Functions
55; CHECK-NEXT:   .long 2
56; Num LargeConstants
57; CHECK-NEXT:   .long 0
58; Num Callsites
59; CHECK-NEXT:   .long 2
60
61; Functions and stack size
62; CHECK-NEXT:   .quad test
63; CHECK-NEXT:   .quad 8
64; CHECK-NEXT:   .quad 1
65; CHECK-NEXT:   .quad test2
66; CHECK-NEXT:   .quad 8
67; CHECK-NEXT:   .quad 1
68
69; Large Constants
70; Statepoint ID only
71; CHECK: .quad	0
72
73; Callsites
74; The GC one
75; CHECK: .long	.Ltmp0-test
76; CHECK: .short	0
77; CHECK: .short	4
78; SmallConstant (0)
79; CHECK: .byte	4
80; CHECK: .byte	8
81; CHECK: .short	0
82; CHECK: .long	0
83; SmallConstant (0)
84; CHECK: .byte	4
85; CHECK: .byte	8
86; CHECK: .short	0
87; CHECK: .long	0
88; SmallConstant (0)
89; CHECK: .byte	4
90; CHECK: .byte	8
91; CHECK: .short	0
92; CHECK: .long	0
93; Direct Spill Slot [RSP+0]
94; CHECK: .byte	2
95; CHECK: .byte	8
96; CHECK: .short	7
97; CHECK: .long	0
98; No Padding or LiveOuts
99; CHECK: .short	0
100; CHECK: .short	0
101; CHECK: .p2align	3
102
103; The Deopt one
104; CHECK: .long	.Ltmp1-test2
105; CHECK: .short	0
106; CHECK: .short	4
107; SmallConstant (0)
108; CHECK: .byte	4
109; CHECK: .byte	8
110; CHECK: .short	0
111; CHECK: .long	0
112; SmallConstant (0)
113; CHECK: .byte	4
114; CHECK: .byte	8
115; CHECK: .short	0
116; CHECK: .long	0
117; SmallConstant (1)
118; CHECK: .byte	4
119; CHECK: .byte	8
120; CHECK: .short	0
121; CHECK: .long	1
122; Direct Spill Slot [RSP+0]
123; CHECK: .byte	2
124; CHECK: .byte	8
125; CHECK: .short	7
126; CHECK: .long	0
127
128; No Padding or LiveOuts
129; CHECK: .short	0
130; CHECK: .short	0
131; CHECK: .p2align	3
132