Compiler projects using llvm
; 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 ptr> %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 ptr> %val) ]
  ret void
}

define void @f_2(<99 x ptr> %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 ptr> %val) ]
  ret void
}


define <400 x ptr addrspace(1)> @f_3(<400 x ptr 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, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 4242, i32 0, ptr elementtype(void ()) @do_safepoint, i32 0, i32 0, i32 0, i32 0) ["gc-live"(<400 x ptr addrspace(1)> %obj)]
  %obj.r = call coldcc <400 x ptr addrspace(1)> @llvm.experimental.gc.relocate.v400p1(token %tok, i32 0, i32 0)
  ret <400 x ptr addrspace(1)> %obj.r
}

declare void @do_safepoint()

declare token @llvm.experimental.gc.statepoint.p0(i64, i32, ptr, i32, i32, ...)
declare <400 x ptr addrspace(1)> @llvm.experimental.gc.relocate.v400p1(token, i32, i32)