Last active
May 27, 2016 09:19
-
-
Save simonbyrne/026a6969a3316cf04aa95c5c75d9dacd to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| @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) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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