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