; RUN: llc < %s | FileCheck %s
; RUN: llc -O3 < %s | FileCheck %s
; RUN: llc -O3 -debug-only=stackmaps < %s 2>&1 | FileCheck -check-prefix=STACKMAPS %s
; REQUIRES: asserts
target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-apple-macosx10.11.0"
; STACKMAPS: Stack Maps: callsite 2882400015
; STACKMAPS-NEXT: Stack Maps: has 4 locations
; STACKMAPS-NEXT: Stack Maps: Loc 0: Constant 0 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 0]
; STACKMAPS-NEXT: Stack Maps: Loc 1: Constant 0 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 0]
; STACKMAPS-NEXT: Stack Maps: Loc 2: Constant 1 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 1]
; STACKMAPS-NEXT: Stack Maps: Loc 3: Constant 0 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 0]
; STACKMAPS-NEXT: Stack Maps: has 0 live-out registers
; STACKMAPS-NEXT: Stack Maps: callsite 4242
; STACKMAPS-NEXT: Stack Maps: has 4 locations
; STACKMAPS-NEXT: Stack Maps: Loc 0: Constant 0 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 0]
; STACKMAPS-NEXT: Stack Maps: Loc 1: Constant 0 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 0]
; STACKMAPS-NEXT: Stack Maps: Loc 2: Constant 1 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 1]
; STACKMAPS-NEXT: Stack Maps: Loc 3: Constant 1 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 1]
; STACKMAPS-NEXT: Stack Maps: has 0 live-out registers
; STACKMAPS-NEXT: Stack Maps: callsite 4243
; STACKMAPS-NEXT: Stack Maps: has 4 locations
; STACKMAPS-NEXT: Stack Maps: Loc 0: Constant 0 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 0]
; STACKMAPS-NEXT: Stack Maps: Loc 1: Constant 0 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 0]
; STACKMAPS-NEXT: Stack Maps: Loc 2: Constant 1 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 1]
; STACKMAPS-NEXT: Stack Maps: Loc 3: Constant 16 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 16]
; STACKMAPS-NEXT: Stack Maps: has 0 live-out registers
; STACKMAPS-NEXT: Stack Maps: callsite 2882400015
; STACKMAPS-NEXT: Stack Maps: has 4 locations
; STACKMAPS-NEXT: Stack Maps: Loc 0: Constant 0 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 0]
; STACKMAPS-NEXT: Stack Maps: Loc 1: Constant 0 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 0]
; STACKMAPS-NEXT: Stack Maps: Loc 2: Constant 1 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 1]
; STACKMAPS-NEXT: Stack Maps: Loc 3: Constant 2 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 2]
; STACKMAPS-NEXT: Stack Maps: has 0 live-out registers
; STACKMAPS-NEXT: Stack Maps: callsite 2882400015
; STACKMAPS-NEXT: Stack Maps: has 4 locations
; STACKMAPS-NEXT: Stack Maps: Loc 0: Constant 0 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 0]
; STACKMAPS-NEXT: Stack Maps: Loc 1: Constant 0 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 0]
; STACKMAPS-NEXT: Stack Maps: Loc 2: Constant 1 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 1]
; STACKMAPS-NEXT: Stack Maps: Loc 3: Constant 3 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 3]
; STACKMAPS-NEXT: Stack Maps: has 0 live-out registers
; STACKMAPS-NEXT: Stack Maps: callsite 4243
; STACKMAPS-NEXT: Stack Maps: has 4 locations
; STACKMAPS-NEXT: Stack Maps: Loc 0: Constant 0 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 0]
; STACKMAPS-NEXT: Stack Maps: Loc 1: Constant 0 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 0]
; STACKMAPS-NEXT: Stack Maps: Loc 2: Constant 1 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 1]
; STACKMAPS-NEXT: Stack Maps: Loc 3: Constant 55 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 55]
; STACKMAPS-NEXT: Stack Maps: has 0 live-out registers
declare i32 @callee_0()
declare i32 @callee_1(i32)
declare i32 @callee_vararg(...)
define i32 @caller_0() {
; CHECK-LABEL: _caller_0
entry:
%v = call i32 @callee_0() [ "deopt"(i32 0) ]
%v2 = add i32 %v, 1
ret i32 %v2
; CHECK: callq _callee_0
; CHECK: incl %eax
; CHECK: retq
}
define i32 @caller_1() {
; CHECK-LABEL: _caller_1
entry:
%v = call i32 @callee_1(i32 42) "statepoint-id"="4242" [ "deopt"(i32 1) ]
ret i32 %v
; CHECK: callq _callee_1
; CHECK: popq %rcx
; CHECK: retq
}
define i32 @caller_vararg() {
; CHECK-LABEL: _caller_vararg
entry:
; CHECK: movb $1, %al
; CHECK: callq _callee_vararg
%v = call i32(...) @callee_vararg(i32 42, double 500.0) "statepoint-id"="4243" [ "deopt"(i32 16) ]
ret i32 %v
}
define i32 @invoker_0() personality i8 0 {
; CHECK-LABEL: _invoker_0
entry:
%v = invoke i32 @callee_0() [ "deopt"(i32 2) ]
to label %normal unwind label %uw
normal:
ret i32 %v
uw:
%ehvals = landingpad { ptr, i32 }
cleanup
ret i32 1
; CHECK: callq _callee_0
; CHECK: popq %rcx
; CHECK: retq
; CHECK: movl $1, %eax
; CHECK: popq %rcx
; CHECK: retq
}
define i32 @invoker_1() personality i8 0 {
; CHECK-LABEL: _invoker_1
entry:
%v = invoke i32 @callee_1(i32 45) "statepoint-num-patch-bytes"="9" [ "deopt"(i32 3) ]
to label %normal unwind label %uw
normal:
ret i32 %v
uw:
%ehvals = landingpad { ptr, i32 }
cleanup
ret i32 1
; CHECK: movl $45, %edi
; CHECK: nopw 512(%rax,%rax)
; CHECK: popq %rcx
; CHECK: retq
; CHECK: movl $1, %eax
; CHECK: popq %rcx
; CHECK: retq
}
define i32 @invoker_2() personality ptr @__CxxFrameHandler3 {
entry:
%val = invoke i32 @callee_1(i32 1)
to label %try.cont unwind label %catch.dispatch
catch.dispatch:
%cs1 = catchswitch within none [label %catch] unwind to caller
catch:
%cp1 = catchpad within %cs1 [ptr null, i32 64, ptr null]
%val2 = call i32 @callee_1(i32 100) "statepoint-id"="4243" [ "funclet"(token %cp1), "deopt"(i32 55) ]
catchret from %cp1 to label %try.cont
try.cont:
ret i32 0
}
declare i32 @__CxxFrameHandler3(...)
define void @f_0(i64 %n) {
; CHECK-LABEL: _f_0
%s = alloca i64
%vl = alloca i64, i64 %n
; Check that the stackmap does not reference %s through
; SP since the offset is not static because of %vl.
; STACKMAPS: Loc 3: Direct 6
call void @g_0(ptr %vl) [ "deopt"(ptr %s) ]
ret void
}
declare void @g_0(ptr %vl)
define void @vector_deopt_bundle(<32 x ptr addrspace(1)> %val) {
; CHECK-LABEL: _vector_deopt_bundle:
; CHECK: movaps 16(%rbp), %xmm8
; CHECK-NEXT: movaps 32(%rbp), %xmm9
; CHECK-NEXT: movaps 48(%rbp), %xmm10
; CHECK-NEXT: movaps 64(%rbp), %xmm11
; CHECK-NEXT: movaps 80(%rbp), %xmm12
; CHECK-NEXT: movaps 96(%rbp), %xmm13
; CHECK-NEXT: movaps 112(%rbp), %xmm14
; CHECK-NEXT: movaps 128(%rbp), %xmm15
; CHECK-NEXT: movaps %xmm15, 240(%rsp)
; CHECK-NEXT: movaps %xmm14, 224(%rsp)
; CHECK-NEXT: movaps %xmm13, 208(%rsp)
; CHECK-NEXT: movaps %xmm12, 192(%rsp)
; CHECK-NEXT: movaps %xmm11, 176(%rsp)
; CHECK-NEXT: movaps %xmm10, 160(%rsp)
; CHECK-NEXT: movaps %xmm9, 144(%rsp)
; CHECK-NEXT: movaps %xmm8, 128(%rsp)
; CHECK-NEXT: movaps %xmm7, 112(%rsp)
; CHECK-NEXT: movaps %xmm6, 96(%rsp)
; CHECK-NEXT: movaps %xmm5, 80(%rsp)
; CHECK-NEXT: movaps %xmm4, 64(%rsp)
; CHECK-NEXT: movaps %xmm3, 48(%rsp)
; CHECK-NEXT: movaps %xmm2, 32(%rsp)
; CHECK-NEXT: movaps %xmm1, 16(%rsp)
; CHECK-NEXT: movaps %xmm0, (%rsp)
call void @unknown() [ "deopt"(<32 x ptr addrspace(1)> %val) ]
ret void
; STACKMAPS: Stack Maps: callsite 2882400015
; STACKMAPS-NEXT: Stack Maps: has 4 locations
; STACKMAPS-NEXT: Stack Maps: Loc 0: Constant 0 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 0]
; STACKMAPS-NEXT: Stack Maps: Loc 1: Constant 0 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 0]
; STACKMAPS-NEXT: Stack Maps: Loc 2: Constant 1 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 1]
; STACKMAPS-NEXT: Stack Maps: Loc 3: Indirect 7+0 [encoding: .byte 3, .byte 0, .short 256, .short 7, .short 0, .int 0]
; STACKMAPS-NEXT: Stack Maps: has 0 live-out registers
}
declare void @unknown()