157 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			LLVM
		
	
	
	
			
		
		
	
	
			157 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			LLVM
		
	
	
	
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
 | 
						|
; RUN: llc -verify-machineinstrs -debug-entry-values < %s | FileCheck %s
 | 
						|
; Check that we can lower a use of an alloca both as a deopt value (where the
 | 
						|
; exact meaning is up to the consumer of the stackmap) and as an explicit spill
 | 
						|
; slot used for GC.
 | 
						|
 | 
						|
target datalayout = "e-i64:64-f80:128-n8:16:32:64-S128"
 | 
						|
target triple = "x86_64-pc-linux-gnu"
 | 
						|
 | 
						|
declare zeroext i1 @return_i1()
 | 
						|
 | 
						|
; Can we handle an explicit relocation slot (in the form of an alloca) given
 | 
						|
; to the statepoint?
 | 
						|
define i32 addrspace(1)* @test(i32 addrspace(1)* %ptr) gc "statepoint-example" {
 | 
						|
; CHECK-LABEL: test:
 | 
						|
; CHECK:       # %bb.0: # %entry
 | 
						|
; CHECK-NEXT:    pushq %rax
 | 
						|
; CHECK-NEXT:    .cfi_def_cfa_offset 16
 | 
						|
; CHECK-NEXT:    movq %rdi, (%rsp)
 | 
						|
; CHECK-NEXT:    callq return_i1
 | 
						|
; CHECK-NEXT:  .Ltmp0:
 | 
						|
; CHECK-NEXT:    movq (%rsp), %rax
 | 
						|
; CHECK-NEXT:    popq %rcx
 | 
						|
; CHECK-NEXT:    .cfi_def_cfa_offset 8
 | 
						|
; CHECK-NEXT:    retq
 | 
						|
entry:
 | 
						|
  %alloca = alloca i32 addrspace(1)*, align 8
 | 
						|
  store i32 addrspace(1)* %ptr, i32 addrspace(1)** %alloca
 | 
						|
  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)
 | 
						|
  %rel = load i32 addrspace(1)*, i32 addrspace(1)** %alloca
 | 
						|
  ret i32 addrspace(1)* %rel
 | 
						|
}
 | 
						|
 | 
						|
; Can we handle an alloca as a deopt value?
 | 
						|
define i32 addrspace(1)* @test2(i32 addrspace(1)* %ptr) gc "statepoint-example" {
 | 
						|
; CHECK-LABEL: test2:
 | 
						|
; CHECK:       # %bb.0: # %entry
 | 
						|
; CHECK-NEXT:    pushq %rax
 | 
						|
; CHECK-NEXT:    .cfi_def_cfa_offset 16
 | 
						|
; CHECK-NEXT:    movq %rdi, (%rsp)
 | 
						|
; CHECK-NEXT:    callq return_i1
 | 
						|
; CHECK-NEXT:  .Ltmp1:
 | 
						|
; CHECK-NEXT:    xorl %eax, %eax
 | 
						|
; CHECK-NEXT:    popq %rcx
 | 
						|
; CHECK-NEXT:    .cfi_def_cfa_offset 8
 | 
						|
; CHECK-NEXT:    retq
 | 
						|
entry:
 | 
						|
  %alloca = alloca i32 addrspace(1)*, align 8
 | 
						|
  store i32 addrspace(1)* %ptr, i32 addrspace(1)** %alloca
 | 
						|
  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)
 | 
						|
  ret i32 addrspace(1)* null
 | 
						|
}
 | 
						|
 | 
						|
declare token @llvm.experimental.gc.statepoint.p0f_i1f(i64, i32, i1 ()*, i32, i32, ...)
 | 
						|
 | 
						|
 | 
						|
; CHECK-LABEL: .section .llvm_stackmaps
 | 
						|
; CHECK-NEXT:  __LLVM_StackMaps:
 | 
						|
; Header
 | 
						|
; CHECK-NEXT:   .byte 3
 | 
						|
; CHECK-NEXT:   .byte 0
 | 
						|
; CHECK-NEXT:   .short 0
 | 
						|
; Num Functions
 | 
						|
; CHECK-NEXT:   .long 2
 | 
						|
; Num LargeConstants
 | 
						|
; CHECK-NEXT:   .long 0
 | 
						|
; Num Callsites
 | 
						|
; CHECK-NEXT:   .long 2
 | 
						|
 | 
						|
; Functions and stack size
 | 
						|
; CHECK-NEXT:   .quad test
 | 
						|
; CHECK-NEXT:   .quad 8
 | 
						|
; CHECK-NEXT:   .quad 1
 | 
						|
; CHECK-NEXT:   .quad test2
 | 
						|
; CHECK-NEXT:   .quad 8
 | 
						|
; CHECK-NEXT:   .quad 1
 | 
						|
 | 
						|
; Large Constants
 | 
						|
; Statepoint ID only
 | 
						|
; CHECK: .quad	0
 | 
						|
 | 
						|
; Callsites
 | 
						|
; The GC one
 | 
						|
; CHECK: .long	.Ltmp0-test
 | 
						|
; CHECK: .short	0
 | 
						|
; CHECK: .short	4
 | 
						|
; SmallConstant (0)
 | 
						|
; CHECK: .byte	4
 | 
						|
; CHECK: .byte	0
 | 
						|
; CHECK: .short 8
 | 
						|
; CHECK: .short	0
 | 
						|
; CHECK: .short	0
 | 
						|
; CHECK: .long	0
 | 
						|
; SmallConstant (0)
 | 
						|
; CHECK: .byte	4
 | 
						|
; CHECK: .byte	0
 | 
						|
; CHECK: .short 8
 | 
						|
; CHECK: .short	0
 | 
						|
; CHECK: .short	0
 | 
						|
; CHECK: .long	0
 | 
						|
; SmallConstant (0)
 | 
						|
; CHECK: .byte	4
 | 
						|
; CHECK: .byte	0
 | 
						|
; CHECK: .short 8
 | 
						|
; CHECK: .short	0
 | 
						|
; CHECK: .short	0
 | 
						|
; CHECK: .long	0
 | 
						|
; Direct Spill Slot [rsp+0]
 | 
						|
; CHECK: .byte	2
 | 
						|
; CHECK: .byte	0
 | 
						|
; CHECK: .short 8
 | 
						|
; CHECK: .short	7
 | 
						|
; CHECK: .short	0
 | 
						|
; CHECK: .long	0
 | 
						|
; No Padding or LiveOuts
 | 
						|
; CHECK: .short	0
 | 
						|
; CHECK: .short	0
 | 
						|
; CHECK: .p2align	3
 | 
						|
 | 
						|
; The Deopt one
 | 
						|
; CHECK: .long	.Ltmp1-test2
 | 
						|
; CHECK: .short	0
 | 
						|
; CHECK: .short	4
 | 
						|
; SmallConstant (0)
 | 
						|
; CHECK: .byte	4
 | 
						|
; CHECK: .byte	0
 | 
						|
; CHECK: .short 8
 | 
						|
; CHECK: .short	0
 | 
						|
; CHECK: .short	0
 | 
						|
; CHECK: .long	0
 | 
						|
; SmallConstant (0)
 | 
						|
; CHECK: .byte	4
 | 
						|
; CHECK: .byte	0
 | 
						|
; CHECK: .short 8
 | 
						|
; CHECK: .short	0
 | 
						|
; CHECK: .short	0
 | 
						|
; CHECK: .long	0
 | 
						|
; SmallConstant (1)
 | 
						|
; CHECK: .byte	4
 | 
						|
; CHECK: .byte	0
 | 
						|
; CHECK: .short 8
 | 
						|
; CHECK: .short	0
 | 
						|
; CHECK: .short	0
 | 
						|
; CHECK: .long	1
 | 
						|
; Direct Spill Slot [rsp+0]
 | 
						|
; CHECK: .byte	2
 | 
						|
; CHECK: .byte	0
 | 
						|
; CHECK: .short 8
 | 
						|
; CHECK: .short	7
 | 
						|
; CHECK: .short	0
 | 
						|
; CHECK: .long	0
 | 
						|
 | 
						|
; No Padding or LiveOuts
 | 
						|
; CHECK: .short	0
 | 
						|
; CHECK: .short	0
 | 
						|
; CHECK: .p2align	3
 |