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