Skip to content

Instantly share code, notes, and snippets.

@Zentrik
Created July 10, 2024 22:24
Show Gist options
  • Save Zentrik/1ff09cce2f2a098b6622286fdaa678f4 to your computer and use it in GitHub Desktop.
Save Zentrik/1ff09cce2f2a098b6622286fdaa678f4 to your computer and use it in GitHub Desktop.
; Function Signature: perf_sumelt(Base.SubArray{Int32, 2, Array{Int32, 3}, Tuple{Int64, Base.Slice{Base.OneTo{Int64}}, Base.Slice{Base.OneTo{Int64}}}, true})
; @ REPL[4]:1 within `perf_sumelt`
define i32 @julia_perf_sumelt_17680(ptr nocapture noundef nonnull readonly align 8 dereferenceable(48) %"A::SubArray") #0 {
top:
%"new::Tuple" = alloca [1 x i64], align 8
; @ REPL[4]:3 within `perf_sumelt`
; ┌ @ abstractarray.jl:1232 within `iterate`
; │┌ @ abstractarray.jl:378 within `eachindex` @ abstractarray.jl:388
; ││┌ @ abstractarray.jl:315 within `length`
; │││┌ @ subarray.jl:65 within `size`
; ││││┌ @ subarray.jl:517 within `axes`
%"A::SubArray.indices_ptr[2]_ptr" = getelementptr inbounds { ptr, { i64, [1 x [1 x i64]], [1 x [1 x i64]] }, i64, i64 }, ptr %"A::SubArray", i64 0, i32 1, i32 1
%"A::SubArray.indices_ptr[3]_ptr" = getelementptr inbounds { ptr, { i64, [1 x [1 x i64]], [1 x [1 x i64]] }, i64, i64 }, ptr %"A::SubArray", i64 0, i32 1, i32 2
; │││└└
; │││┌ @ tuple.jl:661 within `prod`
; ││││┌ @ int.jl:88 within `*`
%"A::SubArray.indices_ptr[2]_ptr.indices_ptr.stop_ptr.unbox" = load i64, ptr %"A::SubArray.indices_ptr[2]_ptr", align 8
%"A::SubArray.indices_ptr[3]_ptr.indices_ptr.stop_ptr.unbox" = load i64, ptr %"A::SubArray.indices_ptr[3]_ptr", align 8
%0 = mul i64 %"A::SubArray.indices_ptr[3]_ptr.indices_ptr.stop_ptr.unbox", %"A::SubArray.indices_ptr[2]_ptr.indices_ptr.stop_ptr.unbox"
; ││└└└
; ││┌ @ range.jl:483 within `oneto`
; │││┌ @ range.jl:481 within `OneTo` @ range.jl:466
; ││││┌ @ promotion.jl:650 within `max`
; │││││┌ @ essentials.jl:786 within `ifelse`
%1 = call i64 @llvm.smax.i64(i64 %0, i64 0)
; │└└└└└
; │ @ abstractarray.jl:1232 within `iterate` @ abstractarray.jl:1232 @ range.jl:911
; │┌ @ range.jl:688 within `isempty`
; ││┌ @ operators.jl:420 within `>`
; │││┌ @ int.jl:83 within `<`
%2 = icmp slt i64 %0, 1
; │└└└
; │ @ abstractarray.jl:1232 within `iterate` @ abstractarray.jl:1233
br i1 %2, label %L146, label %guard_exit125
L93: ; preds = %guard_exit130, %scalar.ph
%3 = phi i64 [ %127, %guard_exit130 ], [ %bc.resume.val, %scalar.ph ]
%4 = phi i32 [ %126, %guard_exit130 ], [ %bc.merge.rdx, %scalar.ph ]
%value_phi12174 = phi i64 [ %3, %guard_exit130 ], [ %bc.resume.val197, %scalar.ph ]
; └
; @ REPL[4]:5 within `perf_sumelt`
; ┌ @ abstractarray.jl:1234 within `iterate`
; │┌ @ subarray.jl:329 within `getindex`
; ││┌ @ abstractarray.jl:699 within `checkbounds` @ abstractarray.jl:689
; │││┌ @ abstractarray.jl:754 within `checkindex`
; ││││┌ @ int.jl:513 within `<`
%.not = icmp ult i64 %value_phi12174, %1
; │││└└
; │││ @ abstractarray.jl:699 within `checkbounds`
br i1 %.not, label %guard_exit130, label %L110
L110: ; preds = %L93
; ││└
store i64 %3, ptr %"new::Tuple", align 8
; ││┌ @ abstractarray.jl:699 within `checkbounds`
call void @j_throw_boundserror_17698(ptr nocapture nonnull readonly %"A::SubArray", ptr nocapture nonnull readonly %"new::Tuple") #9
unreachable
L146: ; preds = %guard_exit130, %guard_exit130.peel, %guard_exit125, %top
%value_phi22 = phi i32 [ 0, %top ], [ %10, %guard_exit125 ], [ %17, %guard_exit130.peel ], [ %126, %guard_exit130 ]
; └└└
; @ REPL[4]:6 within `perf_sumelt`
ret i32 %value_phi22
guard_exit125: ; preds = %top
; @ REPL[4]:3 within `perf_sumelt`
; ┌ @ abstractarray.jl:1232 within `iterate` @ abstractarray.jl:1234
; │┌ @ subarray.jl:330 within `getindex`
; ││┌ @ Base.jl:49 within `getproperty`
%"A::SubArray.parent77" = load atomic ptr, ptr %"A::SubArray" unordered, align 8
; ││└
; ││┌ @ subarray.jl:324 within `_reindexlinear`
; │││┌ @ Base.jl:49 within `getproperty`
%"A::SubArray.offset1_ptr79" = getelementptr inbounds { ptr, { i64, [1 x [1 x i64]], [1 x [1 x i64]] }, i64, i64 }, ptr %"A::SubArray", i64 0, i32 2
%"A::SubArray.stride1_ptr81" = getelementptr inbounds { ptr, { i64, [1 x [1 x i64]], [1 x [1 x i64]] }, i64, i64 }, ptr %"A::SubArray", i64 0, i32 3
; │││└
; │││┌ @ int.jl:88 within `*`
%"A::SubArray.stride1_ptr81.unbox" = load i64, ptr %"A::SubArray.stride1_ptr81", align 8
; │││└
; │││┌ @ int.jl:87 within `+`
%"A::SubArray.offset1_ptr79.unbox" = load i64, ptr %"A::SubArray.offset1_ptr79", align 8
%5 = add i64 %"A::SubArray.offset1_ptr79.unbox", %"A::SubArray.stride1_ptr81.unbox"
; ││└└
; ││ @ subarray.jl:330 within `getindex` @ essentials.jl:907
%6 = load ptr, ptr %"A::SubArray.parent77", align 8
%7 = shl i64 %5, 2
%8 = add i64 %7, -4
%9 = getelementptr i8, ptr %6, i64 %8
%10 = load i32, ptr %9, align 4
; └└
; @ REPL[4]:5 within `perf_sumelt`
; ┌ @ abstractarray.jl:1232 within `iterate` @ range.jl:915
; │┌ @ promotion.jl:639 within `==`
%.not.not.not173 = icmp eq i64 %1, 1
; │└
; │ @ abstractarray.jl:1233 within `iterate`
br i1 %.not.not.not173, label %L146, label %guard_exit130.peel
guard_exit130.peel: ; preds = %guard_exit125
; │ @ abstractarray.jl:1234 within `iterate`
; │┌ @ subarray.jl:330 within `getindex` @ essentials.jl:907
%11 = shl i64 %"A::SubArray.stride1_ptr81.unbox", 3
%12 = shl i64 %"A::SubArray.offset1_ptr79.unbox", 2
%13 = add i64 %11, %12
%14 = add i64 %13, -4
%15 = getelementptr i8, ptr %6, i64 %14
%16 = load i32, ptr %15, align 4
; └└
; @ REPL[4]:4 within `perf_sumelt`
; ┌ @ int.jl:87 within `+`
%17 = add i32 %10, %16
; └
; @ REPL[4]:5 within `perf_sumelt`
; ┌ @ abstractarray.jl:1232 within `iterate` @ range.jl:915
; │┌ @ promotion.jl:639 within `==`
%.not.not.not.peel = icmp eq i64 %1, 2
; │└
; │ @ abstractarray.jl:1233 within `iterate`
br i1 %.not.not.not.peel, label %L146, label %L93.preheader
L93.preheader: ; preds = %guard_exit130.peel
; │ @ abstractarray.jl:1234 within `iterate`
; │┌ @ subarray.jl:329 within `getindex`
; ││┌ @ abstractarray.jl:699 within `checkbounds`
%18 = add nsw i64 %1, -2
%19 = add nsw i64 %1, -3
%umin = call i64 @llvm.umin.i64(i64 %18, i64 %19)
%20 = add nsw i64 %umin, 1
%min.iters.check = icmp ult i64 %20, 17
br i1 %min.iters.check, label %scalar.ph, label %vector.ph
vector.ph: ; preds = %L93.preheader
%n.mod.vf = and i64 %20, 15
%21 = icmp eq i64 %n.mod.vf, 0
%22 = select i1 %21, i64 16, i64 %n.mod.vf
%n.vec = sub nsw i64 %20, %22
%ind.end = add i64 %n.vec, 3
%ind.end196 = add i64 %n.vec, 2
%23 = insertelement <8 x i32> <i32 poison, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>, i32 %17, i64 0
; ││└
; ││ @ subarray.jl:330 within `getindex`
; ││┌ @ subarray.jl:324 within `_reindexlinear`
; │││┌ @ int.jl:87 within `+`
%24 = insertelement <4 x i64> poison, i64 %"A::SubArray.offset1_ptr79.unbox", i64 0
%25 = shufflevector <4 x i64> %24, <4 x i64> poison, <4 x i32> zeroinitializer
; │││└
; │││┌ @ int.jl:88 within `*`
%26 = insertelement <4 x i64> poison, i64 %"A::SubArray.stride1_ptr81.unbox", i64 0
%27 = shufflevector <4 x i64> %26, <4 x i64> poison, <4 x i32> zeroinitializer
; ││└└
; ││ @ subarray.jl:329 within `getindex`
; ││┌ @ abstractarray.jl:699 within `checkbounds`
br label %vector.body
vector.body: ; preds = %vector.body, %vector.ph
%index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
%vec.phi = phi <8 x i32> [ %23, %vector.ph ], [ %116, %vector.body ]
%vec.phi198 = phi <8 x i32> [ zeroinitializer, %vector.ph ], [ %117, %vector.body ]
%28 = insertelement <4 x i64> poison, i64 %index, i64 0
%29 = shufflevector <4 x i64> %28, <4 x i64> poison, <4 x i32> zeroinitializer
%30 = or <4 x i64> %29, <i64 3, i64 4, i64 5, i64 6>
%31 = or <4 x i64> %29, <i64 7, i64 8, i64 9, i64 10>
%32 = or <4 x i64> %29, <i64 11, i64 12, i64 13, i64 14>
%33 = or <4 x i64> %29, <i64 15, i64 poison, i64 poison, i64 poison>
%34 = add <4 x i64> %29, <i64 poison, i64 16, i64 17, i64 18>
%35 = shufflevector <4 x i64> %33, <4 x i64> %34, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
; ││└
; ││ @ subarray.jl:330 within `getindex`
; ││┌ @ subarray.jl:324 within `_reindexlinear`
; │││┌ @ int.jl:88 within `*`
%36 = mul <4 x i64> %27, %30
; │││└
; │││┌ @ int.jl:87 within `+`
%37 = add <4 x i64> %25, %36
; ││└└
; ││ @ subarray.jl:330 within `getindex` @ essentials.jl:907
%38 = shl <4 x i64> %37, <i64 2, i64 2, i64 2, i64 2>
%39 = add <4 x i64> %38, <i64 -4, i64 -4, i64 -4, i64 -4>
; ││ @ subarray.jl:330 within `getindex`
; ││┌ @ subarray.jl:324 within `_reindexlinear`
; │││┌ @ int.jl:88 within `*`
%40 = mul <4 x i64> %27, %31
; │││└
; │││┌ @ int.jl:87 within `+`
%41 = add <4 x i64> %25, %40
; ││└└
; ││ @ subarray.jl:330 within `getindex` @ essentials.jl:907
%42 = shl <4 x i64> %41, <i64 2, i64 2, i64 2, i64 2>
%43 = add <4 x i64> %42, <i64 -4, i64 -4, i64 -4, i64 -4>
; ││ @ subarray.jl:330 within `getindex`
; ││┌ @ subarray.jl:324 within `_reindexlinear`
; │││┌ @ int.jl:88 within `*`
%44 = mul <4 x i64> %27, %32
; │││└
; │││┌ @ int.jl:87 within `+`
%45 = add <4 x i64> %25, %44
; ││└└
; ││ @ subarray.jl:330 within `getindex` @ essentials.jl:907
%46 = shl <4 x i64> %45, <i64 2, i64 2, i64 2, i64 2>
%47 = add <4 x i64> %46, <i64 -4, i64 -4, i64 -4, i64 -4>
; ││ @ subarray.jl:330 within `getindex`
; ││┌ @ subarray.jl:324 within `_reindexlinear`
; │││┌ @ int.jl:88 within `*`
%48 = mul <4 x i64> %27, %35
; │││└
; │││┌ @ int.jl:87 within `+`
%49 = add <4 x i64> %25, %48
; ││└└
; ││ @ subarray.jl:330 within `getindex` @ essentials.jl:907
%50 = shl <4 x i64> %49, <i64 2, i64 2, i64 2, i64 2>
%51 = add <4 x i64> %50, <i64 -4, i64 -4, i64 -4, i64 -4>
%52 = extractelement <4 x i64> %39, i64 0
%53 = getelementptr i8, ptr %6, i64 %52
%54 = extractelement <4 x i64> %39, i64 1
%55 = getelementptr i8, ptr %6, i64 %54
%56 = extractelement <4 x i64> %39, i64 2
%57 = getelementptr i8, ptr %6, i64 %56
%58 = extractelement <4 x i64> %39, i64 3
%59 = getelementptr i8, ptr %6, i64 %58
%60 = extractelement <4 x i64> %43, i64 0
%61 = getelementptr i8, ptr %6, i64 %60
%62 = extractelement <4 x i64> %43, i64 1
%63 = getelementptr i8, ptr %6, i64 %62
%64 = extractelement <4 x i64> %43, i64 2
%65 = getelementptr i8, ptr %6, i64 %64
%66 = extractelement <4 x i64> %43, i64 3
%67 = getelementptr i8, ptr %6, i64 %66
%68 = extractelement <4 x i64> %47, i64 0
%69 = getelementptr i8, ptr %6, i64 %68
%70 = extractelement <4 x i64> %47, i64 1
%71 = getelementptr i8, ptr %6, i64 %70
%72 = extractelement <4 x i64> %47, i64 2
%73 = getelementptr i8, ptr %6, i64 %72
%74 = extractelement <4 x i64> %47, i64 3
%75 = getelementptr i8, ptr %6, i64 %74
%76 = extractelement <4 x i64> %51, i64 0
%77 = getelementptr i8, ptr %6, i64 %76
%78 = extractelement <4 x i64> %51, i64 1
%79 = getelementptr i8, ptr %6, i64 %78
%80 = extractelement <4 x i64> %51, i64 2
%81 = getelementptr i8, ptr %6, i64 %80
%82 = extractelement <4 x i64> %51, i64 3
%83 = getelementptr i8, ptr %6, i64 %82
%84 = load i32, ptr %53, align 4
%85 = load i32, ptr %55, align 4
%86 = load i32, ptr %57, align 4
%87 = load i32, ptr %59, align 4
%88 = load i32, ptr %61, align 4
%89 = load i32, ptr %63, align 4
%90 = load i32, ptr %65, align 4
%91 = load i32, ptr %67, align 4
%92 = insertelement <8 x i32> poison, i32 %84, i64 0
%93 = insertelement <8 x i32> %92, i32 %85, i64 1
%94 = insertelement <8 x i32> %93, i32 %86, i64 2
%95 = insertelement <8 x i32> %94, i32 %87, i64 3
%96 = insertelement <8 x i32> %95, i32 %88, i64 4
%97 = insertelement <8 x i32> %96, i32 %89, i64 5
%98 = insertelement <8 x i32> %97, i32 %90, i64 6
%99 = insertelement <8 x i32> %98, i32 %91, i64 7
%100 = load i32, ptr %69, align 4
%101 = load i32, ptr %71, align 4
%102 = load i32, ptr %73, align 4
%103 = load i32, ptr %75, align 4
%104 = load i32, ptr %77, align 4
%105 = load i32, ptr %79, align 4
%106 = load i32, ptr %81, align 4
%107 = load i32, ptr %83, align 4
; ││ @ subarray.jl:329 within `getindex`
; ││┌ @ abstractarray.jl:699 within `checkbounds`
%108 = insertelement <8 x i32> poison, i32 %100, i64 0
%109 = insertelement <8 x i32> %108, i32 %101, i64 1
%110 = insertelement <8 x i32> %109, i32 %102, i64 2
%111 = insertelement <8 x i32> %110, i32 %103, i64 3
%112 = insertelement <8 x i32> %111, i32 %104, i64 4
%113 = insertelement <8 x i32> %112, i32 %105, i64 5
%114 = insertelement <8 x i32> %113, i32 %106, i64 6
%115 = insertelement <8 x i32> %114, i32 %107, i64 7
%116 = add <8 x i32> %vec.phi, %99
%117 = add <8 x i32> %vec.phi198, %115
%index.next = add nuw i64 %index, 16
%118 = icmp eq i64 %index.next, %n.vec
br i1 %118, label %middle.block, label %vector.body
middle.block: ; preds = %vector.body
; │└└
; │ @ abstractarray.jl:1233 within `iterate`
%bin.rdx = add <8 x i32> %117, %116
%119 = call i32 @llvm.vector.reduce.add.v8i32(<8 x i32> %bin.rdx)
br label %scalar.ph
scalar.ph: ; preds = %middle.block, %L93.preheader
%bc.resume.val = phi i64 [ %ind.end, %middle.block ], [ 3, %L93.preheader ]
%bc.resume.val197 = phi i64 [ %ind.end196, %middle.block ], [ 2, %L93.preheader ]
%bc.merge.rdx = phi i32 [ %119, %middle.block ], [ %17, %L93.preheader ]
; │ @ abstractarray.jl:1234 within `iterate`
; │┌ @ subarray.jl:329 within `getindex`
; ││┌ @ abstractarray.jl:699 within `checkbounds`
br label %L93
guard_exit130: ; preds = %L93
; ││└
; ││ @ subarray.jl:330 within `getindex`
; ││┌ @ subarray.jl:324 within `_reindexlinear`
; │││┌ @ int.jl:88 within `*`
%120 = mul i64 %"A::SubArray.stride1_ptr81.unbox", %3
; │││└
; │││┌ @ int.jl:87 within `+`
%121 = add i64 %"A::SubArray.offset1_ptr79.unbox", %120
; ││└└
; ││ @ subarray.jl:330 within `getindex` @ essentials.jl:907
%122 = shl i64 %121, 2
%123 = add i64 %122, -4
%124 = getelementptr i8, ptr %6, i64 %123
%125 = load i32, ptr %124, align 4
; └└
; @ REPL[4]:4 within `perf_sumelt`
; ┌ @ int.jl:87 within `+`
%126 = add i32 %4, %125
; └
; @ REPL[4]:5 within `perf_sumelt`
; ┌ @ abstractarray.jl:1232 within `iterate` @ range.jl:915
; │┌ @ promotion.jl:639 within `==`
%.not.not.not = icmp eq i64 %3, %1
; │└
%127 = add nuw i64 %3, 1
; │ @ abstractarray.jl:1233 within `iterate`
br i1 %.not.not.not, label %L146, label %L93
; └
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment