Skip to content

Instantly share code, notes, and snippets.

@mbauman
Last active August 29, 2015 14:21
Show Gist options
  • Save mbauman/d626a0b71ba7090ce2df to your computer and use it in GitHub Desktop.
Save mbauman/d626a0b71ba7090ce2df to your computer and use it in GitHub Desktop.
julia> @code_llvm Base.unsafe_getindex(falses(10), [1,2,3])
define %jl_value_t* @julia_anonymous_20585(%jl_value_t*, %jl_value_t**, i32) {
top:
%3 = alloca [8 x %jl_value_t*], align 8
%.sub = getelementptr inbounds [8 x %jl_value_t*]* %3, i64 0, i64 0
%4 = getelementptr [8 x %jl_value_t*]* %3, i64 0, i64 2
store %jl_value_t* inttoptr (i64 12 to %jl_value_t*), %jl_value_t** %.sub, align 8
%5 = load %jl_value_t*** @jl_pgcstack, align 8
%6 = getelementptr [8 x %jl_value_t*]* %3, i64 0, i64 1
%.c = bitcast %jl_value_t** %5 to %jl_value_t*
store %jl_value_t* %.c, %jl_value_t** %6, align 8
store %jl_value_t** %.sub, %jl_value_t*** @jl_pgcstack, align 8
%7 = getelementptr [8 x %jl_value_t*]* %3, i64 0, i64 6
store %jl_value_t* null, %jl_value_t** %7, align 8
%8 = getelementptr [8 x %jl_value_t*]* %3, i64 0, i64 7
store %jl_value_t* null, %jl_value_t** %8, align 8
store %jl_value_t* null, %jl_value_t** %4, align 8
%9 = getelementptr [8 x %jl_value_t*]* %3, i64 0, i64 3
store %jl_value_t* null, %jl_value_t** %9, align 8
%10 = getelementptr [8 x %jl_value_t*]* %3, i64 0, i64 4
store %jl_value_t* null, %jl_value_t** %10, align 8
%11 = getelementptr [8 x %jl_value_t*]* %3, i64 0, i64 5
store %jl_value_t* null, %jl_value_t** %11, align 8
%12 = icmp eq i32 %2, 1
br i1 %12, label %fail, label %pass2
fail: ; preds = %top
%13 = getelementptr %jl_value_t** %1, i64 1
call void @jl_bounds_error_tuple_int(%jl_value_t** %13, i64 0, i64 1)
unreachable
pass2: ; preds = %top
%14 = load %jl_value_t** %1, align 8
%15 = getelementptr %jl_value_t** %1, i64 1
%16 = load %jl_value_t** %15, align 8
%17 = getelementptr inbounds %jl_value_t* %16, i64 1
%18 = bitcast %jl_value_t* %17 to i64*
%19 = load i64* %18, align 8
store %jl_value_t* inttoptr (i64 4373903040 to %jl_value_t*), %jl_value_t** %7, align 8
%20 = call %jl_value_t* @jl_box_int64(i64 signext %19)
store %jl_value_t* %20, %jl_value_t** %8, align 8
%21 = call %jl_value_t* @julia_call2314(%jl_value_t* inttoptr (i64 4394764336 to %jl_value_t*), %jl_value_t** %7, i32 2)
store %jl_value_t* %21, %jl_value_t** %9, align 8
%22 = call i64 @julia_size3865(%jl_value_t* %14, i64 1)
%23 = load i64* %18, align 8
%24 = icmp slt i64 %23, 1
br i1 %24, label %L29, label %L.preheader
L.preheader: ; preds = %pass2
%25 = bitcast %jl_value_t* %16 to i8**
%26 = getelementptr %jl_value_t* %14, i64 1
%27 = bitcast %jl_value_t* %26 to i64*
%28 = getelementptr inbounds %jl_value_t* %14, i64 0, i32 0
%29 = getelementptr inbounds %jl_value_t* %21, i64 0, i32 0
br label %L
L: ; preds = %L26, %L.preheader
%ind.0 = phi i64 [ %87, %L26 ], [ 1, %L.preheader ]
%30 = add i64 %ind.0, -1
%31 = load i64* %18, align 8
%32 = icmp ult i64 %30, %31
br i1 %32, label %idxend, label %oob
oob: ; preds = %L
%33 = alloca i64, align 8
store i64 %ind.0, i64* %33, align 8
call void @jl_bounds_error_ints(%jl_value_t* %16, i64* %33, i64 1)
unreachable
idxend: ; preds = %L
%34 = load i8** %25, align 8
%35 = bitcast i8* %34 to i64*
%36 = getelementptr i64* %35, i64 %30
%37 = load i64* %36, align 8
%38 = icmp slt i64 %37, 1
br i1 %38, label %L8, label %L5
L5: ; preds = %idxend
%39 = load i64* %27, align 8
%phitmp = icmp sgt i64 %37, %39
br i1 %phitmp, label %L8, label %pass22
L8: ; preds = %L5, %idxend
%40 = call %jl_value_t* @alloc_2w()
%41 = getelementptr inbounds %jl_value_t* %40, i64 -1, i32 0
store %jl_value_t* inttoptr (i64 4372960912 to %jl_value_t*), %jl_value_t** %41, align 8
%42 = getelementptr inbounds %jl_value_t* %40, i64 0, i32 0
store %jl_value_t* %14, %jl_value_t** %42, align 8
%43 = getelementptr inbounds %jl_value_t* %40, i64 1, i32 0
store %jl_value_t* null, %jl_value_t** %43, align 8
store %jl_value_t* %40, %jl_value_t** %7, align 8
%44 = call %jl_value_t* @jl_box_int64(i64 signext %37)
store %jl_value_t* %44, %jl_value_t** %43, align 8
%45 = icmp eq %jl_value_t* %44, null
br i1 %45, label %cont9, label %wb_not_null
wb_not_null: ; preds = %L8
%46 = bitcast %jl_value_t** %41 to i64*
%47 = load i64* %46, align 8
%48 = and i64 %47, 1
%49 = icmp eq i64 %48, 0
br i1 %49, label %cont9, label %wb_may_trigger
wb_may_trigger: ; preds = %wb_not_null
%50 = getelementptr inbounds %jl_value_t* %44, i64 -1, i32 0
%51 = bitcast %jl_value_t** %50 to i64*
%52 = load i64* %51, align 8
%53 = and i64 %52, 1
%54 = icmp eq i64 %53, 0
br i1 %54, label %wb_trigger, label %cont9
wb_trigger: ; preds = %wb_may_trigger
call void @gc_queue_root(%jl_value_t* %40)
br label %cont9
cont9: ; preds = %wb_trigger, %wb_may_trigger, %wb_not_null, %L8
call void @jl_throw_with_superfluous_argument(%jl_value_t* %40, i32 651)
unreachable
pass22: ; preds = %L5
%55 = lshr i64 %30, 6
%56 = load %jl_value_t** %28, align 8
%57 = bitcast %jl_value_t* %56 to i8**
%58 = load i8** %57, align 8
%59 = add i64 %37, -1
%60 = bitcast i8* %58 to i64*
%61 = add i64 %37, 63
%62 = lshr i64 %59, 6
%63 = getelementptr i64* %60, i64 %62
%64 = and i64 %61, 63
%65 = load i64* %63, align 8
%66 = shl i64 1, %64
%67 = add i64 %ind.0, 63
%68 = and i64 %67, 63
%69 = and i64 %65, %66
%70 = shl i64 1, %68
%71 = icmp eq i64 %69, 0
%72 = load %jl_value_t** %29, align 8
%73 = bitcast %jl_value_t* %72 to i8**
%74 = load i8** %73, align 8
%75 = bitcast i8* %74 to i64*
%76 = getelementptr i64* %75, i64 %55
%77 = load i64* %76, align 8
br i1 %71, label %L25, label %if23
if23: ; preds = %pass22
%78 = or i64 %77, %70
store %jl_value_t* %72, %jl_value_t** %10, align 8
%79 = load i8** %73, align 8
%80 = bitcast i8* %79 to i64*
%81 = getelementptr i64* %80, i64 %55
store i64 %78, i64* %81, align 8
br label %L26
L25: ; preds = %pass22
%82 = xor i64 %70, -1
%83 = and i64 %77, %82
store %jl_value_t* %72, %jl_value_t** %11, align 8
%84 = load i8** %73, align 8
%85 = bitcast i8* %84 to i64*
%86 = getelementptr i64* %85, i64 %55
store i64 %83, i64* %86, align 8
br label %L26
L26: ; preds = %L25, %if23
%87 = add i64 %ind.0, 1
%88 = load i64* %18, align 8
%89 = icmp slt i64 %88, %87
br i1 %89, label %L29, label %L
L29: ; preds = %L26, %pass2
%90 = load %jl_value_t** %6, align 8
%91 = getelementptr inbounds %jl_value_t* %90, i64 0, i32 0
store %jl_value_t** %91, %jl_value_t*** @jl_pgcstack, align 8
ret %jl_value_t* %21
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment