JuliaLang/julia

Unnecessary root for known permanently rooted types

Ouverte

#22 423 ouverte le 18 juin 2017

 (2 commentaires) (0 réaction) (0 personne assignée)Julia (5 773 forks)batch import
compiler:codegenhelp wanted

Métriques du dépôt

Stars
 (48 709 étoiles)
Métriques de merge PR
 (Merge moyen 20j 6h) (157 PRs mergées en 30 j)

Description

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)

Guide contributeur