• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; RUN: llc     < %s | FileCheck %s
2; RUN: llc -O3 < %s | FileCheck %s
3; RUN: llc -O3 -debug-only=stackmaps < %s 2>&1 | FileCheck -check-prefix=STACKMAPS %s
4; REQUIRES: asserts
5
6target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
7target triple = "x86_64-apple-macosx10.11.0"
8
9
10; STACKMAPS: Stack Maps: callsite 2882400015
11; STACKMAPS-NEXT: Stack Maps:   has 4 locations
12; STACKMAPS-NEXT: Stack Maps: 		Loc 0: Constant 0	[encoding: .byte 4, .byte 8, .short 0, .int 0]
13; STACKMAPS-NEXT: Stack Maps: 		Loc 1: Constant 0	[encoding: .byte 4, .byte 8, .short 0, .int 0]
14; STACKMAPS-NEXT: Stack Maps: 		Loc 2: Constant 1	[encoding: .byte 4, .byte 8, .short 0, .int 1]
15; STACKMAPS-NEXT: Stack Maps: 		Loc 3: Constant 0	[encoding: .byte 4, .byte 8, .short 0, .int 0]
16; STACKMAPS-NEXT: Stack Maps: 	has 0 live-out registers
17; STACKMAPS-NEXT: Stack Maps: callsite 4242
18; STACKMAPS-NEXT: Stack Maps:   has 4 locations
19; STACKMAPS-NEXT: Stack Maps: 		Loc 0: Constant 0	[encoding: .byte 4, .byte 8, .short 0, .int 0]
20; STACKMAPS-NEXT: Stack Maps: 		Loc 1: Constant 0	[encoding: .byte 4, .byte 8, .short 0, .int 0]
21; STACKMAPS-NEXT: Stack Maps: 		Loc 2: Constant 1	[encoding: .byte 4, .byte 8, .short 0, .int 1]
22; STACKMAPS-NEXT: Stack Maps: 		Loc 3: Constant 1	[encoding: .byte 4, .byte 8, .short 0, .int 1]
23; STACKMAPS-NEXT: Stack Maps: 	has 0 live-out registers
24; STACKMAPS-NEXT: Stack Maps: callsite 4243
25; STACKMAPS-NEXT: Stack Maps:   has 4 locations
26; STACKMAPS-NEXT: Stack Maps: 		Loc 0: Constant 0	[encoding: .byte 4, .byte 8, .short 0, .int 0]
27; STACKMAPS-NEXT: Stack Maps: 		Loc 1: Constant 0	[encoding: .byte 4, .byte 8, .short 0, .int 0]
28; STACKMAPS-NEXT: Stack Maps: 		Loc 2: Constant 1	[encoding: .byte 4, .byte 8, .short 0, .int 1]
29; STACKMAPS-NEXT: Stack Maps: 		Loc 3: Constant 16	[encoding: .byte 4, .byte 8, .short 0, .int 16]
30; STACKMAPS-NEXT: Stack Maps: 	has 0 live-out registers
31; STACKMAPS-NEXT: Stack Maps: callsite 2882400015
32; STACKMAPS-NEXT: Stack Maps:   has 4 locations
33; STACKMAPS-NEXT: Stack Maps: 		Loc 0: Constant 0	[encoding: .byte 4, .byte 8, .short 0, .int 0]
34; STACKMAPS-NEXT: Stack Maps: 		Loc 1: Constant 0	[encoding: .byte 4, .byte 8, .short 0, .int 0]
35; STACKMAPS-NEXT: Stack Maps: 		Loc 2: Constant 1	[encoding: .byte 4, .byte 8, .short 0, .int 1]
36; STACKMAPS-NEXT: Stack Maps: 		Loc 3: Constant 2	[encoding: .byte 4, .byte 8, .short 0, .int 2]
37; STACKMAPS-NEXT: Stack Maps: 	has 0 live-out registers
38; STACKMAPS-NEXT: Stack Maps: callsite 2882400015
39; STACKMAPS-NEXT: Stack Maps:   has 4 locations
40; STACKMAPS-NEXT: Stack Maps: 		Loc 0: Constant 0	[encoding: .byte 4, .byte 8, .short 0, .int 0]
41; STACKMAPS-NEXT: Stack Maps: 		Loc 1: Constant 0	[encoding: .byte 4, .byte 8, .short 0, .int 0]
42; STACKMAPS-NEXT: Stack Maps: 		Loc 2: Constant 1	[encoding: .byte 4, .byte 8, .short 0, .int 1]
43; STACKMAPS-NEXT: Stack Maps: 		Loc 3: Constant 3	[encoding: .byte 4, .byte 8, .short 0, .int 3]
44; STACKMAPS-NEXT: Stack Maps: 	has 0 live-out registers
45; STACKMAPS-NEXT: Stack Maps: callsite 4243
46; STACKMAPS-NEXT: Stack Maps:   has 4 locations
47; STACKMAPS-NEXT: Stack Maps: 		Loc 0: Constant 0	[encoding: .byte 4, .byte 8, .short 0, .int 0]
48; STACKMAPS-NEXT: Stack Maps: 		Loc 1: Constant 0	[encoding: .byte 4, .byte 8, .short 0, .int 0]
49; STACKMAPS-NEXT: Stack Maps: 		Loc 2: Constant 1	[encoding: .byte 4, .byte 8, .short 0, .int 1]
50; STACKMAPS-NEXT: Stack Maps: 		Loc 3: Constant 55	[encoding: .byte 4, .byte 8, .short 0, .int 55]
51; STACKMAPS-NEXT: Stack Maps: 	has 0 live-out registers
52
53
54declare i32 @callee_0()
55declare i32 @callee_1(i32)
56declare i32 @callee_vararg(...)
57
58define i32 @caller_0() {
59; CHECK-LABEL: _caller_0
60entry:
61  %v = call i32 @callee_0() [ "deopt"(i32 0) ]
62  %v2 = add i32 %v, 1
63  ret i32 %v2
64; CHECK:	callq	_callee_0
65; CHECK:	incl	%eax
66; CHECK:	retq
67}
68
69define i32 @caller_1() {
70; CHECK-LABEL: _caller_1
71entry:
72  %v = call i32 @callee_1(i32 42) "statepoint-id"="4242" [ "deopt"(i32 1) ]
73  ret i32 %v
74; CHECK:	callq	_callee_1
75; CHECK:	popq	%rcx
76; CHECK:	retq
77}
78
79define i32 @caller_vararg() {
80; CHECK-LABEL: _caller_vararg
81entry:
82; CHECK: movb    $1, %al
83; CHECK: callq   _callee_vararg
84  %v = call i32(...) @callee_vararg(i32 42, double 500.0) "statepoint-id"="4243" [ "deopt"(i32 16) ]
85  ret i32 %v
86}
87
88define i32 @invoker_0() personality i8 0 {
89; CHECK-LABEL: _invoker_0
90entry:
91  %v = invoke i32 @callee_0() [ "deopt"(i32 2) ]
92          to label %normal unwind label %uw
93
94normal:
95  ret i32 %v
96
97uw:
98  %ehvals = landingpad { i8*, i32 }
99      cleanup
100  ret i32 1
101; CHECK:	callq	_callee_0
102; CHECK:	popq	%rcx
103; CHECK:	retq
104; CHECK:	movl	$1, %eax
105; CHECK:	popq	%rcx
106; CHECK:	retq
107}
108
109define i32 @invoker_1() personality i8 0 {
110; CHECK-LABEL: _invoker_1
111entry:
112  %v = invoke i32 @callee_1(i32 45) "statepoint-num-patch-bytes"="9" [ "deopt"(i32 3) ]
113          to label %normal unwind label %uw
114
115normal:
116  ret i32 %v
117
118uw:
119  %ehvals = landingpad { i8*, i32 }
120      cleanup
121  ret i32 1
122; CHECK:	movl	$45, %edi
123; CHECK:	nopw    512(%rax,%rax)
124; CHECK:	popq	%rcx
125; CHECK:	retq
126; CHECK:	movl	$1, %eax
127; CHECK:	popq	%rcx
128; CHECK:	retq
129}
130
131define i32 @invoker_2() personality i32 (...)* @__CxxFrameHandler3 {
132entry:
133  %val = invoke i32 @callee_1(i32 1)
134          to label %try.cont unwind label %catch.dispatch
135
136catch.dispatch:
137  %cs1 = catchswitch within none [label %catch] unwind to caller
138
139catch:
140  %cp1 = catchpad within %cs1 [i8* null, i32 64, i8* null]
141  %val2 = call i32 @callee_1(i32 100) "statepoint-id"="4243" [ "funclet"(token %cp1), "deopt"(i32 55) ]
142  catchret from %cp1 to label %try.cont
143
144try.cont:
145  ret i32 0
146}
147
148declare i32 @__CxxFrameHandler3(...)
149
150define void @f_0(i64 %n) {
151  ; CHECK-LABEL: _f_0
152  %s = alloca i64
153  %vl = alloca i64, i64 %n
154  ; Check that the stackmap does not reference %s through
155  ; SP since the offset is not static because of %vl.
156  ; STACKMAPS: Loc 3: Direct 6
157  call void @g_0(i64* %vl) [ "deopt"(i64* %s) ]
158  ret void
159}
160
161declare void @g_0(i64* %vl)
162