Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save JeffBezanson/1688004c3b4bdd7c2a8fd9d7114dea8d to your computer and use it in GitHub Desktop.
Save JeffBezanson/1688004c3b4bdd7c2a8fd9d7114dea8d to your computer and use it in GitHub Desktop.
Faster version:
julia> code_llvm(STDOUT, Base._unsafe_getindex, Tuple{typeof(Base.linearindexing(a)), typeof(a), typeof(r), typeof(1)}, false, true)
; ModuleID = '_unsafe_getindex'
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-linux-gnu"
%jl_value_t = type { %jl_value_t* }
%OneTo = type { i64 }
@jl_overflow_exception = external constant %jl_value_t*
define %jl_value_t* @julia__unsafe_getindex_69008(%jl_value_t*, %jl_value_t**, i32) #0 {
top:
%3 = alloca [1 x i64], align 8
%4 = alloca [1 x i64], align 8
%5 = alloca %jl_value_t**, align 8
call void @llvm.dbg.value(metadata %jl_value_t** %1, i64 0, metadata !18, metadata !56), !dbg !57
store volatile %jl_value_t** %1, %jl_value_t*** %5, align 8
call void @llvm.dbg.value(metadata %jl_value_t* null, i64 0, metadata !30, metadata !58), !dbg !57
%thread_ptr = call i8* asm "movq %fs:0, $0", "=r"() #3
%ptls_i8 = getelementptr i8, i8* %thread_ptr, i64 -2672
%ptls = bitcast i8* %ptls_i8 to %jl_value_t***
%6 = alloca [8 x %jl_value_t*], align 8
%.sub = getelementptr inbounds [8 x %jl_value_t*], [8 x %jl_value_t*]* %6, i64 0, i64 0
%7 = getelementptr [8 x %jl_value_t*], [8 x %jl_value_t*]* %6, i64 0, i64 2
%8 = bitcast [8 x %jl_value_t*]* %6 to i64*
%9 = bitcast %jl_value_t** %7 to i8*
call void @llvm.memset.p0i8.i64(i8* %9, i8 0, i64 48, i32 8, i1 false)
store i64 12, i64* %8, align 8, !tbaa !59
%10 = getelementptr [8 x %jl_value_t*], [8 x %jl_value_t*]* %6, i64 0, i64 1
%11 = bitcast i8* %ptls_i8 to i64*
%12 = load i64, i64* %11, align 8
%13 = bitcast %jl_value_t** %10 to i64*
store i64 %12, i64* %13, align 8, !tbaa !59
store %jl_value_t** %.sub, %jl_value_t*** %ptls, align 8
%shape = alloca [1 x %OneTo], align 8
call void @llvm.dbg.declare(metadata [1 x %OneTo]* %shape, metadata !25, metadata !58), !dbg !57
%14 = add i32 %2, -2, !dbg !61
%15 = icmp eq i32 %14, 0, !dbg !61
br i1 %15, label %fail, label %pass, !dbg !61
L: ; preds = %pass.17
%16 = getelementptr [8 x %jl_value_t*], [8 x %jl_value_t*]* %6, i64 0, i64 5
store %jl_value_t* %78, %jl_value_t** %16, align 8, !dbg !62, !tbaa !59
call void @julia_throw_checksize_error_69009(%jl_value_t* %78, [1 x %OneTo]* nonnull %shape) #0, !dbg !62
call void @llvm.trap(), !dbg !62
unreachable, !dbg !62
L6.loopexit: ; preds = %middle.block, %if19
store %jl_value_t* %78, %jl_value_t** %17, align 8, !dbg !63, !tbaa !59
br label %L11, !dbg !66
if19.lr.ph: ; preds = %if
%17 = getelementptr [8 x %jl_value_t*], [8 x %jl_value_t*]* %6, i64 0, i64 7
%18 = bitcast %jl_value_t* %65 to i32**
%19 = load i32*, i32** %18, align 8, !tbaa !68
%20 = getelementptr inbounds %jl_value_t, %jl_value_t* %65, i64 3, i32 0
%21 = bitcast %jl_value_t** %20 to i64*
%22 = load i64, i64* %21, align 8, !tbaa !68
%23 = add i64 %69, -1, !dbg !63
%24 = mul i64 %23, %22, !dbg !63
%25 = add i64 %24, -1, !dbg !63
%26 = bitcast %jl_value_t* %78 to i32**, !dbg !63
%27 = load i32*, i32** %26, align 8, !dbg !63, !tbaa !69
%28 = sub i64 %I_1.sroa.3.0.copyload, %I_1.sroa.0.0.copyload, !dbg !71
%backedge.overflow = icmp eq i64 %28, -1
%29 = add i64 %I_1.sroa.3.0.copyload, 1, !dbg !71
br i1 %backedge.overflow, label %scalar.ph, label %overflow.checked, !dbg !71
overflow.checked: ; preds = %if19.lr.ph
%30 = sub i64 %29, %I_1.sroa.0.0.copyload, !dbg !71
%n.vec = and i64 %30, -16, !dbg !61
%end.idx.rnd.down = add i64 %n.vec, %I_1.sroa.0.0.copyload, !dbg !61
%cmp.zero = icmp eq i64 %n.vec, 0, !dbg !61
br i1 %cmp.zero, label %middle.block, label %vector.memcheck, !dbg !71
vector.memcheck: ; preds = %overflow.checked
%31 = sub i64 %I_1.sroa.3.0.copyload, %I_1.sroa.0.0.copyload, !dbg !71
%scevgep = getelementptr i32, i32* %27, i64 %31, !dbg !71
%32 = add i64 %69, -1, !dbg !71
%33 = mul i64 %22, %32, !dbg !71
%34 = add i64 %I_1.sroa.0.0.copyload, %33, !dbg !71
%35 = add i64 %34, -1, !dbg !71
%scevgep30 = getelementptr i32, i32* %19, i64 %35, !dbg !71
%36 = add i64 %I_1.sroa.3.0.copyload, %33, !dbg !71
%37 = add i64 %36, -1, !dbg !71
%scevgep32 = getelementptr i32, i32* %19, i64 %37, !dbg !71
%bound0 = icmp ule i32* %27, %scevgep32, !dbg !71
%bound1 = icmp ule i32* %scevgep30, %scevgep, !dbg !71
%memcheck.conflict = and i1 %bound0, %bound1, !dbg !71
%ind.end = or i64 %n.vec, 1, !dbg !71
br i1 %memcheck.conflict, label %middle.block, label %vector.ph, !dbg !71
vector.ph: ; preds = %vector.memcheck
br label %vector.body, !dbg !71
vector.body: ; preds = %vector.body, %vector.ph
%index = phi i64 [ %I_1.sroa.0.0.copyload, %vector.ph ], [ %index.next, %vector.body ], !dbg !61
%normalized.idx = sub i64 %index, %I_1.sroa.0.0.copyload
%38 = add i64 %25, %index, !dbg !63
%39 = getelementptr i32, i32* %19, i64 %38, !dbg !63
%40 = bitcast i32* %39 to <8 x i32>*, !dbg !63
%wide.load = load <8 x i32>, <8 x i32>* %40, align 4, !dbg !63, !tbaa !72
%41 = getelementptr i32, i32* %39, i64 8, !dbg !63
%42 = bitcast i32* %41 to <8 x i32>*, !dbg !63
%wide.load43 = load <8 x i32>, <8 x i32>* %42, align 4, !dbg !63, !tbaa !72
%43 = getelementptr i32, i32* %27, i64 %normalized.idx, !dbg !63
%44 = bitcast i32* %43 to <8 x i32>*, !dbg !63
store <8 x i32> %wide.load, <8 x i32>* %44, align 4, !dbg !63, !tbaa !72
%45 = getelementptr i32, i32* %43, i64 8, !dbg !63
%46 = bitcast i32* %45 to <8 x i32>*, !dbg !63
store <8 x i32> %wide.load43, <8 x i32>* %46, align 4, !dbg !63, !tbaa !72
%index.next = add i64 %index, 16, !dbg !61
%47 = icmp eq i64 %index.next, %end.idx.rnd.down, !dbg !61
br i1 %47, label %middle.block, label %vector.body, !dbg !61, !llvm.loop !74
middle.block: ; preds = %vector.body, %vector.memcheck, %overflow.checked
%resume.val = phi i64 [ 1, %overflow.checked ], [ 1, %vector.memcheck ], [ %ind.end, %vector.body ]
%resume.val34 = phi i64 [ %I_1.sroa.0.0.copyload, %overflow.checked ], [ %I_1.sroa.0.0.copyload, %vector.memcheck ], [ %end.idx.rnd.down, %vector.body ]
%trunc.resume.val = phi i64 [ %I_1.sroa.0.0.copyload, %overflow.checked ], [ %I_1.sroa.0.0.copyload, %vector.memcheck ], [ %end.idx.rnd.down, %vector.body ]
%cmp.n = icmp eq i64 %29, %resume.val34
br i1 %cmp.n, label %L6.loopexit, label %scalar.ph, !dbg !71
scalar.ph: ; preds = %middle.block, %if19.lr.ph
%bc.resume.val = phi i64 [ %resume.val, %middle.block ], [ 1, %if19.lr.ph ]
%bc.trunc.resume.val = phi i64 [ %trunc.resume.val, %middle.block ], [ %I_1.sroa.0.0.copyload, %if19.lr.ph ]
br label %if19, !dbg !71
L11: ; preds = %if, %L6.loopexit
%48 = load i64, i64* %13, align 8, !dbg !66, !tbaa !59
store i64 %48, i64* %11, align 8, !dbg !66, !tbaa !59
ret %jl_value_t* %78, !dbg !66
fail: ; preds = %top
%49 = getelementptr %jl_value_t*, %jl_value_t** %1, i64 2, !dbg !61
call void @jl_bounds_error_tuple_int(%jl_value_t** %49, i64 0, i64 1), !dbg !61
unreachable, !dbg !61
pass: ; preds = %top
%50 = getelementptr %jl_value_t*, %jl_value_t** %1, i64 2, !dbg !61
%51 = icmp ugt i32 %14, 1, !dbg !61
br i1 %51, label %pass.13, label %fail12, !dbg !61
fail12: ; preds = %pass
%52 = sext i32 %14 to i64, !dbg !61
call void @jl_bounds_error_tuple_int(%jl_value_t** %50, i64 %52, i64 2), !dbg !61
unreachable, !dbg !61
pass.13: ; preds = %pass
%53 = bitcast %jl_value_t** %50 to i8**, !dbg !61
%54 = load i8*, i8** %53, align 8, !dbg !61, !tbaa !77
%I_1.sroa.0.0..sroa_cast = bitcast i8* %54 to i64*, !dbg !61
%I_1.sroa.0.0.copyload = load i64, i64* %I_1.sroa.0.0..sroa_cast, align 1, !dbg !61
%I_1.sroa.3.0..sroa_idx = getelementptr inbounds i8, i8* %54, i64 8, !dbg !61
%I_1.sroa.3.0..sroa_cast = bitcast i8* %I_1.sroa.3.0..sroa_idx to i64*, !dbg !61
%I_1.sroa.3.0.copyload = load i64, i64* %I_1.sroa.3.0..sroa_cast, align 1, !dbg !61
%55 = call { i64, i1 } @llvm.ssub.with.overflow.i64(i64 %I_1.sroa.3.0.copyload, i64 %I_1.sroa.0.0.copyload), !dbg !78
%56 = extractvalue { i64, i1 } %55, 1, !dbg !78
br i1 %56, label %fail14, label %pass.15, !dbg !78
fail14: ; preds = %pass.13
%57 = load %jl_value_t*, %jl_value_t** @jl_overflow_exception, align 8, !dbg !78, !tbaa !68
call void @jl_throw(%jl_value_t* %57), !dbg !78
unreachable, !dbg !78
pass.15: ; preds = %pass.13
%58 = extractvalue { i64, i1 } %55, 0, !dbg !78
%59 = call { i64, i1 } @llvm.sadd.with.overflow.i64(i64 %58, i64 1), !dbg !78
%60 = extractvalue { i64, i1 } %59, 1, !dbg !78
br i1 %60, label %fail16, label %pass.17, !dbg !78
fail16: ; preds = %pass.15
%61 = load %jl_value_t*, %jl_value_t** @jl_overflow_exception, align 8, !dbg !78, !tbaa !68
call void @jl_throw(%jl_value_t* %61), !dbg !78
unreachable, !dbg !78
pass.17: ; preds = %pass.15
%62 = getelementptr [8 x %jl_value_t*], [8 x %jl_value_t*]* %6, i64 0, i64 3
%63 = getelementptr [8 x %jl_value_t*], [8 x %jl_value_t*]* %6, i64 0, i64 4
%64 = getelementptr %jl_value_t*, %jl_value_t** %1, i64 1
%65 = load %jl_value_t*, %jl_value_t** %64, align 8
%66 = getelementptr %jl_value_t*, %jl_value_t** %1, i64 3, !dbg !61
%67 = bitcast %jl_value_t** %66 to i64**, !dbg !61
%68 = load i64*, i64** %67, align 8, !dbg !61, !tbaa !77
%69 = load i64, i64* %68, align 1, !dbg !61
%70 = extractvalue { i64, i1 } %59, 0, !dbg !78
%71 = icmp slt i64 %70, 0, !dbg !81
%72 = select i1 %71, i64 0, i64 %70, !dbg !81
%73 = getelementptr inbounds [1 x %OneTo], [1 x %OneTo]* %shape, i64 0, i64 0, i32 0, !dbg !81
store i64 %72, i64* %73, align 8, !dbg !81
%74 = getelementptr i8, i8* %thread_ptr, i64 -1240, !dbg !82
%75 = call %jl_value_t* @jl_gc_pool_alloc(i8* %ptls_i8, i8* %74, i32 16, i32 16360), !dbg !82
%76 = getelementptr inbounds %jl_value_t, %jl_value_t* %75, i64 -1, i32 0, !dbg !82
store %jl_value_t* inttoptr (i64 140650966842000 to %jl_value_t*), %jl_value_t** %76, align 8, !dbg !82, !tbaa !83
%77 = bitcast %jl_value_t* %75 to i64*, !dbg !82
store i64 %72, i64* %77, align 8, !dbg !82
store %jl_value_t* %75, %jl_value_t** %7, align 8, !dbg !82, !tbaa !59
%78 = call %jl_value_t* inttoptr (i64 140659682665040 to %jl_value_t* (%jl_value_t*, %jl_value_t*)*)(%jl_value_t* inttoptr (i64 140650967125680 to %jl_value_t*), %jl_value_t* %75), !dbg !82
store %jl_value_t* %78, %jl_value_t** %62, align 8, !dbg !82, !tbaa !59
call void @llvm.dbg.value(metadata %jl_value_t* %78, i64 0, metadata !30, metadata !58), !dbg !57
store %jl_value_t* %78, %jl_value_t** %63, align 8, !dbg !84, !tbaa !59
%79 = getelementptr inbounds %jl_value_t, %jl_value_t* %78, i64 3, i32 0, !dbg !84
%80 = bitcast %jl_value_t** %79 to i64*, !dbg !84
%81 = load i64, i64* %80, align 8, !dbg !84, !tbaa !85
%82 = icmp slt i64 %81, 0, !dbg !62
%83 = select i1 %82, i64 0, i64 %81, !dbg !62
%84 = getelementptr inbounds [1 x i64], [1 x i64]* %4, i64 0, i64 0, !dbg !62
store i64 %83, i64* %84, align 8, !dbg !62
%85 = getelementptr inbounds [1 x i64], [1 x i64]* %3, i64 0, i64 0, !dbg !62
%86 = load i64, i64* %73, align 8, !dbg !62
store i64 %86, i64* %85, align 8, !dbg !62
%87 = call i8 @"jlsys_==_38935"([1 x i64]* nonnull %4, [1 x i64]* nonnull %3), !dbg !62
%88 = and i8 %87, 1, !dbg !62
%89 = icmp eq i8 %88, 0, !dbg !62
br i1 %89, label %L, label %if, !dbg !62
if: ; preds = %pass.17
%90 = getelementptr [8 x %jl_value_t*], [8 x %jl_value_t*]* %6, i64 0, i64 6
store %jl_value_t* %78, %jl_value_t** %90, align 8, !dbg !86, !tbaa !59
call void @llvm.dbg.value(metadata i64 1, i64 0, metadata !39, metadata !58), !dbg !57
%91 = add i64 %I_1.sroa.3.0.copyload, 1, !dbg !71
%92 = icmp eq i64 %I_1.sroa.0.0.copyload, %91, !dbg !71
br i1 %92, label %L11, label %if19.lr.ph, !dbg !71
if19: ; preds = %scalar.ph, %if19
%Ds.127 = phi i64 [ %bc.resume.val, %scalar.ph ], [ %94, %if19 ]
%"#temp#3.026" = phi i64 [ %bc.trunc.resume.val, %scalar.ph ], [ %93, %if19 ]
%93 = add i64 %"#temp#3.026", 1, !dbg !71
%94 = add i64 %Ds.127, 1, !dbg !90
%95 = add i64 %25, %"#temp#3.026", !dbg !63
%96 = getelementptr i32, i32* %19, i64 %95, !dbg !63
%97 = load i32, i32* %96, align 4, !dbg !63, !tbaa !72
%98 = add i64 %Ds.127, -1, !dbg !63
%99 = getelementptr i32, i32* %27, i64 %98, !dbg !63
store i32 %97, i32* %99, align 4, !dbg !63, !tbaa !72
%100 = icmp eq i64 %93, %91, !dbg !71
br i1 %100, label %L6.loopexit, label %if19, !dbg !71, !llvm.loop !91
}
declare %jl_value_t*** @jl_get_ptls_states()
; Function Attrs: nounwind readnone
declare void @llvm.dbg.declare(metadata, metadata, metadata) #1
; Function Attrs: noreturn
declare void @jl_bounds_error_tuple_int(%jl_value_t**, i64, i64) #2
; Function Attrs: nounwind
declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture readonly, i64, i32, i1) #3
; Function Attrs: nounwind readnone
declare { i64, i1 } @llvm.ssub.with.overflow.i64(i64, i64) #1
; Function Attrs: noreturn
declare void @jl_throw(%jl_value_t*) #2
; Function Attrs: nounwind readnone
declare { i64, i1 } @llvm.sadd.with.overflow.i64(i64, i64) #1
declare %jl_value_t* @jl_gc_pool_alloc(i8*, i8*, i32, i32)
declare i8 @"jlsys_==_38935"([1 x i64]*, [1 x i64]*)
declare void @julia_throw_checksize_error_69009(%jl_value_t*, [1 x %OneTo]*) #0
; Function Attrs: noreturn nounwind
declare void @llvm.trap() #4
; Function Attrs: nounwind readnone
declare void @llvm.dbg.value(metadata, i64, metadata, metadata) #1
; Function Attrs: nounwind
declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i32, i1) #3
attributes #0 = { "no-frame-pointer-elim"="true" }
attributes #1 = { nounwind readnone }
attributes #2 = { noreturn }
attributes #3 = { nounwind }
attributes #4 = { noreturn nounwind }
!llvm.module.flags = !{!0, !1}
!llvm.dbg.cu = !{!2}
!0 = !{i32 2, !"Dwarf Version", i32 4}
!1 = !{i32 1, !"Debug Info Version", i32 3}
!2 = distinct !DICompileUnit(language: DW_LANG_C89, file: !3, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: 1, enums: !4, subprograms: !5)
!3 = !DIFile(filename: "multidimensional.jl", directory: ".")
!4 = !{}
!5 = !{!6, !43, !44, !45, !47, !49, !45, !47, !45, !47, !50, !43, !51, !45, !47, !52, !53, !45, !47, !54, !43}
!6 = !DISubprogram(name: "_unsafe_getindex", linkageName: "julia__unsafe_getindex_69035", scope: null, file: !3, type: !7, isLocal: false, isDefinition: true, isOptimized: true, function: %jl_value_t* (%jl_value_t*, %jl_value_t**, i32)* @julia__unsafe_getindex_69008, variables: !15)
!7 = !DISubroutineType(types: !8)
!8 = !{!9, !9, !13, !14}
!9 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !10, size: 64, align: 64)
!10 = !DICompositeType(tag: DW_TAG_structure_type, name: "jl_value_t", file: !11, line: 71, align: 64, elements: !12)
!11 = !DIFile(filename: "julia.h", directory: "")
!12 = !{!9}
!13 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !9, size: 64, align: 64)
!14 = !DIBasicType(name: "Int32", size: 32, align: 32, encoding: DW_ATE_unsigned)
!15 = !{!16, !18, !19, !20, !24, !25, !30, !31, !31, !31, !20, !24, !33, !36, !37, !38, !39, !40, !41, !42, !31, !31}
!16 = !DILocalVariable(tag: DW_TAG_arg_variable, name: "#self#", arg: 1, scope: !6, file: !3, line: 284, type: !17)
!17 = !DICompositeType(tag: DW_TAG_structure_type, name: "#_unsafe_getindex", align: 8, elements: !4, runtimeLang: DW_LANG_Julia)
!18 = !DILocalVariable(tag: DW_TAG_arg_variable, name: "A", arg: 3, scope: !6, file: !3, line: 284, type: !9)
!19 = !DILocalVariable(tag: DW_TAG_arg_variable, name: "I...", arg: 4, scope: !6, file: !3, line: 284, type: !9)
!20 = !DILocalVariable(tag: DW_TAG_auto_variable, name: "I_1", scope: !6, file: !3, line: 284, type: !21)
!21 = !DICompositeType(tag: DW_TAG_structure_type, name: "UnitRange", size: 128, align: 64, elements: !22, runtimeLang: DW_LANG_Julia)
!22 = !{!23, !23}
!23 = !DIBasicType(name: "Int64", size: 64, align: 64, encoding: DW_ATE_unsigned)
!24 = !DILocalVariable(tag: DW_TAG_auto_variable, name: "I_2", scope: !6, file: !3, line: 284, type: !23)
!25 = !DILocalVariable(tag: DW_TAG_auto_variable, name: "shape", scope: !6, file: !3, line: 284, type: !26)
!26 = !DICompositeType(tag: DW_TAG_structure_type, name: "Tuple", size: 64, align: 64, elements: !27, runtimeLang: DW_LANG_Julia)
!27 = !{!28}
!28 = !DICompositeType(tag: DW_TAG_structure_type, name: "OneTo", size: 64, align: 64, elements: !29, runtimeLang: DW_LANG_Julia)
!29 = !{!23}
!30 = !DILocalVariable(tag: DW_TAG_auto_variable, name: "dest", scope: !6, file: !3, line: 284, type: !9)
!31 = !DILocalVariable(tag: DW_TAG_auto_variable, name: "#70", scope: !6, file: !3, line: 284, type: !32)
!32 = !DICompositeType(tag: DW_TAG_structure_type, name: "##70#71", align: 8, elements: !4, runtimeLang: DW_LANG_Julia)
!33 = !DILocalVariable(tag: DW_TAG_auto_variable, name: "J", scope: !6, file: !3, line: 284, type: !34)
!34 = !DICompositeType(tag: DW_TAG_structure_type, name: "Tuple", size: 192, align: 64, elements: !35, runtimeLang: DW_LANG_Julia)
!35 = !{!21, !23}
!36 = !DILocalVariable(tag: DW_TAG_auto_variable, name: "J_1", scope: !6, file: !3, line: 284, type: !21)
!37 = !DILocalVariable(tag: DW_TAG_auto_variable, name: "J_2", scope: !6, file: !3, line: 284, type: !23)
!38 = !DILocalVariable(tag: DW_TAG_auto_variable, name: "D", scope: !6, file: !3, line: 284, type: !28)
!39 = !DILocalVariable(tag: DW_TAG_auto_variable, name: "Ds", scope: !6, file: !3, line: 284, type: !23)
!40 = !DILocalVariable(tag: DW_TAG_auto_variable, name: "j_2", scope: !6, file: !3, line: 284, type: !23)
!41 = !DILocalVariable(tag: DW_TAG_auto_variable, name: "j_1", scope: !6, file: !3, line: 284, type: !23)
!42 = !DILocalVariable(tag: DW_TAG_auto_variable, name: "d", scope: !6, file: !3, line: 284, type: !23)
!43 = !DISubprogram(name: "macro expansion;", linkageName: "macro expansion", scope: !3, file: !3, type: !7, isLocal: false, isDefinition: true, isOptimized: true, variables: !4)
!44 = !DISubprogram(name: "index_shape;", linkageName: "index_shape", scope: !3, file: !3, type: !7, isLocal: false, isDefinition: true, isOptimized: true, variables: !4)
!45 = !DISubprogram(name: "indices;", linkageName: "indices", scope: !46, file: !46, type: !7, isLocal: false, isDefinition: true, isOptimized: true, variables: !4)
!46 = !DIFile(filename: "abstractarray.jl", directory: ".")
!47 = !DISubprogram(name: "map;", linkageName: "map", scope: !48, file: !48, type: !7, isLocal: false, isDefinition: true, isOptimized: true, variables: !4)
!48 = !DIFile(filename: "tuple.jl", directory: ".")
!49 = !DISubprogram(name: "index_shape_dim;", linkageName: "index_shape_dim", scope: !3, file: !3, type: !7, isLocal: false, isDefinition: true, isOptimized: true, variables: !4)
!50 = !DISubprogram(name: "_unsafe_getindex!;", linkageName: "_unsafe_getindex!", scope: !3, file: !3, type: !7, isLocal: false, isDefinition: true, isOptimized: true, variables: !4)
!51 = !DISubprogram(name: "decolon;", linkageName: "decolon", scope: !3, file: !3, type: !7, isLocal: false, isDefinition: true, isOptimized: true, variables: !4)
!52 = !DISubprogram(name: "eachindex;", linkageName: "eachindex", scope: !46, file: !46, type: !7, isLocal: false, isDefinition: true, isOptimized: true, variables: !4)
!53 = !DISubprogram(name: "indices1;", linkageName: "indices1", scope: !46, file: !46, type: !7, isLocal: false, isDefinition: true, isOptimized: true, variables: !4)
!54 = !DISubprogram(name: "macro expansion;", linkageName: "macro expansion", scope: !55, file: !55, type: !7, isLocal: false, isDefinition: true, isOptimized: true, variables: !4)
!55 = !DIFile(filename: "cartesian.jl", directory: ".")
!56 = !DIExpression(DW_OP_deref, DW_OP_plus, 8)
!57 = !DILocation(line: 284, scope: !6)
!58 = !DIExpression()
!59 = !{!"jtbaa_gcframe", !60}
!60 = !{!"jtbaa"}
!61 = !DILocation(line: 287, scope: !43, inlinedAt: !57)
!62 = !DILocation(line: 290, scope: !43, inlinedAt: !57)
!63 = !DILocation(line: 343, scope: !43, inlinedAt: !64)
!64 = !DILocation(line: 64, scope: !54, inlinedAt: !65)
!65 = !DILocation(line: 341, scope: !43, inlinedAt: !66)
!66 = !DILocation(line: 333, scope: !50, inlinedAt: !67)
!67 = !DILocation(line: 291, scope: !43, inlinedAt: !57)
!68 = !{!"jtbaa_const", !60, i64 1}
!69 = !{!"jtbaa_arrayptr", !70}
!70 = !{!"jtbaa_array", !60}
!71 = !DILocation(line: 62, scope: !54, inlinedAt: !65)
!72 = !{!"jtbaa_arraybuf", !73}
!73 = !{!"jtbaa_data", !60}
!74 = distinct !{!74, !75, !76}
!75 = !{!"llvm.loop.vectorize.width", i32 1}
!76 = !{!"llvm.loop.interleave.count", i32 1}
!77 = !{!"jtbaa_value", !73}
!78 = !DILocation(line: 44, scope: !45, inlinedAt: !79)
!79 = !DILocation(line: 226, scope: !49, inlinedAt: !80)
!80 = !DILocation(line: 217, scope: !44, inlinedAt: !81)
!81 = !DILocation(line: 288, scope: !43, inlinedAt: !57)
!82 = !DILocation(line: 289, scope: !43, inlinedAt: !57)
!83 = !{!"jtbaa_tag", !73}
!84 = !DILocation(line: 44, scope: !45, inlinedAt: !62)
!85 = !{!"jtbaa_arraysize", !70}
!86 = !DILocation(line: 44, scope: !45, inlinedAt: !87)
!87 = !DILocation(line: 51, scope: !53, inlinedAt: !88)
!88 = !DILocation(line: 593, scope: !52, inlinedAt: !89)
!89 = !DILocation(line: 339, scope: !43, inlinedAt: !66)
!90 = !DILocation(line: 342, scope: !43, inlinedAt: !64)
!91 = distinct !{!91, !75, !76}
Slower version:
julia> code_llvm(STDOUT, Base._unsafe_getindex, Tuple{typeof(Base.linearindexing(a)), typeof(a), typeof(r), typeof(1)}, false, true)
; ModuleID = '_unsafe_getindex'
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-linux-gnu"
%jl_value_t = type { %jl_value_t* }
%OneTo = type { i64 }
@jl_overflow_exception = external constant %jl_value_t*
define %jl_value_t* @julia__unsafe_getindex_68764(%jl_value_t*, %jl_value_t**, i32) #0 {
top:
%3 = alloca [1 x i64], align 8
%4 = alloca [1 x i64], align 8
%5 = alloca %jl_value_t**, align 8
call void @llvm.dbg.value(metadata %jl_value_t** %1, i64 0, metadata !18, metadata !56), !dbg !57
store volatile %jl_value_t** %1, %jl_value_t*** %5, align 8
call void @llvm.dbg.value(metadata %jl_value_t* null, i64 0, metadata !30, metadata !58), !dbg !57
%thread_ptr = call i8* asm "movq %fs:0, $0", "=r"() #3
%ptls_i8 = getelementptr i8, i8* %thread_ptr, i64 -2672
%ptls = bitcast i8* %ptls_i8 to %jl_value_t***
%6 = alloca [8 x %jl_value_t*], align 8
%.sub = getelementptr inbounds [8 x %jl_value_t*], [8 x %jl_value_t*]* %6, i64 0, i64 0
%7 = getelementptr [8 x %jl_value_t*], [8 x %jl_value_t*]* %6, i64 0, i64 2
%8 = bitcast [8 x %jl_value_t*]* %6 to i64*
%9 = bitcast %jl_value_t** %7 to i8*
call void @llvm.memset.p0i8.i64(i8* %9, i8 0, i64 48, i32 8, i1 false)
store i64 12, i64* %8, align 8, !tbaa !59
%10 = getelementptr [8 x %jl_value_t*], [8 x %jl_value_t*]* %6, i64 0, i64 1
%11 = bitcast i8* %ptls_i8 to i64*
%12 = load i64, i64* %11, align 8
%13 = bitcast %jl_value_t** %10 to i64*
store i64 %12, i64* %13, align 8, !tbaa !59
store %jl_value_t** %.sub, %jl_value_t*** %ptls, align 8
%shape = alloca [1 x %OneTo], align 8
call void @llvm.dbg.declare(metadata [1 x %OneTo]* %shape, metadata !25, metadata !58), !dbg !57
%14 = add i32 %2, -2, !dbg !61
%15 = icmp eq i32 %14, 0, !dbg !61
br i1 %15, label %fail, label %pass, !dbg !61
L: ; preds = %pass.17
%16 = getelementptr [8 x %jl_value_t*], [8 x %jl_value_t*]* %6, i64 0, i64 5
store %jl_value_t* %78, %jl_value_t** %16, align 8, !dbg !62, !tbaa !59
call void @julia_throw_checksize_error_68765(%jl_value_t* %78, [1 x %OneTo]* nonnull %shape) #0, !dbg !62
call void @llvm.trap(), !dbg !62
unreachable, !dbg !62
L6.loopexit: ; preds = %middle.block, %if19
store %jl_value_t* %78, %jl_value_t** %17, align 8, !dbg !63, !tbaa !59
br label %L11, !dbg !66
if19.lr.ph: ; preds = %if
%17 = getelementptr [8 x %jl_value_t*], [8 x %jl_value_t*]* %6, i64 0, i64 7
%18 = bitcast %jl_value_t* %65 to i32**
%19 = load i32*, i32** %18, align 8, !tbaa !68
%20 = getelementptr inbounds %jl_value_t, %jl_value_t* %65, i64 3, i32 0
%21 = bitcast %jl_value_t** %20 to i64*
%22 = load i64, i64* %21, align 8, !tbaa !68
%23 = add i64 %69, -1, !dbg !63
%24 = mul i64 %23, %22, !dbg !63
%25 = add i64 %24, -1, !dbg !63
%26 = bitcast %jl_value_t* %78 to i32**, !dbg !63
%27 = load i32*, i32** %26, align 8, !dbg !63, !tbaa !69
%28 = sub i64 %I_1.sroa.3.0.copyload, %I_1.sroa.0.0.copyload, !dbg !71
%backedge.overflow = icmp eq i64 %28, -1
%29 = add i64 %I_1.sroa.3.0.copyload, 1, !dbg !71
br i1 %backedge.overflow, label %scalar.ph, label %overflow.checked, !dbg !71
overflow.checked: ; preds = %if19.lr.ph
%30 = sub i64 %29, %I_1.sroa.0.0.copyload, !dbg !71
%n.vec = and i64 %30, -16, !dbg !61
%end.idx.rnd.down = add i64 %n.vec, %I_1.sroa.0.0.copyload, !dbg !61
%cmp.zero = icmp eq i64 %n.vec, 0, !dbg !61
br i1 %cmp.zero, label %middle.block, label %vector.memcheck, !dbg !71
vector.memcheck: ; preds = %overflow.checked
%31 = sub i64 %I_1.sroa.3.0.copyload, %I_1.sroa.0.0.copyload, !dbg !71
%scevgep = getelementptr i32, i32* %27, i64 %31, !dbg !71
%32 = add i64 %69, -1, !dbg !71
%33 = mul i64 %22, %32, !dbg !71
%34 = add i64 %I_1.sroa.0.0.copyload, %33, !dbg !71
%35 = add i64 %34, -1, !dbg !71
%scevgep30 = getelementptr i32, i32* %19, i64 %35, !dbg !71
%36 = add i64 %I_1.sroa.3.0.copyload, %33, !dbg !71
%37 = add i64 %36, -1, !dbg !71
%scevgep32 = getelementptr i32, i32* %19, i64 %37, !dbg !71
%bound0 = icmp ule i32* %27, %scevgep32, !dbg !71
%bound1 = icmp ule i32* %scevgep30, %scevgep, !dbg !71
%memcheck.conflict = and i1 %bound0, %bound1, !dbg !71
%ind.end = or i64 %n.vec, 1, !dbg !71
br i1 %memcheck.conflict, label %middle.block, label %vector.ph, !dbg !71
vector.ph: ; preds = %vector.memcheck
br label %vector.body, !dbg !71
vector.body: ; preds = %vector.body, %vector.ph
%index = phi i64 [ %I_1.sroa.0.0.copyload, %vector.ph ], [ %index.next, %vector.body ], !dbg !61
%normalized.idx = sub i64 %index, %I_1.sroa.0.0.copyload
%38 = add i64 %25, %index, !dbg !63
%39 = getelementptr i32, i32* %19, i64 %38, !dbg !63
%40 = bitcast i32* %39 to <8 x i32>*, !dbg !63
%wide.load = load <8 x i32>, <8 x i32>* %40, align 4, !dbg !63, !tbaa !72
%41 = getelementptr i32, i32* %39, i64 8, !dbg !63
%42 = bitcast i32* %41 to <8 x i32>*, !dbg !63
%wide.load43 = load <8 x i32>, <8 x i32>* %42, align 4, !dbg !63, !tbaa !72
%43 = getelementptr i32, i32* %27, i64 %normalized.idx, !dbg !63
%44 = bitcast i32* %43 to <8 x i32>*, !dbg !63
store <8 x i32> %wide.load, <8 x i32>* %44, align 4, !dbg !63, !tbaa !72
%45 = getelementptr i32, i32* %43, i64 8, !dbg !63
%46 = bitcast i32* %45 to <8 x i32>*, !dbg !63
store <8 x i32> %wide.load43, <8 x i32>* %46, align 4, !dbg !63, !tbaa !72
%index.next = add i64 %index, 16, !dbg !61
%47 = icmp eq i64 %index.next, %end.idx.rnd.down, !dbg !61
br i1 %47, label %middle.block, label %vector.body, !dbg !61, !llvm.loop !74
middle.block: ; preds = %vector.body, %vector.memcheck, %overflow.checked
%resume.val = phi i64 [ 1, %overflow.checked ], [ 1, %vector.memcheck ], [ %ind.end, %vector.body ]
%resume.val34 = phi i64 [ %I_1.sroa.0.0.copyload, %overflow.checked ], [ %I_1.sroa.0.0.copyload, %vector.memcheck ], [ %end.idx.rnd.down, %vector.body ]
%trunc.resume.val = phi i64 [ %I_1.sroa.0.0.copyload, %overflow.checked ], [ %I_1.sroa.0.0.copyload, %vector.memcheck ], [ %end.idx.rnd.down, %vector.body ]
%cmp.n = icmp eq i64 %29, %resume.val34
br i1 %cmp.n, label %L6.loopexit, label %scalar.ph, !dbg !71
scalar.ph: ; preds = %middle.block, %if19.lr.ph
%bc.resume.val = phi i64 [ %resume.val, %middle.block ], [ 1, %if19.lr.ph ]
%bc.trunc.resume.val = phi i64 [ %trunc.resume.val, %middle.block ], [ %I_1.sroa.0.0.copyload, %if19.lr.ph ]
br label %if19, !dbg !71
L11: ; preds = %if, %L6.loopexit
%48 = load i64, i64* %13, align 8, !dbg !66, !tbaa !59
store i64 %48, i64* %11, align 8, !dbg !66, !tbaa !59
ret %jl_value_t* %78, !dbg !66
fail: ; preds = %top
%49 = getelementptr %jl_value_t*, %jl_value_t** %1, i64 2, !dbg !61
call void @jl_bounds_error_tuple_int(%jl_value_t** %49, i64 0, i64 1), !dbg !61
unreachable, !dbg !61
pass: ; preds = %top
%50 = getelementptr %jl_value_t*, %jl_value_t** %1, i64 2, !dbg !61
%51 = icmp ugt i32 %14, 1, !dbg !61
br i1 %51, label %pass.13, label %fail12, !dbg !61
fail12: ; preds = %pass
%52 = sext i32 %14 to i64, !dbg !61
call void @jl_bounds_error_tuple_int(%jl_value_t** %50, i64 %52, i64 2), !dbg !61
unreachable, !dbg !61
pass.13: ; preds = %pass
%53 = bitcast %jl_value_t** %50 to i8**, !dbg !61
%54 = load i8*, i8** %53, align 8, !dbg !61, !tbaa !77
%I_1.sroa.0.0..sroa_cast = bitcast i8* %54 to i64*, !dbg !61
%I_1.sroa.0.0.copyload = load i64, i64* %I_1.sroa.0.0..sroa_cast, align 1, !dbg !61
%I_1.sroa.3.0..sroa_idx = getelementptr inbounds i8, i8* %54, i64 8, !dbg !61
%I_1.sroa.3.0..sroa_cast = bitcast i8* %I_1.sroa.3.0..sroa_idx to i64*, !dbg !61
%I_1.sroa.3.0.copyload = load i64, i64* %I_1.sroa.3.0..sroa_cast, align 1, !dbg !61
%55 = call { i64, i1 } @llvm.ssub.with.overflow.i64(i64 %I_1.sroa.3.0.copyload, i64 %I_1.sroa.0.0.copyload), !dbg !78
%56 = extractvalue { i64, i1 } %55, 1, !dbg !78
br i1 %56, label %fail14, label %pass.15, !dbg !78
fail14: ; preds = %pass.13
%57 = load %jl_value_t*, %jl_value_t** @jl_overflow_exception, align 8, !dbg !78, !tbaa !68
call void @jl_throw(%jl_value_t* %57), !dbg !78
unreachable, !dbg !78
pass.15: ; preds = %pass.13
%58 = extractvalue { i64, i1 } %55, 0, !dbg !78
%59 = call { i64, i1 } @llvm.sadd.with.overflow.i64(i64 %58, i64 1), !dbg !78
%60 = extractvalue { i64, i1 } %59, 1, !dbg !78
br i1 %60, label %fail16, label %pass.17, !dbg !78
fail16: ; preds = %pass.15
%61 = load %jl_value_t*, %jl_value_t** @jl_overflow_exception, align 8, !dbg !78, !tbaa !68
call void @jl_throw(%jl_value_t* %61), !dbg !78
unreachable, !dbg !78
pass.17: ; preds = %pass.15
%62 = getelementptr [8 x %jl_value_t*], [8 x %jl_value_t*]* %6, i64 0, i64 3
%63 = getelementptr [8 x %jl_value_t*], [8 x %jl_value_t*]* %6, i64 0, i64 4
%64 = getelementptr %jl_value_t*, %jl_value_t** %1, i64 1
%65 = load %jl_value_t*, %jl_value_t** %64, align 8
%66 = getelementptr %jl_value_t*, %jl_value_t** %1, i64 3, !dbg !61
%67 = bitcast %jl_value_t** %66 to i64**, !dbg !61
%68 = load i64*, i64** %67, align 8, !dbg !61, !tbaa !77
%69 = load i64, i64* %68, align 1, !dbg !61
%70 = extractvalue { i64, i1 } %59, 0, !dbg !78
%71 = icmp slt i64 %70, 0, !dbg !81
%72 = select i1 %71, i64 0, i64 %70, !dbg !81
%73 = getelementptr inbounds [1 x %OneTo], [1 x %OneTo]* %shape, i64 0, i64 0, i32 0, !dbg !81
store i64 %72, i64* %73, align 8, !dbg !81
%74 = getelementptr i8, i8* %thread_ptr, i64 -1240, !dbg !82
%75 = call %jl_value_t* @jl_gc_pool_alloc(i8* %ptls_i8, i8* %74, i32 16, i32 16360), !dbg !82
%76 = getelementptr inbounds %jl_value_t, %jl_value_t* %75, i64 -1, i32 0, !dbg !82
store %jl_value_t* inttoptr (i64 140241635277456 to %jl_value_t*), %jl_value_t** %76, align 8, !dbg !82, !tbaa !83
%77 = bitcast %jl_value_t* %75 to i64*, !dbg !82
store i64 %72, i64* %77, align 8, !dbg !82
store %jl_value_t* %75, %jl_value_t** %7, align 8, !dbg !82, !tbaa !59
%78 = call %jl_value_t* inttoptr (i64 140250351100496 to %jl_value_t* (%jl_value_t*, %jl_value_t*)*)(%jl_value_t* inttoptr (i64 140241635561136 to %jl_value_t*), %jl_value_t* %75), !dbg !82
store %jl_value_t* %78, %jl_value_t** %62, align 8, !dbg !82, !tbaa !59
call void @llvm.dbg.value(metadata %jl_value_t* %78, i64 0, metadata !30, metadata !58), !dbg !57
store %jl_value_t* %78, %jl_value_t** %63, align 8, !dbg !84, !tbaa !59
%79 = getelementptr inbounds %jl_value_t, %jl_value_t* %78, i64 3, i32 0, !dbg !84
%80 = bitcast %jl_value_t** %79 to i64*, !dbg !84
%81 = load i64, i64* %80, align 8, !dbg !84, !tbaa !85
%82 = icmp slt i64 %81, 0, !dbg !62
%83 = select i1 %82, i64 0, i64 %81, !dbg !62
%84 = getelementptr inbounds [1 x i64], [1 x i64]* %4, i64 0, i64 0, !dbg !62
store i64 %83, i64* %84, align 8, !dbg !62
%85 = getelementptr inbounds [1 x i64], [1 x i64]* %3, i64 0, i64 0, !dbg !62
%86 = load i64, i64* %73, align 8, !dbg !62
store i64 %86, i64* %85, align 8, !dbg !62
%87 = call i8 @"jlsys_==_38935"([1 x i64]* nonnull %4, [1 x i64]* nonnull %3), !dbg !62
%88 = and i8 %87, 1, !dbg !62
%89 = icmp eq i8 %88, 0, !dbg !62
br i1 %89, label %L, label %if, !dbg !62
if: ; preds = %pass.17
%90 = getelementptr [8 x %jl_value_t*], [8 x %jl_value_t*]* %6, i64 0, i64 6
store %jl_value_t* %78, %jl_value_t** %90, align 8, !dbg !86, !tbaa !59
call void @llvm.dbg.value(metadata i64 1, i64 0, metadata !39, metadata !58), !dbg !57
%91 = add i64 %I_1.sroa.3.0.copyload, 1, !dbg !71
%92 = icmp eq i64 %I_1.sroa.0.0.copyload, %91, !dbg !71
br i1 %92, label %L11, label %if19.lr.ph, !dbg !71
if19: ; preds = %scalar.ph, %if19
%Ds.127 = phi i64 [ %bc.resume.val, %scalar.ph ], [ %94, %if19 ]
%"#temp#3.026" = phi i64 [ %bc.trunc.resume.val, %scalar.ph ], [ %93, %if19 ]
%93 = add i64 %"#temp#3.026", 1, !dbg !71
%94 = add i64 %Ds.127, 1, !dbg !90
%95 = add i64 %25, %"#temp#3.026", !dbg !63
%96 = getelementptr i32, i32* %19, i64 %95, !dbg !63
%97 = load i32, i32* %96, align 4, !dbg !63, !tbaa !72
%98 = add i64 %Ds.127, -1, !dbg !63
%99 = getelementptr i32, i32* %27, i64 %98, !dbg !63
store i32 %97, i32* %99, align 4, !dbg !63, !tbaa !72
%100 = icmp eq i64 %93, %91, !dbg !71
br i1 %100, label %L6.loopexit, label %if19, !dbg !71, !llvm.loop !91
}
declare %jl_value_t*** @jl_get_ptls_states()
; Function Attrs: nounwind readnone
declare void @llvm.dbg.declare(metadata, metadata, metadata) #1
; Function Attrs: noreturn
declare void @jl_bounds_error_tuple_int(%jl_value_t**, i64, i64) #2
; Function Attrs: nounwind
declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture readonly, i64, i32, i1) #3
; Function Attrs: nounwind readnone
declare { i64, i1 } @llvm.ssub.with.overflow.i64(i64, i64) #1
; Function Attrs: noreturn
declare void @jl_throw(%jl_value_t*) #2
; Function Attrs: nounwind readnone
declare { i64, i1 } @llvm.sadd.with.overflow.i64(i64, i64) #1
declare %jl_value_t* @jl_gc_pool_alloc(i8*, i8*, i32, i32)
declare i8 @"jlsys_==_38935"([1 x i64]*, [1 x i64]*)
declare void @julia_throw_checksize_error_68765(%jl_value_t*, [1 x %OneTo]*) #0
; Function Attrs: noreturn nounwind
declare void @llvm.trap() #4
; Function Attrs: nounwind readnone
declare void @llvm.dbg.value(metadata, i64, metadata, metadata) #1
; Function Attrs: nounwind
declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i32, i1) #3
attributes #0 = { "no-frame-pointer-elim"="true" }
attributes #1 = { nounwind readnone }
attributes #2 = { noreturn }
attributes #3 = { nounwind }
attributes #4 = { noreturn nounwind }
!llvm.module.flags = !{!0, !1}
!llvm.dbg.cu = !{!2}
!0 = !{i32 2, !"Dwarf Version", i32 4}
!1 = !{i32 1, !"Debug Info Version", i32 3}
!2 = distinct !DICompileUnit(language: DW_LANG_C89, file: !3, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: 1, enums: !4, subprograms: !5)
!3 = !DIFile(filename: "multidimensional.jl", directory: ".")
!4 = !{}
!5 = !{!6, !43, !44, !45, !47, !49, !45, !47, !45, !47, !50, !43, !51, !45, !47, !52, !53, !45, !47, !54, !43}
!6 = !DISubprogram(name: "_unsafe_getindex", linkageName: "julia__unsafe_getindex_68766", scope: null, file: !3, type: !7, isLocal: false, isDefinition: true, isOptimized: true, function: %jl_value_t* (%jl_value_t*, %jl_value_t**, i32)* @julia__unsafe_getindex_68764, variables: !15)
!7 = !DISubroutineType(types: !8)
!8 = !{!9, !9, !13, !14}
!9 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !10, size: 64, align: 64)
!10 = !DICompositeType(tag: DW_TAG_structure_type, name: "jl_value_t", file: !11, line: 71, align: 64, elements: !12)
!11 = !DIFile(filename: "julia.h", directory: "")
!12 = !{!9}
!13 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !9, size: 64, align: 64)
!14 = !DIBasicType(name: "Int32", size: 32, align: 32, encoding: DW_ATE_unsigned)
!15 = !{!16, !18, !19, !20, !24, !25, !30, !31, !31, !31, !20, !24, !33, !36, !37, !38, !39, !40, !41, !42, !31, !31}
!16 = !DILocalVariable(tag: DW_TAG_arg_variable, name: "#self#", arg: 1, scope: !6, file: !3, line: 284, type: !17)
!17 = !DICompositeType(tag: DW_TAG_structure_type, name: "#_unsafe_getindex", align: 8, elements: !4, runtimeLang: DW_LANG_Julia)
!18 = !DILocalVariable(tag: DW_TAG_arg_variable, name: "A", arg: 3, scope: !6, file: !3, line: 284, type: !9)
!19 = !DILocalVariable(tag: DW_TAG_arg_variable, name: "I...", arg: 4, scope: !6, file: !3, line: 284, type: !9)
!20 = !DILocalVariable(tag: DW_TAG_auto_variable, name: "I_1", scope: !6, file: !3, line: 284, type: !21)
!21 = !DICompositeType(tag: DW_TAG_structure_type, name: "UnitRange", size: 128, align: 64, elements: !22, runtimeLang: DW_LANG_Julia)
!22 = !{!23, !23}
!23 = !DIBasicType(name: "Int64", size: 64, align: 64, encoding: DW_ATE_unsigned)
!24 = !DILocalVariable(tag: DW_TAG_auto_variable, name: "I_2", scope: !6, file: !3, line: 284, type: !23)
!25 = !DILocalVariable(tag: DW_TAG_auto_variable, name: "shape", scope: !6, file: !3, line: 284, type: !26)
!26 = !DICompositeType(tag: DW_TAG_structure_type, name: "Tuple", size: 64, align: 64, elements: !27, runtimeLang: DW_LANG_Julia)
!27 = !{!28}
!28 = !DICompositeType(tag: DW_TAG_structure_type, name: "OneTo", size: 64, align: 64, elements: !29, runtimeLang: DW_LANG_Julia)
!29 = !{!23}
!30 = !DILocalVariable(tag: DW_TAG_auto_variable, name: "dest", scope: !6, file: !3, line: 284, type: !9)
!31 = !DILocalVariable(tag: DW_TAG_auto_variable, name: "#70", scope: !6, file: !3, line: 284, type: !32)
!32 = !DICompositeType(tag: DW_TAG_structure_type, name: "##70#71", align: 8, elements: !4, runtimeLang: DW_LANG_Julia)
!33 = !DILocalVariable(tag: DW_TAG_auto_variable, name: "J", scope: !6, file: !3, line: 284, type: !34)
!34 = !DICompositeType(tag: DW_TAG_structure_type, name: "Tuple", size: 192, align: 64, elements: !35, runtimeLang: DW_LANG_Julia)
!35 = !{!21, !23}
!36 = !DILocalVariable(tag: DW_TAG_auto_variable, name: "J_1", scope: !6, file: !3, line: 284, type: !21)
!37 = !DILocalVariable(tag: DW_TAG_auto_variable, name: "J_2", scope: !6, file: !3, line: 284, type: !23)
!38 = !DILocalVariable(tag: DW_TAG_auto_variable, name: "D", scope: !6, file: !3, line: 284, type: !28)
!39 = !DILocalVariable(tag: DW_TAG_auto_variable, name: "Ds", scope: !6, file: !3, line: 284, type: !23)
!40 = !DILocalVariable(tag: DW_TAG_auto_variable, name: "j_2", scope: !6, file: !3, line: 284, type: !23)
!41 = !DILocalVariable(tag: DW_TAG_auto_variable, name: "j_1", scope: !6, file: !3, line: 284, type: !23)
!42 = !DILocalVariable(tag: DW_TAG_auto_variable, name: "d", scope: !6, file: !3, line: 284, type: !23)
!43 = !DISubprogram(name: "macro expansion;", linkageName: "macro expansion", scope: !3, file: !3, type: !7, isLocal: false, isDefinition: true, isOptimized: true, variables: !4)
!44 = !DISubprogram(name: "index_shape;", linkageName: "index_shape", scope: !3, file: !3, type: !7, isLocal: false, isDefinition: true, isOptimized: true, variables: !4)
!45 = !DISubprogram(name: "indices;", linkageName: "indices", scope: !46, file: !46, type: !7, isLocal: false, isDefinition: true, isOptimized: true, variables: !4)
!46 = !DIFile(filename: "abstractarray.jl", directory: ".")
!47 = !DISubprogram(name: "map;", linkageName: "map", scope: !48, file: !48, type: !7, isLocal: false, isDefinition: true, isOptimized: true, variables: !4)
!48 = !DIFile(filename: "tuple.jl", directory: ".")
!49 = !DISubprogram(name: "index_shape_dim;", linkageName: "index_shape_dim", scope: !3, file: !3, type: !7, isLocal: false, isDefinition: true, isOptimized: true, variables: !4)
!50 = !DISubprogram(name: "_unsafe_getindex!;", linkageName: "_unsafe_getindex!", scope: !3, file: !3, type: !7, isLocal: false, isDefinition: true, isOptimized: true, variables: !4)
!51 = !DISubprogram(name: "decolon;", linkageName: "decolon", scope: !3, file: !3, type: !7, isLocal: false, isDefinition: true, isOptimized: true, variables: !4)
!52 = !DISubprogram(name: "eachindex;", linkageName: "eachindex", scope: !46, file: !46, type: !7, isLocal: false, isDefinition: true, isOptimized: true, variables: !4)
!53 = !DISubprogram(name: "indices1;", linkageName: "indices1", scope: !46, file: !46, type: !7, isLocal: false, isDefinition: true, isOptimized: true, variables: !4)
!54 = !DISubprogram(name: "macro expansion;", linkageName: "macro expansion", scope: !55, file: !55, type: !7, isLocal: false, isDefinition: true, isOptimized: true, variables: !4)
!55 = !DIFile(filename: "cartesian.jl", directory: ".")
!56 = !DIExpression(DW_OP_deref, DW_OP_plus, 8)
!57 = !DILocation(line: 284, scope: !6)
!58 = !DIExpression()
!59 = !{!"jtbaa_gcframe", !60}
!60 = !{!"jtbaa"}
!61 = !DILocation(line: 287, scope: !43, inlinedAt: !57)
!62 = !DILocation(line: 290, scope: !43, inlinedAt: !57)
!63 = !DILocation(line: 343, scope: !43, inlinedAt: !64)
!64 = !DILocation(line: 64, scope: !54, inlinedAt: !65)
!65 = !DILocation(line: 341, scope: !43, inlinedAt: !66)
!66 = !DILocation(line: 333, scope: !50, inlinedAt: !67)
!67 = !DILocation(line: 291, scope: !43, inlinedAt: !57)
!68 = !{!"jtbaa_const", !60, i64 1}
!69 = !{!"jtbaa_arrayptr", !70}
!70 = !{!"jtbaa_array", !60}
!71 = !DILocation(line: 62, scope: !54, inlinedAt: !65)
!72 = !{!"jtbaa_arraybuf", !73}
!73 = !{!"jtbaa_data", !60}
!74 = distinct !{!74, !75, !76}
!75 = !{!"llvm.loop.vectorize.width", i32 1}
!76 = !{!"llvm.loop.interleave.count", i32 1}
!77 = !{!"jtbaa_value", !73}
!78 = !DILocation(line: 44, scope: !45, inlinedAt: !79)
!79 = !DILocation(line: 226, scope: !49, inlinedAt: !80)
!80 = !DILocation(line: 217, scope: !44, inlinedAt: !81)
!81 = !DILocation(line: 288, scope: !43, inlinedAt: !57)
!82 = !DILocation(line: 289, scope: !43, inlinedAt: !57)
!83 = !{!"jtbaa_tag", !73}
!84 = !DILocation(line: 44, scope: !45, inlinedAt: !62)
!85 = !{!"jtbaa_arraysize", !70}
!86 = !DILocation(line: 44, scope: !45, inlinedAt: !87)
!87 = !DILocation(line: 51, scope: !53, inlinedAt: !88)
!88 = !DILocation(line: 593, scope: !52, inlinedAt: !89)
!89 = !DILocation(line: 339, scope: !43, inlinedAt: !66)
!90 = !DILocation(line: 342, scope: !43, inlinedAt: !64)
!91 = distinct !{!91, !75, !76}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment