Test
[oota-llvm.git] / test / CodeGen / X86 / stackmap-liveness.ll
1 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=corei7-avx -enable-patchpoint-liveness=false | FileCheck %s
2 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=corei7-avx                                   | FileCheck -check-prefix=PATCH %s
3 ;
4 ; Note: Print verbose stackmaps using -debug-only=stackmaps.
5
6 ; CHECK-LABEL:  .section  __LLVM_STACKMAPS,__llvm_stackmaps
7 ; CHECK-NEXT:   __LLVM_StackMaps:
8 ; Header
9 ; CHECK-NEXT:   .byte 1
10 ; CHECK-NEXT:   .byte 0
11 ; CHECK-NEXT:   .short 0
12 ; Num Functions
13 ; CHECK-NEXT:   .long 2
14 ; Num LargeConstants
15 ; CHECK-NEXT:   .long   0
16 ; Num Callsites
17 ; CHECK-NEXT:   .long   5
18
19 ; Functions and stack size
20 ; CHECK-NEXT:   .quad _stackmap_liveness
21 ; CHECK-NEXT:   .quad 8
22 ; CHECK-NEXT:   .quad _mixed_liveness
23 ; CHECK-NEXT:   .quad 8
24
25 define void @stackmap_liveness() {
26 entry:
27   %a1 = call <2 x double> asm sideeffect "", "={xmm2}"() nounwind
28 ; StackMap 1 (no liveness information available)
29 ; CHECK-LABEL:  .long L{{.*}}-_stackmap_liveness
30 ; CHECK-NEXT:   .short  0
31 ; CHECK-NEXT:   .short  0
32 ; Padding
33 ; CHECK-NEXT:   .short  0
34 ; Num LiveOut Entries: 0
35 ; CHECK-NEXT:   .short  0
36 ; Align
37 ; CHECK-NEXT:   .align  3
38
39 ; StackMap 1 (patchpoint liveness information enabled)
40 ; PATCH-LABEL:  .long L{{.*}}-_stackmap_liveness
41 ; PATCH-NEXT:   .short  0
42 ; PATCH-NEXT:   .short  0
43 ; Padding
44 ; PATCH-NEXT:   .short  0
45 ; Num LiveOut Entries: 1
46 ; PATCH-NEXT:   .short  1
47 ; LiveOut Entry 1: %YMM2 (16 bytes) --> %XMM2
48 ; PATCH-NEXT:   .short  19
49 ; PATCH-NEXT:   .byte 0
50 ; PATCH-NEXT:   .byte 16
51 ; Align
52 ; PATCH-NEXT:   .align  3
53   call anyregcc void (i64, i32, i8*, i32, ...) @llvm.experimental.patchpoint.void(i64 1, i32 12, i8* null, i32 0)
54   %a2 = call i64 asm sideeffect "", "={r8}"() nounwind
55   %a3 = call i8 asm sideeffect "", "={ah}"() nounwind
56   %a4 = call <4 x double> asm sideeffect "", "={ymm0}"() nounwind
57   %a5 = call <4 x double> asm sideeffect "", "={ymm1}"() nounwind
58
59 ; StackMap 2 (no liveness information available)
60 ; CHECK-LABEL:  .long L{{.*}}-_stackmap_liveness
61 ; CHECK-NEXT:   .short  0
62 ; CHECK-NEXT:   .short  0
63 ; Padding
64 ; CHECK-NEXT:   .short  0
65 ; Num LiveOut Entries: 0
66 ; CHECK-NEXT:   .short  0
67 ; Align
68 ; CHECK-NEXT:   .align  3
69
70 ; StackMap 2 (patchpoint liveness information enabled)
71 ; PATCH-LABEL:  .long L{{.*}}-_stackmap_liveness
72 ; PATCH-NEXT:   .short  0
73 ; PATCH-NEXT:   .short  0
74 ; Padding
75 ; PATCH-NEXT:   .short  0
76 ; Num LiveOut Entries: 5
77 ; PATCH-NEXT:   .short  5
78 ; LiveOut Entry 1: %RAX (1 bytes) --> %AL or %AH
79 ; PATCH-NEXT:   .short  0
80 ; PATCH-NEXT:   .byte 0
81 ; PATCH-NEXT:   .byte 1
82 ; LiveOut Entry 2: %R8 (8 bytes)
83 ; PATCH-NEXT:   .short  8
84 ; PATCH-NEXT:   .byte 0
85 ; PATCH-NEXT:   .byte 8
86 ; LiveOut Entry 3: %YMM0 (32 bytes)
87 ; PATCH-NEXT:   .short  17
88 ; PATCH-NEXT:   .byte 0
89 ; PATCH-NEXT:   .byte 32
90 ; LiveOut Entry 4: %YMM1 (32 bytes)
91 ; PATCH-NEXT:   .short  18
92 ; PATCH-NEXT:   .byte 0
93 ; PATCH-NEXT:   .byte 32
94 ; LiveOut Entry 5: %YMM2 (16 bytes) --> %XMM2
95 ; PATCH-NEXT:   .short  19
96 ; PATCH-NEXT:   .byte 0
97 ; PATCH-NEXT:   .byte 16
98 ; Align
99 ; PATCH-NEXT:   .align  3
100   call anyregcc void (i64, i32, i8*, i32, ...) @llvm.experimental.patchpoint.void(i64 2, i32 12, i8* null, i32 0)
101   call void asm sideeffect "", "{r8},{ah},{ymm0},{ymm1}"(i64 %a2, i8 %a3, <4 x double> %a4, <4 x double> %a5) nounwind
102
103 ; StackMap 3 (no liveness information available)
104 ; CHECK-LABEL:  .long L{{.*}}-_stackmap_liveness
105 ; CHECK-NEXT:   .short  0
106 ; CHECK-NEXT:   .short  0
107 ; Padding
108 ; CHECK-NEXT:   .short  0
109 ; Num LiveOut Entries: 0
110 ; CHECK-NEXT:   .short  0
111 ; Align
112 ; CHECK-NEXT:   .align  3
113
114 ; StackMap 3 (patchpoint liveness information enabled)
115 ; PATCH-LABEL:  .long L{{.*}}-_stackmap_liveness
116 ; PATCH-NEXT:   .short  0
117 ; PATCH-NEXT:   .short  0
118 ; Padding
119 ; PATCH-NEXT:   .short  0
120 ; Num LiveOut Entries: 2
121 ; PATCH-NEXT:   .short  2
122 ; LiveOut Entry 1: %RSP (8 bytes)
123 ; PATCH-NEXT:   .short  7
124 ; PATCH-NEXT:   .byte 0
125 ; PATCH-NEXT:   .byte 8
126 ; LiveOut Entry 2: %YMM2 (16 bytes) --> %XMM2
127 ; PATCH-NEXT:   .short  19
128 ; PATCH-NEXT:   .byte 0
129 ; PATCH-NEXT:   .byte 16
130 ; Align
131 ; PATCH-NEXT:   .align  3
132   call anyregcc void (i64, i32, i8*, i32, ...) @llvm.experimental.patchpoint.void(i64 3, i32 12, i8* null, i32 0)
133   call void asm sideeffect "", "{xmm2}"(<2 x double> %a1) nounwind
134   ret void
135 }
136
137 define void @mixed_liveness() {
138 entry:
139   %a1 = call <2 x double> asm sideeffect "", "={xmm2}"() nounwind
140 ; StackMap 4 (patchpoint liveness information enabled)
141 ; PATCH-LABEL:  .long L{{.*}}-_mixed_liveness
142 ; PATCH-NEXT:   .short  0
143 ; PATCH-NEXT:   .short  0
144 ; Padding
145 ; PATCH-NEXT:   .short  0
146 ; Num LiveOut Entries: 0
147 ; PATCH-NEXT:   .short  0
148 ; Align
149 ; PATCH-NEXT:   .align  3
150
151 ; StackMap 5 (patchpoint liveness information enabled)
152 ; PATCH-LABEL:  .long L{{.*}}-_mixed_liveness
153 ; PATCH-NEXT:   .short  0
154 ; PATCH-NEXT:   .short  0
155 ; Padding
156 ; PATCH-NEXT:   .short  0
157 ; Num LiveOut Entries: 2
158 ; PATCH-NEXT:   .short  2
159 ; LiveOut Entry 1: %RSP (8 bytes)
160 ; PATCH-NEXT:   .short  7
161 ; PATCH-NEXT:   .byte 0
162 ; PATCH-NEXT:   .byte 8
163 ; LiveOut Entry 2: %YMM2 (16 bytes) --> %XMM2
164 ; PATCH-NEXT:   .short  19
165 ; PATCH-NEXT:   .byte 0
166 ; PATCH-NEXT:   .byte 16
167 ; Align
168 ; PATCH-NEXT:   .align  3
169   call void (i64, i32, ...) @llvm.experimental.stackmap(i64 4, i32 5)
170   call anyregcc void (i64, i32, i8*, i32, ...) @llvm.experimental.patchpoint.void(i64 5, i32 0, i8* null, i32 0)
171   call void asm sideeffect "", "{xmm2}"(<2 x double> %a1) nounwind
172   ret void
173 }
174
175 declare void @llvm.experimental.stackmap(i64, i32, ...)
176 declare void @llvm.experimental.patchpoint.void(i64, i32, i8*, i32, ...)