Home | History | Annotate | Download | only in X86
      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