aboutsummaryrefslogtreecommitdiff
path: root/test/CodeGen/X86/deopt-bundles.ll
diff options
context:
space:
mode:
Diffstat (limited to 'test/CodeGen/X86/deopt-bundles.ll')
-rw-r--r--test/CodeGen/X86/deopt-bundles.ll161
1 files changed, 161 insertions, 0 deletions
diff --git a/test/CodeGen/X86/deopt-bundles.ll b/test/CodeGen/X86/deopt-bundles.ll
new file mode 100644
index 000000000000..1fb73ea252ee
--- /dev/null
+++ b/test/CodeGen/X86/deopt-bundles.ll
@@ -0,0 +1,161 @@
+; 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 8, .short 0, .int 0]
+; STACKMAPS-NEXT: Stack Maps: Loc 1: Constant 0 [encoding: .byte 4, .byte 8, .short 0, .int 0]
+; STACKMAPS-NEXT: Stack Maps: Loc 2: Constant 1 [encoding: .byte 4, .byte 8, .short 0, .int 1]
+; STACKMAPS-NEXT: Stack Maps: Loc 3: Constant 0 [encoding: .byte 4, .byte 8, .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 8, .short 0, .int 0]
+; STACKMAPS-NEXT: Stack Maps: Loc 1: Constant 0 [encoding: .byte 4, .byte 8, .short 0, .int 0]
+; STACKMAPS-NEXT: Stack Maps: Loc 2: Constant 1 [encoding: .byte 4, .byte 8, .short 0, .int 1]
+; STACKMAPS-NEXT: Stack Maps: Loc 3: Constant 1 [encoding: .byte 4, .byte 8, .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 8, .short 0, .int 0]
+; STACKMAPS-NEXT: Stack Maps: Loc 1: Constant 0 [encoding: .byte 4, .byte 8, .short 0, .int 0]
+; STACKMAPS-NEXT: Stack Maps: Loc 2: Constant 1 [encoding: .byte 4, .byte 8, .short 0, .int 1]
+; STACKMAPS-NEXT: Stack Maps: Loc 3: Constant 16 [encoding: .byte 4, .byte 8, .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 8, .short 0, .int 0]
+; STACKMAPS-NEXT: Stack Maps: Loc 1: Constant 0 [encoding: .byte 4, .byte 8, .short 0, .int 0]
+; STACKMAPS-NEXT: Stack Maps: Loc 2: Constant 1 [encoding: .byte 4, .byte 8, .short 0, .int 1]
+; STACKMAPS-NEXT: Stack Maps: Loc 3: Constant 2 [encoding: .byte 4, .byte 8, .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 8, .short 0, .int 0]
+; STACKMAPS-NEXT: Stack Maps: Loc 1: Constant 0 [encoding: .byte 4, .byte 8, .short 0, .int 0]
+; STACKMAPS-NEXT: Stack Maps: Loc 2: Constant 1 [encoding: .byte 4, .byte 8, .short 0, .int 1]
+; STACKMAPS-NEXT: Stack Maps: Loc 3: Constant 3 [encoding: .byte 4, .byte 8, .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 8, .short 0, .int 0]
+; STACKMAPS-NEXT: Stack Maps: Loc 1: Constant 0 [encoding: .byte 4, .byte 8, .short 0, .int 0]
+; STACKMAPS-NEXT: Stack Maps: Loc 2: Constant 1 [encoding: .byte 4, .byte 8, .short 0, .int 1]
+; STACKMAPS-NEXT: Stack Maps: Loc 3: Constant 55 [encoding: .byte 4, .byte 8, .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 { i8*, 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 { i8*, 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 i32 (...)* @__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 [i8* null, i32 64, i8* 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(i64* %vl) [ "deopt"(i64* %s) ]
+ ret void
+}
+
+declare void @g_0(i64* %vl)