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) gc "statepoint-example" { 12 ; CHECK-LABEL: test 13 ; Do we see one spill for the local value and the store to the 14 ; alloca? 15 ; CHECK: subq $24, %rsp 16 ; CHECK: movq $0, 8(%rsp) 17 ; CHECK: movq %rdi, (%rsp) 18 ; CHECK: callq return_i1 19 ; CHECK: addq $24, %rsp 20 ; CHECK: retq 21 entry: 22 %metadata1 = alloca i32 addrspace(1)*, i32 2, align 8 23 store i32 addrspace(1)* null, i32 addrspace(1)** %metadata1 24 %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) 25 %call1 = call zeroext i1 @llvm.experimental.gc.result.i1(i32 %safepoint_token) 26 %a = call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(i32 %safepoint_token, i32 6, i32 6) 27 %b = call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(i32 %safepoint_token, i32 7, i32 7) 28 ; 29 ret i1 %call1 30 } 31 32 declare i32 @llvm.experimental.gc.statepoint.p0f_i1f(i1 ()*, i32, i32, ...) 33 declare i1 @llvm.experimental.gc.result.i1(i32) 34 declare i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(i32, i32, i32) #3 35 36 37 ; CHECK-LABEL: .section .llvm_stackmaps 38 ; CHECK-NEXT: __LLVM_StackMaps: 39 ; Header 40 ; CHECK-NEXT: .byte 1 41 ; CHECK-NEXT: .byte 0 42 ; CHECK-NEXT: .short 0 43 ; Num Functions 44 ; CHECK-NEXT: .long 1 45 ; Num LargeConstants 46 ; CHECK-NEXT: .long 0 47 ; Num Callsites 48 ; CHECK-NEXT: .long 1 49 50 ; Functions and stack size 51 ; CHECK-NEXT: .quad test 52 ; CHECK-NEXT: .quad 24 53 54 ; Large Constants 55 ; Statepoint ID only 56 ; CHECK: .quad 2882400000 57 58 ; Callsites 59 ; Constant arguments 60 ; CHECK: .long .Ltmp1-test 61 ; CHECK: .short 0 62 ; CHECK: .short 8 63 ; SmallConstant (0) 64 ; CHECK: .byte 4 65 ; CHECK: .byte 8 66 ; CHECK: .short 0 67 ; CHECK: .long 0 68 ; SmallConstant (2) 69 ; CHECK: .byte 4 70 ; CHECK: .byte 8 71 ; CHECK: .short 0 72 ; CHECK: .long 2 73 ; Direct Spill Slot [RSP+0] 74 ; CHECK: .byte 2 75 ; CHECK: .byte 8 76 ; CHECK: .short 7 77 ; CHECK: .long 0 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 ; Direct Spill Slot [RSP+0] 99 ; CHECK: .byte 2 100 ; CHECK: .byte 8 101 ; CHECK: .short 7 102 ; CHECK: .long 0 103 104 ; No Padding or LiveOuts 105 ; CHECK: .short 0 106 ; CHECK: .short 0 107 ; CHECK: .align 8 108 109 110