[Reland][Runtimes] Merge 'compile_commands.json' files from runtimes build (#116303)
[llvm-project.git] / llvm / test / CodeGen / X86 / statepoint-allocas.ll
blobe743b3db7067da4d2496deb2a0a11b63828e39a3
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.
7 target datalayout = "e-i64:64-f80:128-n8:16:32:64-S128"
8 target triple = "x86_64-pc-linux-gnu"
10 declare zeroext i1 @return_i1()
12 ; Can we handle an explicit relocation slot (in the form of an alloca) given
13 ; to the statepoint?
14 define ptr addrspace(1) @test(ptr 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
26 entry:
27   %alloca = alloca ptr addrspace(1), align 8
28   store ptr addrspace(1) %ptr, ptr %alloca
29   call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 0, i32 0, ptr elementtype(i1 ()) @return_i1, i32 0, i32 0, i32 0, i32 0) ["gc-live" (ptr %alloca)]
30   %rel = load ptr addrspace(1), ptr %alloca
31   ret ptr addrspace(1) %rel
34 ; Can we handle an alloca as a deopt value?
35 define ptr addrspace(1) @test2(ptr 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
47 entry:
48   %alloca = alloca ptr addrspace(1), align 8
49   store ptr addrspace(1) %ptr, ptr %alloca
50   call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 0, i32 0, ptr elementtype(i1 ()) @return_i1, i32 0, i32 0, i32 0, i32 0) ["deopt" (ptr %alloca)]
51   ret ptr addrspace(1) null
54 declare token @llvm.experimental.gc.statepoint.p0(i64, i32, ptr, i32, i32, ...)
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
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
78 ; Large Constants
79 ; Statepoint ID only
80 ; CHECK: .quad  0
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
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
153 ; No Padding or LiveOuts
154 ; CHECK: .short 0
155 ; CHECK: .short 0
156 ; CHECK: .p2align       3