1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; Check that we can lower a use of an alloca both as a deopt value (where the 3*9880d681SAndroid Build Coastguard Worker; exact meaning is up to the consumer of the stackmap) and as an explicit spill 4*9880d681SAndroid Build Coastguard Worker; slot used for GC. 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-i64:64-f80:128-n8:16:32:64-S128" 7*9880d681SAndroid Build Coastguard Workertarget triple = "x86_64-pc-linux-gnu" 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Workerdeclare zeroext i1 @return_i1() 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard Worker; Can we handle an explicit relocation slot (in the form of an alloca) given 12*9880d681SAndroid Build Coastguard Worker; to the statepoint? 13*9880d681SAndroid Build Coastguard Workerdefine i32 addrspace(1)* @test(i32 addrspace(1)* %ptr) gc "statepoint-example" { 14*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test 15*9880d681SAndroid Build Coastguard Worker; CHECK: pushq %rax 16*9880d681SAndroid Build Coastguard Worker; CHECK: movq %rdi, (%rsp) 17*9880d681SAndroid Build Coastguard Worker; CHECK: callq return_i1 18*9880d681SAndroid Build Coastguard Worker; CHECK: movq (%rsp), %rax 19*9880d681SAndroid Build Coastguard Worker; CHECK: popq %rcx 20*9880d681SAndroid Build Coastguard Worker; CHECK: retq 21*9880d681SAndroid Build Coastguard Workerentry: 22*9880d681SAndroid Build Coastguard Worker %alloca = alloca i32 addrspace(1)*, align 8 23*9880d681SAndroid Build Coastguard Worker store i32 addrspace(1)* %ptr, i32 addrspace(1)** %alloca 24*9880d681SAndroid Build Coastguard Worker 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*9880d681SAndroid Build Coastguard Worker %rel = load i32 addrspace(1)*, i32 addrspace(1)** %alloca 26*9880d681SAndroid Build Coastguard Worker ret i32 addrspace(1)* %rel 27*9880d681SAndroid Build Coastguard Worker} 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Worker; Can we handle an alloca as a deopt value? 30*9880d681SAndroid Build Coastguard Workerdefine i32 addrspace(1)* @test2(i32 addrspace(1)* %ptr) gc "statepoint-example" { 31*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test2 32*9880d681SAndroid Build Coastguard Worker; CHECK: pushq %rax 33*9880d681SAndroid Build Coastguard Worker; CHECK: movq %rdi, (%rsp) 34*9880d681SAndroid Build Coastguard Worker; CHECK: callq return_i1 35*9880d681SAndroid Build Coastguard Worker; CHECK: xorl %eax, %eax 36*9880d681SAndroid Build Coastguard Worker; CHECK: popq %rcx 37*9880d681SAndroid Build Coastguard Worker; CHECK: retq 38*9880d681SAndroid Build Coastguard Workerentry: 39*9880d681SAndroid Build Coastguard Worker %alloca = alloca i32 addrspace(1)*, align 8 40*9880d681SAndroid Build Coastguard Worker store i32 addrspace(1)* %ptr, i32 addrspace(1)** %alloca 41*9880d681SAndroid Build Coastguard Worker 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*9880d681SAndroid Build Coastguard Worker ret i32 addrspace(1)* null 43*9880d681SAndroid Build Coastguard Worker} 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Workerdeclare token @llvm.experimental.gc.statepoint.p0f_i1f(i64, i32, i1 ()*, i32, i32, ...) 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: .section .llvm_stackmaps 49*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: __LLVM_StackMaps: 50*9880d681SAndroid Build Coastguard Worker; Header 51*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .byte 1 52*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .byte 0 53*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .short 0 54*9880d681SAndroid Build Coastguard Worker; Num Functions 55*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long 2 56*9880d681SAndroid Build Coastguard Worker; Num LargeConstants 57*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long 0 58*9880d681SAndroid Build Coastguard Worker; Num Callsites 59*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long 2 60*9880d681SAndroid Build Coastguard Worker 61*9880d681SAndroid Build Coastguard Worker; Functions and stack size 62*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .quad test 63*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .quad 8 64*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .quad test2 65*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .quad 8 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard Worker; Large Constants 68*9880d681SAndroid Build Coastguard Worker; Statepoint ID only 69*9880d681SAndroid Build Coastguard Worker; CHECK: .quad 0 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Worker; Callsites 72*9880d681SAndroid Build Coastguard Worker; The GC one 73*9880d681SAndroid Build Coastguard Worker; CHECK: .long .Ltmp1-test 74*9880d681SAndroid Build Coastguard Worker; CHECK: .short 0 75*9880d681SAndroid Build Coastguard Worker; CHECK: .short 4 76*9880d681SAndroid Build Coastguard Worker; SmallConstant (0) 77*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 4 78*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 8 79*9880d681SAndroid Build Coastguard Worker; CHECK: .short 0 80*9880d681SAndroid Build Coastguard Worker; CHECK: .long 0 81*9880d681SAndroid Build Coastguard Worker; SmallConstant (0) 82*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 4 83*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 8 84*9880d681SAndroid Build Coastguard Worker; CHECK: .short 0 85*9880d681SAndroid Build Coastguard Worker; CHECK: .long 0 86*9880d681SAndroid Build Coastguard Worker; SmallConstant (0) 87*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 4 88*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 8 89*9880d681SAndroid Build Coastguard Worker; CHECK: .short 0 90*9880d681SAndroid Build Coastguard Worker; CHECK: .long 0 91*9880d681SAndroid Build Coastguard Worker; Direct Spill Slot [RSP+0] 92*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 2 93*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 8 94*9880d681SAndroid Build Coastguard Worker; CHECK: .short 7 95*9880d681SAndroid Build Coastguard Worker; CHECK: .long 0 96*9880d681SAndroid Build Coastguard Worker; No Padding or LiveOuts 97*9880d681SAndroid Build Coastguard Worker; CHECK: .short 0 98*9880d681SAndroid Build Coastguard Worker; CHECK: .short 0 99*9880d681SAndroid Build Coastguard Worker; CHECK: .p2align 3 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Worker; The Deopt one 102*9880d681SAndroid Build Coastguard Worker; CHECK: .long .Ltmp3-test2 103*9880d681SAndroid Build Coastguard Worker; CHECK: .short 0 104*9880d681SAndroid Build Coastguard Worker; CHECK: .short 4 105*9880d681SAndroid Build Coastguard Worker; SmallConstant (0) 106*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 4 107*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 8 108*9880d681SAndroid Build Coastguard Worker; CHECK: .short 0 109*9880d681SAndroid Build Coastguard Worker; CHECK: .long 0 110*9880d681SAndroid Build Coastguard Worker; SmallConstant (0) 111*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 4 112*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 8 113*9880d681SAndroid Build Coastguard Worker; CHECK: .short 0 114*9880d681SAndroid Build Coastguard Worker; CHECK: .long 0 115*9880d681SAndroid Build Coastguard Worker; SmallConstant (1) 116*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 4 117*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 8 118*9880d681SAndroid Build Coastguard Worker; CHECK: .short 0 119*9880d681SAndroid Build Coastguard Worker; CHECK: .long 1 120*9880d681SAndroid Build Coastguard Worker; Direct Spill Slot [RSP+0] 121*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 2 122*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 8 123*9880d681SAndroid Build Coastguard Worker; CHECK: .short 7 124*9880d681SAndroid Build Coastguard Worker; CHECK: .long 0 125*9880d681SAndroid Build Coastguard Worker 126*9880d681SAndroid Build Coastguard Worker; No Padding or LiveOuts 127*9880d681SAndroid Build Coastguard Worker; CHECK: .short 0 128*9880d681SAndroid Build Coastguard Worker; CHECK: .short 0 129*9880d681SAndroid Build Coastguard Worker; CHECK: .p2align 3 130*9880d681SAndroid Build Coastguard Worker 131