JuliaLang/julia

Unnecessary root for known permanently rooted types

Open

#22,423 opened on 2017年6月18日

GitHub で見る
 (2 comments) (0 reactions) (0 assignees)Julia (48,709 stars) (5,773 forks)batch import
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)

コントリビューターガイド