Created
September 17, 2016 21:45
-
-
Save johnmyleswhite/7484870a0f3656c735ae38bd1d5a0268 to your computer and use it in GitHub Desktop.
Keyword Arguments and Method Specialization
This file contains 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> function foo(x; y = 0) | |
return x + y | |
end | |
foo (generic function with 1 method) | |
julia> foo(0, y = 1) | |
1 | |
julia> foo(0, y = 1.0) | |
1.0 | |
julia> @code_llvm foo(0, y = 1) | |
define %jl_value_t* @"julia_#foo_70162"(%jl_value_t*, i64) #0 { | |
top: | |
%2 = call %jl_value_t*** @jl_get_ptls_states() #1 | |
%3 = alloca [15 x %jl_value_t*], align 8 | |
%.sub = getelementptr inbounds [15 x %jl_value_t*], [15 x %jl_value_t*]* %3, i64 0, i64 0 | |
%4 = getelementptr [15 x %jl_value_t*], [15 x %jl_value_t*]* %3, i64 0, i64 12 | |
%5 = getelementptr [15 x %jl_value_t*], [15 x %jl_value_t*]* %3, i64 0, i64 2 | |
%y = getelementptr [15 x %jl_value_t*], [15 x %jl_value_t*]* %3, i64 0, i64 5 | |
%6 = getelementptr [15 x %jl_value_t*], [15 x %jl_value_t*]* %3, i64 0, i64 11 | |
%7 = bitcast %jl_value_t** %4 to i8* | |
call void @llvm.memset.p0i8.i32(i8* %7, i8 0, i32 24, i32 8, i1 false) | |
%8 = bitcast [15 x %jl_value_t*]* %3 to i64* | |
%9 = bitcast %jl_value_t** %5 to i8* | |
call void @llvm.memset.p0i8.i64(i8* %9, i8 0, i64 72, i32 8, i1 false) | |
store i64 26, i64* %8, align 8 | |
%10 = bitcast %jl_value_t*** %2 to i64* | |
%11 = load i64, i64* %10, align 8 | |
%12 = getelementptr [15 x %jl_value_t*], [15 x %jl_value_t*]* %3, i64 0, i64 1 | |
%13 = bitcast %jl_value_t** %12 to i64* | |
store i64 %11, i64* %13, align 8 | |
store %jl_value_t** %.sub, %jl_value_t*** %2, align 8 | |
store %jl_value_t* null, %jl_value_t** %6, align 8 | |
%14 = getelementptr [15 x %jl_value_t*], [15 x %jl_value_t*]* %3, i64 0, i64 13 | |
store %jl_value_t* inttoptr (i64 4479271008 to %jl_value_t*), %jl_value_t** %y, align 8 | |
%15 = getelementptr inbounds %jl_value_t, %jl_value_t* %0, i64 1 | |
%16 = bitcast %jl_value_t* %15 to i64* | |
%17 = load i64, i64* %16, align 8 | |
%18 = ashr i64 %17, 1 | |
%19 = icmp slt i64 %18, 1 | |
br i1 %19, label %L7, label %if.lr.ph | |
if.lr.ph: ; preds = %top | |
%20 = getelementptr [15 x %jl_value_t*], [15 x %jl_value_t*]* %3, i64 0, i64 3 | |
%21 = getelementptr [15 x %jl_value_t*], [15 x %jl_value_t*]* %3, i64 0, i64 4 | |
%22 = getelementptr [15 x %jl_value_t*], [15 x %jl_value_t*]* %3, i64 0, i64 6 | |
%23 = getelementptr [15 x %jl_value_t*], [15 x %jl_value_t*]* %3, i64 0, i64 7 | |
%24 = getelementptr [15 x %jl_value_t*], [15 x %jl_value_t*]* %3, i64 0, i64 8 | |
%25 = getelementptr [15 x %jl_value_t*], [15 x %jl_value_t*]* %3, i64 0, i64 9 | |
%26 = getelementptr [15 x %jl_value_t*], [15 x %jl_value_t*]* %3, i64 0, i64 10 | |
%27 = load i64, i64* %16, align 8 | |
%28 = bitcast %jl_value_t* %0 to %jl_value_t*** | |
br label %if | |
L5: ; preds = %pass | |
%29 = load i8*, i8** inttoptr (i64 4580225040 to i8**), align 16 | |
%30 = getelementptr i8, i8* %29, i64 56 | |
%31 = bitcast i8* %30 to %jl_value_t** | |
%32 = load %jl_value_t*, %jl_value_t** %31, align 8 | |
%33 = icmp eq %jl_value_t* %32, null | |
br i1 %33, label %fail13, label %pass.14 | |
L.L7_crit_edge: ; preds = %pass.12 | |
%34 = ptrtoint %jl_value_t* %57 to i64 | |
br label %L7 | |
L7: ; preds = %L.L7_crit_edge, %top | |
%35 = phi i64 [ %34, %L.L7_crit_edge ], [ 4479271008, %top ] | |
%36 = getelementptr [15 x %jl_value_t*], [15 x %jl_value_t*]* %3, i64 0, i64 14 | |
%37 = bitcast %jl_value_t** %36 to i64* | |
store i64 %35, i64* %37, align 8 | |
store %jl_value_t* inttoptr (i64 4483516232 to %jl_value_t*), %jl_value_t** %4, align 8 | |
%38 = call %jl_value_t* @jl_box_int64(i64 signext %1) | |
store %jl_value_t* %38, %jl_value_t** %14, align 8 | |
%39 = call %jl_value_t* @jl_apply_generic(%jl_value_t** %4, i32 3) | |
%40 = load i64, i64* %13, align 8 | |
store i64 %40, i64* %10, align 8 | |
ret %jl_value_t* %39 | |
if: ; preds = %if.lr.ph, %pass.12 | |
%"#temp#1.021" = phi i64 [ 1, %if.lr.ph ], [ %59, %pass.12 ] | |
%41 = shl i64 %"#temp#1.021", 1 | |
%42 = add i64 %41, -2 | |
%43 = icmp ult i64 %42, %27 | |
br i1 %43, label %idxend, label %oob | |
oob: ; preds = %if | |
%44 = add i64 %41, -1 | |
%45 = alloca i64, align 8 | |
store i64 %44, i64* %45, align 8 | |
call void @jl_bounds_error_ints(%jl_value_t* %0, i64* nonnull %45, i64 1) | |
unreachable | |
idxend: ; preds = %if | |
%46 = load %jl_value_t**, %jl_value_t*** %28, align 8 | |
%47 = getelementptr %jl_value_t*, %jl_value_t** %46, i64 %42 | |
%48 = load %jl_value_t*, %jl_value_t** %47, align 8 | |
%49 = icmp eq %jl_value_t* %48, null | |
br i1 %49, label %fail, label %pass | |
fail: ; preds = %idxend | |
call void @jl_throw(%jl_value_t* inttoptr (i64 4482657536 to %jl_value_t*)) | |
unreachable | |
pass: ; preds = %idxend | |
store %jl_value_t* %48, %jl_value_t** %5, align 8 | |
store %jl_value_t* %48, %jl_value_t** %20, align 8 | |
%50 = icmp eq %jl_value_t* %48, inttoptr (i64 13085947768 to %jl_value_t*) | |
br i1 %50, label %if8, label %L5 | |
if8: ; preds = %pass | |
%51 = add i64 %41, -1 | |
%52 = load i64, i64* %16, align 8 | |
%53 = icmp ult i64 %51, %52 | |
br i1 %53, label %idxend.10, label %oob.9 | |
oob.9: ; preds = %if8 | |
%54 = alloca i64, align 8 | |
store i64 %41, i64* %54, align 8 | |
call void @jl_bounds_error_ints(%jl_value_t* %0, i64* nonnull %54, i64 1) | |
unreachable | |
idxend.10: ; preds = %if8 | |
%55 = load %jl_value_t**, %jl_value_t*** %28, align 8 | |
%56 = getelementptr %jl_value_t*, %jl_value_t** %55, i64 %51 | |
%57 = load %jl_value_t*, %jl_value_t** %56, align 8 | |
%58 = icmp eq %jl_value_t* %57, null | |
br i1 %58, label %fail11, label %pass.12 | |
fail11: ; preds = %idxend.10 | |
call void @jl_throw(%jl_value_t* inttoptr (i64 4482657536 to %jl_value_t*)) | |
unreachable | |
pass.12: ; preds = %idxend.10 | |
%59 = add i64 %"#temp#1.021", 1 | |
store %jl_value_t* %57, %jl_value_t** %21, align 8 | |
store %jl_value_t* %57, %jl_value_t** %y, align 8 | |
%60 = icmp eq i64 %"#temp#1.021", %18 | |
br i1 %60, label %L.L7_crit_edge, label %if | |
fail13: ; preds = %L5 | |
call void @jl_throw(%jl_value_t* inttoptr (i64 4482657536 to %jl_value_t*)) | |
unreachable | |
pass.14: ; preds = %L5 | |
store %jl_value_t* %32, %jl_value_t** %22, align 8 | |
store %jl_value_t* %32, %jl_value_t** %4, align 8 | |
store %jl_value_t* inttoptr (i64 13085922792 to %jl_value_t*), %jl_value_t** %14, align 8 | |
%61 = call %jl_value_t* @jl_f_getfield(%jl_value_t* null, %jl_value_t** %4, i32 2) | |
store %jl_value_t* %61, %jl_value_t** %23, align 8 | |
%62 = bitcast %jl_value_t*** %2 to i8* | |
%63 = call %jl_value_t* @jl_gc_pool_alloc(i8* %62, i32 1408, i32 32) | |
%64 = getelementptr inbounds %jl_value_t, %jl_value_t* %63, i64 -1, i32 0 | |
store %jl_value_t* inttoptr (i64 4479492752 to %jl_value_t*), %jl_value_t** %64, align 8 | |
store %jl_value_t* %63, %jl_value_t** %24, align 8 | |
store %jl_value_t* %61, %jl_value_t** %25, align 8 | |
%65 = getelementptr inbounds %jl_value_t, %jl_value_t* %63, i64 0, i32 0 | |
store %jl_value_t* %61, %jl_value_t** %65, align 8 | |
%66 = getelementptr inbounds %jl_value_t, %jl_value_t* %63, i64 1, i32 0 | |
store %jl_value_t* null, %jl_value_t** %66, align 8 | |
%67 = call %jl_value_t* @jl_gc_pool_alloc(i8* %62, i32 1408, i32 32) | |
%68 = getelementptr inbounds %jl_value_t, %jl_value_t* %67, i64 -1, i32 0 | |
store %jl_value_t* inttoptr (i64 4583473936 to %jl_value_t*), %jl_value_t** %68, align 8 | |
store %jl_value_t* %67, %jl_value_t** %26, align 8 | |
store %jl_value_t* %0, %jl_value_t** %6, align 8 | |
%69 = getelementptr inbounds %jl_value_t, %jl_value_t* %67, i64 0, i32 0 | |
store %jl_value_t* %0, %jl_value_t** %69, align 8 | |
%70 = getelementptr %jl_value_t, %jl_value_t* %67, i64 1 | |
%71 = bitcast %jl_value_t* %70 to i64* | |
store i64 %1, i64* %71, align 8 | |
store %jl_value_t* %67, %jl_value_t** %66, align 8 | |
%72 = icmp eq %jl_value_t* %67, null | |
br i1 %72, label %cont.15, label %wb_not_null | |
wb_not_null: ; preds = %pass.14 | |
%73 = bitcast %jl_value_t** %64 to i64* | |
%74 = load i64, i64* %73, align 8 | |
%75 = and i64 %74, 3 | |
%76 = icmp eq i64 %75, 3 | |
br i1 %76, label %wb_trigger, label %cont.15 | |
wb_trigger: ; preds = %wb_not_null | |
call void @jl_gc_queue_root(%jl_value_t* %63) | |
br label %cont.15 | |
cont.15: ; preds = %pass.14, %wb_not_null, %wb_trigger | |
call void @jl_throw(%jl_value_t* %63) | |
unreachable | |
} | |
julia> @code_llvm foo(0, y = 1.0) | |
define %jl_value_t* @"julia_#foo_70162"(%jl_value_t*, i64) #0 { | |
top: | |
%2 = call %jl_value_t*** @jl_get_ptls_states() #1 | |
%3 = alloca [15 x %jl_value_t*], align 8 | |
%.sub = getelementptr inbounds [15 x %jl_value_t*], [15 x %jl_value_t*]* %3, i64 0, i64 0 | |
%4 = getelementptr [15 x %jl_value_t*], [15 x %jl_value_t*]* %3, i64 0, i64 12 | |
%5 = getelementptr [15 x %jl_value_t*], [15 x %jl_value_t*]* %3, i64 0, i64 2 | |
%y = getelementptr [15 x %jl_value_t*], [15 x %jl_value_t*]* %3, i64 0, i64 5 | |
%6 = getelementptr [15 x %jl_value_t*], [15 x %jl_value_t*]* %3, i64 0, i64 11 | |
%7 = bitcast %jl_value_t** %4 to i8* | |
call void @llvm.memset.p0i8.i32(i8* %7, i8 0, i32 24, i32 8, i1 false) | |
%8 = bitcast [15 x %jl_value_t*]* %3 to i64* | |
%9 = bitcast %jl_value_t** %5 to i8* | |
call void @llvm.memset.p0i8.i64(i8* %9, i8 0, i64 72, i32 8, i1 false) | |
store i64 26, i64* %8, align 8 | |
%10 = bitcast %jl_value_t*** %2 to i64* | |
%11 = load i64, i64* %10, align 8 | |
%12 = getelementptr [15 x %jl_value_t*], [15 x %jl_value_t*]* %3, i64 0, i64 1 | |
%13 = bitcast %jl_value_t** %12 to i64* | |
store i64 %11, i64* %13, align 8 | |
store %jl_value_t** %.sub, %jl_value_t*** %2, align 8 | |
store %jl_value_t* null, %jl_value_t** %6, align 8 | |
%14 = getelementptr [15 x %jl_value_t*], [15 x %jl_value_t*]* %3, i64 0, i64 13 | |
store %jl_value_t* inttoptr (i64 4479271008 to %jl_value_t*), %jl_value_t** %y, align 8 | |
%15 = getelementptr inbounds %jl_value_t, %jl_value_t* %0, i64 1 | |
%16 = bitcast %jl_value_t* %15 to i64* | |
%17 = load i64, i64* %16, align 8 | |
%18 = ashr i64 %17, 1 | |
%19 = icmp slt i64 %18, 1 | |
br i1 %19, label %L7, label %if.lr.ph | |
if.lr.ph: ; preds = %top | |
%20 = getelementptr [15 x %jl_value_t*], [15 x %jl_value_t*]* %3, i64 0, i64 3 | |
%21 = getelementptr [15 x %jl_value_t*], [15 x %jl_value_t*]* %3, i64 0, i64 4 | |
%22 = getelementptr [15 x %jl_value_t*], [15 x %jl_value_t*]* %3, i64 0, i64 6 | |
%23 = getelementptr [15 x %jl_value_t*], [15 x %jl_value_t*]* %3, i64 0, i64 7 | |
%24 = getelementptr [15 x %jl_value_t*], [15 x %jl_value_t*]* %3, i64 0, i64 8 | |
%25 = getelementptr [15 x %jl_value_t*], [15 x %jl_value_t*]* %3, i64 0, i64 9 | |
%26 = getelementptr [15 x %jl_value_t*], [15 x %jl_value_t*]* %3, i64 0, i64 10 | |
%27 = load i64, i64* %16, align 8 | |
%28 = bitcast %jl_value_t* %0 to %jl_value_t*** | |
br label %if | |
L5: ; preds = %pass | |
%29 = load i8*, i8** inttoptr (i64 4580225040 to i8**), align 16 | |
%30 = getelementptr i8, i8* %29, i64 56 | |
%31 = bitcast i8* %30 to %jl_value_t** | |
%32 = load %jl_value_t*, %jl_value_t** %31, align 8 | |
%33 = icmp eq %jl_value_t* %32, null | |
br i1 %33, label %fail13, label %pass.14 | |
L.L7_crit_edge: ; preds = %pass.12 | |
%34 = ptrtoint %jl_value_t* %57 to i64 | |
br label %L7 | |
L7: ; preds = %L.L7_crit_edge, %top | |
%35 = phi i64 [ %34, %L.L7_crit_edge ], [ 4479271008, %top ] | |
%36 = getelementptr [15 x %jl_value_t*], [15 x %jl_value_t*]* %3, i64 0, i64 14 | |
%37 = bitcast %jl_value_t** %36 to i64* | |
store i64 %35, i64* %37, align 8 | |
store %jl_value_t* inttoptr (i64 4483516232 to %jl_value_t*), %jl_value_t** %4, align 8 | |
%38 = call %jl_value_t* @jl_box_int64(i64 signext %1) | |
store %jl_value_t* %38, %jl_value_t** %14, align 8 | |
%39 = call %jl_value_t* @jl_apply_generic(%jl_value_t** %4, i32 3) | |
%40 = load i64, i64* %13, align 8 | |
store i64 %40, i64* %10, align 8 | |
ret %jl_value_t* %39 | |
if: ; preds = %if.lr.ph, %pass.12 | |
%"#temp#1.021" = phi i64 [ 1, %if.lr.ph ], [ %59, %pass.12 ] | |
%41 = shl i64 %"#temp#1.021", 1 | |
%42 = add i64 %41, -2 | |
%43 = icmp ult i64 %42, %27 | |
br i1 %43, label %idxend, label %oob | |
oob: ; preds = %if | |
%44 = add i64 %41, -1 | |
%45 = alloca i64, align 8 | |
store i64 %44, i64* %45, align 8 | |
call void @jl_bounds_error_ints(%jl_value_t* %0, i64* nonnull %45, i64 1) | |
unreachable | |
idxend: ; preds = %if | |
%46 = load %jl_value_t**, %jl_value_t*** %28, align 8 | |
%47 = getelementptr %jl_value_t*, %jl_value_t** %46, i64 %42 | |
%48 = load %jl_value_t*, %jl_value_t** %47, align 8 | |
%49 = icmp eq %jl_value_t* %48, null | |
br i1 %49, label %fail, label %pass | |
fail: ; preds = %idxend | |
call void @jl_throw(%jl_value_t* inttoptr (i64 4482657536 to %jl_value_t*)) | |
unreachable | |
pass: ; preds = %idxend | |
store %jl_value_t* %48, %jl_value_t** %5, align 8 | |
store %jl_value_t* %48, %jl_value_t** %20, align 8 | |
%50 = icmp eq %jl_value_t* %48, inttoptr (i64 13085947768 to %jl_value_t*) | |
br i1 %50, label %if8, label %L5 | |
if8: ; preds = %pass | |
%51 = add i64 %41, -1 | |
%52 = load i64, i64* %16, align 8 | |
%53 = icmp ult i64 %51, %52 | |
br i1 %53, label %idxend.10, label %oob.9 | |
oob.9: ; preds = %if8 | |
%54 = alloca i64, align 8 | |
store i64 %41, i64* %54, align 8 | |
call void @jl_bounds_error_ints(%jl_value_t* %0, i64* nonnull %54, i64 1) | |
unreachable | |
idxend.10: ; preds = %if8 | |
%55 = load %jl_value_t**, %jl_value_t*** %28, align 8 | |
%56 = getelementptr %jl_value_t*, %jl_value_t** %55, i64 %51 | |
%57 = load %jl_value_t*, %jl_value_t** %56, align 8 | |
%58 = icmp eq %jl_value_t* %57, null | |
br i1 %58, label %fail11, label %pass.12 | |
fail11: ; preds = %idxend.10 | |
call void @jl_throw(%jl_value_t* inttoptr (i64 4482657536 to %jl_value_t*)) | |
unreachable | |
pass.12: ; preds = %idxend.10 | |
%59 = add i64 %"#temp#1.021", 1 | |
store %jl_value_t* %57, %jl_value_t** %21, align 8 | |
store %jl_value_t* %57, %jl_value_t** %y, align 8 | |
%60 = icmp eq i64 %"#temp#1.021", %18 | |
br i1 %60, label %L.L7_crit_edge, label %if | |
fail13: ; preds = %L5 | |
call void @jl_throw(%jl_value_t* inttoptr (i64 4482657536 to %jl_value_t*)) | |
unreachable | |
pass.14: ; preds = %L5 | |
store %jl_value_t* %32, %jl_value_t** %22, align 8 | |
store %jl_value_t* %32, %jl_value_t** %4, align 8 | |
store %jl_value_t* inttoptr (i64 13085922792 to %jl_value_t*), %jl_value_t** %14, align 8 | |
%61 = call %jl_value_t* @jl_f_getfield(%jl_value_t* null, %jl_value_t** %4, i32 2) | |
store %jl_value_t* %61, %jl_value_t** %23, align 8 | |
%62 = bitcast %jl_value_t*** %2 to i8* | |
%63 = call %jl_value_t* @jl_gc_pool_alloc(i8* %62, i32 1408, i32 32) | |
%64 = getelementptr inbounds %jl_value_t, %jl_value_t* %63, i64 -1, i32 0 | |
store %jl_value_t* inttoptr (i64 4479492752 to %jl_value_t*), %jl_value_t** %64, align 8 | |
store %jl_value_t* %63, %jl_value_t** %24, align 8 | |
store %jl_value_t* %61, %jl_value_t** %25, align 8 | |
%65 = getelementptr inbounds %jl_value_t, %jl_value_t* %63, i64 0, i32 0 | |
store %jl_value_t* %61, %jl_value_t** %65, align 8 | |
%66 = getelementptr inbounds %jl_value_t, %jl_value_t* %63, i64 1, i32 0 | |
store %jl_value_t* null, %jl_value_t** %66, align 8 | |
%67 = call %jl_value_t* @jl_gc_pool_alloc(i8* %62, i32 1408, i32 32) | |
%68 = getelementptr inbounds %jl_value_t, %jl_value_t* %67, i64 -1, i32 0 | |
store %jl_value_t* inttoptr (i64 4583473936 to %jl_value_t*), %jl_value_t** %68, align 8 | |
store %jl_value_t* %67, %jl_value_t** %26, align 8 | |
store %jl_value_t* %0, %jl_value_t** %6, align 8 | |
%69 = getelementptr inbounds %jl_value_t, %jl_value_t* %67, i64 0, i32 0 | |
store %jl_value_t* %0, %jl_value_t** %69, align 8 | |
%70 = getelementptr %jl_value_t, %jl_value_t* %67, i64 1 | |
%71 = bitcast %jl_value_t* %70 to i64* | |
store i64 %1, i64* %71, align 8 | |
store %jl_value_t* %67, %jl_value_t** %66, align 8 | |
%72 = icmp eq %jl_value_t* %67, null | |
br i1 %72, label %cont.15, label %wb_not_null | |
wb_not_null: ; preds = %pass.14 | |
%73 = bitcast %jl_value_t** %64 to i64* | |
%74 = load i64, i64* %73, align 8 | |
%75 = and i64 %74, 3 | |
%76 = icmp eq i64 %75, 3 | |
br i1 %76, label %wb_trigger, label %cont.15 | |
wb_trigger: ; preds = %wb_not_null | |
call void @jl_gc_queue_root(%jl_value_t* %63) | |
br label %cont.15 | |
cont.15: ; preds = %pass.14, %wb_not_null, %wb_trigger | |
call void @jl_throw(%jl_value_t* %63) | |
unreachable | |
} | |
julia> |
julia> function foo(x; y::Int = 0)
return x + y
end
foo (generic function with 1 method)
julia> foo(0, y = 0)
0
julia> foo(0, y = 1)
1
julia> @code_llvm foo(0, y = 1)
define i64 @"julia_#foo_70267"(%jl_value_t*, i64) #0 {
top:
%2 = call %jl_value_t*** @jl_get_ptls_states() #1
%3 = alloca [13 x %jl_value_t*], align 8
%.sub = getelementptr inbounds [13 x %jl_value_t*], [13 x %jl_value_t*]* %3, i64 0, i64 0
%4 = getelementptr [13 x %jl_value_t*], [13 x %jl_value_t*]* %3, i64 0, i64 11
%5 = getelementptr [13 x %jl_value_t*], [13 x %jl_value_t*]* %3, i64 0, i64 2
%6 = getelementptr [13 x %jl_value_t*], [13 x %jl_value_t*]* %3, i64 0, i64 10
%7 = bitcast %jl_value_t** %4 to i8*
call void @llvm.memset.p0i8.i32(i8* %7, i8 0, i32 16, i32 8, i1 false)
%8 = bitcast [13 x %jl_value_t*]* %3 to i64*
%9 = bitcast %jl_value_t** %5 to i8*
call void @llvm.memset.p0i8.i64(i8* %9, i8 0, i64 64, i32 8, i1 false)
store i64 22, i64* %8, align 8
%10 = bitcast %jl_value_t*** %2 to i64*
%11 = load i64, i64* %10, align 8
%12 = getelementptr [13 x %jl_value_t*], [13 x %jl_value_t*]* %3, i64 0, i64 1
%13 = bitcast %jl_value_t** %12 to i64*
store i64 %11, i64* %13, align 8
store %jl_value_t** %.sub, %jl_value_t*** %2, align 8
store %jl_value_t* null, %jl_value_t** %6, align 8
%14 = getelementptr inbounds %jl_value_t, %jl_value_t* %0, i64 1
%15 = bitcast %jl_value_t* %14 to i64*
%16 = load i64, i64* %15, align 8
%17 = ashr i64 %16, 1
%18 = icmp slt i64 %17, 1
br i1 %18, label %L7, label %if.lr.ph
if.lr.ph: ; preds = %top
%19 = getelementptr [13 x %jl_value_t*], [13 x %jl_value_t*]* %3, i64 0, i64 3
%20 = getelementptr [13 x %jl_value_t*], [13 x %jl_value_t*]* %3, i64 0, i64 4
%21 = getelementptr [13 x %jl_value_t*], [13 x %jl_value_t*]* %3, i64 0, i64 5
%22 = getelementptr [13 x %jl_value_t*], [13 x %jl_value_t*]* %3, i64 0, i64 6
%23 = getelementptr [13 x %jl_value_t*], [13 x %jl_value_t*]* %3, i64 0, i64 7
%24 = getelementptr [13 x %jl_value_t*], [13 x %jl_value_t*]* %3, i64 0, i64 8
%25 = getelementptr [13 x %jl_value_t*], [13 x %jl_value_t*]* %3, i64 0, i64 9
%26 = getelementptr [13 x %jl_value_t*], [13 x %jl_value_t*]* %3, i64 0, i64 12
%27 = bitcast %jl_value_t* %0 to %jl_value_t***
br label %if
L5: ; preds = %pass
%28 = load i8*, i8** inttoptr (i64 4641181264 to i8**), align 16
%29 = getelementptr i8, i8* %28, i64 56
%30 = bitcast i8* %29 to %jl_value_t**
%31 = load %jl_value_t*, %jl_value_t** %30, align 8
%32 = icmp eq %jl_value_t* %31, null
br i1 %32, label %fail15, label %pass.16
L.L7_crit_edge: ; preds = %pass.14
%33 = bitcast %jl_value_t* %54 to i64*
%34 = load i64, i64* %33, align 1
br label %L7
L7: ; preds = %L.L7_crit_edge, %top
%y.0.lcssa = phi i64 [ %34, %L.L7_crit_edge ], [ 0, %top ]
%35 = add i64 %y.0.lcssa, %1
%36 = load i64, i64* %13, align 8
store i64 %36, i64* %10, align 8
ret i64 %35
if: ; preds = %if.lr.ph, %pass.14
%"#temp#1.032" = phi i64 [ 1, %if.lr.ph ], [ %62, %pass.14 ]
%37 = shl i64 %"#temp#1.032", 1
%38 = add i64 %37, -2
%39 = load i64, i64* %15, align 8
%40 = icmp ult i64 %38, %39
br i1 %40, label %idxend, label %oob
oob: ; preds = %if
%41 = add i64 %37, -1
%42 = alloca i64, align 8
store i64 %41, i64* %42, align 8
call void @jl_bounds_error_ints(%jl_value_t* %0, i64* nonnull %42, i64 1)
unreachable
idxend: ; preds = %if
%43 = load %jl_value_t**, %jl_value_t*** %27, align 8
%44 = getelementptr %jl_value_t*, %jl_value_t** %43, i64 %38
%45 = load %jl_value_t*, %jl_value_t** %44, align 8
%46 = icmp eq %jl_value_t* %45, null
br i1 %46, label %fail, label %pass
fail: ; preds = %idxend
call void @jl_throw(%jl_value_t* inttoptr (i64 4542934272 to %jl_value_t*))
unreachable
pass: ; preds = %idxend
store %jl_value_t* %45, %jl_value_t** %5, align 8
store %jl_value_t* %45, %jl_value_t** %19, align 8
%47 = icmp eq %jl_value_t* %45, inttoptr (i64 13146228600 to %jl_value_t*)
br i1 %47, label %if8, label %L5
if8: ; preds = %pass
%48 = add i64 %37, -1
%49 = load i64, i64* %15, align 8
%50 = icmp ult i64 %48, %49
br i1 %50, label %idxend.10, label %oob.9
oob.9: ; preds = %if8
%51 = alloca i64, align 8
store i64 %37, i64* %51, align 8
call void @jl_bounds_error_ints(%jl_value_t* %0, i64* nonnull %51, i64 1)
unreachable
idxend.10: ; preds = %if8
%52 = load %jl_value_t**, %jl_value_t*** %27, align 8
%53 = getelementptr %jl_value_t*, %jl_value_t** %52, i64 %48
%54 = load %jl_value_t*, %jl_value_t** %53, align 8
%55 = icmp eq %jl_value_t* %54, null
br i1 %55, label %fail11, label %pass.12
fail11: ; preds = %idxend.10
call void @jl_throw(%jl_value_t* inttoptr (i64 4542934272 to %jl_value_t*))
unreachable
pass.12: ; preds = %idxend.10
store %jl_value_t* %54, %jl_value_t** %20, align 8
%56 = getelementptr inbounds %jl_value_t, %jl_value_t* %54, i64 -1, i32 0
%57 = bitcast %jl_value_t** %56 to i64*
%58 = load i64, i64* %57, align 8
%59 = and i64 %58, -16
%60 = inttoptr i64 %59 to %jl_value_t*
%61 = icmp eq %jl_value_t* %60, inttoptr (i64 4539418032 to %jl_value_t*)
br i1 %61, label %pass.14, label %fail13
fail13: ; preds = %pass.12
call void @jl_type_error_rt(i8* inttoptr (i64 140588844457984 to i8*), i8* inttoptr (i64 140588839413920 to i8*), %jl_value_t* inttoptr (i64 4539418032 to %jl_value_t*), %jl_value_t* %54)
unreachable
pass.14: ; preds = %pass.12
%62 = add i64 %"#temp#1.032", 1
%63 = icmp eq i64 %"#temp#1.032", %17
br i1 %63, label %L.L7_crit_edge, label %if
fail15: ; preds = %L5
call void @jl_throw(%jl_value_t* inttoptr (i64 4542934272 to %jl_value_t*))
unreachable
pass.16: ; preds = %L5
store %jl_value_t* %31, %jl_value_t** %21, align 8
store %jl_value_t* %31, %jl_value_t** %4, align 8
store %jl_value_t* inttoptr (i64 13146203624 to %jl_value_t*), %jl_value_t** %26, align 8
%64 = call %jl_value_t* @jl_f_getfield(%jl_value_t* null, %jl_value_t** %4, i32 2)
store %jl_value_t* %64, %jl_value_t** %22, align 8
%65 = bitcast %jl_value_t*** %2 to i8*
%66 = call %jl_value_t* @jl_gc_pool_alloc(i8* %65, i32 1408, i32 32)
%67 = getelementptr inbounds %jl_value_t, %jl_value_t* %66, i64 -1, i32 0
store %jl_value_t* inttoptr (i64 4539769488 to %jl_value_t*), %jl_value_t** %67, align 8
store %jl_value_t* %66, %jl_value_t** %23, align 8
store %jl_value_t* %64, %jl_value_t** %24, align 8
%68 = getelementptr inbounds %jl_value_t, %jl_value_t* %66, i64 0, i32 0
store %jl_value_t* %64, %jl_value_t** %68, align 8
%69 = getelementptr inbounds %jl_value_t, %jl_value_t* %66, i64 1, i32 0
store %jl_value_t* null, %jl_value_t** %69, align 8
%70 = call %jl_value_t* @jl_gc_pool_alloc(i8* %65, i32 1408, i32 32)
%71 = getelementptr inbounds %jl_value_t, %jl_value_t* %70, i64 -1, i32 0
store %jl_value_t* inttoptr (i64 4623669744 to %jl_value_t*), %jl_value_t** %71, align 8
store %jl_value_t* %70, %jl_value_t** %25, align 8
store %jl_value_t* %0, %jl_value_t** %6, align 8
%72 = getelementptr inbounds %jl_value_t, %jl_value_t* %70, i64 0, i32 0
store %jl_value_t* %0, %jl_value_t** %72, align 8
%73 = getelementptr %jl_value_t, %jl_value_t* %70, i64 1
%74 = bitcast %jl_value_t* %73 to i64*
store i64 %1, i64* %74, align 8
store %jl_value_t* %70, %jl_value_t** %69, align 8
%75 = icmp eq %jl_value_t* %70, null
br i1 %75, label %cont.17, label %wb_not_null
wb_not_null: ; preds = %pass.16
%76 = bitcast %jl_value_t** %67 to i64*
%77 = load i64, i64* %76, align 8
%78 = and i64 %77, 3
%79 = icmp eq i64 %78, 3
br i1 %79, label %wb_trigger, label %cont.17
wb_trigger: ; preds = %wb_not_null
call void @jl_gc_queue_root(%jl_value_t* %66)
br label %cont.17
cont.17: ; preds = %pass.16, %wb_not_null, %wb_trigger
call void @jl_throw(%jl_value_t* %66)
unreachable
}
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Contrast with