@@ -12,14 +12,19 @@ target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
1212
1313# CHECK-LABEL: @return_obj
1414# CHECK-NOT: @julia.gc_alloc_obj
15- # CHECK: %v = call noalias nonnull {} addrspace(10)* @ijl_gc_pool_alloc
16- # CHECK: store atomic {} addrspace(10)* @tag, {} addrspace(10)* addrspace(10)* {{.*}} unordered, align 8, !tbaa !0
15+ # CHECK: %current_task = getelementptr inbounds {}*, {}** %gcstack, i64 -12
16+ # CHECK-NEXT: [[ptls_field:%.*]] = getelementptr inbounds {}*, {}** %current_task, i64 14
17+ # CHECK-NEXT: [[ptls_load:%.*]] = load {}*, {}** [[ptls_field]], align 8, !tbaa !0
18+ # CHECK-NEXT: [[ppjl_ptls:%.*]] = bitcast {}* [[ptls_load]] to {}**
19+ # CHECK-NEXT: [[ptls_i8:%.*]] = bitcast {}** [[ppjl_ptls]] to i8*
20+ # CHECK-NEXT: %v = call noalias nonnull {} addrspace(10)* @ijl_gc_pool_alloc(i8* [[ptls_i8]], i32 [[SIZE_T:[0-9]+]], i32 16)
21+ # CHECK: store atomic {} addrspace(10)* @tag, {} addrspace(10)* addrspace(10)* {{.*}} unordered, align 8, !tbaa !4
1722println ("""
1823define {} addrspace(10)* @return_obj() {
1924 %pgcstack = call {}*** @julia.get_pgcstack()
20- %ptls = call {}*** @julia.ptls_states()
21- %ptls_i8 = bitcast {}*** %ptls to i8*
22- %v = call noalias {} addrspace(10)* @julia.gc_alloc_obj(i8* %ptls_i8 , $isz 8, {} addrspace(10)* @tag)
25+ %gcstack = bitcast {}*** %pgcstack to {}**
26+ %current_task = getelementptr inbounds {}*, {} ** %gcstack, i64 -12
27+ %v = call noalias {} addrspace(10)* @julia.gc_alloc_obj({}** %current_task , $isz 8, {} addrspace(10)* @tag)
2328 ret {} addrspace(10)* %v
2429}
2530""" )
@@ -35,9 +40,9 @@ define {} addrspace(10)* @return_obj() {
3540println ("""
3641define i64 @return_load(i64 %i) {
3742 %pgcstack = call {}*** @julia.get_pgcstack()
38- %ptls = call {}*** @julia.ptls_states()
39- %ptls_i8 = bitcast {}*** %ptls to i8*
40- %v = call noalias {} addrspace(10)* @julia.gc_alloc_obj(i8* %ptls_i8 , $isz 8, {} addrspace(10)* @tag)
43+ %gcstack = bitcast {}*** %pgcstack to {}**
44+ %current_task = getelementptr inbounds {}*, {} ** %gcstack, i64 -12
45+ %v = call noalias {} addrspace(10)* @julia.gc_alloc_obj({}** %current_task , $isz 8, {} addrspace(10)* @tag)
4146 %v64 = bitcast {} addrspace(10)* %v to i64 addrspace(10)*
4247 %v64a11 = addrspacecast i64 addrspace(10)* %v64 to i64 addrspace(11)*
4348 store i64 %i, i64 addrspace(11)* %v64a11, align 16, !tbaa !4
@@ -50,16 +55,15 @@ define i64 @return_load(i64 %i) {
5055
5156# CHECK-LABEL: @ccall_obj
5257# CHECK: call {}*** @julia.get_pgcstack()
53- # CHECK: call {}*** @julia.ptls_states()
5458# CHECK-NOT: @julia.gc_alloc_obj
5559# CHECK: @ijl_gc_pool_alloc
56- # CHECK: store atomic {} addrspace(10)* @tag, {} addrspace(10)* addrspace(10)* {{.*}} unordered, align 8, !tbaa !0
60+ # CHECK: store atomic {} addrspace(10)* @tag, {} addrspace(10)* addrspace(10)* {{.*}} unordered, align 8, !tbaa !4
5761println ("""
5862define void @ccall_obj(i8* %fptr) {
5963 %pgcstack = call {}*** @julia.get_pgcstack()
60- %ptls = call {}*** @julia.ptls_states()
61- %ptls_i8 = bitcast {}*** %ptls to i8*
62- %v = call noalias {} addrspace(10)* @julia.gc_alloc_obj(i8* %ptls_i8 , $isz 8, {} addrspace(10)* @tag)
64+ %gcstack = bitcast {}*** %pgcstack to {}**
65+ %current_task = getelementptr inbounds {}*, {} ** %gcstack, i64 -12
66+ %v = call noalias {} addrspace(10)* @julia.gc_alloc_obj({}** %current_task , $isz 8, {} addrspace(10)* @tag)
6367 %f = bitcast i8* %fptr to void ({} addrspace(10)*)*
6468 call void %f({} addrspace(10)* %v)
6569 ret void
@@ -70,7 +74,6 @@ define void @ccall_obj(i8* %fptr) {
7074# CHECK-LABEL: @ccall_ptr
7175# CHECK: alloca i64
7276# CHECK: call {}*** @julia.get_pgcstack()
73- # CHECK: call {}*** @julia.ptls_states()
7477# CHECK-NOT: @julia.gc_alloc_obj
7578# CHECK-NOT: @jl_gc_pool_alloc
7679# CHECK: call void @llvm.lifetime.start{{.*}}(i64 8, i8*
@@ -81,9 +84,9 @@ define void @ccall_obj(i8* %fptr) {
8184println ("""
8285define void @ccall_ptr(i8* %fptr) {
8386 %pgcstack = call {}*** @julia.get_pgcstack()
84- %ptls = call {}*** @julia.ptls_states()
85- %ptls_i8 = bitcast {}*** %ptls to i8*
86- %v = call noalias {} addrspace(10)* @julia.gc_alloc_obj(i8* %ptls_i8 , $isz 8, {} addrspace(10)* @tag)
87+ %gcstack = bitcast {}*** %pgcstack to {}**
88+ %current_task = getelementptr inbounds {}*, {} ** %gcstack, i64 -12
89+ %v = call noalias {} addrspace(10)* @julia.gc_alloc_obj({}** %current_task , $isz 8, {} addrspace(10)* @tag)
8790 %va = addrspacecast {} addrspace(10)* %v to {} addrspace(11)*
8891 %ptrj = call {}* @julia.pointer_from_objref({} addrspace(11)* %va)
8992 %ptr = bitcast {}* %ptrj to i8*
@@ -96,16 +99,15 @@ define void @ccall_ptr(i8* %fptr) {
9699
97100# CHECK-LABEL: @ccall_unknown_bundle
98101# CHECK: call {}*** @julia.get_pgcstack()
99- # CHECK: call {}*** @julia.ptls_states()
100102# CHECK-NOT: @julia.gc_alloc_obj
101103# CHECK: @ijl_gc_pool_alloc
102- # CHECK: store atomic {} addrspace(10)* @tag, {} addrspace(10)* addrspace(10)* {{.*}} unordered, align 8, !tbaa !0
104+ # CHECK: store atomic {} addrspace(10)* @tag, {} addrspace(10)* addrspace(10)* {{.*}} unordered, align 8, !tbaa !4
103105println ("""
104106define void @ccall_unknown_bundle(i8* %fptr) {
105107 %pgcstack = call {}*** @julia.get_pgcstack()
106- %ptls = call {}*** @julia.ptls_states()
107- %ptls_i8 = bitcast {}*** %ptls to i8*
108- %v = call noalias {} addrspace(10)* @julia.gc_alloc_obj(i8* %ptls_i8 , $isz 8, {} addrspace(10)* @tag)
108+ %gcstack = bitcast {}*** %pgcstack to {}**
109+ %current_task = getelementptr inbounds {}*, {} ** %gcstack, i64 -12
110+ %v = call noalias {} addrspace(10)* @julia.gc_alloc_obj({}** %current_task , $isz 8, {} addrspace(10)* @tag)
109111 %va = addrspacecast {} addrspace(10)* %v to {} addrspace(11)*
110112 %ptrj = call {}* @julia.pointer_from_objref({} addrspace(11)* %va)
111113 %ptr = bitcast {}* %ptrj to i8*
@@ -119,7 +121,6 @@ define void @ccall_unknown_bundle(i8* %fptr) {
119121# CHECK-LABEL: @lifetime_branches
120122# CHECK: alloca i64
121123# CHECK: call {}*** @julia.get_pgcstack()
122- # CHECK: call {}*** @julia.ptls_states()
123124# CHECK: L1:
124125# CHECK-NEXT: call void @llvm.lifetime.start{{.*}}(i64 8,
125126# CHECK: %f = bitcast i8* %fptr to void (i8*)*
@@ -136,12 +137,12 @@ define void @ccall_unknown_bundle(i8* %fptr) {
136137println ("""
137138define void @lifetime_branches(i8* %fptr, i1 %b, i1 %b2) {
138139 %pgcstack = call {}*** @julia.get_pgcstack()
139- %ptls = call {}*** @julia.ptls_states()
140- %ptls_i8 = bitcast {}*** %ptls to i8*
140+ %gcstack = bitcast {}*** %pgcstack to {}**
141+ %current_task = getelementptr inbounds {}*, {} ** %gcstack, i64 -12
141142 br i1 %b, label %L1, label %L3
142143
143144L1:
144- %v = call noalias {} addrspace(10)* @julia.gc_alloc_obj(i8* %ptls_i8 , $isz 8, {} addrspace(10)* @tag)
145+ %v = call noalias {} addrspace(10)* @julia.gc_alloc_obj({}** %current_task , $isz 8, {} addrspace(10)* @tag)
145146 %va = addrspacecast {} addrspace(10)* %v to {} addrspace(11)*
146147 %ptrj = call {}* @julia.pointer_from_objref({} addrspace(11)* %va)
147148 %ptr = bitcast {}* %ptrj to i8*
@@ -162,16 +163,15 @@ L3:
162163
163164# CHECK-LABEL: @object_field
164165# CHECK: call {}*** @julia.get_pgcstack()
165- # CHECK: call {}*** @julia.ptls_states()
166166# CHECK-NOT: @julia.gc_alloc_obj
167167# CHECK-NOT: @jl_gc_pool_alloc
168- # CHECK-NOT: store {} addrspace(10)* @tag, {} addrspace(10)* addrspace(10)* {{.*}}, align 8, !tbaa !0
168+ # CHECK-NOT: store {} addrspace(10)* @tag, {} addrspace(10)* addrspace(10)* {{.*}}, align 8, !tbaa !4
169169println ("""
170170define void @object_field({} addrspace(10)* %field) {
171171 %pgcstack = call {}*** @julia.get_pgcstack()
172- %ptls = call {}*** @julia.ptls_states()
173- %ptls_i8 = bitcast {}*** %ptls to i8*
174- %v = call noalias {} addrspace(10)* @julia.gc_alloc_obj(i8* %ptls_i8 , $isz 8, {} addrspace(10)* @tag)
172+ %gcstack = bitcast {}*** %pgcstack to {}**
173+ %current_task = getelementptr inbounds {}*, {} ** %gcstack, i64 -12
174+ %v = call noalias {} addrspace(10)* @julia.gc_alloc_obj({}** %current_task , $isz 8, {} addrspace(10)* @tag)
175175 %va = addrspacecast {} addrspace(10)* %v to {} addrspace(11)*
176176 %vab = bitcast {} addrspace(11)* %va to {} addrspace(10)* addrspace(11)*
177177 store {} addrspace(10)* %field, {} addrspace(10)* addrspace(11)* %vab, align 8
@@ -183,17 +183,16 @@ define void @object_field({} addrspace(10)* %field) {
183183# CHECK-LABEL: @memcpy_opt
184184# CHECK: alloca [16 x i8], align 16
185185# CHECK: call {}*** @julia.get_pgcstack()
186- # CHECK: call {}*** @julia.ptls_states()
187186# CHECK-NOT: @julia.gc_alloc_obj
188187# CHECK-NOT: @jl_gc_pool_alloc
189188# CHECK: call void @llvm.memcpy.p0i8.p0i8.i64
190189println ("""
191190define void @memcpy_opt(i8* %v22) {
192191top:
193192 %pgcstack = call {}*** @julia.get_pgcstack()
194- %v6 = call {}*** @julia.ptls_states()
195- %v18 = bitcast {}*** %v6 to i8*
196- %v19 = call noalias {} addrspace(10)* @julia.gc_alloc_obj(i8* %v18 , $isz 16, {} addrspace(10)* @tag)
193+ %gcstack = bitcast {}*** %pgcstack to {}**
194+ %current_task = getelementptr inbounds {}*, {} ** %gcstack, i64 -12
195+ %v19 = call noalias {} addrspace(10)* @julia.gc_alloc_obj({}** %current_task , $isz 16, {} addrspace(10)* @tag)
197196 %v20 = bitcast {} addrspace(10)* %v19 to i8 addrspace(10)*
198197 %v21 = addrspacecast i8 addrspace(10)* %v20 to i8 addrspace(11)*
199198 call void @llvm.memcpy.p11i8.p0i8.i64(i8 addrspace(11)* %v21, i8* %v22, i64 16, i32 8, i1 false)
204203
205204# CHECK-LABEL: @preserve_opt
206205# CHECK: call {}*** @julia.get_pgcstack()
207- # CHECK: call {}*** @julia.ptls_states()
208206# CHECK-NOT: @julia.gc_alloc_obj
209207# CHECK-NOT: @jl_gc_pool_alloc
210208# CHECK-NOT: @llvm.lifetime.end
@@ -213,9 +211,9 @@ println("""
213211define void @preserve_opt(i8* %v22) {
214212top:
215213 %pgcstack = call {}*** @julia.get_pgcstack()
216- %v6 = call {}*** @julia.ptls_states()
217- %v18 = bitcast {}*** %v6 to i8*
218- %v19 = call noalias {} addrspace(10)* @julia.gc_alloc_obj(i8* %v18 , $isz 16, {} addrspace(10)* @tag)
214+ %gcstack = bitcast {}*** %pgcstack to {}**
215+ %current_task = getelementptr inbounds {}*, {} ** %gcstack, i64 -12
216+ %v19 = call noalias {} addrspace(10)* @julia.gc_alloc_obj({}** %current_task , $isz 16, {} addrspace(10)* @tag)
219217 %v20 = bitcast {} addrspace(10)* %v19 to i8 addrspace(10)*
220218 %v21 = addrspacecast i8 addrspace(10)* %v20 to i8 addrspace(11)*
221219 %tok = call token (...) @llvm.julia.gc_preserve_begin({} addrspace(10)* %v19)
229227
230228# CHECK-LABEL: @preserve_branches
231229# CHECK: call {}*** @julia.get_pgcstack()
232- # CHECK: call {}*** @julia.ptls_states()
233230# CHECK: L1:
234231# CHECK-NEXT: @external_function()
235232# CHECK-NEXT: br i1 %b2, label %L2, label %L3
@@ -242,12 +239,12 @@ top:
242239println ("""
243240define void @preserve_branches(i8* %fptr, i1 %b, i1 %b2) {
244241 %pgcstack = call {}*** @julia.get_pgcstack()
245- %ptls = call {}*** @julia.ptls_states()
246- %ptls_i8 = bitcast {}*** %ptls to i8*
242+ %gcstack = bitcast {}*** %pgcstack to {}**
243+ %current_task = getelementptr inbounds {}*, {} ** %gcstack, i64 -12
247244 br i1 %b, label %L1, label %L3
248245
249246L1:
250- %v = call noalias {} addrspace(10)* @julia.gc_alloc_obj(i8* %ptls_i8 , $isz 8, {} addrspace(10)* @tag)
247+ %v = call noalias {} addrspace(10)* @julia.gc_alloc_obj({}** %current_task , $isz 8, {} addrspace(10)* @tag)
251248 %tok = call token (...) @llvm.julia.gc_preserve_begin({} addrspace(10)* %v)
252249 call void @external_function()
253250 br i1 %b2, label %L2, label %L3
266263# CHECK: declare noalias nonnull {} addrspace(10)* @ijl_gc_big_alloc(i8*,
267264println ("""
268265declare void @external_function()
269- declare {}*** @julia.ptls_states()
270266declare {}*** @julia.get_pgcstack()
271- declare noalias nonnull {} addrspace(10)* @julia.gc_alloc_obj(i8 *, $isz , {} addrspace(10)*)
267+ declare noalias nonnull {} addrspace(10)* @julia.gc_alloc_obj({}* *, $isz , {} addrspace(10)*)
272268declare {}* @julia.pointer_from_objref({} addrspace(11)*)
273269declare void @llvm.memcpy.p11i8.p0i8.i64(i8 addrspace(11)* nocapture writeonly, i8* nocapture readonly, i64, i32, i1)
274270declare token @llvm.julia.gc_preserve_begin(...)
0 commit comments