Skip to content

Reuse gcframe for jlcall #22417

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
yuyichao opened this issue Jun 18, 2017 · 0 comments
Open

Reuse gcframe for jlcall #22417

yuyichao opened this issue Jun 18, 2017 · 0 comments
Labels
compiler:codegen Generation of LLVM IR and native code

Comments

@yuyichao
Copy link
Contributor

jlcall is not using gcframe anymore after #21888 . With

julia> @noinline g2(a...) = a[1][]
g2 (generic function with 1 method)

julia> f2() = g2(Ref(1))
f2 (generic function with 1 method)

code_llvm

define i64 @julia_f2_63184() #0 !dbg !5 {
top:
  %0 = alloca [2 x %jl_value_t addrspace(10)*], align 8
  %gcframe2 = alloca [4 x %jl_value_t addrspace(10)*], align 8
  %gcframe2.sub = getelementptr inbounds [4 x %jl_value_t addrspace(10)*], [4 x %jl_value_t addrspace(10)*]* %gcframe2, i64 0, i64 0
  %.sub = getelementptr inbounds [2 x %jl_value_t addrspace(10)*], [2 x %jl_value_t addrspace(10)*]* %0, i64 0, i64 0
  %gcroot1 = getelementptr inbounds [4 x %jl_value_t addrspace(10)*], [4 x %jl_value_t addrspace(10)*]* %gcframe2, i64 0, i64 2
  %1 = getelementptr inbounds [4 x %jl_value_t addrspace(10)*], [4 x %jl_value_t addrspace(10)*]* %gcframe2, i64 0, i64 1
  %2 = bitcast %jl_value_t addrspace(10)** %1 to i8*
  call void @llvm.memset.p0i8.i32(i8* %2, i8 0, i32 24, i32 8, i1 false)
  %ptls_i8 = call i8* asm "movq %fs:0, $0;\0Aaddq $$-10928, $0", "=r,~{dirflag},~{fpsr},~{flags}"() #2
  %3 = bitcast [4 x %jl_value_t addrspace(10)*]* %gcframe2 to i64*
  store i64 4, i64* %3, align 8
  %4 = getelementptr inbounds [4 x %jl_value_t addrspace(10)*], [4 x %jl_value_t addrspace(10)*]* %gcframe2, i64 0, i64 1
  %5 = bitcast i8* %ptls_i8 to i64*
  %6 = load i64, i64* %5, align 8
  %7 = bitcast %jl_value_t addrspace(10)** %4 to i64*
  store i64 %6, i64* %7, align 8
  %8 = bitcast i8* %ptls_i8 to %jl_value_t addrspace(10)***
  store %jl_value_t addrspace(10)** %gcframe2.sub, %jl_value_t addrspace(10)*** %8, align 8
  %9 = call %jl_value_t addrspace(10)* @jl_gc_pool_alloc(i8* %ptls_i8, i32 1432, i32 16)
  %10 = addrspacecast %jl_value_t addrspace(10)* %9 to %jl_value_t addrspace(11)*
  %11 = bitcast %jl_value_t addrspace(11)* %10 to %jl_value_t addrspace(10)* addrspace(11)*
  %12 = getelementptr %jl_value_t addrspace(10)*, %jl_value_t addrspace(10)* addrspace(11)* %11, i64 -1
  store %jl_value_t addrspace(10)* addrspacecast (%jl_value_t* inttoptr (i64 140124422927792 to %jl_value_t*) to %jl_value_t addrspace(10)*), %jl_value_t addrspace(10)* addrspace(11)* %12, align 8
  %13 = bitcast %jl_value_t addrspace(10)* %9 to i64 addrspace(10)*
  %14 = addrspacecast i64 addrspace(10)* %13 to i64 addrspace(11)*
  store i64 1, i64 addrspace(11)* %14, align 16
  %15 = getelementptr inbounds [4 x %jl_value_t addrspace(10)*], [4 x %jl_value_t addrspace(10)*]* %gcframe2, i64 0, i64 3
  store %jl_value_t addrspace(10)* %9, %jl_value_t addrspace(10)** %15, align 8
  store %jl_value_t addrspace(10)* addrspacecast (%jl_value_t* inttoptr (i64 140124422078488 to %jl_value_t*) to %jl_value_t addrspace(10)*), %jl_value_t addrspace(10)** %.sub, align 8
  %16 = getelementptr inbounds [2 x %jl_value_t addrspace(10)*], [2 x %jl_value_t addrspace(10)*]* %0, i64 0, i64 1
  store %jl_value_t addrspace(10)* %9, %jl_value_t addrspace(10)** %16, align 8
  %17 = call %jl_value_t addrspace(10)* @jl_invoke(%jl_value_t addrspace(10)* addrspacecast (%jl_value_t* inttoptr (i64 140123895890192 to %jl_value_t*) to %jl_value_t addrspace(10)*), %jl_value_t addrspace(10)** %.sub, i32 2)
  store %jl_value_t addrspace(10)* %17, %jl_value_t addrspace(10)** %gcroot1, align 8
  store %jl_value_t addrspace(10)* %17, %jl_value_t addrspace(10)** %15, align 8
  %18 = bitcast %jl_value_t addrspace(10)* %17 to i64 addrspace(10)*
  %19 = load i64, i64 addrspace(10)* %18, align 16
  %20 = load %jl_value_t addrspace(10)*, %jl_value_t addrspace(10)** %4, align 8
  %21 = bitcast i8* %ptls_i8 to %jl_value_t addrspace(10)**
  store %jl_value_t addrspace(10)* %20, %jl_value_t addrspace(10)** %21, align 8
  ret i64 %19
}

Two alloca are created for jlcall and gcframe separately.

%0 = alloca [2 x %jl_value_t addrspace(10)*], align 8
%gcframe2 = alloca [4 x %jl_value_t addrspace(10)*], align 8

This could be related to #14779 (which means that the gcframe content could change after a jlcall)

@ararslan ararslan added the GC Garbage collector label Jun 18, 2017
@yuyichao yuyichao added compiler:codegen Generation of LLVM IR and native code and removed GC Garbage collector labels Jun 18, 2017
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
compiler:codegen Generation of LLVM IR and native code
Projects
None yet
Development

No branches or pull requests

2 participants