Skip to content

Instantly share code, notes, and snippets.

@johnmyleswhite
Created September 17, 2016 21:45
Show Gist options
  • Save johnmyleswhite/7484870a0f3656c735ae38bd1d5a0268 to your computer and use it in GitHub Desktop.
Save johnmyleswhite/7484870a0f3656c735ae38bd1d5a0268 to your computer and use it in GitHub Desktop.
Keyword Arguments and Method Specialization
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>
@johnmyleswhite
Copy link
Author

Contrast with

julia> function bar(x, y)
       return x + y
       end
bar (generic function with 1 method)

julia> bar(0, 1)
1

julia> bar(0, 1.0)
1.0

julia> @code_llvm bar(0, 1)

define i64 @julia_bar_70151(i64, i64) #0 {
top:
  %2 = add i64 %1, %0
  ret i64 %2
}

@johnmyleswhite
Copy link
Author

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