; RUN: llc < %s | FileCheck %s ; This test is a sanity check to ensure statepoints are generating StackMap ; sections correctly. This is not intended to be a rigorous test of the ; StackMap format (see the stackmap tests for that). target datalayout = "e-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-pc-linux-gnu" declare zeroext i1 @return_i1() define i1 @test(i32 addrspace(1)* %ptr) gc "statepoint-example" { ; CHECK-LABEL: test ; Do we see one spill for the local value and the store to the ; alloca? ; CHECK: subq $24, %rsp ; CHECK: movq $0, 8(%rsp) ; CHECK: movq %rdi, (%rsp) ; CHECK: callq return_i1 ; CHECK: addq $24, %rsp ; CHECK: retq entry: %metadata1 = alloca i32 addrspace(1)*, i32 2, align 8 store i32 addrspace(1)* null, i32 addrspace(1)** %metadata1 %safepoint_token = tail call i32 (i1 ()*, i32, i32, ...)* @llvm.experimental.gc.statepoint.p0f_i1f(i1 ()* @return_i1, i32 0, i32 0, i32 2, i32 addrspace(1)* %ptr, i32 addrspace(1)* null, i32 addrspace(1)* %ptr, i32 addrspace(1)* null) %call1 = call zeroext i1 @llvm.experimental.gc.result.i1(i32 %safepoint_token) %a = call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(i32 %safepoint_token, i32 6, i32 6) %b = call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(i32 %safepoint_token, i32 7, i32 7) ; ret i1 %call1 } declare i32 @llvm.experimental.gc.statepoint.p0f_i1f(i1 ()*, i32, i32, ...) declare i1 @llvm.experimental.gc.result.i1(i32) declare i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(i32, i32, i32) #3 ; CHECK-LABEL: .section .llvm_stackmaps ; CHECK-NEXT: __LLVM_StackMaps: ; Header ; CHECK-NEXT: .byte 1 ; CHECK-NEXT: .byte 0 ; CHECK-NEXT: .short 0 ; Num Functions ; CHECK-NEXT: .long 1 ; Num LargeConstants ; CHECK-NEXT: .long 0 ; Num Callsites ; CHECK-NEXT: .long 1 ; Functions and stack size ; CHECK-NEXT: .quad test ; CHECK-NEXT: .quad 24 ; Large Constants ; Statepoint ID only ; CHECK: .quad 2882400000 ; Callsites ; Constant arguments ; CHECK: .long .Ltmp1-test ; CHECK: .short 0 ; CHECK: .short 8 ; SmallConstant (0) ; CHECK: .byte 4 ; CHECK: .byte 8 ; CHECK: .short 0 ; CHECK: .long 0 ; SmallConstant (2) ; CHECK: .byte 4 ; CHECK: .byte 8 ; CHECK: .short 0 ; CHECK: .long 2 ; Direct Spill Slot [RSP+0] ; CHECK: .byte 2 ; CHECK: .byte 8 ; CHECK: .short 7 ; CHECK: .long 0 ; SmallConstant (0) ; CHECK: .byte 4 ; CHECK: .byte 8 ; CHECK: .short 0 ; CHECK: .long 0 ; SmallConstant (0) ; CHECK: .byte 4 ; CHECK: .byte 8 ; CHECK: .short 0 ; CHECK: .long 0 ; SmallConstant (0) ; CHECK: .byte 4 ; CHECK: .byte 8 ; CHECK: .short 0 ; CHECK: .long 0 ; Direct Spill Slot [RSP+0] ; CHECK: .byte 2 ; CHECK: .byte 8 ; CHECK: .short 7 ; CHECK: .long 0 ; Direct Spill Slot [RSP+0] ; CHECK: .byte 2 ; CHECK: .byte 8 ; CHECK: .short 7 ; CHECK: .long 0 ; No Padding or LiveOuts ; CHECK: .short 0 ; CHECK: .short 0 ; CHECK: .align 8