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