compiler:codegenhelp wanted
説明
E.g. for Symbols. The following shouldn't need a root.
julia> @noinline f() = Symbol("a")
f (generic function with 1 method)
julia> @noinline g(a) = a
g (generic function with 1 method)
julia> k() = g(f())
k (generic function with 1 method)
julia> @code_llvm k()
define %jl_value_t addrspace(10)* @julia_k_63178() #0 !dbg !5 {
top:
%gcframe2 = alloca [3 x %jl_value_t addrspace(10)*], align 8
%gcframe2.sub = getelementptr inbounds [3 x %jl_value_t addrspace(10)*], [3 x %jl_value_t addrspace(10)*]* %gcframe2, i64 0, i64 0
%0 = getelementptr inbounds [3 x %jl_value_t addrspace(10)*], [3 x %jl_value_t addrspace(10)*]* %gcframe2, i64 0, i64 1
%1 = bitcast %jl_value_t addrspace(10)** %0 to i8*
call void @llvm.memset.p0i8.i32(i8* %1, i8 0, i32 16, i32 8, i1 false)
%ptls_i8 = call i8* asm "movq %fs:0, $0;\0Aaddq $$-10928, $0", "=r,~{dirflag},~{fpsr},~{flags}"() #2
%2 = bitcast [3 x %jl_value_t addrspace(10)*]* %gcframe2 to i64*
store i64 2, i64* %2, align 8
%3 = getelementptr inbounds [3 x %jl_value_t addrspace(10)*], [3 x %jl_value_t addrspace(10)*]* %gcframe2, i64 0, i64 1
%4 = bitcast i8* %ptls_i8 to i64*
%5 = load i64, i64* %4, align 8
%6 = bitcast %jl_value_t addrspace(10)** %3 to i64*
store i64 %5, i64* %6, align 8
%7 = bitcast i8* %ptls_i8 to %jl_value_t addrspace(10)***
store %jl_value_t addrspace(10)** %gcframe2.sub, %jl_value_t addrspace(10)*** %7, align 8
%8 = call %jl_value_t addrspace(10)* @julia_f_63180()
%9 = getelementptr inbounds [3 x %jl_value_t addrspace(10)*], [3 x %jl_value_t addrspace(10)*]* %gcframe2, i64 0, i64 2
store %jl_value_t addrspace(10)* %8, %jl_value_t addrspace(10)** %9, align 8
%10 = call %jl_value_t addrspace(10)* @julia_g_63179(%jl_value_t addrspace(10)* %8)
%11 = load %jl_value_t addrspace(10)*, %jl_value_t addrspace(10)** %3, align 8
%12 = bitcast i8* %ptls_i8 to %jl_value_t addrspace(10)**
store %jl_value_t addrspace(10)* %11, %jl_value_t addrspace(10)** %12, align 8
ret %jl_value_t addrspace(10)* %10
}
A rough test shows that singleton, leaftypes are handled already. Known cached box isn't yet. I.e.
julia> @noinline f(::ANY) = sin(1)
f (generic function with 1 method)
julia> g() = f(1)
g (generic function with 1 method)