; RUN: llc < %s -mtriple="x86_64-pc-linux-gnu" | FileCheck %s

declare void @callee()

define void @f_0(<1024 x i64> %val) {
; CHECK:      .quad	2882400015
; CHECK-NEXT: .long	.Ltmp0-f_0
; CHECK-NEXT: .short	0
; CHECK-NEXT: .short	4
; Constant(0)
; CHECK-NEXT: .byte	4
; CHECK-NEXT: .byte	0 
; CHECK-NEXT: .short	8
; CHECK-NEXT: .short	0
; CHECK-NEXT: .short	0
; CHECK-NEXT: .long	0
; Constant(0)
; CHECK-NEXT: .byte	4
; CHECK-NEXT: .byte	0
; CHECK-NEXT: .short	8
; CHECK-NEXT: .short	0
; CHECK-NEXT: .short	0
; CHECK-NEXT: .long	0
; Constant(1)
; CHECK-NEXT: .byte	4
; CHECK-NEXT: .byte	0
; CHECK-NEXT: .short	8
; CHECK-NEXT: .short	0
; CHECK-NEXT: .short	0
; CHECK-NEXT: .long	1
; Indirect
; CHECK-NEXT: .byte	3
; CHECK-NEXT: .byte	0
; CHECK-NEXT: .short	8192
; CHECK-NEXT: .short	7
; CHECK-NEXT: .short	0
; CHECK-NEXT: .long	0
; Padding
; CHECK-NEXT: .p2align	3
  call void @callee() [ "deopt"(<1024 x i64> %val) ]
  ret void
}

define void @f_1(<1024 x i8*> %val) {
; CHECK:      .quad	2882400015
; CHECK-NEXT: .long	.Ltmp1-f_1
; CHECK-NEXT: .short	0
; CHECK-NEXT: .short	4
; Constant(0)
; CHECK-NEXT: .byte	4
; CHECK-NEXT: .byte	0
; CHECK-NEXT: .short	8
; CHECK-NEXT: .short	0
; CHECK-NEXT: .short	0
; CHECK-NEXT: .long	0
; Constant(0)
; CHECK-NEXT: .byte	4
; CHECK-NEXT: .byte	0
; CHECK-NEXT: .short	8
; CHECK-NEXT: .short	0
; CHECK-NEXT: .short	0
; CHECK-NEXT: .long	0
; Constant(1)
; CHECK-NEXT: .byte	4
; CHECK-NEXT: .byte	0
; CHECK-NEXT: .short	8
; CHECK-NEXT: .short	0
; CHECK-NEXT: .short	0
; CHECK-NEXT: .long	1
; Indirect
; CHECK-NEXT: .byte	3
; CHECK-NEXT: .byte	0
; CHECK-NEXT: .short	8192
; CHECK-NEXT: .short	7
; CHECK-NEXT: .short	0
; CHECK-NEXT: .long	0
; Padding
; CHECK-NEXT: .p2align	3
  call void @callee() [ "deopt"(<1024 x i8*> %val) ]
  ret void
}

define void @f_2(<99 x i8*> %val) {
; CHECK:      .quad	2882400015
; CHECK-NEXT: .long	.Ltmp2-f_2
; CHECK-NEXT: .short	0
; CHECK-NEXT: .short	4
; Constant(0)
; CHECK-NEXT: .byte	4
; CHECK-NEXT: .byte	0
; CHECK-NEXT: .short	8
; CHECK-NEXT: .short	0
; CHECK-NEXT: .short	0
; CHECK-NEXT: .long	0
; Constant(0)
; CHECK-NEXT: .byte	4
; CHECK-NEXT: .byte	0
; CHECK-NEXT: .short	8
; CHECK-NEXT: .short	0
; CHECK-NEXT: .short	0
; CHECK-NEXT: .long	0
; Constant(1)
; CHECK-NEXT: .byte	4
; CHECK-NEXT: .byte	0
; CHECK-NEXT: .short	8
; CHECK-NEXT: .short	0
; CHECK-NEXT: .short	0
; CHECK-NEXT: .long	1
; Indirect
; CHECK-NEXT: .byte	3
; CHECK-NEXT: .byte	0
; CHECK-NEXT: .short	792
; CHECK-NEXT: .short	7
; CHECK-NEXT: .short	0
; CHECK-NEXT: .long	0
; CHECK-NEXT: .p2align	3
  call void @callee() [ "deopt"(<99 x i8*> %val) ]
  ret void
}


define <400 x i8 addrspace(1)*> @f_3(<400 x i8 addrspace(1)*> %obj) gc "statepoint-example" {
; CHECK:      .quad	4242
; CHECK-NEXT: .long	.Ltmp3-f_3
; CHECK-NEXT: .short	0
; CHECK-NEXT: .short	5
; Constant(0)
; CHECK-NEXT: .byte	4
; CHECK-NEXT: .byte	0
; CHECK-NEXT: .short	8
; CHECK-NEXT: .short	0
; CHECK-NEXT: .short	0
; CHECK-NEXT: .long	0
; Constant(0)
; CHECK-NEXT: .byte	4
; CHECK-NEXT: .byte	0
; CHECK-NEXT: .short	8
; CHECK-NEXT: .short	0
; CHECK-NEXT: .short	0
; CHECK-NEXT: .long	0
; Constant(0)
; CHECK-NEXT: .byte	4
; CHECK-NEXT: .byte	0
; CHECK-NEXT: .short	8
; CHECK-NEXT: .short	0
; CHECK-NEXT: .short	0
; CHECK-NEXT: .long	0
; Indirect
; CHECK-NEXT: .byte	3
; CHECK-NEXT: .byte	0
; CHECK-NEXT: .short	3200
; CHECK-NEXT: .short	7
; CHECK-NEXT: .short	0
; CHECK-NEXT: .long	0
; Indirect
; CHECK-NEXT: .byte	3
; CHECK-NEXT: .byte	0
; CHECK-NEXT: .short	3200
; CHECK-NEXT: .short	7
; CHECK-NEXT: .short	0
; CHECK-NEXT: .long	0
; Padding
; CHECK-NEXT: .p2align	3
  %tok = call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 4242, i32 0, void ()* @do_safepoint, i32 0, i32 0, i32 0, i32 0) ["gc-live"(<400 x i8 addrspace(1)*> %obj)]
  %obj.r = call coldcc <400 x i8 addrspace(1)*> @llvm.experimental.gc.relocate.v400p1i8(token %tok, i32 0, i32 0)
  ret <400 x i8 addrspace(1)*> %obj.r
}

declare void @do_safepoint()

declare token @llvm.experimental.gc.statepoint.p0f_isVoidf(i64, i32, void ()*, i32, i32, ...)
declare <400 x i8 addrspace(1)*> @llvm.experimental.gc.relocate.v400p1i8(token, i32, i32)
