Skip to content

Instantly share code, notes, and snippets.

@simonbyrne
Last active May 27, 2016 09:19
Show Gist options
  • Select an option

  • Save simonbyrne/026a6969a3316cf04aa95c5c75d9dacd to your computer and use it in GitHub Desktop.

Select an option

Save simonbyrne/026a6969a3316cf04aa95c5c75d9dacd to your computer and use it in GitHub Desktop.
@generated function convertg{T<:Integer}(::Type{Rational{T}}, x::Irrational)
o = precision(BigFloat)
p = 256
while true
setprecision(BigFloat, p)
bx = BigFloat(x())
r = rationalize(T, bx, tol=0)
if abs(BigFloat(r) - bx) > eps(bx)
setprecision(BigFloat, o)
return r
end
p += 32
end
end
Base.@pure function convertp{T<:Integer}(::Type{Rational{T}}, x::Irrational)
o = precision(BigFloat)
p = 256
while true
setprecision(BigFloat, p)
bx = BigFloat(x)
r = rationalize(T, bx, tol=0)
if abs(BigFloat(r) - bx) > eps(bx)
setprecision(BigFloat, o)
return r
end
p += 32
end
end
@code_llvm convertg(Rational{Int},pi)
@code_llvm convertp(Rational{Int},pi)
julia> @code_llvm convertg(Rational{Int},pi)
define void @julia_convertg_50037(%Rational* sret, %jl_value_t*) #0 {
top:
store %Rational { i64 2646693125139304345, i64 842468587426513207 }, %Rational* %0, align 8
ret void
}
julia> @code_llvm convertp(Rational{Int},pi)
define %jl_value_t* @julia_convertp_50046(%jl_value_t*) #0 {
top:
%1 = call %jl_value_t*** @jl_get_ptls_states()
%2 = alloca [16 x %jl_value_t*], align 8
%.sub = getelementptr inbounds [16 x %jl_value_t*], [16 x %jl_value_t*]* %2, i64 0, i64 0
%3 = getelementptr [16 x %jl_value_t*], [16 x %jl_value_t*]* %2, i64 0, i64 14
%4 = getelementptr [16 x %jl_value_t*], [16 x %jl_value_t*]* %2, i64 0, i64 2
%5 = getelementptr [16 x %jl_value_t*], [16 x %jl_value_t*]* %2, i64 0, i64 3
%6 = getelementptr [16 x %jl_value_t*], [16 x %jl_value_t*]* %2, i64 0, i64 4
%7 = getelementptr [16 x %jl_value_t*], [16 x %jl_value_t*]* %2, i64 0, i64 5
%8 = bitcast %jl_value_t** %4 to <4 x %jl_value_t*>*
store <4 x %jl_value_t*> zeroinitializer, <4 x %jl_value_t*>* %8, align 8
%9 = getelementptr [16 x %jl_value_t*], [16 x %jl_value_t*]* %2, i64 0, i64 6
%10 = getelementptr [16 x %jl_value_t*], [16 x %jl_value_t*]* %2, i64 0, i64 7
%11 = getelementptr [16 x %jl_value_t*], [16 x %jl_value_t*]* %2, i64 0, i64 8
%12 = getelementptr [16 x %jl_value_t*], [16 x %jl_value_t*]* %2, i64 0, i64 9
%13 = bitcast %jl_value_t** %9 to <4 x %jl_value_t*>*
store <4 x %jl_value_t*> zeroinitializer, <4 x %jl_value_t*>* %13, align 8
%14 = getelementptr [16 x %jl_value_t*], [16 x %jl_value_t*]* %2, i64 0, i64 10
%15 = getelementptr [16 x %jl_value_t*], [16 x %jl_value_t*]* %2, i64 0, i64 11
%16 = getelementptr [16 x %jl_value_t*], [16 x %jl_value_t*]* %2, i64 0, i64 12
%17 = getelementptr [16 x %jl_value_t*], [16 x %jl_value_t*]* %2, i64 0, i64 13
%18 = bitcast %jl_value_t** %14 to <4 x %jl_value_t*>*
store <4 x %jl_value_t*> zeroinitializer, <4 x %jl_value_t*>* %18, align 8
store %jl_value_t* null, %jl_value_t** %3, align 8
%19 = getelementptr [16 x %jl_value_t*], [16 x %jl_value_t*]* %2, i64 0, i64 15
store %jl_value_t* null, %jl_value_t** %19, align 8
%20 = bitcast [16 x %jl_value_t*]* %2 to i64*
store i64 28, i64* %20, align 8
%21 = bitcast %jl_value_t*** %1 to i64*
%22 = load i64, i64* %21, align 8
%23 = getelementptr [16 x %jl_value_t*], [16 x %jl_value_t*]* %2, i64 0, i64 1
%24 = bitcast %jl_value_t** %23 to i64*
store i64 %22, i64* %24, align 8
store %jl_value_t** %.sub, %jl_value_t*** %1, align 8
%25 = load i64, i64* inttoptr (i64 4670236728 to i64*), align 8
%26 = icmp eq i64 %25, 0
br i1 %26, label %oob, label %idxend
L: ; preds = %cont.11
%27 = add i64 %p.015, 32
%28 = call i64 @julia_setprecision_50001(%jl_value_t* inttoptr (i64 4637721616 to %jl_value_t*), i64 %27) #0
%29 = call %jl_value_t* @jlsys_convert_36725(%jl_value_t* inttoptr (i64 4637721616 to %jl_value_t*))
store %jl_value_t* %29, %jl_value_t** %4, align 8
%30 = call %jl_value_t* @jlsys_kwfunc_32538(%jl_value_t* inttoptr (i64 4692202912 to %jl_value_t*))
%31 = call %jl_value_t* inttoptr (i64 4559108400 to %jl_value_t* (%jl_value_t*, i64)*)(%jl_value_t* inttoptr (i64 4635003056 to %jl_value_t*), i64 2)
store %jl_value_t* %31, %jl_value_t** %5, align 8
%32 = getelementptr inbounds %jl_value_t, %jl_value_t* %31, i64 1
%33 = bitcast %jl_value_t* %32 to i64*
%34 = load i64, i64* %33, align 8
%35 = icmp eq i64 %34, 0
br i1 %35, label %oob.3.loopexit, label %idxend.4
oob: ; preds = %top
%36 = alloca i64, align 8
store i64 0, i64* %36, align 8
call void @jl_bounds_error_ints(%jl_value_t* inttoptr (i64 4670236720 to %jl_value_t*), i64* nonnull %36, i64 1)
unreachable
idxend: ; preds = %top
%37 = add i64 %25, -1
%38 = load i64*, i64** inttoptr (i64 4670236720 to i64**), align 16
%39 = getelementptr i64, i64* %38, i64 %37
%40 = load i64, i64* %39, align 8
%41 = call i64 @julia_setprecision_50001(%jl_value_t* inttoptr (i64 4637721616 to %jl_value_t*), i64 256) #0
%42 = call %jl_value_t* @jlsys_convert_36725(%jl_value_t* inttoptr (i64 4637721616 to %jl_value_t*))
store %jl_value_t* %42, %jl_value_t** %4, align 8
%43 = call %jl_value_t* @jlsys_kwfunc_32538(%jl_value_t* inttoptr (i64 4692202912 to %jl_value_t*))
%44 = call %jl_value_t* inttoptr (i64 4559108400 to %jl_value_t* (%jl_value_t*, i64)*)(%jl_value_t* inttoptr (i64 4635003056 to %jl_value_t*), i64 2)
store %jl_value_t* %44, %jl_value_t** %5, align 8
%45 = getelementptr inbounds %jl_value_t, %jl_value_t* %44, i64 1
%46 = bitcast %jl_value_t* %45 to i64*
%47 = load i64, i64* %46, align 8
%48 = icmp eq i64 %47, 0
br i1 %48, label %oob.3, label %idxend.4.preheader
idxend.4.preheader: ; preds = %idxend
br label %idxend.4
oob.3.loopexit: ; preds = %L
br label %oob.3
oob.3: ; preds = %oob.3.loopexit, %idxend
%.lcssa = phi %jl_value_t* [ %44, %idxend ], [ %31, %oob.3.loopexit ]
%49 = alloca i64, align 8
store i64 1, i64* %49, align 8
call void @jl_bounds_error_ints(%jl_value_t* %.lcssa, i64* nonnull %49, i64 1)
unreachable
idxend.4: ; preds = %idxend.4.preheader, %L
%50 = phi i64 [ %34, %L ], [ %47, %idxend.4.preheader ]
%51 = phi i64* [ %33, %L ], [ %46, %idxend.4.preheader ]
%52 = phi %jl_value_t* [ %31, %L ], [ %44, %idxend.4.preheader ]
%53 = phi %jl_value_t* [ %29, %L ], [ %42, %idxend.4.preheader ]
%p.015 = phi i64 [ %27, %L ], [ 256, %idxend.4.preheader ]
%54 = getelementptr inbounds %jl_value_t, %jl_value_t* %52, i64 2
%55 = bitcast %jl_value_t* %54 to i16*
%56 = load i16, i16* %55, align 2
%57 = and i16 %56, 3
%58 = icmp eq i16 %57, 3
br i1 %58, label %array_owned, label %merge_own
array_owned: ; preds = %idxend.4
%59 = getelementptr inbounds %jl_value_t, %jl_value_t* %52, i64 5, i32 0
%60 = load %jl_value_t*, %jl_value_t** %59, align 8
br label %merge_own
merge_own: ; preds = %array_owned, %idxend.4
%61 = phi %jl_value_t* [ %52, %idxend.4 ], [ %60, %array_owned ]
%62 = bitcast %jl_value_t* %52 to %jl_value_t***
%63 = load %jl_value_t**, %jl_value_t*** %62, align 8
%64 = getelementptr inbounds %jl_value_t, %jl_value_t* %61, i64 -1, i32 0
%65 = bitcast %jl_value_t** %64 to i64*
%66 = load i64, i64* %65, align 8
%67 = and i64 %66, 1
%68 = icmp eq i64 %67, 0
br i1 %68, label %cont, label %wb_may_trigger
wb_may_trigger: ; preds = %merge_own
%69 = load i64, i64* inttoptr (i64 13241959696 to i64*), align 16
%70 = and i64 %69, 1
%71 = icmp eq i64 %70, 0
br i1 %71, label %wb_trigger, label %cont
wb_trigger: ; preds = %wb_may_trigger
call void @jl_gc_queue_root(%jl_value_t* %61)
%.pre = load i64, i64* %51, align 8
br label %cont
cont: ; preds = %merge_own, %wb_trigger, %wb_may_trigger
%72 = phi i64 [ %50, %merge_own ], [ %.pre, %wb_trigger ], [ %50, %wb_may_trigger ]
store %jl_value_t* inttoptr (i64 13241959704 to %jl_value_t*), %jl_value_t** %63, align 8
%73 = icmp ugt i64 %72, 1
br i1 %73, label %idxend.6, label %oob.5
oob.5: ; preds = %cont
%74 = alloca i64, align 8
store i64 2, i64* %74, align 8
call void @jl_bounds_error_ints(%jl_value_t* %52, i64* nonnull %74, i64 1)
unreachable
idxend.6: ; preds = %cont
%75 = load i16, i16* %55, align 2
%76 = and i16 %75, 3
%77 = icmp eq i16 %76, 3
br i1 %77, label %array_owned7, label %merge_own8
array_owned7: ; preds = %idxend.6
%78 = getelementptr inbounds %jl_value_t, %jl_value_t* %52, i64 5, i32 0
%79 = load %jl_value_t*, %jl_value_t** %78, align 8
br label %merge_own8
merge_own8: ; preds = %array_owned7, %idxend.6
%80 = phi %jl_value_t* [ %52, %idxend.6 ], [ %79, %array_owned7 ]
%81 = load %jl_value_t**, %jl_value_t*** %62, align 8
%82 = getelementptr inbounds %jl_value_t, %jl_value_t* %80, i64 -1, i32 0
%83 = bitcast %jl_value_t** %82 to i64*
%84 = load i64, i64* %83, align 8
%85 = and i64 %84, 1
%86 = icmp eq i64 %85, 0
br i1 %86, label %cont.11, label %wb_may_trigger9
wb_may_trigger9: ; preds = %merge_own8
%87 = load i64, i64* inttoptr (i64 4635148376 to i64*), align 8
%88 = and i64 %87, 1
%89 = icmp eq i64 %88, 0
br i1 %89, label %wb_trigger10, label %cont.11
wb_trigger10: ; preds = %wb_may_trigger9
call void @jl_gc_queue_root(%jl_value_t* %80)
br label %cont.11
cont.11: ; preds = %merge_own8, %wb_trigger10, %wb_may_trigger9
%90 = getelementptr %jl_value_t*, %jl_value_t** %81, i64 1
store %jl_value_t* inttoptr (i64 4635148384 to %jl_value_t*), %jl_value_t** %90, align 8
store %jl_value_t* %53, %jl_value_t** %6, align 8
%91 = call %jl_value_t* @"julia_#rationalize_50003"(%jl_value_t* %52, %jl_value_t* inttoptr (i64 4635001712 to %jl_value_t*), %jl_value_t* %53) #0
store %jl_value_t* %91, %jl_value_t** %7, align 8
store %jl_value_t* %91, %jl_value_t** %19, align 8
store %jl_value_t* inttoptr (i64 4637721616 to %jl_value_t*), %jl_value_t** %3, align 8
%92 = call %jl_value_t* @jl_apply_generic(%jl_value_t** %3, i32 2)
store %jl_value_t* %92, %jl_value_t** %9, align 8
store %jl_value_t* %53, %jl_value_t** %10, align 8
%93 = call %jl_value_t* @julia_-_50010(%jl_value_t* %92, %jl_value_t* %53) #0
store %jl_value_t* %93, %jl_value_t** %11, align 8
%94 = getelementptr inbounds %jl_value_t, %jl_value_t* %93, i64 0, i32 0
%95 = call i32 inttoptr (i64 13256826688 to i32 (%jl_value_t**)*)(%jl_value_t** %94)
%96 = call %jl_value_t* @julia_-_50006(%jl_value_t* %93) #0
store %jl_value_t* %96, %jl_value_t** %12, align 8
%97 = icmp eq i32 %95, 0
%98 = select i1 %97, %jl_value_t* %93, %jl_value_t* %96
store %jl_value_t* %98, %jl_value_t** %14, align 8
store %jl_value_t* %53, %jl_value_t** %15, align 8
%99 = call %jl_value_t* @julia_eps_50004(%jl_value_t* %53) #0
store %jl_value_t* %99, %jl_value_t** %16, align 8
%100 = getelementptr inbounds %jl_value_t, %jl_value_t* %98, i64 0, i32 0
%101 = getelementptr inbounds %jl_value_t, %jl_value_t* %99, i64 0, i32 0
%102 = call i32 inttoptr (i64 13256672928 to i32 (%jl_value_t**, %jl_value_t**)*)(%jl_value_t** %100, %jl_value_t** %101)
%103 = icmp eq i32 %102, 0
br i1 %103, label %L, label %if
if: ; preds = %cont.11
%104 = call i64 @julia_setprecision_50001(%jl_value_t* inttoptr (i64 4637721616 to %jl_value_t*), i64 %40) #0
store %jl_value_t* %91, %jl_value_t** %17, align 8
%105 = load i64, i64* %24, align 8
store i64 %105, i64* %21, align 8
ret %jl_value_t* %91
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment