Created
July 25, 2016 18:53
-
-
Save JeffBezanson/1688004c3b4bdd7c2a8fd9d7114dea8d to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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