1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -stack-symbol-ordering=0 -mtriple="x86_64-pc-linux-gnu" | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -stack-symbol-ordering=0 -mtriple="x86_64-pc-unknown-elf" | FileCheck %s 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker; This test is a sanity check to ensure statepoints are generating StackMap 5*9880d681SAndroid Build Coastguard Worker; sections correctly. This is not intended to be a rigorous test of the 6*9880d681SAndroid Build Coastguard Worker; StackMap format (see the stackmap tests for that). 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-i64:64-f80:128-n8:16:32:64-S128" 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Workerdeclare zeroext i1 @return_i1() 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Workerdefine i1 @test(i32 addrspace(1)* %ptr_base, i32 %arg) 13*9880d681SAndroid Build Coastguard Worker gc "statepoint-example" { 14*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test: 15*9880d681SAndroid Build Coastguard Worker; Do we see two spills for the local values and the store to the 16*9880d681SAndroid Build Coastguard Worker; alloca? 17*9880d681SAndroid Build Coastguard Worker; CHECK: subq $40, %rsp 18*9880d681SAndroid Build Coastguard Worker; CHECK: movq $0, 24(%rsp) 19*9880d681SAndroid Build Coastguard Worker; CHECK: movq %rdi, 16(%rsp) 20*9880d681SAndroid Build Coastguard Worker; CHECK: movq %rax, 8(%rsp) 21*9880d681SAndroid Build Coastguard Worker; CHECK: callq return_i1 22*9880d681SAndroid Build Coastguard Worker; CHECK: addq $40, %rsp 23*9880d681SAndroid Build Coastguard Worker; CHECK: retq 24*9880d681SAndroid Build Coastguard Workerentry: 25*9880d681SAndroid Build Coastguard Worker %metadata1 = alloca i32 addrspace(1)*, i32 2, align 8 26*9880d681SAndroid Build Coastguard Worker store i32 addrspace(1)* null, i32 addrspace(1)** %metadata1 27*9880d681SAndroid Build Coastguard Worker %ptr_derived = getelementptr i32, i32 addrspace(1)* %ptr_base, i32 %arg 28*9880d681SAndroid Build Coastguard Worker %safepoint_token = tail 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 2, i32 addrspace(1)* %ptr_base, i32 addrspace(1)* null, i32 addrspace(1)* %ptr_base, i32 addrspace(1)* %ptr_derived, i32 addrspace(1)* null) 29*9880d681SAndroid Build Coastguard Worker %call1 = call zeroext i1 @llvm.experimental.gc.result.i1(token %safepoint_token) 30*9880d681SAndroid Build Coastguard Worker %a = call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token %safepoint_token, i32 9, i32 9) 31*9880d681SAndroid Build Coastguard Worker %b = call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token %safepoint_token, i32 9, i32 10) 32*9880d681SAndroid Build Coastguard Worker %c = call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token %safepoint_token, i32 11, i32 11) 33*9880d681SAndroid Build Coastguard Worker; 34*9880d681SAndroid Build Coastguard Worker ret i1 %call1 35*9880d681SAndroid Build Coastguard Worker} 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Worker; This is similar to the previous test except that we have derived pointer as 38*9880d681SAndroid Build Coastguard Worker; argument to the function. Despite that this can not happen after the 39*9880d681SAndroid Build Coastguard Worker; RewriteSafepointForGC pass, lowering should be able to handle it anyway. 40*9880d681SAndroid Build Coastguard Workerdefine i1 @test_derived_arg(i32 addrspace(1)* %ptr_base, 41*9880d681SAndroid Build Coastguard Worker i32 addrspace(1)* %ptr_derived) 42*9880d681SAndroid Build Coastguard Worker gc "statepoint-example" { 43*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_derived_arg 44*9880d681SAndroid Build Coastguard Worker; Do we see two spills for the local values and the store to the 45*9880d681SAndroid Build Coastguard Worker; alloca? 46*9880d681SAndroid Build Coastguard Worker; CHECK: subq $40, %rsp 47*9880d681SAndroid Build Coastguard Worker; CHECK: movq $0, 24(%rsp) 48*9880d681SAndroid Build Coastguard Worker; CHECK: movq %rdi, 16(%rsp) 49*9880d681SAndroid Build Coastguard Worker; CHECK: movq %rsi, 8(%rsp) 50*9880d681SAndroid Build Coastguard Worker; CHECK: callq return_i1 51*9880d681SAndroid Build Coastguard Worker; CHECK: addq $40, %rsp 52*9880d681SAndroid Build Coastguard Worker; CHECK: retq 53*9880d681SAndroid Build Coastguard Workerentry: 54*9880d681SAndroid Build Coastguard Worker %metadata1 = alloca i32 addrspace(1)*, i32 2, align 8 55*9880d681SAndroid Build Coastguard Worker store i32 addrspace(1)* null, i32 addrspace(1)** %metadata1 56*9880d681SAndroid Build Coastguard Worker %safepoint_token = tail 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 2, i32 addrspace(1)* %ptr_base, i32 addrspace(1)* null, i32 addrspace(1)* %ptr_base, i32 addrspace(1)* %ptr_derived, i32 addrspace(1)* null) 57*9880d681SAndroid Build Coastguard Worker %call1 = call zeroext i1 @llvm.experimental.gc.result.i1(token %safepoint_token) 58*9880d681SAndroid Build Coastguard Worker %a = call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token %safepoint_token, i32 9, i32 9) 59*9880d681SAndroid Build Coastguard Worker %b = call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token %safepoint_token, i32 9, i32 10) 60*9880d681SAndroid Build Coastguard Worker %c = call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token %safepoint_token, i32 11, i32 11) 61*9880d681SAndroid Build Coastguard Worker; 62*9880d681SAndroid Build Coastguard Worker ret i1 %call1 63*9880d681SAndroid Build Coastguard Worker} 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Worker; Simple test case to check that we emit the ID field correctly 66*9880d681SAndroid Build Coastguard Workerdefine i1 @test_id() gc "statepoint-example" { 67*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_id 68*9880d681SAndroid Build Coastguard Workerentry: 69*9880d681SAndroid Build Coastguard Worker %safepoint_token = tail call token (i64, i32, i1 ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_i1f(i64 237, i32 0, i1 ()* @return_i1, i32 0, i32 0, i32 0, i32 0) 70*9880d681SAndroid Build Coastguard Worker %call1 = call zeroext i1 @llvm.experimental.gc.result.i1(token %safepoint_token) 71*9880d681SAndroid Build Coastguard Worker ret i1 %call1 72*9880d681SAndroid Build Coastguard Worker} 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Workerdeclare token @llvm.experimental.gc.statepoint.p0f_i1f(i64, i32, i1 ()*, i32, i32, ...) 76*9880d681SAndroid Build Coastguard Workerdeclare i1 @llvm.experimental.gc.result.i1(token) 77*9880d681SAndroid Build Coastguard Workerdeclare i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token, i32, i32) #3 78*9880d681SAndroid Build Coastguard Worker 79*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: .section .llvm_stackmaps 80*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: __LLVM_StackMaps: 81*9880d681SAndroid Build Coastguard Worker; Header 82*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .byte 1 83*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .byte 0 84*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .short 0 85*9880d681SAndroid Build Coastguard Worker; Num Functions 86*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long 3 87*9880d681SAndroid Build Coastguard Worker; Num LargeConstants 88*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long 0 89*9880d681SAndroid Build Coastguard Worker; Num Callsites 90*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long 3 91*9880d681SAndroid Build Coastguard Worker 92*9880d681SAndroid Build Coastguard Worker; Functions and stack size 93*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .quad test 94*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .quad 40 95*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .quad test_derived_arg 96*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .quad 40 97*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .quad test_id 98*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .quad 8 99*9880d681SAndroid Build Coastguard Worker 100*9880d681SAndroid Build Coastguard Worker; 101*9880d681SAndroid Build Coastguard Worker; test 102*9880d681SAndroid Build Coastguard Worker; 103*9880d681SAndroid Build Coastguard Worker 104*9880d681SAndroid Build Coastguard Worker; Statepoint ID 105*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .quad 0 106*9880d681SAndroid Build Coastguard Worker 107*9880d681SAndroid Build Coastguard Worker; Callsites 108*9880d681SAndroid Build Coastguard Worker; Constant arguments 109*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long .Ltmp1-test 110*9880d681SAndroid Build Coastguard Worker; CHECK: .short 0 111*9880d681SAndroid Build Coastguard Worker; CHECK: .short 11 112*9880d681SAndroid Build Coastguard Worker; SmallConstant (0) 113*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 4 114*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 8 115*9880d681SAndroid Build Coastguard Worker; CHECK: .short 0 116*9880d681SAndroid Build Coastguard Worker; CHECK: .long 0 117*9880d681SAndroid Build Coastguard Worker; SmallConstant (0) 118*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 4 119*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 8 120*9880d681SAndroid Build Coastguard Worker; CHECK: .short 0 121*9880d681SAndroid Build Coastguard Worker; CHECK: .long 0 122*9880d681SAndroid Build Coastguard Worker; SmallConstant (2) 123*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 4 124*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 8 125*9880d681SAndroid Build Coastguard Worker; CHECK: .short 0 126*9880d681SAndroid Build Coastguard Worker; CHECK: .long 2 127*9880d681SAndroid Build Coastguard Worker; Indirect Spill Slot [RSP+0] 128*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 3 129*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 8 130*9880d681SAndroid Build Coastguard Worker; CHECK: .short 7 131*9880d681SAndroid Build Coastguard Worker; CHECK: .long 16 132*9880d681SAndroid Build Coastguard Worker; SmallConstant (0) 133*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 4 134*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 8 135*9880d681SAndroid Build Coastguard Worker; CHECK: .short 0 136*9880d681SAndroid Build Coastguard Worker; CHECK: .long 0 137*9880d681SAndroid Build Coastguard Worker; SmallConstant (0) 138*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 4 139*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 8 140*9880d681SAndroid Build Coastguard Worker; CHECK: .short 0 141*9880d681SAndroid Build Coastguard Worker; CHECK: .long 0 142*9880d681SAndroid Build Coastguard Worker; SmallConstant (0) 143*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 4 144*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 8 145*9880d681SAndroid Build Coastguard Worker; CHECK: .short 0 146*9880d681SAndroid Build Coastguard Worker; CHECK: .long 0 147*9880d681SAndroid Build Coastguard Worker; Indirect Spill Slot [RSP+16] 148*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 3 149*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 8 150*9880d681SAndroid Build Coastguard Worker; CHECK: .short 7 151*9880d681SAndroid Build Coastguard Worker; CHECK: .long 16 152*9880d681SAndroid Build Coastguard Worker; Indirect Spill Slot [RSP+8] 153*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 3 154*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 8 155*9880d681SAndroid Build Coastguard Worker; CHECK: .short 7 156*9880d681SAndroid Build Coastguard Worker; CHECK: .long 8 157*9880d681SAndroid Build Coastguard Worker; Indirect Spill Slot [RSP+16] 158*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 3 159*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 8 160*9880d681SAndroid Build Coastguard Worker; CHECK: .short 7 161*9880d681SAndroid Build Coastguard Worker; CHECK: .long 16 162*9880d681SAndroid Build Coastguard Worker; Indirect Spill Slot [RSP+16] 163*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 3 164*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 8 165*9880d681SAndroid Build Coastguard Worker; CHECK: .short 7 166*9880d681SAndroid Build Coastguard Worker; CHECK: .long 16 167*9880d681SAndroid Build Coastguard Worker 168*9880d681SAndroid Build Coastguard Worker; No Padding or LiveOuts 169*9880d681SAndroid Build Coastguard Worker; CHECK: .short 0 170*9880d681SAndroid Build Coastguard Worker; CHECK: .short 0 171*9880d681SAndroid Build Coastguard Worker; CHECK: .p2align 3 172*9880d681SAndroid Build Coastguard Worker 173*9880d681SAndroid Build Coastguard Worker; 174*9880d681SAndroid Build Coastguard Worker; test_derived_arg 175*9880d681SAndroid Build Coastguard Worker 176*9880d681SAndroid Build Coastguard Worker; Statepoint ID 177*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .quad 0 178*9880d681SAndroid Build Coastguard Worker 179*9880d681SAndroid Build Coastguard Worker; Callsites 180*9880d681SAndroid Build Coastguard Worker; Constant arguments 181*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long .Ltmp3-test_derived_arg 182*9880d681SAndroid Build Coastguard Worker; CHECK: .short 0 183*9880d681SAndroid Build Coastguard Worker; CHECK: .short 11 184*9880d681SAndroid Build Coastguard Worker; SmallConstant (0) 185*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 4 186*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 8 187*9880d681SAndroid Build Coastguard Worker; CHECK: .short 0 188*9880d681SAndroid Build Coastguard Worker; CHECK: .long 0 189*9880d681SAndroid Build Coastguard Worker; SmallConstant (2) 190*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 4 191*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 8 192*9880d681SAndroid Build Coastguard Worker; CHECK: .short 0 193*9880d681SAndroid Build Coastguard Worker; CHECK: .long 2 194*9880d681SAndroid Build Coastguard Worker; Indirect Spill Slot [RSP+0] 195*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 3 196*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 8 197*9880d681SAndroid Build Coastguard Worker; CHECK: .short 7 198*9880d681SAndroid Build Coastguard Worker; CHECK: .long 16 199*9880d681SAndroid Build Coastguard Worker; SmallConstant (0) 200*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 4 201*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 8 202*9880d681SAndroid Build Coastguard Worker; CHECK: .short 0 203*9880d681SAndroid Build Coastguard Worker; CHECK: .long 0 204*9880d681SAndroid Build Coastguard Worker; SmallConstant (0) 205*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 4 206*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 8 207*9880d681SAndroid Build Coastguard Worker; CHECK: .short 0 208*9880d681SAndroid Build Coastguard Worker; CHECK: .long 0 209*9880d681SAndroid Build Coastguard Worker; SmallConstant (0) 210*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 4 211*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 8 212*9880d681SAndroid Build Coastguard Worker; CHECK: .short 0 213*9880d681SAndroid Build Coastguard Worker; CHECK: .long 0 214*9880d681SAndroid Build Coastguard Worker; Indirect Spill Slot [RSP+16] 215*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 3 216*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 8 217*9880d681SAndroid Build Coastguard Worker; CHECK: .short 7 218*9880d681SAndroid Build Coastguard Worker; CHECK: .long 16 219*9880d681SAndroid Build Coastguard Worker; Indirect Spill Slot [RSP+8] 220*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 3 221*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 8 222*9880d681SAndroid Build Coastguard Worker; CHECK: .short 7 223*9880d681SAndroid Build Coastguard Worker; CHECK: .long 8 224*9880d681SAndroid Build Coastguard Worker; Indirect Spill Slot [RSP+16] 225*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 3 226*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 8 227*9880d681SAndroid Build Coastguard Worker; CHECK: .short 7 228*9880d681SAndroid Build Coastguard Worker; CHECK: .long 16 229*9880d681SAndroid Build Coastguard Worker; Indirect Spill Slot [RSP+16] 230*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 3 231*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 8 232*9880d681SAndroid Build Coastguard Worker; CHECK: .short 7 233*9880d681SAndroid Build Coastguard Worker; CHECK: .long 16 234*9880d681SAndroid Build Coastguard Worker 235*9880d681SAndroid Build Coastguard Worker; No Padding or LiveOuts 236*9880d681SAndroid Build Coastguard Worker; CHECK: .short 0 237*9880d681SAndroid Build Coastguard Worker; CHECK: .short 0 238*9880d681SAndroid Build Coastguard Worker; CHECK: .p2align 3 239*9880d681SAndroid Build Coastguard Worker 240*9880d681SAndroid Build Coastguard Worker; Records for the test_id function: 241*9880d681SAndroid Build Coastguard Worker 242*9880d681SAndroid Build Coastguard Worker; The Statepoint ID: 243*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .quad 237 244*9880d681SAndroid Build Coastguard Worker 245*9880d681SAndroid Build Coastguard Worker; Instruction Offset 246*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long .Ltmp5-test_id 247*9880d681SAndroid Build Coastguard Worker 248*9880d681SAndroid Build Coastguard Worker; Reserved: 249*9880d681SAndroid Build Coastguard Worker; CHECK: .short 0 250*9880d681SAndroid Build Coastguard Worker 251*9880d681SAndroid Build Coastguard Worker; NumLocations: 252*9880d681SAndroid Build Coastguard Worker; CHECK: .short 3 253*9880d681SAndroid Build Coastguard Worker 254*9880d681SAndroid Build Coastguard Worker; StkMapRecord[0]: 255*9880d681SAndroid Build Coastguard Worker; SmallConstant(0): 256*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 4 257*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 8 258*9880d681SAndroid Build Coastguard Worker; CHECK: .short 0 259*9880d681SAndroid Build Coastguard Worker; CHECK: .long 0 260*9880d681SAndroid Build Coastguard Worker 261*9880d681SAndroid Build Coastguard Worker; StkMapRecord[1]: 262*9880d681SAndroid Build Coastguard Worker; SmallConstant(0): 263*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 4 264*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 8 265*9880d681SAndroid Build Coastguard Worker; CHECK: .short 0 266*9880d681SAndroid Build Coastguard Worker; CHECK: .long 0 267*9880d681SAndroid Build Coastguard Worker 268*9880d681SAndroid Build Coastguard Worker; StkMapRecord[2]: 269*9880d681SAndroid Build Coastguard Worker; SmallConstant(0): 270*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 4 271*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 8 272*9880d681SAndroid Build Coastguard Worker; CHECK: .short 0 273*9880d681SAndroid Build Coastguard Worker; CHECK: .long 0 274*9880d681SAndroid Build Coastguard Worker 275*9880d681SAndroid Build Coastguard Worker; No padding or LiveOuts 276*9880d681SAndroid Build Coastguard Worker; CHECK: .short 0 277*9880d681SAndroid Build Coastguard Worker; CHECK: .short 0 278*9880d681SAndroid Build Coastguard Worker; CHECK: .p2align 3 279*9880d681SAndroid Build Coastguard Worker 280