https://github.com/JuliaLang/julia/issues/8742
Let me know if it needs any changes. FWIW I'm on Julia 0.3.1, OS X. Cheers! *Sebastian Good* On Mon, Oct 20, 2014 at 11:43 AM, Jameson Nash <[email protected]> wrote: > Can you open an issue? It looks like it's still emitting a gc-frame, even > though it isn't using it. > > > On Monday, October 20, 2014, Sebastian Good < > [email protected]> wrote: > >> Your'e right! Sloppy case-minimizing-and-pasting; my apologies. I forgot >> to define the conversion. Try this >> >> julia> import Base.convert >> >> julia> bitstype 8 Foo >> >> julia> convert(::Type{Foo}, x::Uint8) = reinterpret(Foo, x) >> convert (generic function with 443 methods) >> >> julia> @code_llvm convert(Uint8, 0x10) >> >> define i8 @"julia_convert;19713"(%jl_value_t*, i8) { >> top: >> ret i8 %1, !dbg !741 >> } >> >> julia> @code_llvm convert(Foo, 0x10) >> >> define i8 @"julia_convert;19716"(%jl_value_t*, i8) { >> top: >> %2 = alloca [4 x %jl_value_t*], align 8 >> %.sub = getelementptr inbounds [4 x %jl_value_t*]* %2, i64 0, i64 0 >> store %jl_value_t* inttoptr (i64 4 to %jl_value_t*), %jl_value_t** >> %.sub, align 8 >> %3 = load %jl_value_t*** @jl_pgcstack, align 8, !dbg !751 >> %4 = getelementptr [4 x %jl_value_t*]* %2, i64 0, i64 1, !dbg !751 >> %.c = bitcast %jl_value_t** %3 to %jl_value_t*, !dbg !751 >> store %jl_value_t* %.c, %jl_value_t** %4, align 8, !dbg !751 >> store %jl_value_t** %.sub, %jl_value_t*** @jl_pgcstack, align 8, !dbg >> !751 >> %5 = getelementptr [4 x %jl_value_t*]* %2, i64 0, i64 2 >> store %jl_value_t* null, %jl_value_t** %5, align 8 >> %6 = getelementptr [4 x %jl_value_t*]* %2, i64 0, i64 3 >> store %jl_value_t* null, %jl_value_t** %6, align 8 >> %7 = load %jl_value_t** %4, align 8, !dbg !752 >> %8 = getelementptr inbounds %jl_value_t* %7, i64 0, i32 0, !dbg !752 >> store %jl_value_t** %8, %jl_value_t*** @jl_pgcstack, align 8, !dbg !752 >> ret i8 %1, !dbg !752 >> } >> >> julia> convert(Foo, 0x10) >> Foo(0x10) >> >> julia> convert(Uint8, 0x10) >> 0x10 >> >> >> *Sebastian Good* >> >> >> On Mon, Oct 20, 2014 at 11:29 AM, Stefan Karpinski <[email protected]> >> wrote: >> >>> julia> bitstype 8 Foo >>> >>> julia> convert(Foo, 100) >>> ERROR: `convert` has no method matching convert(::Type{Foo}, ::Int64) >>> in convert at base.jl:9 >>> >>> How fast do you want to raise an error? ;-) >>> >>> On Mon, Oct 20, 2014 at 11:18 AM, Sebastian Good < >>> [email protected]> wrote: >>> >>>> When I've run benchmarks with custom bitstypes, they seem to run very >>>> quickly. But I wouldn't have guessed it from the machine code I can preview >>>> at the REPL. Can anyone explain what I'm seeing here? (I'm dumping >>>> @code_llvm as it's more instructive; the @code_native is very large). >>>> Converting a constant number to a Uint8 is a one-operation function. >>>> Converting a constant number to a bitstype of the same size seems to do a >>>> lot more. >>>> >>>> julia> @code_llvm convert(Uint8, 100) >>>> >>>> define i8 @"julia_convert;19720"(%jl_value_t*, i64) { >>>> top: >>>> %2 = trunc i64 %1 to i8, !dbg !772, !julia_type !773 >>>> ret i8 %2, !dbg !772 >>>> } >>>> >>>> julia> bitstype 8 Foo >>>> julia> @code_llvm convert(Foo, 100) >>>> >>>> ; Function Attrs: noreturn >>>> define void @"julia_convert;19725"(%jl_value_t*, i64) #0 { >>>> top: >>>> %2 = alloca [5 x %jl_value_t*], align 8 >>>> %.sub = getelementptr inbounds [5 x %jl_value_t*]* %2, i64 0, i64 0 >>>> %3 = getelementptr [5 x %jl_value_t*]* %2, i64 0, i64 2, !dbg !776 >>>> store %jl_value_t* inttoptr (i64 6 to %jl_value_t*), %jl_value_t** >>>> %.sub, align 8 >>>> %4 = load %jl_value_t*** @jl_pgcstack, align 8, !dbg !776 >>>> %5 = getelementptr [5 x %jl_value_t*]* %2, i64 0, i64 1, !dbg !776 >>>> %.c = bitcast %jl_value_t** %4 to %jl_value_t*, !dbg !776 >>>> store %jl_value_t* %.c, %jl_value_t** %5, align 8, !dbg !776 >>>> store %jl_value_t** %.sub, %jl_value_t*** @jl_pgcstack, align 8, !dbg >>>> !776 >>>> store %jl_value_t* null, %jl_value_t** %3, align 8 >>>> %6 = getelementptr [5 x %jl_value_t*]* %2, i64 0, i64 3 >>>> store %jl_value_t* null, %jl_value_t** %6, align 8 >>>> %7 = getelementptr [5 x %jl_value_t*]* %2, i64 0, i64 4 >>>> store %jl_value_t* null, %jl_value_t** %7, align 8 >>>> %8 = load %jl_value_t** inttoptr (i64 140384830597872 to >>>> %jl_value_t**), align 16, !dbg !777 >>>> %9 = getelementptr inbounds %jl_value_t* %8, i64 1, i32 0, !dbg !777 >>>> %10 = load %jl_value_t** %9, align 8, !dbg !777, !tbaa %jtbaa_func >>>> %11 = bitcast %jl_value_t* %10 to %jl_value_t* (%jl_value_t*, >>>> %jl_value_t**, i32)*, !dbg !777 >>>> store %jl_value_t* %0, %jl_value_t** %3, align 8, !dbg !777 >>>> %12 = call %jl_value_t* @jl_box_int64(i64 %1), !dbg !777 >>>> store %jl_value_t* %12, %jl_value_t** %6, align 8, !dbg !777 >>>> %13 = load %jl_value_t** inttoptr (i64 140384825150528 to >>>> %jl_value_t**), align 64, !dbg !777 >>>> store %jl_value_t* %13, %jl_value_t** %7, align 8, !dbg !777 >>>> %14 = call %jl_value_t* %11(%jl_value_t* %8, %jl_value_t** %3, i32 >>>> 3), !dbg !777 >>>> %15 = load %jl_value_t** %5, align 8, !dbg !777 >>>> %16 = getelementptr inbounds %jl_value_t* %15, i64 0, i32 0, !dbg !777 >>>> store %jl_value_t** %16, %jl_value_t*** @jl_pgcstack, align 8, !dbg >>>> !777 >>>> ret void, !dbg !777 >>>> } >>>> >>>> >>> >>
