Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

segfault in jl_datatype_layout while constructing Memory #54266

Closed
nsajko opened this issue Apr 26, 2024 · 6 comments · Fixed by #54335
Closed

segfault in jl_datatype_layout while constructing Memory #54266

nsajko opened this issue Apr 26, 2024 · 6 comments · Fixed by #54335
Labels
kind:bug Indicates an unexpected problem or unintended behavior kind:rr trace included
Milestone

Comments

@nsajko
Copy link
Contributor

nsajko commented Apr 26, 2024

Reproducer, for both v1.11.0-beta1 and nightly:

module FixedSizeArrays

struct Internal end

struct FixedSizeArray{T,N} <: DenseArray{T,N}
    mem::Memory{T}
    size::NTuple{N,Int}
    function FixedSizeArray{T,N}(::Internal, mem::Memory{T}, size::NTuple{N,Int}) where {T,N}
        new{T,N}(mem, size)
    end
end

function FixedSizeArray{T,N}(::UndefInitializer, size::NTuple{N,Int}) where {T,N}
    FixedSizeArray{T,N}(Internal(), Memory{T}(undef, checked_dims(size)), size)
end
function FixedSizeArray{T,N}(::UndefInitializer, size::Vararg{Int,N}) where {T,N}
    FixedSizeArray{T,N}(undef, size)
end
function FixedSizeArray{T}(::UndefInitializer, size::Vararg{Int,N}) where {T,N}
    FixedSizeArray{T,N}(undef, size)
end
function FixedSizeArray{T}(::UndefInitializer, size::NTuple{N,Int}) where {T,N}
    FixedSizeArray{T,N}(undef, size)
end

Base.IndexStyle(::Type{<:FixedSizeArray}) = IndexLinear()
Base.getindex(A::FixedSizeArray, i::Int) = A.mem[i]
Base.setindex!(A::FixedSizeArray, v, i::Int) = A.mem[i] = v

Base.size(a::FixedSizeArray) = getfield(a, :size)

function Base.similar(::FixedSizeArray, ::Type{S}, size::NTuple{N,Int}) where {S,N}
    FixedSizeArray{S,N}(undef, size...)
end

# safe product of a tuple of integers, for calculating dimensions size

checked_dims_impl(a::Int, ::Tuple{}, have_overflow::Bool) = (a, have_overflow)
function checked_dims_impl(a::Int, t::Tuple{Int,Vararg{Int,N}}, have_overflow::Bool) where {N}
    b = first(t)
    (m, o) = Base.Checked.mul_with_overflow(a, b)
    r = Base.tail(t)::NTuple{N,Int}
    checked_dims_impl(m, r, have_overflow | o)::Tuple{Int,Bool}
end

checked_dims(::Tuple{}) = 1
function checked_dims(t::Tuple{Int,Vararg{Int,N}}) where {N}
    any_is_zero     = any(iszero,                 t)::Bool
    any_is_negative = any((x -> x < false),       t)::Bool
    any_is_typemax  = any((x -> x == typemax(x)), t)::Bool
    a = first(t)
    r = Base.tail(t)::NTuple{N,Int}
    (product, have_overflow) = checked_dims_impl(a, r, false)::Tuple{Int,Bool}
    if any_is_negative
        throw(ArgumentError("array dimension size can't be negative"))
    end
    if any_is_typemax
        throw(ArgumentError("array dimension size can't be the maximum representable value"))
    end
    if have_overflow & !any_is_zero
        throw(ArgumentError("array dimensions too great, can't represent length"))
    end
    product
end

# broadcasting

function Base.BroadcastStyle(::Type{<:FixedSizeArray})
    Broadcast.ArrayStyle{FixedSizeArray}()
end

function Base.similar(
    bc::Broadcast.Broadcasted{Broadcast.ArrayStyle{FixedSizeArray}},
    ::Type{E},
) where {E}
    similar(FixedSizeArray{E}, axes(bc))
end

# helper functions

parent_type(::Type{<:FixedSizeArray{T}}) where {T} = Memory{T}

memory_of(m::Memory) = m
memory_of(f::FixedSizeArray) = f.mem

first_linear_index(a) = first(eachindex(IndexLinear(), a))

axes_are_one_based(axes) = all(isone  first, axes)

# converting constructors for copying other array types

function FixedSizeArray{T,N}(src::AbstractArray{S,N}) where {T,N,S}
    axs = axes(src)
    if !axes_are_one_based(axs)
        throw(DimensionMismatch("source array has a non-one-based indexing axis"))
    end
    # Can't use `Base.size` because, according to it's doc string, it's not
    # available for all `AbstractArray` types.
    size = map(length, axs)
    dst = FixedSizeArray{T,N}(undef, size)
    copyto!(dst, src)::FixedSizeArray{T,N}
end

FixedSizeArray{T}(a::AbstractArray{<:Any,N})   where {T,N} = FixedSizeArray{T,N}(a)
FixedSizeArray{<:Any,N}(a::AbstractArray{T,N}) where {T,N} = FixedSizeArray{T,N}(a)
FixedSizeArray(a::AbstractArray{T,N})          where {T,N} = FixedSizeArray{T,N}(a)

# conversion

Base.convert(::Type{T}, a::T) where {T<:FixedSizeArray} = a
Base.convert(::Type{T}, a::AbstractArray) where {T<:FixedSizeArray} = T(a)::T

end # module FixedSizeArrays


# creates nested vectors
rand_nested_vec(::Tuple{}) = rand()
function rand_nested_vec(size::Tuple{Vararg{Int}})
  [rand_nested_vec(Base.tail(size)) for _  Base.OneTo(first(size))]::Vector
end

# converts nested vectors to other `AbstractArray` types
recursive_array_convert(::Type{T}) where {T} = a -> recursive_array_convert(T, a)
recursive_array_convert(::Type, a) = a
function recursive_array_convert(::Type{T}, a::AbstractArray) where {T}
  t = map(recursive_array_convert(T), a)
  T(t)::T
end

f(a) = map(+, a, a)

data = recursive_array_convert(FixedSizeArrays.FixedSizeArray, rand_nested_vec((100, 10, 100)));

iter_cnt = 1000  # when lowered to, e.g., 30, the bug doesn't reproduce each time

for _  1:iter_cnt
  f(data)
end

Backtrace with -g2 --check-bounds=yes:

julia> for _ ∈ 1:iter_cnt
         f(data)
       end

[150999] signal 11 (1): Segmentation fault
in expression starting at REPL[11]:1
jl_datatype_layout at /cache/build/builder-amdci5-3/julialang/julia-master/src/julia.h:1366 [inlined]
gc_mark_outrefs at /cache/build/builder-amdci5-3/julialang/julia-master/src/gc.c:2791 [inlined]
gc_mark_loop_serial_ at /cache/build/builder-amdci5-3/julialang/julia-master/src/gc.c:2963
gc_mark_loop_serial at /cache/build/builder-amdci5-3/julialang/julia-master/src/gc.c:2986
gc_mark_loop at /cache/build/builder-amdci5-3/julialang/julia-master/src/gc.c:3163 [inlined]
_jl_gc_collect at /cache/build/builder-amdci5-3/julialang/julia-master/src/gc.c:3552
ijl_gc_collect at /cache/build/builder-amdci5-3/julialang/julia-master/src/gc.c:3931
maybe_collect at /cache/build/builder-amdci5-3/julialang/julia-master/src/gc.c:922 [inlined]
jl_gc_pool_alloc_inner at /cache/build/builder-amdci5-3/julialang/julia-master/src/gc.c:1319
jl_gc_pool_alloc_noinline at /cache/build/builder-amdci5-3/julialang/julia-master/src/gc.c:1386 [inlined]
jl_gc_alloc_ at /cache/build/builder-amdci5-3/julialang/julia-master/src/julia_internal.h:506 [inlined]
jl_gc_alloc at /cache/build/builder-amdci5-3/julialang/julia-master/src/gc.c:3984
_new_genericmemory_ at /cache/build/builder-amdci5-3/julialang/julia-master/src/genericmemory.c:56 [inlined]
jl_alloc_genericmemory at /cache/build/builder-amdci5-3/julialang/julia-master/src/genericmemory.c:99
GenericMemory at ./boot.jl:529 [inlined]
FixedSizeArray at ./REPL[1]:19 [inlined]
FixedSizeArray at ./REPL[1]:28 [inlined]
similar at ./abstractarray.jl:868 [inlined]
similar at ./abstractarray.jl:867 [inlined]
similar at ./REPL[1]:81 [inlined]
copy at ./broadcast.jl:897 [inlined]
materialize at ./broadcast.jl:872 [inlined]
broadcast_preserving_zero_d at ./broadcast.jl:861 [inlined]
+ at ./arraymath.jl:8
_broadcast_getindex_evalf at ./broadcast.jl:678 [inlined]
_broadcast_getindex at ./broadcast.jl:651 [inlined]
getindex at ./broadcast.jl:610 [inlined]
macro expansion at ./broadcast.jl:973 [inlined]
macro expansion at ./simdloop.jl:77 [inlined]
copyto! at ./broadcast.jl:972 [inlined]
copyto! at ./broadcast.jl:925 [inlined]
copy at ./broadcast.jl:897 [inlined]
materialize at ./broadcast.jl:872 [inlined]
broadcast_preserving_zero_d at ./broadcast.jl:861 [inlined]
+ at ./arraymath.jl:8
#4 at ./generator.jl:37 [inlined]
iterate at ./generator.jl:48 [inlined]
collect_to! at ./array.jl:834 [inlined]
collect_to_with_first! at ./array.jl:812 [inlined]
collect at ./array.jl:786
map at ./abstractarray.jl:3547 [inlined]
f at ./REPL[7]:1
unknown function (ip: 0x700b7160e3a2)
top-level scope at ./REPL[11]:2
jl_toplevel_eval_flex at /cache/build/builder-amdci5-3/julialang/julia-master/src/toplevel.c:944
__repl_entry_eval_expanded_with_loc at /home/nsajko/tmp/jl/jl/julia-aeac289163/share/julia/stdlib/v1.12/REPL/src/REPL.jl:220
toplevel_eval_with_hooks at /home/nsajko/tmp/jl/jl/julia-aeac289163/share/julia/stdlib/v1.12/REPL/src/REPL.jl:227
toplevel_eval_with_hooks at /home/nsajko/tmp/jl/jl/julia-aeac289163/share/julia/stdlib/v1.12/REPL/src/REPL.jl:231
toplevel_eval_with_hooks at /home/nsajko/tmp/jl/jl/julia-aeac289163/share/julia/stdlib/v1.12/REPL/src/REPL.jl:224 [inlined]
eval_user_input at /home/nsajko/tmp/jl/jl/julia-aeac289163/share/julia/stdlib/v1.12/REPL/src/REPL.jl:249
repl_backend_loop at /home/nsajko/tmp/jl/jl/julia-aeac289163/share/julia/stdlib/v1.12/REPL/src/REPL.jl:358
#start_repl_backend#59 at /home/nsajko/tmp/jl/jl/julia-aeac289163/share/julia/stdlib/v1.12/REPL/src/REPL.jl:343
start_repl_backend at /home/nsajko/tmp/jl/jl/julia-aeac289163/share/julia/stdlib/v1.12/REPL/src/REPL.jl:340
#run_repl#72 at /home/nsajko/tmp/jl/jl/julia-aeac289163/share/julia/stdlib/v1.12/REPL/src/REPL.jl:499
run_repl at /home/nsajko/tmp/jl/jl/julia-aeac289163/share/julia/stdlib/v1.12/REPL/src/REPL.jl:485
jfptr_run_repl_12511 at /home/nsajko/.julia/compiled/v1.12/REPL/u0gqU_ZNQMV.so (unknown line)
#1161 at ./client.jl:448
jfptr_YY.1161_17027 at /home/nsajko/.julia/compiled/v1.12/REPL/u0gqU_ZNQMV.so (unknown line)
jl_apply at /cache/build/builder-amdci5-3/julialang/julia-master/src/julia.h:2188 [inlined]
jl_f__call_latest at /cache/build/builder-amdci5-3/julialang/julia-master/src/builtins.c:875
#invokelatest#2 at ./essentials.jl:1032 [inlined]
invokelatest at ./essentials.jl:1029 [inlined]
run_main_repl at ./client.jl:432
repl_main at ./client.jl:569 [inlined]
_start at ./client.jl:543
jfptr__start_69977.1 at /home/nsajko/tmp/jl/jl/julia-aeac289163/lib/julia/sys.so (unknown line)
jl_apply at /cache/build/builder-amdci5-3/julialang/julia-master/src/julia.h:2188 [inlined]
true_main at /cache/build/builder-amdci5-3/julialang/julia-master/src/jlapi.c:900
jl_repl_entrypoint at /cache/build/builder-amdci5-3/julialang/julia-master/src/jlapi.c:1059
main at /cache/build/builder-amdci5-3/julialang/julia-master/cli/loader_exe.c:58
unknown function (ip: 0x700b73043ccf)
__libc_start_main at /usr/lib/libc.so.6 (unknown line)
unknown function (ip: 0x4010b8)
Allocations: 2017840 (Pool: 2017705; Big: 135); GC: 3
Segmentation fault (core dumped)
@nsajko nsajko added kind:bug Indicates an unexpected problem or unintended behavior kind:regression Regression in behavior compared to a previous version and removed kind:regression Regression in behavior compared to a previous version labels Apr 26, 2024
@Zentrik
Copy link
Member

Zentrik commented Apr 26, 2024

rr trace should be here for 1.11-beta1, https://julialang-dumps.s3.amazonaws.com/reports/2024-04-26T09-21-10-Zentrik.tar.zst.

@nsajko
Copy link
Contributor Author

nsajko commented Apr 26, 2024

I tried to reduce the reproducer by changing the FixedSizeArrays module into a simpler, FixedSizeVectors module. Interestingly, this simpler example isn't a reproducer:

module FixedSizeVectors

struct Internal end

struct FixedSizeVector{T} <: DenseVector{T}
    mem::Memory{T}
    function FixedSizeVector{T}(::Internal, mem::Memory{T}) where {T}
        new{T}(mem)
    end
end

function FixedSizeVector{T}(::UndefInitializer, size::Tuple{Int}) where {T}
    FixedSizeVector{T}(Internal(), Memory{T}(undef, size))
end
function FixedSizeVector{T}(::UndefInitializer, size::Int) where {T}
    FixedSizeVector{T,N}(undef, (size,))
end

Base.IndexStyle(::Type{<:FixedSizeVector}) = IndexLinear()
Base.getindex(A::FixedSizeVector, i::Int) = A.mem[i]
Base.setindex!(A::FixedSizeVector, v, i::Int) = A.mem[i] = v

Base.size(a::FixedSizeVector) = (length(a.mem),)

function Base.similar(::FixedSizeVector, ::Type{S}, size::Tuple{Int}) where {S}
    FixedSizeVector{S}(undef, size)
end

# broadcasting

function Base.BroadcastStyle(::Type{<:FixedSizeVector})
    Broadcast.ArrayStyle{FixedSizeVector}()
end

function Base.similar(
    bc::Broadcast.Broadcasted{Broadcast.ArrayStyle{FixedSizeVector}},
    ::Type{E},
) where {E}
    similar(FixedSizeVector{E}, axes(bc))
end

# helper functions

parent_type(::Type{FixedSizeVector{T}}) where {T} = Memory{T}

memory_of(m::Memory) = m
memory_of(f::FixedSizeVector) = f.mem

first_linear_index(a) = first(eachindex(IndexLinear(), a))

axes_are_one_based(axes) = all(isone  first, axes)

# converting constructors for copying other array types

function FixedSizeVector{T}(src::AbstractVector{S}) where {T,S}
    axs = axes(src)
    if !axes_are_one_based(axs)
        throw(DimensionMismatch("source array has a non-one-based indexing axis"))
    end
    size = map(length, axs)::Tuple{Int}
    dst = FixedSizeVector{T}(undef, size)
    copyto!(dst, src)::FixedSizeVector{T}
end

FixedSizeVector(a::AbstractVector{T}) where {T,N} = FixedSizeVector{T}(a)

# conversion

Base.convert(::Type{T}, a::T) where {T<:FixedSizeVector} = a
Base.convert(::Type{T}, a::AbstractVector) where {T<:FixedSizeVector} = T(a)::T

end # module FixedSizeVectors


# creates nested vectors
rand_nested_vec(::Tuple{}) = rand()
function rand_nested_vec(size::Tuple{Vararg{Int}})
  [rand_nested_vec(Base.tail(size)) for _  Base.OneTo(first(size))]::Vector
end

# converts nested vectors to other `AbstractVector` types
recursive_array_convert(::Type{T}) where {T} = a -> recursive_array_convert(T, a)
recursive_array_convert(::Type, a) = a
function recursive_array_convert(::Type{T}, a::AbstractVector) where {T}
  t = map(recursive_array_convert(T), a)
  T(t)::T
end

f(a) = map(+, a, a)

data = recursive_array_convert(FixedSizeVectors.FixedSizeVector, rand_nested_vec((100, 10, 100)));

iter_cnt = 1000  # when lowered to, e.g., 30, the bug doesn't reproduce each time

for _  1:iter_cnt
  f(data)
end

@Zentrik
Copy link
Member

Zentrik commented Apr 26, 2024

Btw there is an automatic reduction tool https://github.com/maleadt/creduce_julia. I've never used it, but seems interesting.

@vchuravy vchuravy added this to the 1.11 milestone Apr 26, 2024
@gbaraldi
Copy link
Member

I'm running creduce on it ;)

@gbaraldi
Copy link
Member

gbaraldi commented Apr 26, 2024

Creduce didn't do it right, but looking at it. We put some garbage in the GC roots.
The function is +(FixedSizeArrays.FixedSizeArray{FixedSizeArrays.FixedSizeArray{Float64, 1}, 1}, FixedSizeArrays.FixedSizeArray{FixedSizeArrays.FixedSizeArray{Float64, 1}, 1})

; ModuleID = '+'
source_filename = "+"
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

@"+Main.FixedSizeArrays.FixedSizeArray#943" = private unnamed_addr constant ptr @"+Main.FixedSizeArrays.FixedSizeArray#943.jit", !julia.constgv !0
@jl_undefref_exception = external constant ptr
@jl_nothing = external constant ptr

@"+Main.Base.LazyString#977.jit" = private alias ptr, inttoptr (i64 140293568847376 to ptr)
@"+Core.Tuple#978.jit" = private alias ptr, inttoptr (i64 140293576064224 to ptr)
@"+Main.Base.DimensionMismatch#980.jit" = private alias ptr, inttoptr (i64 140293584366464 to ptr)
@"+Core.ArgumentError#955.jit" = private alias ptr, inttoptr (i64 140293625686976 to ptr)
@"jl_global#974.jit" = private alias ptr, inttoptr (i64 140293633272480 to ptr)
@"jl_global#973.jit" = private alias ptr, inttoptr (i64 140293633272528 to ptr)
@"+Main.FixedSizeArrays.FixedSizeArray#943.jit" = private alias ptr, inttoptr (i64 140293723992016 to ptr)
@"+Core.GenericMemoryRef#966.jit" = private alias ptr, inttoptr (i64 140293725504592 to ptr)
@"+Core.GenericMemory#958.jit" = private alias ptr, inttoptr (i64 140293725504720 to ptr)
@"jl_global#953.jit" = private alias ptr, inttoptr (i64 140293745993680 to ptr)
@"jl_global#956.jit" = private alias ptr, inttoptr (i64 140293745993872 to ptr)

; Function Signature: +(FixedSizeArrays.FixedSizeArray{FixedSizeArrays.FixedSizeArray{Float64, 1}, 1}, FixedSizeArrays.FixedSizeArray{FixedSizeArrays.FixedSizeArray{Float64, 1}, 1})
; Function Attrs: sspstrong
define swiftcc void @"julia_+_941"(ptr noalias nocapture noundef nonnull sret({ ptr, [1 x i64] }) align 8 dereferenceable(16) %sret_return, ptr noalias nocapture noundef nonnull align 8 dereferenceable(8) %return_roots, ptr nonnull swiftself %pgcstack, ptr nocapture noundef nonnull readonly align 8 dereferenceable(16) %"A::FixedSizeArray", ptr nocapture noundef nonnull readonly align 8 dereferenceable(16) %"B::FixedSizeArray") #0 !dbg !7 {
top:
  %gcframe1 = alloca [23 x ptr], align 16
  call void @llvm.memset.p0.i64(ptr align 16 %gcframe1, i8 0, i64 184, i1 true)
  %gc_slot_addr16 = getelementptr inbounds ptr, ptr %gcframe1, i64 18
  %gc_slot_addr15 = getelementptr inbounds ptr, ptr %gcframe1, i64 17
  %gc_slot_addr14 = getelementptr inbounds ptr, ptr %gcframe1, i64 16
  %gc_slot_addr13 = getelementptr inbounds ptr, ptr %gcframe1, i64 15
  %gc_slot_addr12 = getelementptr inbounds ptr, ptr %gcframe1, i64 14
  %gc_slot_addr11 = getelementptr inbounds ptr, ptr %gcframe1, i64 13
  %gc_slot_addr10 = getelementptr inbounds ptr, ptr %gcframe1, i64 12
  %gc_slot_addr9 = getelementptr inbounds ptr, ptr %gcframe1, i64 11
  %gc_slot_addr8 = getelementptr inbounds ptr, ptr %gcframe1, i64 10
  %gc_slot_addr7 = getelementptr inbounds ptr, ptr %gcframe1, i64 9
  %gc_slot_addr6 = getelementptr inbounds ptr, ptr %gcframe1, i64 8
  %gc_slot_addr5 = getelementptr inbounds ptr, ptr %gcframe1, i64 7
  %gc_slot_addr4 = getelementptr inbounds ptr, ptr %gcframe1, i64 6
  %gc_slot_addr3 = getelementptr inbounds ptr, ptr %gcframe1, i64 5
  %0 = getelementptr inbounds ptr, ptr %gcframe1, i64 4
  %1 = getelementptr inbounds ptr, ptr %gcframe1, i64 3
  %2 = getelementptr inbounds ptr, ptr %gcframe1, i64 2
  %"new::Tuple" = alloca [1 x [1 x i64]], align 8
  %"new::Tuple6" = alloca [1 x [1 x i64]], align 8
  %3 = alloca { ptr, [1 x i64] }, align 8
  %4 = alloca { ptr, [1 x i64] }, align 8
  %5 = alloca { ptr, [1 x i64] }, align 8
  %6 = alloca { ptr, [1 x i64] }, align 8
  %7 = alloca { ptr, [1 x i64] }, align 8
  %8 = alloca { ptr, [1 x i64] }, align 8
  %9 = alloca { ptr, [1 x i64] }, align 8
  store i64 84, ptr %gcframe1, align 16, !tbaa !25
  %frame.prev = getelementptr inbounds ptr, ptr %gcframe1, i64 1
  %task.gcstack = load ptr, ptr %pgcstack, align 8
  store ptr %task.gcstack, ptr %frame.prev, align 8, !tbaa !25
  store ptr %gcframe1, ptr %pgcstack, align 8
  call void @llvm.dbg.declare(metadata ptr %"A::FixedSizeArray", metadata !23, metadata !DIExpression()), !dbg !29
  call void @llvm.dbg.declare(metadata ptr %"B::FixedSizeArray", metadata !24, metadata !DIExpression()), !dbg !29
  %ptls_field = getelementptr inbounds ptr, ptr %pgcstack, i64 2
  %ptls_load = load ptr, ptr %ptls_field, align 8, !tbaa !25
  %10 = getelementptr inbounds ptr, ptr %ptls_load, i64 2
  %safepoint = load ptr, ptr %10, align 8, !tbaa !30
  fence syncscope("singlethread") seq_cst
  %11 = load volatile i64, ptr %safepoint, align 8, !dbg !29
  fence syncscope("singlethread") seq_cst
  %"A::FixedSizeArray.size_ptr" = getelementptr inbounds { ptr, [1 x i64] }, ptr %"A::FixedSizeArray", i64 0, i32 1, !dbg !32
  %12 = load i64, ptr %"A::FixedSizeArray.size_ptr", align 8, !dbg !43, !tbaa !49, !alias.scope !50, !noalias !54
  store i64 %12, ptr %"new::Tuple", align 8, !dbg !43, !tbaa !49, !alias.scope !50, !noalias !54
  %"B::FixedSizeArray.size_ptr" = getelementptr inbounds { ptr, [1 x i64] }, ptr %"B::FixedSizeArray", i64 0, i32 1, !dbg !32
  %13 = load i64, ptr %"B::FixedSizeArray.size_ptr", align 8, !dbg !43, !tbaa !49, !alias.scope !50, !noalias !54
  store i64 %13, ptr %"new::Tuple6", align 8, !dbg !43, !tbaa !49, !alias.scope !50, !noalias !54
  %.not = icmp eq i64 %12, %13, !dbg !58
  br i1 %.not, label %L47, label %L14, !dbg !66

L14:                                              ; preds = %top
  call swiftcc void @j_throw_promote_shape_mismatch_949(ptr nonnull swiftself %pgcstack, ptr nocapture nonnull readonly %"new::Tuple", ptr nocapture nonnull readonly %"new::Tuple6", i64 signext 1) #7, !dbg !66
  unreachable, !dbg !66

L47:                                              ; preds = %top
  %14 = icmp sgt i64 %12, -1, !dbg !67
  br i1 %14, label %L81, label %L78, !dbg !97

L78:                                              ; preds = %L47
  %15 = call swiftcc [1 x ptr] @j_ArgumentError_952(ptr nonnull swiftself %pgcstack, ptr nonnull @"jl_global#953.jit"), !dbg !98
  %gc_slot_addr_17 = getelementptr inbounds ptr, ptr %gcframe1, i64 19
  %16 = extractvalue [1 x ptr] %15, 0, !dbg !98
  store ptr %16, ptr %gc_slot_addr_17, align 8
  %ptls_load986 = load ptr, ptr %ptls_field, align 8, !dbg !98, !tbaa !25
  %"box::ArgumentError" = call noalias nonnull align 8 dereferenceable(16) ptr @ijl_gc_pool_alloc_instrumented(ptr %ptls_load986, i32 752, i32 16, i64 140293625686976) #15, !dbg !98
  %"box::ArgumentError.tag_addr" = getelementptr inbounds i64, ptr %"box::ArgumentError", i64 -1, !dbg !98
  store atomic i64 140293625686976, ptr %"box::ArgumentError.tag_addr" unordered, align 8, !dbg !98, !tbaa !99
  store ptr %16, ptr %"box::ArgumentError", align 8, !dbg !98, !tbaa !102, !alias.scope !105, !noalias !106
  call void @ijl_throw(ptr nonnull %"box::ArgumentError"), !dbg !98
  unreachable, !dbg !98

L81:                                              ; preds = %L47
  %.not362.not = icmp eq i64 %12, 9223372036854775807, !dbg !107
  br i1 %.not362.not, label %L82, label %L86, !dbg !113

L82:                                              ; preds = %L81
  %17 = call swiftcc [1 x ptr] @j_ArgumentError_952(ptr nonnull swiftself %pgcstack, ptr nonnull @"jl_global#956.jit"), !dbg !114
  %gc_slot_addr_17939 = getelementptr inbounds ptr, ptr %gcframe1, i64 19
  %18 = extractvalue [1 x ptr] %17, 0, !dbg !114
  store ptr %18, ptr %gc_slot_addr_17939, align 8
  %ptls_load989 = load ptr, ptr %ptls_field, align 8, !dbg !114, !tbaa !25
  %"box::ArgumentError34" = call noalias nonnull align 8 dereferenceable(16) ptr @ijl_gc_pool_alloc_instrumented(ptr %ptls_load989, i32 752, i32 16, i64 140293625686976) #15, !dbg !114
  %"box::ArgumentError34.tag_addr" = getelementptr inbounds i64, ptr %"box::ArgumentError34", i64 -1, !dbg !114
  store atomic i64 140293625686976, ptr %"box::ArgumentError34.tag_addr" unordered, align 8, !dbg !114, !tbaa !99
  store ptr %18, ptr %"box::ArgumentError34", align 8, !dbg !114, !tbaa !102, !alias.scope !105, !noalias !106
  call void @ijl_throw(ptr nonnull %"box::ArgumentError34"), !dbg !114
  unreachable, !dbg !114

L86:                                              ; preds = %L81
  %.not363 = icmp eq i64 %12, 0, !dbg !115
  br i1 %.not363, label %L88, label %L107.thread, !dbg !115

L88:                                              ; preds = %L86
  %.instance = load atomic ptr, ptr getelementptr inbounds (ptr, ptr @"+Core.GenericMemory#958.jit", i64 4) unordered, align 16, !dbg !118, !tbaa !30, !alias.scope !119, !noalias !120
  %.not364 = icmp eq ptr %.instance, null, !dbg !118
  br i1 %.not364, label %fail, label %L107, !dbg !118

L107:                                             ; preds = %L88
  %"A::FixedSizeArray.mem" = load atomic ptr, ptr %"A::FixedSizeArray" unordered, align 8, !dbg !121, !tbaa !30, !alias.scope !119, !noalias !120, !nonnull !0, !dereferenceable !131, !align !132
  br label %L133, !dbg !121

L107.thread:                                      ; preds = %L86
  %"Memory{FixedSizeArray}[]" = call ptr @jl_alloc_genericmemory(ptr nonnull @"+Core.GenericMemory#958.jit", i64 %12), !dbg !133
  %"A::FixedSizeArray.mem681" = load atomic ptr, ptr %"A::FixedSizeArray" unordered, align 8, !dbg !121, !tbaa !30, !alias.scope !119, !noalias !120, !nonnull !0, !dereferenceable !131, !align !132
  %.not662682 = icmp eq ptr %"Memory{FixedSizeArray}[]", %"A::FixedSizeArray.mem681", !dbg !121
  br i1 %.not662682, label %L133, label %L126, !dbg !121

L126:                                             ; preds = %L107.thread
  store ptr %"Memory{FixedSizeArray}[]", ptr %gc_slot_addr3, align 8
  store ptr %"Memory{FixedSizeArray}[]", ptr %8, align 8, !dbg !134
  %.fca.1.0.gep = getelementptr inbounds { ptr, [1 x i64] }, ptr %8, i64 0, i32 1, i64 0, !dbg !134
  store i64 %12, ptr %.fca.1.0.gep, align 8, !dbg !134
  %gc_slot_addr_17940 = getelementptr inbounds ptr, ptr %gcframe1, i64 19
  store ptr %"Memory{FixedSizeArray}[]", ptr %gc_slot_addr_17940, align 8
  %object_id166 = call i64 @ijl_object_id_(i64 ptrtoint (ptr @"+Main.FixedSizeArrays.FixedSizeArray#943.jit" to i64), ptr nonnull %8), !dbg !134
  %object_id169 = call i64 @ijl_object_id_(i64 ptrtoint (ptr @"+Main.FixedSizeArrays.FixedSizeArray#943.jit" to i64), ptr nonnull %"A::FixedSizeArray"), !dbg !134
  %.not425 = icmp eq i64 %object_id166, %object_id169, !dbg !143
  br i1 %.not425, label %L133.thread, label %L126.L130_crit_edge, !dbg !141

L126.L130_crit_edge:                              ; preds = %L126
  %"A::FixedSizeArray.unbox329.unpack.pre" = load ptr, ptr %"A::FixedSizeArray", align 8
  %"A::FixedSizeArray.unbox329.unpack427.unpack.pre" = load i64, ptr %"A::FixedSizeArray.size_ptr", align 8
  br label %L133, !dbg !141

L133:                                             ; preds = %L107, %L126.L130_crit_edge, %L107.thread
  %19 = phi ptr [ %"Memory{FixedSizeArray}[]", %L107.thread ], [ %"Memory{FixedSizeArray}[]", %L126.L130_crit_edge ], [ %.instance, %L107 ]
  %"A::FixedSizeArray.mem693.pn" = phi ptr [ %"Memory{FixedSizeArray}[]", %L107.thread ], [ %"A::FixedSizeArray.unbox329.unpack.pre", %L126.L130_crit_edge ], [ %"A::FixedSizeArray.mem", %L107 ]
  %.pn836 = phi i64 [ %12, %L107.thread ], [ %"A::FixedSizeArray.unbox329.unpack427.unpack.pre", %L126.L130_crit_edge ], [ 0, %L107 ]
  %"A::FixedSizeArray.unbox.unpack370372.pn" = insertvalue [1 x i64] zeroinitializer, i64 %.pn836, 0
  %.pn = insertvalue { ptr, [1 x i64] } zeroinitializer, ptr %"A::FixedSizeArray.mem693.pn", 0
  %value_phi44 = insertvalue { ptr, [1 x i64] } %.pn, [1 x i64] %"A::FixedSizeArray.unbox.unpack370372.pn", 1
  %value_phi44.fr = freeze { ptr, [1 x i64] } %value_phi44, !dbg !147
  %value_phi44.size = extractvalue { ptr, [1 x i64] } %value_phi44.fr, 1, !dbg !147
  %value_phi44.size.fca.0.extract = extractvalue [1 x i64] %value_phi44.size, 0, !dbg !147
  %.not373 = icmp eq i64 %value_phi44.size.fca.0.extract, 1, !dbg !153
  %"B::FixedSizeArray.mem" = load atomic ptr, ptr %"B::FixedSizeArray" unordered, align 8, !dbg !159, !tbaa !30, !alias.scope !119, !noalias !120, !nonnull !0, !dereferenceable !131, !align !132
  %.not663 = icmp eq ptr %19, %"B::FixedSizeArray.mem", !dbg !159
  br i1 %.not663, label %L168, label %L145, !dbg !159

L133.thread:                                      ; preds = %L126
  call swiftcc void @j_unaliascopy_982(ptr noalias nocapture noundef nonnull sret({ ptr, [1 x i64] }) %9, ptr noalias nocapture noundef nonnull %1, ptr nonnull swiftself %pgcstack, ptr nocapture nonnull readonly %"A::FixedSizeArray"), !dbg !141
  %.unbox322.fca.0.load = load ptr, ptr %9, align 8
  %.unbox322.fca.0.insert = insertvalue { ptr, [1 x i64] } zeroinitializer, ptr %.unbox322.fca.0.load, 0
  %.unbox322.fca.1.0.gep = getelementptr inbounds { ptr, [1 x i64] }, ptr %9, i64 0, i32 1, i64 0
  %.unbox322.fca.1.0.load = load i64, ptr %.unbox322.fca.1.0.gep, align 8
  %.unbox322.fca.1.0.insert = insertvalue { ptr, [1 x i64] } %.unbox322.fca.0.insert, i64 %.unbox322.fca.1.0.load, 1, 0
  %value_phi44.fr701 = freeze { ptr, [1 x i64] } %.unbox322.fca.1.0.insert, !dbg !147
  %value_phi44.size702 = extractvalue { ptr, [1 x i64] } %value_phi44.fr701, 1, !dbg !147
  %value_phi44.size.fca.0.extract703 = extractvalue [1 x i64] %value_phi44.size702, 0, !dbg !147
  %.not373704 = icmp eq i64 %value_phi44.size.fca.0.extract703, 1, !dbg !153
  %"B::FixedSizeArray.mem705" = load atomic ptr, ptr %"B::FixedSizeArray" unordered, align 8, !dbg !159, !tbaa !30, !alias.scope !119, !noalias !120, !nonnull !0, !dereferenceable !131, !align !132
  %.not663706 = icmp eq ptr %"Memory{FixedSizeArray}[]", %"B::FixedSizeArray.mem705", !dbg !159
  br i1 %.not663706, label %L168, label %L161, !dbg !159

L145:                                             ; preds = %L133
  br i1 %.not363, label %L168, label %L161, !dbg !162

L161:                                             ; preds = %L145, %L133.thread
  %20 = phi ptr [ %19, %L145 ], [ %"Memory{FixedSizeArray}[]", %L133.thread ]
  %value_phi44.fr711724 = phi { ptr, [1 x i64] } [ %value_phi44.fr, %L145 ], [ %value_phi44.fr701, %L133.thread ]
  %.not373714722 = phi i1 [ %.not373, %L145 ], [ %.not373704, %L133.thread ]
  store ptr %20, ptr %gc_slot_addr4, align 16
  store ptr %20, ptr %6, align 8, !dbg !164
  %.fca.1.0.gep341 = getelementptr inbounds { ptr, [1 x i64] }, ptr %6, i64 0, i32 1, i64 0, !dbg !164
  store i64 %12, ptr %.fca.1.0.gep341, align 8, !dbg !164
  %gc_slot_addr_19 = getelementptr inbounds ptr, ptr %gcframe1, i64 21
  store ptr %20, ptr %gc_slot_addr_19, align 8
  %gc_slot_addr_18 = getelementptr inbounds ptr, ptr %gcframe1, i64 20
  %21 = extractvalue { ptr, [1 x i64] } %value_phi44.fr711724, 0, !dbg !164
  store ptr %21, ptr %gc_slot_addr_18, align 16
  %gc_slot_addr_17941 = getelementptr inbounds ptr, ptr %gcframe1, i64 19
  store ptr %20, ptr %gc_slot_addr_17941, align 8
  %object_id = call i64 @ijl_object_id_(i64 ptrtoint (ptr @"+Main.FixedSizeArrays.FixedSizeArray#943.jit" to i64), ptr nonnull %6), !dbg !164
  %object_id151 = call i64 @ijl_object_id_(i64 ptrtoint (ptr @"+Main.FixedSizeArrays.FixedSizeArray#943.jit" to i64), ptr nonnull %"B::FixedSizeArray"), !dbg !164
  %.not418.not = icmp eq i64 %object_id, %object_id151, !dbg !166
  br i1 %.not418.not, label %L168.thread, label %L161.L165_crit_edge, !dbg !163

L161.L165_crit_edge:                              ; preds = %L161
  %"B::FixedSizeArray.unbox315.unpack.pre" = load ptr, ptr %"B::FixedSizeArray", align 8
  br label %L168, !dbg !163

L168.thread:                                      ; preds = %L161
  call swiftcc void @j_unaliascopy_982(ptr noalias nocapture noundef nonnull sret({ ptr, [1 x i64] }) %7, ptr noalias nocapture noundef nonnull %0, ptr nonnull swiftself %pgcstack, ptr nocapture nonnull readonly %"B::FixedSizeArray"), !dbg !163
  %.unbox308.fca.0.load = load ptr, ptr %7, align 8
  %.unbox308.fca.0.insert = insertvalue { ptr, [1 x i64] } zeroinitializer, ptr %.unbox308.fca.0.load, 0
  %.unbox308.fca.1.0.gep = getelementptr inbounds { ptr, [1 x i64] }, ptr %7, i64 0, i32 1, i64 0
  %.unbox308.fca.1.0.load = load i64, ptr %.unbox308.fca.1.0.gep, align 8
  %.unbox308.fca.1.0.insert = insertvalue { ptr, [1 x i64] } %.unbox308.fca.0.insert, i64 %.unbox308.fca.1.0.load, 1, 0
  %value_phi57.fr732 = freeze { ptr, [1 x i64] } %.unbox308.fca.1.0.insert, !dbg !169
  br label %L188.lr.ph, !dbg !173

L168:                                             ; preds = %L161.L165_crit_edge, %L145, %L133.thread, %L133
  %.not373713 = phi i1 [ %.not373704, %L133.thread ], [ %.not373, %L133 ], [ %.not373714722, %L161.L165_crit_edge ], [ %.not373, %L145 ]
  %value_phi44.fr710 = phi { ptr, [1 x i64] } [ %value_phi44.fr701, %L133.thread ], [ %value_phi44.fr, %L133 ], [ %value_phi44.fr711724, %L161.L165_crit_edge ], [ %value_phi44.fr, %L145 ]
  %22 = phi ptr [ %"Memory{FixedSizeArray}[]", %L133.thread ], [ %19, %L133 ], [ %20, %L161.L165_crit_edge ], [ %19, %L145 ]
  %"B::FixedSizeArray.mem716.pn" = phi ptr [ %"Memory{FixedSizeArray}[]", %L133.thread ], [ %19, %L133 ], [ %"B::FixedSizeArray.unbox315.unpack.pre", %L161.L165_crit_edge ], [ %"B::FixedSizeArray.mem", %L145 ]
  br i1 %.not363, label %L249, label %L168.L188.lr.ph_crit_edge, !dbg !173

L168.L188.lr.ph_crit_edge:                        ; preds = %L168
  %.pn837 = insertvalue { ptr, [1 x i64] } zeroinitializer, ptr %"B::FixedSizeArray.mem716.pn", 0
  %"B::FixedSizeArray.unbox.unpack378.unpack.pn" = load i64, ptr %"B::FixedSizeArray.size_ptr", align 8
  %"B::FixedSizeArray.unbox.unpack378380.pn" = insertvalue [1 x i64] zeroinitializer, i64 %"B::FixedSizeArray.unbox.unpack378.unpack.pn", 0
  %value_phi57 = insertvalue { ptr, [1 x i64] } %.pn837, [1 x i64] %"B::FixedSizeArray.unbox.unpack378380.pn", 1
  %value_phi57.fr = freeze { ptr, [1 x i64] } %value_phi57, !dbg !169
  %.pre = extractvalue { ptr, [1 x i64] } %value_phi44.fr710, 0
  br label %L188.lr.ph, !dbg !173

L188.lr.ph:                                       ; preds = %L168.L188.lr.ph_crit_edge, %L168.thread
  %value_phi44.mem.pre-phi = phi ptr [ %.pre, %L168.L188.lr.ph_crit_edge ], [ %21, %L168.thread ]
  %value_phi57.fr739 = phi { ptr, [1 x i64] } [ %value_phi57.fr, %L168.L188.lr.ph_crit_edge ], [ %value_phi57.fr732, %L168.thread ]
  %gclift938 = phi ptr [ %22, %L168.L188.lr.ph_crit_edge ], [ %20, %L168.thread ]
  %.not373713736 = phi i1 [ %.not373713, %L168.L188.lr.ph_crit_edge ], [ %.not373714722, %L168.thread ]
  %value_phi57.size733.pn = extractvalue { ptr, [1 x i64] } %value_phi57.fr739, 1, !dbg !169
  %.not381740.in = extractvalue [1 x i64] %value_phi57.size733.pn, 0, !dbg !169
  %.not381740 = icmp eq i64 %.not381740.in, 1, !dbg !177
  %.data_ptr = getelementptr inbounds { i64, ptr }, ptr %value_phi44.mem.pre-phi, i64 0, i32 1
  %23 = load ptr, ptr %.data_ptr, align 8, !tbaa !30, !alias.scope !119, !noalias !120, !nonnull !0
  %24 = load i64, ptr %value_phi44.mem.pre-phi, align 8, !tbaa !181, !range !184, !alias.scope !185, !noalias !186
  %25 = shl nuw nsw i64 %24, 1
  %26 = shl nuw nsw i64 %24, 4
  %value_phi57.mem = extractvalue { ptr, [1 x i64] } %value_phi57.fr739, 0
  %.data_ptr87 = getelementptr inbounds { i64, ptr }, ptr %value_phi57.mem, i64 0, i32 1
  %.fca.1.0.gep349 = getelementptr inbounds { ptr, [1 x i64] }, ptr %4, i64 0, i32 1, i64 0
  %.fca.1.0.gep345 = getelementptr inbounds { ptr, [1 x i64] }, ptr %5, i64 0, i32 1, i64 0
  %.data_ptr101 = getelementptr inbounds { i64, ptr }, ptr %gclift938, i64 0, i32 1
  %27 = getelementptr inbounds ptr, ptr %gclift938, i64 2
  %.unbox.fca.1.0.gep = getelementptr inbounds { ptr, [1 x i64] }, ptr %3, i64 0, i32 1, i64 0
  br i1 %.not373713736, label %L188.lr.ph.split.us, label %L188.lr.ph.split, !dbg !187

L188.lr.ph.split.us:                              ; preds = %L188.lr.ph
  %.not675 = icmp eq i64 %24, 0
  %.elt386.us = getelementptr inbounds { ptr, [1 x i64] }, ptr %23, i64 0, i32 1
  br i1 %.not675, label %oob, label %L188.lr.ph.split.us.split.us, !dbg !202

L188.lr.ph.split.us.split.us:                     ; preds = %L188.lr.ph.split.us
  br i1 %.not381740, label %L188.us.us.us, label %L188.us.us, !dbg !206

L188.us.us.us:                                    ; preds = %L188.lr.ph.split.us.split.us, %41
  %value_phi67481.us.us.us = phi i64 [ %28, %41 ], [ 0, %L188.lr.ph.split.us.split.us ]
  %28 = add nuw nsw i64 %value_phi67481.us.us.us, 1, !dbg !210
  %.unpack.us.us.us = load ptr, ptr %23, align 8, !dbg !202, !tbaa !215, !alias.scope !105, !noalias !106
  %.unpack387.unpack.us.us.us = load i64, ptr %.elt386.us, align 8, !dbg !202, !tbaa !215, !alias.scope !105, !noalias !106
  %.not389.us.us.us = icmp eq ptr %.unpack.us.us.us, null, !dbg !202
  br i1 %.not389.us.us.us, label %fail81, label %pass82.us.us.us, !dbg !202

pass82.us.us.us:                                  ; preds = %L188.us.us.us
  %29 = load ptr, ptr %.data_ptr87, align 8, !dbg !217, !tbaa !30, !alias.scope !119, !noalias !120, !nonnull !0
  %30 = load i64, ptr %value_phi57.mem, align 8, !dbg !217, !tbaa !181, !range !184, !alias.scope !185, !noalias !186
  %.not678 = icmp eq i64 %30, 0, !dbg !217
  br i1 %.not678, label %oob90, label %idxend95.us.us.us, !dbg !217

idxend95.us.us.us:                                ; preds = %pass82.us.us.us
  %.unpack393.us.us.us = load ptr, ptr %29, align 8, !dbg !217, !tbaa !215, !alias.scope !105, !noalias !106
  %.not397.us.us.us = icmp eq ptr %.unpack393.us.us.us, null, !dbg !217
  br i1 %.not397.us.us.us, label %fail98, label %pass99.us.us.us, !dbg !217

pass99.us.us.us:                                  ; preds = %idxend95.us.us.us
  %.elt394.us.us.us = getelementptr inbounds { ptr, [1 x i64] }, ptr %29, i64 0, i32 1, !dbg !217
  %.unpack395.unpack.us.us.us = load i64, ptr %.elt394.us.us.us, align 8, !dbg !217, !tbaa !215, !alias.scope !105, !noalias !106
  store ptr %.unpack.us.us.us, ptr %gc_slot_addr6, align 16
  store ptr %.unpack.us.us.us, ptr %4, align 8, !dbg !219
  store i64 %.unpack387.unpack.us.us.us, ptr %.fca.1.0.gep349, align 8, !dbg !219
  store ptr %.unpack393.us.us.us, ptr %gc_slot_addr5, align 8
  store ptr %.unpack393.us.us.us, ptr %5, align 8, !dbg !219
  store i64 %.unpack395.unpack.us.us.us, ptr %.fca.1.0.gep345, align 8, !dbg !219
  %gc_slot_addr_20 = getelementptr inbounds ptr, ptr %gcframe1, i64 22
  store ptr %value_phi44.mem.pre-phi, ptr %gc_slot_addr_20, align 16
  %gc_slot_addr_19942 = getelementptr inbounds ptr, ptr %gcframe1, i64 21
  store ptr %gclift938, ptr %gc_slot_addr_19942, align 8
  %gc_slot_addr_18943 = getelementptr inbounds ptr, ptr %gcframe1, i64 20
  store ptr %gclift938, ptr %gc_slot_addr_18943, align 16
  %gc_slot_addr_17944 = getelementptr inbounds ptr, ptr %gcframe1, i64 19
  store ptr %value_phi57.mem, ptr %gc_slot_addr_17944, align 8
  call swiftcc void @"j_+_968"(ptr noalias nocapture noundef nonnull sret({ ptr, [1 x i64] }) %3, ptr noalias nocapture noundef nonnull %2, ptr nonnull swiftself %pgcstack, ptr nocapture nonnull readonly %4, ptr nocapture nonnull readonly %5), !dbg !219
  %31 = load ptr, ptr %.data_ptr101, align 8, !dbg !222, !tbaa !30, !alias.scope !119, !noalias !120, !nonnull !0
  %32 = load i64, ptr %gclift938, align 8, !dbg !222, !tbaa !181, !range !184, !alias.scope !185, !noalias !186
  %33 = shl nuw nsw i64 %32, 1, !dbg !222
  %34 = add nuw i64 %32, %value_phi67481.us.us.us, !dbg !222
  %.not398.us.us.us = icmp ult i64 %34, %33, !dbg !222
  %35 = icmp ult i64 %value_phi67481.us.us.us, %32, !dbg !222
  %36 = and i1 %.not398.us.us.us, %35, !dbg !222
  br i1 %36, label %load.us.us.us, label %oob104, !dbg !222

load.us.us.us:                                    ; preds = %pass99.us.us.us
  %37 = getelementptr inbounds { ptr, [1 x i64] }, ptr %31, i64 %value_phi67481.us.us.us, !dbg !227
  %.not401.us.us.us = icmp eq ptr %27, %31, !dbg !227
  br i1 %.not401.us.us.us, label %guard_exit.us.us.us, label %guard_pass.us.us.us, !dbg !227

guard_pass.us.us.us:                              ; preds = %load.us.us.us
  %38 = load ptr, ptr %27, align 8, !dbg !227, !tbaa !30, !alias.scope !119, !noalias !120
  %39 = icmp eq ptr %38, null, !dbg !227
  %40 = select i1 %39, ptr %gclift938, ptr %38, !dbg !227
  br label %guard_exit.us.us.us, !dbg !227

guard_exit.us.us.us:                              ; preds = %guard_pass.us.us.us, %load.us.us.us
  %guard_res.us.us.us = phi ptr [ %gclift938, %load.us.us.us ], [ %40, %guard_pass.us.us.us ], !dbg !227
  %.unbox.fca.0.load.us.us.us = load ptr, ptr %3, align 8, !dbg !227, !tbaa !228, !alias.scope !230, !noalias !231
  %.unbox.fca.1.0.load.us.us.us = load i64, ptr %.unbox.fca.1.0.gep, align 8, !dbg !227, !tbaa !228, !alias.scope !230, !noalias !231
  store ptr %.unbox.fca.0.load.us.us.us, ptr %37, align 8, !dbg !227, !tbaa !215, !alias.scope !105, !noalias !106
  %.repack402.us.us.us = getelementptr inbounds { ptr, [1 x i64] }, ptr %31, i64 %value_phi67481.us.us.us, i32 1, !dbg !227
  store i64 %.unbox.fca.1.0.load.us.us.us, ptr %.repack402.us.us.us, align 8, !dbg !227, !tbaa !215, !alias.scope !105, !noalias !106
  %guard_res.us.us.us.tag_addr = getelementptr inbounds i64, ptr %guard_res.us.us.us, i64 -1, !dbg !227
  %guard_res.us.us.us.tag = load atomic i64, ptr %guard_res.us.us.us.tag_addr unordered, align 8, !dbg !227, !tbaa !99, !range !232
  %parent_bits = and i64 %guard_res.us.us.us.tag, 3, !dbg !227
  %parent_old_marked = icmp eq i64 %parent_bits, 3, !dbg !227
  br i1 %parent_old_marked, label %may_trigger_wb, label %41, !dbg !227

may_trigger_wb:                                   ; preds = %guard_exit.us.us.us
  %.unbox.fca.0.load.us.us.us.tag_addr = getelementptr inbounds i64, ptr %.unbox.fca.0.load.us.us.us, i64 -1, !dbg !227
  %.unbox.fca.0.load.us.us.us.tag = load atomic i64, ptr %.unbox.fca.0.load.us.us.us.tag_addr unordered, align 8, !dbg !227, !tbaa !99, !range !232
  %child_bit = and i64 %.unbox.fca.0.load.us.us.us.tag, 1, !dbg !227
  %child_not_marked = icmp eq i64 %child_bit, 0, !dbg !227
  br i1 %child_not_marked, label %trigger_wb, label %41, !dbg !227, !prof !233

trigger_wb:                                       ; preds = %may_trigger_wb
  call void @ijl_gc_queue_root(ptr %guard_res.us.us.us), !dbg !227
  br label %41, !dbg !227

41:                                               ; preds = %may_trigger_wb, %trigger_wb, %guard_exit.us.us.us
  %exitcond.not = icmp eq i64 %28, %12, !dbg !234
  br i1 %exitcond.not, label %L249, label %L188.us.us.us, !dbg !235, !llvm.loop !236

L188.us.us:                                       ; preds = %L188.lr.ph.split.us.split.us, %60
  %value_phi67481.us.us = phi i64 [ %42, %60 ], [ 0, %L188.lr.ph.split.us.split.us ]
  %42 = add nuw nsw i64 %value_phi67481.us.us, 1, !dbg !210
  %.unpack.us.us = load ptr, ptr %23, align 8, !dbg !202, !tbaa !215, !alias.scope !105, !noalias !106
  %.unpack387.unpack.us.us = load i64, ptr %.elt386.us, align 8, !dbg !202, !tbaa !215, !alias.scope !105, !noalias !106
  %.not389.us.us = icmp eq ptr %.unpack.us.us, null, !dbg !202
  br i1 %.not389.us.us, label %fail81, label %pass82.us.us, !dbg !202

pass82.us.us:                                     ; preds = %L188.us.us
  %43 = load ptr, ptr %.data_ptr87, align 8, !dbg !217, !tbaa !30, !alias.scope !119, !noalias !120, !nonnull !0
  %44 = load i64, ptr %value_phi57.mem, align 8, !dbg !217, !tbaa !181, !range !184, !alias.scope !185, !noalias !186
  %45 = shl nuw nsw i64 %44, 1, !dbg !217
  %46 = add nuw i64 %44, %value_phi67481.us.us, !dbg !217
  %.not390.us.us = icmp ult i64 %46, %45, !dbg !217
  %47 = icmp ult i64 %value_phi67481.us.us, %44, !dbg !217
  %48 = and i1 %.not390.us.us, %47, !dbg !217
  br i1 %48, label %idxend95.us.us, label %oob90, !dbg !217

idxend95.us.us:                                   ; preds = %pass82.us.us
  %49 = getelementptr inbounds { ptr, [1 x i64] }, ptr %43, i64 %value_phi67481.us.us, !dbg !217
  %.unpack393.us.us = load ptr, ptr %49, align 8, !dbg !217, !tbaa !215, !alias.scope !105, !noalias !106
  %.not397.us.us = icmp eq ptr %.unpack393.us.us, null, !dbg !217
  br i1 %.not397.us.us, label %fail98, label %pass99.us.us, !dbg !217

pass99.us.us:                                     ; preds = %idxend95.us.us
  %.elt394.us.us = getelementptr inbounds { ptr, [1 x i64] }, ptr %43, i64 %value_phi67481.us.us, i32 1, !dbg !217
  %.unpack395.unpack.us.us = load i64, ptr %.elt394.us.us, align 8, !dbg !217, !tbaa !215, !alias.scope !105, !noalias !106
  store ptr %.unpack.us.us, ptr %gc_slot_addr8, align 16
  store ptr %.unpack.us.us, ptr %4, align 8, !dbg !219
  store i64 %.unpack387.unpack.us.us, ptr %.fca.1.0.gep349, align 8, !dbg !219
  store ptr %.unpack393.us.us, ptr %gc_slot_addr7, align 8
  store ptr %.unpack393.us.us, ptr %5, align 8, !dbg !219
  store i64 %.unpack395.unpack.us.us, ptr %.fca.1.0.gep345, align 8, !dbg !219
  %gc_slot_addr_20945 = getelementptr inbounds ptr, ptr %gcframe1, i64 22
  store ptr %value_phi44.mem.pre-phi, ptr %gc_slot_addr_20945, align 16
  %gc_slot_addr_19946 = getelementptr inbounds ptr, ptr %gcframe1, i64 21
  store ptr %gclift938, ptr %gc_slot_addr_19946, align 8
  %gc_slot_addr_18947 = getelementptr inbounds ptr, ptr %gcframe1, i64 20
  store ptr %gclift938, ptr %gc_slot_addr_18947, align 16
  %gc_slot_addr_17948 = getelementptr inbounds ptr, ptr %gcframe1, i64 19
  store ptr %value_phi57.mem, ptr %gc_slot_addr_17948, align 8
  call swiftcc void @"j_+_968"(ptr noalias nocapture noundef nonnull sret({ ptr, [1 x i64] }) %3, ptr noalias nocapture noundef nonnull %2, ptr nonnull swiftself %pgcstack, ptr nocapture nonnull readonly %4, ptr nocapture nonnull readonly %5), !dbg !219
  %50 = load ptr, ptr %.data_ptr101, align 8, !dbg !222, !tbaa !30, !alias.scope !119, !noalias !120, !nonnull !0
  %51 = load i64, ptr %gclift938, align 8, !dbg !222, !tbaa !181, !range !184, !alias.scope !185, !noalias !186
  %52 = shl nuw nsw i64 %51, 1, !dbg !222
  %53 = add nuw i64 %51, %value_phi67481.us.us, !dbg !222
  %.not398.us.us = icmp ult i64 %53, %52, !dbg !222
  %54 = icmp ult i64 %value_phi67481.us.us, %51, !dbg !222
  %55 = and i1 %.not398.us.us, %54, !dbg !222
  br i1 %55, label %load.us.us, label %oob104, !dbg !222

load.us.us:                                       ; preds = %pass99.us.us
  %56 = getelementptr inbounds { ptr, [1 x i64] }, ptr %50, i64 %value_phi67481.us.us, !dbg !227
  %.not401.us.us = icmp eq ptr %27, %50, !dbg !227
  br i1 %.not401.us.us, label %guard_exit.us.us, label %guard_pass.us.us, !dbg !227

guard_pass.us.us:                                 ; preds = %load.us.us
  %57 = load ptr, ptr %27, align 8, !dbg !227, !tbaa !30, !alias.scope !119, !noalias !120
  %58 = icmp eq ptr %57, null, !dbg !227
  %59 = select i1 %58, ptr %gclift938, ptr %57, !dbg !227
  br label %guard_exit.us.us, !dbg !227

guard_exit.us.us:                                 ; preds = %guard_pass.us.us, %load.us.us
  %guard_res.us.us = phi ptr [ %gclift938, %load.us.us ], [ %59, %guard_pass.us.us ], !dbg !227
  %.unbox.fca.0.load.us.us = load ptr, ptr %3, align 8, !dbg !227, !tbaa !228, !alias.scope !230, !noalias !231
  %.unbox.fca.1.0.load.us.us = load i64, ptr %.unbox.fca.1.0.gep, align 8, !dbg !227, !tbaa !228, !alias.scope !230, !noalias !231
  store ptr %.unbox.fca.0.load.us.us, ptr %56, align 8, !dbg !227, !tbaa !215, !alias.scope !105, !noalias !106
  %.repack402.us.us = getelementptr inbounds { ptr, [1 x i64] }, ptr %50, i64 %value_phi67481.us.us, i32 1, !dbg !227
  store i64 %.unbox.fca.1.0.load.us.us, ptr %.repack402.us.us, align 8, !dbg !227, !tbaa !215, !alias.scope !105, !noalias !106
  %guard_res.us.us.tag_addr = getelementptr inbounds i64, ptr %guard_res.us.us, i64 -1, !dbg !227
  %guard_res.us.us.tag = load atomic i64, ptr %guard_res.us.us.tag_addr unordered, align 8, !dbg !227, !tbaa !99, !range !232
  %parent_bits1039 = and i64 %guard_res.us.us.tag, 3, !dbg !227
  %parent_old_marked1040 = icmp eq i64 %parent_bits1039, 3, !dbg !227
  br i1 %parent_old_marked1040, label %may_trigger_wb1041, label %60, !dbg !227

may_trigger_wb1041:                               ; preds = %guard_exit.us.us
  %.unbox.fca.0.load.us.us.tag_addr = getelementptr inbounds i64, ptr %.unbox.fca.0.load.us.us, i64 -1, !dbg !227
  %.unbox.fca.0.load.us.us.tag = load atomic i64, ptr %.unbox.fca.0.load.us.us.tag_addr unordered, align 8, !dbg !227, !tbaa !99, !range !232
  %child_bit1042 = and i64 %.unbox.fca.0.load.us.us.tag, 1, !dbg !227
  %child_not_marked1044 = icmp eq i64 %child_bit1042, 0, !dbg !227
  br i1 %child_not_marked1044, label %trigger_wb1045, label %60, !dbg !227, !prof !233

trigger_wb1045:                                   ; preds = %may_trigger_wb1041
  call void @ijl_gc_queue_root(ptr %guard_res.us.us), !dbg !227
  br label %60, !dbg !227

60:                                               ; preds = %may_trigger_wb1041, %trigger_wb1045, %guard_exit.us.us
  %exitcond568.not = icmp eq i64 %42, %12, !dbg !234
  br i1 %exitcond568.not, label %L249, label %L188.us.us, !dbg !235, !llvm.loop !236

L188.lr.ph.split:                                 ; preds = %L188.lr.ph
  %smin = call i64 @llvm.smin.i64(i64 %12, i64 %24), !dbg !235
  %.not669 = icmp eq i64 %smin, 0, !dbg !235
  br i1 %.not381740, label %L188.lr.ph.split.split.us, label %L188.lr.ph.split.split, !dbg !206

L188.lr.ph.split.split.us:                        ; preds = %L188.lr.ph.split
  br i1 %.not669, label %main.pseudo.exit, label %L188.us487, !dbg !235

L188.us487:                                       ; preds = %L188.lr.ph.split.split.us, %75
  %value_phi67481.us488 = phi i64 [ %61, %75 ], [ 0, %L188.lr.ph.split.split.us ]
  %61 = add nuw nsw i64 %value_phi67481.us488, 1, !dbg !210
  %exitcond570.not = icmp eq i64 %value_phi67481.us488, %24, !dbg !202
  br i1 %exitcond570.not, label %oob, label %idxend.us489, !dbg !202

idxend.us489:                                     ; preds = %L188.us487
  %62 = getelementptr inbounds { ptr, [1 x i64] }, ptr %23, i64 %value_phi67481.us488, !dbg !202
  %.unpack.us490 = load ptr, ptr %62, align 8, !dbg !202, !tbaa !215, !alias.scope !105, !noalias !106
  %.elt386.us491 = getelementptr inbounds { ptr, [1 x i64] }, ptr %23, i64 %value_phi67481.us488, i32 1, !dbg !202
  %.unpack387.unpack.us492 = load i64, ptr %.elt386.us491, align 8, !dbg !202, !tbaa !215, !alias.scope !105, !noalias !106
  %.not389.us493 = icmp eq ptr %.unpack.us490, null, !dbg !202
  br i1 %.not389.us493, label %fail81, label %pass82.us494, !dbg !202

pass82.us494:                                     ; preds = %idxend.us489
  %63 = load ptr, ptr %.data_ptr87, align 8, !dbg !217, !tbaa !30, !alias.scope !119, !noalias !120, !nonnull !0
  %64 = load i64, ptr %value_phi57.mem, align 8, !dbg !217, !tbaa !181, !range !184, !alias.scope !185, !noalias !186
  %.not673 = icmp eq i64 %64, 0, !dbg !217
  br i1 %.not673, label %oob90, label %idxend95.us495, !dbg !217

idxend95.us495:                                   ; preds = %pass82.us494
  %.unpack393.us496 = load ptr, ptr %63, align 8, !dbg !217, !tbaa !215, !alias.scope !105, !noalias !106
  %.not397.us497 = icmp eq ptr %.unpack393.us496, null, !dbg !217
  br i1 %.not397.us497, label %fail98, label %pass99.us498, !dbg !217

pass99.us498:                                     ; preds = %idxend95.us495
  %.elt394.us499 = getelementptr inbounds { ptr, [1 x i64] }, ptr %63, i64 0, i32 1, !dbg !217
  %.unpack395.unpack.us500 = load i64, ptr %.elt394.us499, align 8, !dbg !217, !tbaa !215, !alias.scope !105, !noalias !106
  store ptr %.unpack.us490, ptr %gc_slot_addr10, align 16
  store ptr %.unpack.us490, ptr %4, align 8, !dbg !219
  store i64 %.unpack387.unpack.us492, ptr %.fca.1.0.gep349, align 8, !dbg !219
  store ptr %.unpack393.us496, ptr %gc_slot_addr9, align 8
  store ptr %.unpack393.us496, ptr %5, align 8, !dbg !219
  store i64 %.unpack395.unpack.us500, ptr %.fca.1.0.gep345, align 8, !dbg !219
  %gc_slot_addr_20949 = getelementptr inbounds ptr, ptr %gcframe1, i64 22
  store ptr %value_phi44.mem.pre-phi, ptr %gc_slot_addr_20949, align 16
  %gc_slot_addr_19950 = getelementptr inbounds ptr, ptr %gcframe1, i64 21
  store ptr %gclift938, ptr %gc_slot_addr_19950, align 8
  %gc_slot_addr_18951 = getelementptr inbounds ptr, ptr %gcframe1, i64 20
  store ptr %gclift938, ptr %gc_slot_addr_18951, align 16
  %gc_slot_addr_17952 = getelementptr inbounds ptr, ptr %gcframe1, i64 19
  store ptr %value_phi57.mem, ptr %gc_slot_addr_17952, align 8
  call swiftcc void @"j_+_968"(ptr noalias nocapture noundef nonnull sret({ ptr, [1 x i64] }) %3, ptr noalias nocapture noundef nonnull %2, ptr nonnull swiftself %pgcstack, ptr nocapture nonnull readonly %4, ptr nocapture nonnull readonly %5), !dbg !219
  %65 = load ptr, ptr %.data_ptr101, align 8, !dbg !222, !tbaa !30, !alias.scope !119, !noalias !120, !nonnull !0
  %66 = load i64, ptr %gclift938, align 8, !dbg !222, !tbaa !181, !range !184, !alias.scope !185, !noalias !186
  %67 = shl nuw nsw i64 %66, 1, !dbg !222
  %68 = add nuw i64 %66, %value_phi67481.us488, !dbg !222
  %.not398.us501 = icmp ult i64 %68, %67, !dbg !222
  %69 = icmp ult i64 %value_phi67481.us488, %66, !dbg !222
  %70 = and i1 %.not398.us501, %69, !dbg !222
  br i1 %70, label %load.us503, label %oob104, !dbg !222

load.us503:                                       ; preds = %pass99.us498
  %71 = getelementptr inbounds { ptr, [1 x i64] }, ptr %65, i64 %value_phi67481.us488, !dbg !227
  %.not401.us504 = icmp eq ptr %27, %65, !dbg !227
  br i1 %.not401.us504, label %guard_exit.us506, label %guard_pass.us505, !dbg !227

guard_pass.us505:                                 ; preds = %load.us503
  %72 = load ptr, ptr %27, align 8, !dbg !227, !tbaa !30, !alias.scope !119, !noalias !120
  %73 = icmp eq ptr %72, null, !dbg !227
  %74 = select i1 %73, ptr %gclift938, ptr %72, !dbg !227
  br label %guard_exit.us506, !dbg !227

guard_exit.us506:                                 ; preds = %guard_pass.us505, %load.us503
  %guard_res.us507 = phi ptr [ %gclift938, %load.us503 ], [ %74, %guard_pass.us505 ], !dbg !227
  %.unbox.fca.0.load.us508 = load ptr, ptr %3, align 8, !dbg !227, !tbaa !228, !alias.scope !230, !noalias !231
  %.unbox.fca.1.0.load.us509 = load i64, ptr %.unbox.fca.1.0.gep, align 8, !dbg !227, !tbaa !228, !alias.scope !230, !noalias !231
  store ptr %.unbox.fca.0.load.us508, ptr %71, align 8, !dbg !227, !tbaa !215, !alias.scope !105, !noalias !106
  %.repack402.us510 = getelementptr inbounds { ptr, [1 x i64] }, ptr %65, i64 %value_phi67481.us488, i32 1, !dbg !227
  store i64 %.unbox.fca.1.0.load.us509, ptr %.repack402.us510, align 8, !dbg !227, !tbaa !215, !alias.scope !105, !noalias !106
  %guard_res.us507.tag_addr = getelementptr inbounds i64, ptr %guard_res.us507, i64 -1, !dbg !227
  %guard_res.us507.tag = load atomic i64, ptr %guard_res.us507.tag_addr unordered, align 8, !dbg !227, !tbaa !99, !range !232
  %parent_bits1046 = and i64 %guard_res.us507.tag, 3, !dbg !227
  %parent_old_marked1047 = icmp eq i64 %parent_bits1046, 3, !dbg !227
  br i1 %parent_old_marked1047, label %may_trigger_wb1048, label %75, !dbg !227

may_trigger_wb1048:                               ; preds = %guard_exit.us506
  %.unbox.fca.0.load.us508.tag_addr = getelementptr inbounds i64, ptr %.unbox.fca.0.load.us508, i64 -1, !dbg !227
  %.unbox.fca.0.load.us508.tag = load atomic i64, ptr %.unbox.fca.0.load.us508.tag_addr unordered, align 8, !dbg !227, !tbaa !99, !range !232
  %child_bit1049 = and i64 %.unbox.fca.0.load.us508.tag, 1, !dbg !227
  %child_not_marked1051 = icmp eq i64 %child_bit1049, 0, !dbg !227
  br i1 %child_not_marked1051, label %trigger_wb1052, label %75, !dbg !227, !prof !233

trigger_wb1052:                                   ; preds = %may_trigger_wb1048
  call void @ijl_gc_queue_root(ptr %guard_res.us507), !dbg !227
  br label %75, !dbg !227

75:                                               ; preds = %may_trigger_wb1048, %trigger_wb1052, %guard_exit.us506
  %exitcond569.not = icmp eq i64 %61, %smin, !dbg !235
  br i1 %exitcond569.not, label %main.exit.selector, label %L188.us487, !dbg !235, !llvm.loop !236

main.exit.selector:                               ; preds = %75
  %76 = icmp sgt i64 %12, %24, !dbg !235
  br i1 %76, label %main.pseudo.exit, label %L249, !dbg !235

main.pseudo.exit:                                 ; preds = %main.exit.selector, %L188.lr.ph.split.split.us
  br label %L188.us487.postloop

L188.lr.ph.split.split:                           ; preds = %L188.lr.ph.split
  br i1 %.not669, label %main.pseudo.exit553, label %L188, !dbg !235

L188:                                             ; preds = %L188.lr.ph.split.split, %98
  %value_phi67481 = phi i64 [ %77, %98 ], [ 0, %L188.lr.ph.split.split ]
  %77 = add nuw nsw i64 %value_phi67481, 1, !dbg !210
  %exitcond572.not = icmp eq i64 %value_phi67481, %24, !dbg !202
  br i1 %exitcond572.not, label %oob, label %idxend, !dbg !202

L249:                                             ; preds = %140, %117, %60, %41, %main.exit.selector552, %main.exit.selector, %L168
  %value_phi38686 = phi ptr [ %22, %L168 ], [ %gclift938, %main.exit.selector ], [ %gclift938, %main.exit.selector552 ], [ %gclift938, %41 ], [ %gclift938, %60 ], [ %gclift938, %117 ], [ %gclift938, %140 ]
  %"new::OneTo120.sroa.0.0.copyload" = load i64, ptr %"A::FixedSizeArray.size_ptr", align 8, !dbg !237
  %"new::OneTo124.sroa.0.0.copyload" = load i64, ptr %"B::FixedSizeArray.size_ptr", align 8, !dbg !237, !tbaa !49, !alias.scope !50, !noalias !54
  %78 = icmp eq i64 %"new::OneTo124.sroa.0.0.copyload", %"new::OneTo120.sroa.0.0.copyload", !dbg !247
  %value_phi126.v404 = icmp eq i64 %"new::OneTo120.sroa.0.0.copyload", 1, !dbg !249
  %value_phi126.v.not.not841 = or i1 %value_phi126.v404, %78, !dbg !251
  %value_phi130.v408.not = icmp eq i64 %"new::OneTo124.sroa.0.0.copyload", 1
  %or.cond = or i1 %value_phi126.v.not.not841, %value_phi130.v408.not, !dbg !251
  br i1 %or.cond, label %L284, label %L273, !dbg !251

L273:                                             ; preds = %L249
  %ptls_load1013 = load ptr, ptr %ptls_field, align 8, !dbg !257, !tbaa !25
  %"new::LazyString" = call noalias nonnull align 8 dereferenceable(32) ptr @ijl_gc_pool_alloc_instrumented(ptr %ptls_load1013, i32 800, i32 32, i64 140293568847376) #15, !dbg !257
  %"new::LazyString.tag_addr" = getelementptr inbounds i64, ptr %"new::LazyString", i64 -1, !dbg !257
  store atomic i64 140293568847376, ptr %"new::LazyString.tag_addr" unordered, align 8, !dbg !257, !tbaa !99
  store ptr null, ptr %"new::LazyString", align 8, !dbg !257, !tbaa !260, !alias.scope !105, !noalias !106
  %79 = getelementptr inbounds ptr, ptr %"new::LazyString", i64 1, !dbg !257
  store ptr null, ptr %79, align 8, !dbg !257, !tbaa !260, !alias.scope !105, !noalias !106
  %gc_slot_addr_17953 = getelementptr inbounds ptr, ptr %gcframe1, i64 19
  store ptr %"new::LazyString", ptr %gc_slot_addr_17953, align 8
  %"box::Tuple" = call noalias nonnull align 8 dereferenceable(48) ptr @ijl_gc_pool_alloc_instrumented(ptr %ptls_load1013, i32 848, i32 48, i64 140293576064224) #15, !dbg !257
  %"box::Tuple.tag_addr" = getelementptr inbounds i64, ptr %"box::Tuple", i64 -1, !dbg !257
  store atomic i64 140293576064224, ptr %"box::Tuple.tag_addr" unordered, align 8, !dbg !257, !tbaa !99
  store ptr @"jl_global#973.jit", ptr %"box::Tuple", align 8, !dbg !257, !tbaa !102, !alias.scope !105, !noalias !106
  %"box::Tuple.repack410" = getelementptr inbounds { ptr, [1 x i64], ptr, [1 x i64] }, ptr %"box::Tuple", i64 0, i32 1, !dbg !257
  store i64 %"new::OneTo120.sroa.0.0.copyload", ptr %"box::Tuple.repack410", align 8, !dbg !257, !tbaa !102, !alias.scope !105, !noalias !106
  %"box::Tuple.repack412" = getelementptr inbounds { ptr, [1 x i64], ptr, [1 x i64] }, ptr %"box::Tuple", i64 0, i32 2, !dbg !257
  store ptr @"jl_global#974.jit", ptr %"box::Tuple.repack412", align 8, !dbg !257, !tbaa !102, !alias.scope !105, !noalias !106
  %"box::Tuple.repack414" = getelementptr inbounds { ptr, [1 x i64], ptr, [1 x i64] }, ptr %"box::Tuple", i64 0, i32 3, !dbg !257
  store i64 %"new::OneTo124.sroa.0.0.copyload", ptr %"box::Tuple.repack414", align 8, !dbg !257, !tbaa !102, !alias.scope !105, !noalias !106
  store atomic ptr %"box::Tuple", ptr %"new::LazyString" release, align 8, !dbg !257, !tbaa !260, !alias.scope !105, !noalias !106
  %jl_nothing = load ptr, ptr @jl_nothing, align 8, !dbg !257, !tbaa !30, !alias.scope !119, !noalias !120, !nonnull !0
  store atomic ptr %jl_nothing, ptr %79 release, align 8, !dbg !257, !tbaa !260, !alias.scope !105, !noalias !106
  %"box::DimensionMismatch" = call noalias nonnull align 8 dereferenceable(16) ptr @ijl_gc_pool_alloc_instrumented(ptr %ptls_load1013, i32 752, i32 16, i64 140293584366464) #15, !dbg !251
  %"box::DimensionMismatch.tag_addr" = getelementptr inbounds i64, ptr %"box::DimensionMismatch", i64 -1, !dbg !251
  store atomic i64 140293584366464, ptr %"box::DimensionMismatch.tag_addr" unordered, align 8, !dbg !251, !tbaa !99
  store ptr %"new::LazyString", ptr %"box::DimensionMismatch", align 8, !dbg !251, !tbaa !102, !alias.scope !105, !noalias !106
  call void @ijl_throw(ptr nonnull %"box::DimensionMismatch"), !dbg !251
  unreachable, !dbg !251

L284:                                             ; preds = %L249
  store ptr %value_phi38686, ptr %return_roots, align 8, !dbg !246
  store ptr %value_phi38686, ptr %sret_return, align 8, !dbg !246
  %sret_return.repack406 = getelementptr inbounds { ptr, [1 x i64] }, ptr %sret_return, i64 0, i32 1, !dbg !246
  store i64 %12, ptr %sret_return.repack406, align 8, !dbg !246
  %frame.prev1083 = load ptr, ptr %frame.prev, align 8, !tbaa !25
  store ptr %frame.prev1083, ptr %pgcstack, align 8, !tbaa !25
  ret void, !dbg !246

fail:                                             ; preds = %L88
  %jl_undefref_exception = load ptr, ptr @jl_undefref_exception, align 8, !dbg !118, !tbaa !30, !alias.scope !119, !noalias !120, !nonnull !0
  call void @ijl_throw(ptr nonnull %jl_undefref_exception), !dbg !118
  unreachable, !dbg !118

oob:                                              ; preds = %L188, %L188.postloop, %L188.us487, %L188.us487.postloop, %L188.lr.ph.split.us
  %.us-phi485 = phi i64 [ 1, %L188.lr.ph.split.us ], [ %100, %L188.us487.postloop ], [ %61, %L188.us487 ], [ %118, %L188.postloop ], [ %77, %L188 ]
  %gc_slot_addr_20954 = getelementptr inbounds ptr, ptr %gcframe1, i64 22
  store ptr %value_phi44.mem.pre-phi, ptr %gc_slot_addr_20954, align 16
  %ptls_load1021 = load ptr, ptr %ptls_field, align 8, !dbg !202, !tbaa !25
  %"box::GenericMemoryRef" = call noalias nonnull align 8 dereferenceable(32) ptr @ijl_gc_pool_alloc_instrumented(ptr %ptls_load1021, i32 800, i32 32, i64 140293725504592) #15, !dbg !202
  %"box::GenericMemoryRef.tag_addr" = getelementptr inbounds i64, ptr %"box::GenericMemoryRef", i64 -1, !dbg !202
  store atomic i64 140293725504592, ptr %"box::GenericMemoryRef.tag_addr" unordered, align 8, !dbg !202, !tbaa !99
  store ptr %23, ptr %"box::GenericMemoryRef", align 8, !dbg !202, !tbaa !102, !alias.scope !105, !noalias !106
  %"box::GenericMemoryRef.repack384" = getelementptr inbounds { ptr, ptr }, ptr %"box::GenericMemoryRef", i64 0, i32 1, !dbg !202
  store ptr %value_phi44.mem.pre-phi, ptr %"box::GenericMemoryRef.repack384", align 8, !dbg !202, !tbaa !102, !alias.scope !105, !noalias !106
  call void @ijl_bounds_error_int(ptr nonnull %"box::GenericMemoryRef", i64 %.us-phi485), !dbg !202
  unreachable, !dbg !202

idxend:                                           ; preds = %L188
  %80 = getelementptr inbounds { ptr, [1 x i64] }, ptr %23, i64 %value_phi67481, !dbg !202
  %.unpack = load ptr, ptr %80, align 8, !dbg !202, !tbaa !215, !alias.scope !105, !noalias !106
  %.elt386 = getelementptr inbounds { ptr, [1 x i64] }, ptr %23, i64 %value_phi67481, i32 1, !dbg !202
  %.unpack387.unpack = load i64, ptr %.elt386, align 8, !dbg !202, !tbaa !215, !alias.scope !105, !noalias !106
  %.not389 = icmp eq ptr %.unpack, null, !dbg !202
  br i1 %.not389, label %fail81, label %pass82, !dbg !202

fail81:                                           ; preds = %idxend, %idxend.postloop, %idxend.us489, %idxend.us489.postloop, %L188.us.us, %L188.us.us.us
  %jl_undefref_exception80 = load ptr, ptr @jl_undefref_exception, align 8, !dbg !202, !tbaa !30, !alias.scope !119, !noalias !120, !nonnull !0
  call void @ijl_throw(ptr nonnull %jl_undefref_exception80), !dbg !202
  unreachable, !dbg !202

pass82:                                           ; preds = %idxend
  %81 = load ptr, ptr %.data_ptr87, align 8, !dbg !217, !tbaa !30, !alias.scope !119, !noalias !120, !nonnull !0
  %82 = load i64, ptr %value_phi57.mem, align 8, !dbg !217, !tbaa !181, !range !184, !alias.scope !185, !noalias !186
  %83 = shl nuw nsw i64 %82, 1, !dbg !217
  %84 = add nuw i64 %82, %value_phi67481, !dbg !217
  %.not390 = icmp ult i64 %84, %83, !dbg !217
  %85 = icmp ult i64 %value_phi67481, %82, !dbg !217
  %86 = and i1 %.not390, %85, !dbg !217
  br i1 %86, label %idxend95, label %oob90, !dbg !217

oob90:                                            ; preds = %pass82, %pass82.postloop, %pass82.us494, %pass82.us494.postloop, %pass82.us.us, %pass82.us.us.us
  %.us-phi = phi i64 [ 1, %pass82.us.us.us ], [ %42, %pass82.us.us ], [ 1, %pass82.us494.postloop ], [ 1, %pass82.us494 ], [ %118, %pass82.postloop ], [ %77, %pass82 ]
  %.us-phi482 = phi ptr [ %29, %pass82.us.us.us ], [ %43, %pass82.us.us ], [ %105, %pass82.us494.postloop ], [ %63, %pass82.us494 ], [ %123, %pass82.postloop ], [ %81, %pass82 ]
  %gc_slot_addr_17955 = getelementptr inbounds ptr, ptr %gcframe1, i64 19
  store ptr %value_phi57.mem, ptr %gc_slot_addr_17955, align 8
  %ptls_load1024 = load ptr, ptr %ptls_field, align 8, !dbg !217, !tbaa !25
  %"box::GenericMemoryRef94" = call noalias nonnull align 8 dereferenceable(32) ptr @ijl_gc_pool_alloc_instrumented(ptr %ptls_load1024, i32 800, i32 32, i64 140293725504592) #15, !dbg !217
  %"box::GenericMemoryRef94.tag_addr" = getelementptr inbounds i64, ptr %"box::GenericMemoryRef94", i64 -1, !dbg !217
  store atomic i64 140293725504592, ptr %"box::GenericMemoryRef94.tag_addr" unordered, align 8, !dbg !217, !tbaa !99
  store ptr %.us-phi482, ptr %"box::GenericMemoryRef94", align 8, !dbg !217, !tbaa !102, !alias.scope !105, !noalias !106
  %"box::GenericMemoryRef94.repack391" = getelementptr inbounds { ptr, ptr }, ptr %"box::GenericMemoryRef94", i64 0, i32 1, !dbg !217
  store ptr %value_phi57.mem, ptr %"box::GenericMemoryRef94.repack391", align 8, !dbg !217, !tbaa !102, !alias.scope !105, !noalias !106
  call void @ijl_bounds_error_int(ptr nonnull %"box::GenericMemoryRef94", i64 %.us-phi), !dbg !217
  unreachable, !dbg !217

idxend95:                                         ; preds = %pass82
  %87 = getelementptr inbounds { ptr, [1 x i64] }, ptr %81, i64 %value_phi67481, !dbg !217
  %.unpack393 = load ptr, ptr %87, align 8, !dbg !217, !tbaa !215, !alias.scope !105, !noalias !106
  %.not397 = icmp eq ptr %.unpack393, null, !dbg !217
  br i1 %.not397, label %fail98, label %pass99, !dbg !217

fail98:                                           ; preds = %idxend95, %idxend95.postloop, %idxend95.us495, %idxend95.us495.postloop, %idxend95.us.us, %idxend95.us.us.us
  %jl_undefref_exception97 = load ptr, ptr @jl_undefref_exception, align 8, !dbg !217, !tbaa !30, !alias.scope !119, !noalias !120, !nonnull !0
  call void @ijl_throw(ptr nonnull %jl_undefref_exception97), !dbg !217
  unreachable, !dbg !217

pass99:                                           ; preds = %idxend95
  %.elt394 = getelementptr inbounds { ptr, [1 x i64] }, ptr %81, i64 %value_phi67481, i32 1, !dbg !217
  %.unpack395.unpack = load i64, ptr %.elt394, align 8, !dbg !217, !tbaa !215, !alias.scope !105, !noalias !106
  store ptr %.unpack, ptr %gc_slot_addr12, align 16
  store ptr %.unpack, ptr %4, align 8, !dbg !219
  store i64 %.unpack387.unpack, ptr %.fca.1.0.gep349, align 8, !dbg !219
  store ptr %.unpack393, ptr %gc_slot_addr11, align 8
  store ptr %.unpack393, ptr %5, align 8, !dbg !219
  store i64 %.unpack395.unpack, ptr %.fca.1.0.gep345, align 8, !dbg !219
  %gc_slot_addr_20956 = getelementptr inbounds ptr, ptr %gcframe1, i64 22
  store ptr %value_phi44.mem.pre-phi, ptr %gc_slot_addr_20956, align 16
  %gc_slot_addr_19957 = getelementptr inbounds ptr, ptr %gcframe1, i64 21
  store ptr %gclift938, ptr %gc_slot_addr_19957, align 8
  %gc_slot_addr_18958 = getelementptr inbounds ptr, ptr %gcframe1, i64 20
  store ptr %gclift938, ptr %gc_slot_addr_18958, align 16
  %gc_slot_addr_17959 = getelementptr inbounds ptr, ptr %gcframe1, i64 19
  store ptr %value_phi57.mem, ptr %gc_slot_addr_17959, align 8
  call swiftcc void @"j_+_968"(ptr noalias nocapture noundef nonnull sret({ ptr, [1 x i64] }) %3, ptr noalias nocapture noundef nonnull %2, ptr nonnull swiftself %pgcstack, ptr nocapture nonnull readonly %4, ptr nocapture nonnull readonly %5), !dbg !219
  %88 = load ptr, ptr %.data_ptr101, align 8, !dbg !222, !tbaa !30, !alias.scope !119, !noalias !120, !nonnull !0
  %89 = load i64, ptr %gclift938, align 8, !dbg !222, !tbaa !181, !range !184, !alias.scope !185, !noalias !186
  %90 = shl nuw nsw i64 %89, 1, !dbg !222
  %91 = add nuw i64 %89, %value_phi67481, !dbg !222
  %.not398 = icmp ult i64 %91, %90, !dbg !222
  %92 = icmp ult i64 %value_phi67481, %89, !dbg !222
  %93 = and i1 %.not398, %92, !dbg !222
  br i1 %93, label %load, label %oob104, !dbg !222

oob104:                                           ; preds = %pass99, %pass99.postloop, %pass99.us498, %pass99.us498.postloop, %pass99.us.us, %pass99.us.us.us
  %.us-phi483 = phi ptr [ %31, %pass99.us.us.us ], [ %50, %pass99.us.us ], [ %107, %pass99.us498.postloop ], [ %65, %pass99.us498 ], [ %130, %pass99.postloop ], [ %88, %pass99 ]
  %.us-phi484 = phi i64 [ %28, %pass99.us.us.us ], [ %42, %pass99.us.us ], [ %100, %pass99.us498.postloop ], [ %61, %pass99.us498 ], [ %118, %pass99.postloop ], [ %77, %pass99 ]
  %ptls_load1030 = load ptr, ptr %ptls_field, align 8, !dbg !222, !tbaa !25
  %"box::GenericMemoryRef108" = call noalias nonnull align 8 dereferenceable(32) ptr @ijl_gc_pool_alloc_instrumented(ptr %ptls_load1030, i32 800, i32 32, i64 140293725504592) #15, !dbg !222
  %"box::GenericMemoryRef108.tag_addr" = getelementptr inbounds i64, ptr %"box::GenericMemoryRef108", i64 -1, !dbg !222
  store atomic i64 140293725504592, ptr %"box::GenericMemoryRef108.tag_addr" unordered, align 8, !dbg !222, !tbaa !99
  store ptr %.us-phi483, ptr %"box::GenericMemoryRef108", align 8, !dbg !222, !tbaa !102, !alias.scope !105, !noalias !106
  %"box::GenericMemoryRef108.repack399" = getelementptr inbounds { ptr, ptr }, ptr %"box::GenericMemoryRef108", i64 0, i32 1, !dbg !222
  store ptr %gclift938, ptr %"box::GenericMemoryRef108.repack399", align 8, !dbg !222, !tbaa !102, !alias.scope !105, !noalias !106
  call void @ijl_bounds_error_int(ptr nonnull %"box::GenericMemoryRef108", i64 %.us-phi484), !dbg !222
  unreachable, !dbg !222

load:                                             ; preds = %pass99
  %94 = getelementptr inbounds { ptr, [1 x i64] }, ptr %88, i64 %value_phi67481, !dbg !227
  %.not401 = icmp eq ptr %27, %88, !dbg !227
  br i1 %.not401, label %guard_exit, label %guard_pass, !dbg !227

guard_pass:                                       ; preds = %load
  %95 = load ptr, ptr %27, align 8, !dbg !227, !tbaa !30, !alias.scope !119, !noalias !120
  %96 = icmp eq ptr %95, null, !dbg !227
  %97 = select i1 %96, ptr %gclift938, ptr %95, !dbg !227
  br label %guard_exit, !dbg !227

guard_exit:                                       ; preds = %guard_pass, %load
  %guard_res = phi ptr [ %gclift938, %load ], [ %97, %guard_pass ], !dbg !227
  %.unbox.fca.0.load = load ptr, ptr %3, align 8, !dbg !227, !tbaa !228, !alias.scope !230, !noalias !231
  %.unbox.fca.1.0.load = load i64, ptr %.unbox.fca.1.0.gep, align 8, !dbg !227, !tbaa !228, !alias.scope !230, !noalias !231
  store ptr %.unbox.fca.0.load, ptr %94, align 8, !dbg !227, !tbaa !215, !alias.scope !105, !noalias !106
  %.repack402 = getelementptr inbounds { ptr, [1 x i64] }, ptr %88, i64 %value_phi67481, i32 1, !dbg !227
  store i64 %.unbox.fca.1.0.load, ptr %.repack402, align 8, !dbg !227, !tbaa !215, !alias.scope !105, !noalias !106
  %guard_res.tag_addr = getelementptr inbounds i64, ptr %guard_res, i64 -1, !dbg !227
  %guard_res.tag = load atomic i64, ptr %guard_res.tag_addr unordered, align 8, !dbg !227, !tbaa !99, !range !232
  %parent_bits1062 = and i64 %guard_res.tag, 3, !dbg !227
  %parent_old_marked1063 = icmp eq i64 %parent_bits1062, 3, !dbg !227
  br i1 %parent_old_marked1063, label %may_trigger_wb1064, label %98, !dbg !227

may_trigger_wb1064:                               ; preds = %guard_exit
  %.unbox.fca.0.load.tag_addr = getelementptr inbounds i64, ptr %.unbox.fca.0.load, i64 -1, !dbg !227
  %.unbox.fca.0.load.tag = load atomic i64, ptr %.unbox.fca.0.load.tag_addr unordered, align 8, !dbg !227, !tbaa !99, !range !232
  %child_bit1065 = and i64 %.unbox.fca.0.load.tag, 1, !dbg !227
  %child_not_marked1067 = icmp eq i64 %child_bit1065, 0, !dbg !227
  br i1 %child_not_marked1067, label %trigger_wb1068, label %98, !dbg !227, !prof !233

trigger_wb1068:                                   ; preds = %may_trigger_wb1064
  call void @ijl_gc_queue_root(ptr %guard_res), !dbg !227
  br label %98, !dbg !227

98:                                               ; preds = %may_trigger_wb1064, %trigger_wb1068, %guard_exit
  %exitcond571.not = icmp eq i64 %77, %smin, !dbg !235
  br i1 %exitcond571.not, label %main.exit.selector552, label %L188, !dbg !235, !llvm.loop !236

main.exit.selector552:                            ; preds = %98
  %99 = icmp sgt i64 %12, %24, !dbg !235
  br i1 %99, label %main.pseudo.exit553, label %L249, !dbg !235

main.pseudo.exit553:                              ; preds = %main.exit.selector552, %L188.lr.ph.split.split
  br label %L188.postloop

L188.us487.postloop:                              ; preds = %117, %main.pseudo.exit
  %value_phi67481.us488.postloop = phi i64 [ %smin, %main.pseudo.exit ], [ %100, %117 ]
  %100 = add nuw nsw i64 %value_phi67481.us488.postloop, 1, !dbg !210
  %101 = add i64 %24, %value_phi67481.us488.postloop, !dbg !202
  %.not383.us512.postloop = icmp ult i64 %101, %25, !dbg !202
  %.idx670 = shl nsw i64 %value_phi67481.us488.postloop, 4, !dbg !202
  %102 = icmp ult i64 %.idx670, %26, !dbg !202
  %103 = and i1 %.not383.us512.postloop, %102, !dbg !202
  br i1 %103, label %idxend.us489.postloop, label %oob, !dbg !202

idxend.us489.postloop:                            ; preds = %L188.us487.postloop
  %104 = getelementptr inbounds { ptr, [1 x i64] }, ptr %23, i64 %value_phi67481.us488.postloop, !dbg !202
  %.unpack.us490.postloop = load ptr, ptr %104, align 8, !dbg !202, !tbaa !215, !alias.scope !105, !noalias !106
  %.elt386.us491.postloop = getelementptr inbounds { ptr, [1 x i64] }, ptr %23, i64 %value_phi67481.us488.postloop, i32 1, !dbg !202
  %.unpack387.unpack.us492.postloop = load i64, ptr %.elt386.us491.postloop, align 8, !dbg !202, !tbaa !215, !alias.scope !105, !noalias !106
  %.not389.us493.postloop = icmp eq ptr %.unpack.us490.postloop, null, !dbg !202
  br i1 %.not389.us493.postloop, label %fail81, label %pass82.us494.postloop, !dbg !202

pass82.us494.postloop:                            ; preds = %idxend.us489.postloop
  %105 = load ptr, ptr %.data_ptr87, align 8, !dbg !217, !tbaa !30, !alias.scope !119, !noalias !120, !nonnull !0
  %106 = load i64, ptr %value_phi57.mem, align 8, !dbg !217, !tbaa !181, !range !184, !alias.scope !185, !noalias !186
  %.not671 = icmp eq i64 %106, 0, !dbg !217
  br i1 %.not671, label %oob90, label %idxend95.us495.postloop, !dbg !217

idxend95.us495.postloop:                          ; preds = %pass82.us494.postloop
  %.unpack393.us496.postloop = load ptr, ptr %105, align 8, !dbg !217, !tbaa !215, !alias.scope !105, !noalias !106
  %.not397.us497.postloop = icmp eq ptr %.unpack393.us496.postloop, null, !dbg !217
  br i1 %.not397.us497.postloop, label %fail98, label %pass99.us498.postloop, !dbg !217

pass99.us498.postloop:                            ; preds = %idxend95.us495.postloop
  %.elt394.us499.postloop = getelementptr inbounds { ptr, [1 x i64] }, ptr %105, i64 0, i32 1, !dbg !217
  %.unpack395.unpack.us500.postloop = load i64, ptr %.elt394.us499.postloop, align 8, !dbg !217, !tbaa !215, !alias.scope !105, !noalias !106
  store ptr %.unpack.us490.postloop, ptr %gc_slot_addr14, align 16
  store ptr %.unpack.us490.postloop, ptr %4, align 8, !dbg !219
  store i64 %.unpack387.unpack.us492.postloop, ptr %.fca.1.0.gep349, align 8, !dbg !219
  store ptr %.unpack393.us496.postloop, ptr %gc_slot_addr13, align 8
  store ptr %.unpack393.us496.postloop, ptr %5, align 8, !dbg !219
  store i64 %.unpack395.unpack.us500.postloop, ptr %.fca.1.0.gep345, align 8, !dbg !219
  %gc_slot_addr_20960 = getelementptr inbounds ptr, ptr %gcframe1, i64 22
  store ptr %value_phi44.mem.pre-phi, ptr %gc_slot_addr_20960, align 16
  %gc_slot_addr_19961 = getelementptr inbounds ptr, ptr %gcframe1, i64 21
  store ptr %gclift938, ptr %gc_slot_addr_19961, align 8
  %gc_slot_addr_18962 = getelementptr inbounds ptr, ptr %gcframe1, i64 20
  store ptr %gclift938, ptr %gc_slot_addr_18962, align 16
  %gc_slot_addr_17963 = getelementptr inbounds ptr, ptr %gcframe1, i64 19
  store ptr %value_phi57.mem, ptr %gc_slot_addr_17963, align 8
  call swiftcc void @"j_+_968"(ptr noalias nocapture noundef nonnull sret({ ptr, [1 x i64] }) %3, ptr noalias nocapture noundef nonnull %2, ptr nonnull swiftself %pgcstack, ptr nocapture nonnull readonly %4, ptr nocapture nonnull readonly %5), !dbg !219
  %107 = load ptr, ptr %.data_ptr101, align 8, !dbg !222, !tbaa !30, !alias.scope !119, !noalias !120, !nonnull !0
  %108 = load i64, ptr %gclift938, align 8, !dbg !222, !tbaa !181, !range !184, !alias.scope !185, !noalias !186
  %109 = shl nuw nsw i64 %108, 1, !dbg !222
  %110 = add i64 %108, %value_phi67481.us488.postloop, !dbg !222
  %.not398.us501.postloop = icmp ult i64 %110, %109, !dbg !222
  %111 = icmp ult i64 %value_phi67481.us488.postloop, %108, !dbg !222
  %112 = and i1 %.not398.us501.postloop, %111, !dbg !222
  br i1 %112, label %load.us503.postloop, label %oob104, !dbg !222

load.us503.postloop:                              ; preds = %pass99.us498.postloop
  %113 = getelementptr inbounds { ptr, [1 x i64] }, ptr %107, i64 %value_phi67481.us488.postloop, !dbg !227
  %.not401.us504.postloop = icmp eq ptr %27, %107, !dbg !227
  br i1 %.not401.us504.postloop, label %guard_exit.us506.postloop, label %guard_pass.us505.postloop, !dbg !227

guard_pass.us505.postloop:                        ; preds = %load.us503.postloop
  %114 = load ptr, ptr %27, align 8, !dbg !227, !tbaa !30, !alias.scope !119, !noalias !120
  %115 = icmp eq ptr %114, null, !dbg !227
  %116 = select i1 %115, ptr %gclift938, ptr %114, !dbg !227
  br label %guard_exit.us506.postloop, !dbg !227

guard_exit.us506.postloop:                        ; preds = %guard_pass.us505.postloop, %load.us503.postloop
  %guard_res.us507.postloop = phi ptr [ %gclift938, %load.us503.postloop ], [ %116, %guard_pass.us505.postloop ], !dbg !227
  %.unbox.fca.0.load.us508.postloop = load ptr, ptr %3, align 8, !dbg !227, !tbaa !228, !alias.scope !230, !noalias !231
  %.unbox.fca.1.0.load.us509.postloop = load i64, ptr %.unbox.fca.1.0.gep, align 8, !dbg !227, !tbaa !228, !alias.scope !230, !noalias !231
  store ptr %.unbox.fca.0.load.us508.postloop, ptr %113, align 8, !dbg !227, !tbaa !215, !alias.scope !105, !noalias !106
  %.repack402.us510.postloop = getelementptr inbounds { ptr, [1 x i64] }, ptr %107, i64 %value_phi67481.us488.postloop, i32 1, !dbg !227
  store i64 %.unbox.fca.1.0.load.us509.postloop, ptr %.repack402.us510.postloop, align 8, !dbg !227, !tbaa !215, !alias.scope !105, !noalias !106
  %guard_res.us507.postloop.tag_addr = getelementptr inbounds i64, ptr %guard_res.us507.postloop, i64 -1, !dbg !227
  %guard_res.us507.postloop.tag = load atomic i64, ptr %guard_res.us507.postloop.tag_addr unordered, align 8, !dbg !227, !tbaa !99, !range !232
  %parent_bits1069 = and i64 %guard_res.us507.postloop.tag, 3, !dbg !227
  %parent_old_marked1070 = icmp eq i64 %parent_bits1069, 3, !dbg !227
  br i1 %parent_old_marked1070, label %may_trigger_wb1071, label %117, !dbg !227

may_trigger_wb1071:                               ; preds = %guard_exit.us506.postloop
  %.unbox.fca.0.load.us508.postloop.tag_addr = getelementptr inbounds i64, ptr %.unbox.fca.0.load.us508.postloop, i64 -1, !dbg !227
  %.unbox.fca.0.load.us508.postloop.tag = load atomic i64, ptr %.unbox.fca.0.load.us508.postloop.tag_addr unordered, align 8, !dbg !227, !tbaa !99, !range !232
  %child_bit1072 = and i64 %.unbox.fca.0.load.us508.postloop.tag, 1, !dbg !227
  %child_not_marked1074 = icmp eq i64 %child_bit1072, 0, !dbg !227
  br i1 %child_not_marked1074, label %trigger_wb1075, label %117, !dbg !227, !prof !233

trigger_wb1075:                                   ; preds = %may_trigger_wb1071
  call void @ijl_gc_queue_root(ptr %guard_res.us507.postloop), !dbg !227
  br label %117, !dbg !227

117:                                              ; preds = %may_trigger_wb1071, %trigger_wb1075, %guard_exit.us506.postloop
  %.not382.us511.postloop = icmp slt i64 %100, %12, !dbg !234
  br i1 %.not382.us511.postloop, label %L188.us487.postloop, label %L249, !dbg !235, !llvm.loop !262, !irce.loop.clone !0

L188.postloop:                                    ; preds = %140, %main.pseudo.exit553
  %value_phi67481.postloop = phi i64 [ %smin, %main.pseudo.exit553 ], [ %118, %140 ]
  %118 = add nuw nsw i64 %value_phi67481.postloop, 1, !dbg !210
  %119 = add i64 %24, %value_phi67481.postloop, !dbg !202
  %.not383.postloop = icmp ult i64 %119, %25, !dbg !202
  %.idx = shl nsw i64 %value_phi67481.postloop, 4, !dbg !202
  %120 = icmp ult i64 %.idx, %26, !dbg !202
  %121 = and i1 %.not383.postloop, %120, !dbg !202
  br i1 %121, label %idxend.postloop, label %oob, !dbg !202

idxend.postloop:                                  ; preds = %L188.postloop
  %122 = getelementptr inbounds { ptr, [1 x i64] }, ptr %23, i64 %value_phi67481.postloop, !dbg !202
  %.unpack.postloop = load ptr, ptr %122, align 8, !dbg !202, !tbaa !215, !alias.scope !105, !noalias !106
  %.elt386.postloop = getelementptr inbounds { ptr, [1 x i64] }, ptr %23, i64 %value_phi67481.postloop, i32 1, !dbg !202
  %.unpack387.unpack.postloop = load i64, ptr %.elt386.postloop, align 8, !dbg !202, !tbaa !215, !alias.scope !105, !noalias !106
  %.not389.postloop = icmp eq ptr %.unpack.postloop, null, !dbg !202
  br i1 %.not389.postloop, label %fail81, label %pass82.postloop, !dbg !202

pass82.postloop:                                  ; preds = %idxend.postloop
  %123 = load ptr, ptr %.data_ptr87, align 8, !dbg !217, !tbaa !30, !alias.scope !119, !noalias !120, !nonnull !0
  %124 = load i64, ptr %value_phi57.mem, align 8, !dbg !217, !tbaa !181, !range !184, !alias.scope !185, !noalias !186
  %125 = shl nuw nsw i64 %124, 1, !dbg !217
  %126 = add i64 %124, %value_phi67481.postloop, !dbg !217
  %.not390.postloop = icmp ult i64 %126, %125, !dbg !217
  %127 = icmp ult i64 %value_phi67481.postloop, %124, !dbg !217
  %128 = and i1 %.not390.postloop, %127, !dbg !217
  br i1 %128, label %idxend95.postloop, label %oob90, !dbg !217

idxend95.postloop:                                ; preds = %pass82.postloop
  %129 = getelementptr inbounds { ptr, [1 x i64] }, ptr %123, i64 %value_phi67481.postloop, !dbg !217
  %.unpack393.postloop = load ptr, ptr %129, align 8, !dbg !217, !tbaa !215, !alias.scope !105, !noalias !106
  %.not397.postloop = icmp eq ptr %.unpack393.postloop, null, !dbg !217
  br i1 %.not397.postloop, label %fail98, label %pass99.postloop, !dbg !217

pass99.postloop:                                  ; preds = %idxend95.postloop
  %.elt394.postloop = getelementptr inbounds { ptr, [1 x i64] }, ptr %123, i64 %value_phi67481.postloop, i32 1, !dbg !217
  %.unpack395.unpack.postloop = load i64, ptr %.elt394.postloop, align 8, !dbg !217, !tbaa !215, !alias.scope !105, !noalias !106
  store ptr %.unpack.postloop, ptr %gc_slot_addr16, align 16
  store ptr %.unpack.postloop, ptr %4, align 8, !dbg !219
  store i64 %.unpack387.unpack.postloop, ptr %.fca.1.0.gep349, align 8, !dbg !219
  store ptr %.unpack393.postloop, ptr %gc_slot_addr15, align 8
  store ptr %.unpack393.postloop, ptr %5, align 8, !dbg !219
  store i64 %.unpack395.unpack.postloop, ptr %.fca.1.0.gep345, align 8, !dbg !219
  %gc_slot_addr_20964 = getelementptr inbounds ptr, ptr %gcframe1, i64 22
  store ptr %value_phi44.mem.pre-phi, ptr %gc_slot_addr_20964, align 16
  %gc_slot_addr_19965 = getelementptr inbounds ptr, ptr %gcframe1, i64 21
  store ptr %gclift938, ptr %gc_slot_addr_19965, align 8
  %gc_slot_addr_18966 = getelementptr inbounds ptr, ptr %gcframe1, i64 20
  store ptr %gclift938, ptr %gc_slot_addr_18966, align 16
  %gc_slot_addr_17967 = getelementptr inbounds ptr, ptr %gcframe1, i64 19
  store ptr %value_phi57.mem, ptr %gc_slot_addr_17967, align 8
  call swiftcc void @"j_+_968"(ptr noalias nocapture noundef nonnull sret({ ptr, [1 x i64] }) %3, ptr noalias nocapture noundef nonnull %2, ptr nonnull swiftself %pgcstack, ptr nocapture nonnull readonly %4, ptr nocapture nonnull readonly %5), !dbg !219
  %130 = load ptr, ptr %.data_ptr101, align 8, !dbg !222, !tbaa !30, !alias.scope !119, !noalias !120, !nonnull !0
  %131 = load i64, ptr %gclift938, align 8, !dbg !222, !tbaa !181, !range !184, !alias.scope !185, !noalias !186
  %132 = shl nuw nsw i64 %131, 1, !dbg !222
  %133 = add i64 %131, %value_phi67481.postloop, !dbg !222
  %.not398.postloop = icmp ult i64 %133, %132, !dbg !222
  %134 = icmp ult i64 %value_phi67481.postloop, %131, !dbg !222
  %135 = and i1 %.not398.postloop, %134, !dbg !222
  br i1 %135, label %load.postloop, label %oob104, !dbg !222

load.postloop:                                    ; preds = %pass99.postloop
  %136 = getelementptr inbounds { ptr, [1 x i64] }, ptr %130, i64 %value_phi67481.postloop, !dbg !227
  %.not401.postloop = icmp eq ptr %27, %130, !dbg !227
  br i1 %.not401.postloop, label %guard_exit.postloop, label %guard_pass.postloop, !dbg !227

guard_pass.postloop:                              ; preds = %load.postloop
  %137 = load ptr, ptr %27, align 8, !dbg !227, !tbaa !30, !alias.scope !119, !noalias !120
  %138 = icmp eq ptr %137, null, !dbg !227
  %139 = select i1 %138, ptr %gclift938, ptr %137, !dbg !227
  br label %guard_exit.postloop, !dbg !227

guard_exit.postloop:                              ; preds = %guard_pass.postloop, %load.postloop
  %guard_res.postloop = phi ptr [ %gclift938, %load.postloop ], [ %139, %guard_pass.postloop ], !dbg !227
  %.unbox.fca.0.load.postloop = load ptr, ptr %3, align 8, !dbg !227, !tbaa !228, !alias.scope !230, !noalias !231
  %.unbox.fca.1.0.load.postloop = load i64, ptr %.unbox.fca.1.0.gep, align 8, !dbg !227, !tbaa !228, !alias.scope !230, !noalias !231
  store ptr %.unbox.fca.0.load.postloop, ptr %136, align 8, !dbg !227, !tbaa !215, !alias.scope !105, !noalias !106
  %.repack402.postloop = getelementptr inbounds { ptr, [1 x i64] }, ptr %130, i64 %value_phi67481.postloop, i32 1, !dbg !227
  store i64 %.unbox.fca.1.0.load.postloop, ptr %.repack402.postloop, align 8, !dbg !227, !tbaa !215, !alias.scope !105, !noalias !106
  %guard_res.postloop.tag_addr = getelementptr inbounds i64, ptr %guard_res.postloop, i64 -1, !dbg !227
  %guard_res.postloop.tag = load atomic i64, ptr %guard_res.postloop.tag_addr unordered, align 8, !dbg !227, !tbaa !99, !range !232
  %parent_bits1076 = and i64 %guard_res.postloop.tag, 3, !dbg !227
  %parent_old_marked1077 = icmp eq i64 %parent_bits1076, 3, !dbg !227
  br i1 %parent_old_marked1077, label %may_trigger_wb1078, label %140, !dbg !227

may_trigger_wb1078:                               ; preds = %guard_exit.postloop
  %.unbox.fca.0.load.postloop.tag_addr = getelementptr inbounds i64, ptr %.unbox.fca.0.load.postloop, i64 -1, !dbg !227
  %.unbox.fca.0.load.postloop.tag = load atomic i64, ptr %.unbox.fca.0.load.postloop.tag_addr unordered, align 8, !dbg !227, !tbaa !99, !range !232
  %child_bit1079 = and i64 %.unbox.fca.0.load.postloop.tag, 1, !dbg !227
  %child_not_marked1081 = icmp eq i64 %child_bit1079, 0, !dbg !227
  br i1 %child_not_marked1081, label %trigger_wb1082, label %140, !dbg !227, !prof !233

trigger_wb1082:                                   ; preds = %may_trigger_wb1078
  call void @ijl_gc_queue_root(ptr %guard_res.postloop), !dbg !227
  br label %140, !dbg !227

140:                                              ; preds = %may_trigger_wb1078, %trigger_wb1082, %guard_exit.postloop
  %.not382.postloop = icmp slt i64 %118, %12, !dbg !234
  br i1 %.not382.postloop, label %L188.postloop, label %L249, !dbg !235, !llvm.loop !267, !irce.loop.clone !0
}

; Function Attrs: noinline optnone
define nonnull ptr @"jfptr_+_942"(ptr %"function::Core.Function", ptr noalias nocapture noundef readonly %"args::Any[]", i32 %"nargs::UInt32") #1 {
top:
  %gcframe = alloca ptr, i32 4, align 16
  call void @llvm.memset.p0.i64(ptr align 16 %gcframe, i8 0, i64 32, i1 true)
  %return_roots = getelementptr inbounds ptr, ptr %gcframe, i32 2
  %thread_ptr = call ptr asm "movq %fs:0, $0", "=r"()
  %tls_ppgcstack = getelementptr i8, ptr %thread_ptr, i64 -8
  %tls_pgcstack = load ptr, ptr %tls_ppgcstack, align 8
  %frame.nroots = getelementptr inbounds ptr, ptr %gcframe, i32 0
  store i64 8, ptr %frame.nroots, align 8, !tbaa !25
  %frame.prev = getelementptr inbounds ptr, ptr %gcframe, i32 1
  %task.gcstack = load ptr, ptr %tls_pgcstack, align 8
  store ptr %task.gcstack, ptr %frame.prev, align 8, !tbaa !25
  store ptr %gcframe, ptr %tls_pgcstack, align 8
  %sret = alloca { ptr, [1 x i64] }, align 8
  %0 = getelementptr inbounds ptr, ptr %"args::Any[]", i32 0
  %1 = load ptr, ptr %0, align 8, !tbaa !30, !alias.scope !119, !noalias !120, !nonnull !0, !dereferenceable !131, !align !132
  %2 = getelementptr inbounds ptr, ptr %"args::Any[]", i32 1
  %3 = load ptr, ptr %2, align 8, !tbaa !30, !alias.scope !119, !noalias !120, !nonnull !0, !dereferenceable !131, !align !132
  call swiftcc void @"julia_+_941"(ptr noalias nocapture noundef sret({ ptr, [1 x i64] }) %sret, ptr noalias nocapture noundef %return_roots, ptr nonnull swiftself %tls_pgcstack, ptr nocapture readonly %1, ptr nocapture readonly %3)
  %"+Main.FixedSizeArrays.FixedSizeArray#943" = load ptr, ptr @"+Main.FixedSizeArrays.FixedSizeArray#943", align 8, !tbaa !30, !alias.scope !119, !noalias !120, !nonnull !0, !dereferenceable !268, !align !131
  %FixedSizeArray = ptrtoint ptr %"+Main.FixedSizeArrays.FixedSizeArray#943" to i64
  %4 = inttoptr i64 %FixedSizeArray to ptr
  %current_task = getelementptr inbounds ptr, ptr %tls_pgcstack, i64 -14
  %gc_slot_addr_1 = getelementptr inbounds ptr, ptr %gcframe, i32 3
  store ptr %4, ptr %gc_slot_addr_1, align 8
  call void @llvm.assume(i1 true) [ "align"(ptr %4, i64 16) ]
  %ptls_field = getelementptr inbounds ptr, ptr %current_task, i64 16
  %ptls_load = load ptr, ptr %ptls_field, align 8, !tbaa !25
  %5 = ptrtoint ptr %4 to i64
  %"box::FixedSizeArray" = call noalias nonnull align 8 dereferenceable(16) ptr @ijl_gc_pool_alloc_instrumented(ptr %ptls_load, i32 800, i32 32, i64 %5) #15
  %"box::FixedSizeArray.tag_addr" = getelementptr inbounds ptr, ptr %"box::FixedSizeArray", i64 -1
  store atomic ptr %4, ptr %"box::FixedSizeArray.tag_addr" unordered, align 8, !tbaa !99
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %"box::FixedSizeArray", ptr align 8 %sret, i64 16, i1 false), !tbaa !49, !alias.scope !269, !noalias !270
  %6 = getelementptr inbounds ptr, ptr %gcframe, i32 1
  %frame.prev5 = load ptr, ptr %6, align 8, !tbaa !25
  store ptr %frame.prev5, ptr %tls_pgcstack, align 8, !tbaa !25
  ret ptr %"box::FixedSizeArray"
}

; Function Attrs: nounwind willreturn allockind("alloc") allocsize(1) memory(argmem: read, inaccessiblemem: readwrite)
declare noalias nonnull ptr @julia.gc_alloc_obj(ptr, i64, ptr) #2

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare void @llvm.dbg.declare(metadata, metadata, metadata) #3

; Function Attrs: memory(argmem: readwrite, inaccessiblemem: readwrite)
declare void @julia.safepoint(ptr) #4

; Function Signature: throw_promote_shape_mismatch(Tuple{Base.OneTo{Int64}}, Tuple{Base.OneTo{Int64}}, Int64)
; Function Attrs: noreturn
declare swiftcc void @j_throw_promote_shape_mismatch_949(ptr nonnull swiftself, ptr nocapture readonly, ptr nocapture readonly, i64 signext) #5

; Function Signature: (::Type{ArgumentError})(String)
declare swiftcc [1 x ptr] @j_ArgumentError_952(ptr nonnull swiftself, ptr) #6

; Function Attrs: noreturn
declare void @ijl_throw(ptr) #7

; Function Attrs: noreturn
declare void @ijl_bounds_error_int(ptr, i64) #7

; Function Attrs: norecurse nosync nounwind speculatable willreturn memory(none)
declare noundef nonnull ptr @julia.gc_loaded(ptr nocapture noundef nonnull readnone, ptr noundef nonnull readnone) #8

; Function Signature: +(FixedSizeArrays.FixedSizeArray{Float64, 1}, FixedSizeArrays.FixedSizeArray{Float64, 1})
declare swiftcc void @"j_+_968"(ptr noalias nocapture noundef sret({ ptr, [1 x i64] }), ptr noalias nocapture noundef, ptr nonnull swiftself, ptr nocapture readonly, ptr nocapture readonly) #9

; Function Attrs: norecurse nounwind memory(inaccessiblemem: readwrite)
declare void @julia.write_barrier(ptr readonly, ...) #10

declare i64 @ijl_object_id_(i64, ptr)

; Function Signature: unaliascopy(FixedSizeArrays.FixedSizeArray{FixedSizeArrays.FixedSizeArray{Float64, 1}, 1})
declare swiftcc void @j_unaliascopy_982(ptr noalias nocapture noundef sret({ ptr, [1 x i64] }), ptr noalias nocapture noundef, ptr nonnull swiftself, ptr nocapture readonly) #11

; Function Signature: throwdm(Tuple{Base.OneTo{Int64}}, Tuple{Base.OneTo{Int64}})
; Function Attrs: noreturn
declare swiftcc void @j_throwdm_984(ptr nonnull swiftself, ptr nocapture readonly, ptr nocapture readonly) #12

; Function Attrs: willreturn memory(argmem: read, inaccessiblemem: readwrite)
declare nonnull align 16 dereferenceable(16) ptr @jl_alloc_genericmemory(ptr, i64) #13

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i64 @llvm.smin.i64(i64, i64) #3

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i64 @llvm.smax.i64(i64, i64) #3

; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: readwrite)
declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture) #14

; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: readwrite)
declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture) #14

declare noalias nonnull ptr @julia.new_gc_frame(i32)

declare void @julia.push_gc_frame(ptr, i32)

declare ptr @julia.get_gc_frame_slot(ptr, i32)

declare void @julia.pop_gc_frame(ptr)

; Function Attrs: nounwind willreturn allockind("alloc") allocsize(1) memory(argmem: read, inaccessiblemem: readwrite)
declare noalias nonnull ptr @julia.gc_alloc_bytes(ptr, i64, i64) #2

; Function Attrs: memory(argmem: readwrite, inaccessiblemem: readwrite)
declare void @julia.queue_gc_root(ptr) #4

; Function Attrs: memory(argmem: readwrite, inaccessiblemem: readwrite)
declare void @ijl_gc_queue_root(ptr) #4

; Function Attrs: nounwind willreturn allockind("alloc") allocsize(2) memory(argmem: read, inaccessiblemem: readwrite)
declare noalias nonnull ptr @ijl_gc_pool_alloc_instrumented(ptr, i32, i32, i64) #15

; Function Attrs: nounwind willreturn allockind("alloc") allocsize(1) memory(argmem: read, inaccessiblemem: readwrite)
declare noalias nonnull ptr @ijl_gc_big_alloc_instrumented(ptr, i64, i64) #2

; Function Attrs: nounwind willreturn allockind("alloc") allocsize(1) memory(argmem: read, inaccessiblemem: readwrite)
declare noalias nonnull ptr @ijl_gc_alloc_typed(ptr, i64, i64) #2

; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: write)
declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg) #16

; Function Attrs: nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: readwrite)
declare void @llvm.assume(i1 noundef) #17

; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: readwrite)
declare void @llvm.memcpy.p0.p0.i64(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i64, i1 immarg) #18

attributes #0 = { sspstrong "frame-pointer"="all" "julia.fsig"="+(FixedSizeArrays.FixedSizeArray{FixedSizeArrays.FixedSizeArray{Float64, 1}, 1}, FixedSizeArrays.FixedSizeArray{FixedSizeArrays.FixedSizeArray{Float64, 1}, 1})" "probe-stack"="inline-asm" }
attributes #1 = { noinline optnone "frame-pointer"="all" "probe-stack"="inline-asm" }
attributes #2 = { nounwind willreturn allockind("alloc") allocsize(1) memory(argmem: read, inaccessiblemem: readwrite) }
attributes #3 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #4 = { memory(argmem: readwrite, inaccessiblemem: readwrite) }
attributes #5 = { noreturn "frame-pointer"="all" "julia.fsig"="throw_promote_shape_mismatch(Tuple{Base.OneTo{Int64}}, Tuple{Base.OneTo{Int64}}, Int64)" "probe-stack"="inline-asm" }
attributes #6 = { "frame-pointer"="all" "julia.fsig"="(::Type{ArgumentError})(String)" "probe-stack"="inline-asm" }
attributes #7 = { noreturn }
attributes #8 = { norecurse nosync nounwind speculatable willreturn memory(none) }
attributes #9 = { "frame-pointer"="all" "julia.fsig"="+(FixedSizeArrays.FixedSizeArray{Float64, 1}, FixedSizeArrays.FixedSizeArray{Float64, 1})" "probe-stack"="inline-asm" }
attributes #10 = { norecurse nounwind memory(inaccessiblemem: readwrite) }
attributes #11 = { "frame-pointer"="all" "julia.fsig"="unaliascopy(FixedSizeArrays.FixedSizeArray{FixedSizeArrays.FixedSizeArray{Float64, 1}, 1})" "probe-stack"="inline-asm" }
attributes #12 = { noreturn "frame-pointer"="all" "julia.fsig"="throwdm(Tuple{Base.OneTo{Int64}}, Tuple{Base.OneTo{Int64}})" "probe-stack"="inline-asm" }
attributes #13 = { willreturn memory(argmem: read, inaccessiblemem: readwrite) }
attributes #14 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #15 = { nounwind willreturn allockind("alloc") allocsize(2) memory(argmem: read, inaccessiblemem: readwrite) }
attributes #16 = { nocallback nofree nounwind willreturn memory(argmem: write) }
attributes #17 = { nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: readwrite) }
attributes #18 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }

!llvm.module.flags = !{!1, !2, !3, !4}
!llvm.dbg.cu = !{!5}

!0 = !{}
!1 = !{i32 2, !"Dwarf Version", i32 4}
!2 = !{i32 2, !"Debug Info Version", i32 3}
!3 = !{i32 1, !"stack-protector-guard", !"global"}
!4 = !{i32 2, !"julia.debug_level", i32 2}
!5 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !6, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: NoDebug, nameTableKind: GNU)
!6 = !DIFile(filename: "julia", directory: ".")
!7 = distinct !DISubprogram(name: "+", linkageName: "julia_+_941", scope: null, file: !8, line: 6, type: !9, scopeLine: 6, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !21)
!8 = !DIFile(filename: "arraymath.jl", directory: ".")
!9 = !DISubroutineType(types: !10)
!10 = !{!11, !20, !11, !11}
!11 = !DICompositeType(tag: DW_TAG_structure_type, name: "FixedSizeArray", size: 128, align: 64, elements: !12, runtimeLang: DW_LANG_Julia, identifier: "140293723992016")
!12 = !{!13, !17}
!13 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !14, size: 64, align: 64)
!14 = !DICompositeType(tag: DW_TAG_structure_type, name: "jl_value_t", file: !15, line: 71, align: 64, elements: !16)
!15 = !DIFile(filename: "julia.h", directory: "")
!16 = !{!13}
!17 = !DICompositeType(tag: DW_TAG_structure_type, name: "Tuple", size: 64, align: 64, elements: !18, runtimeLang: DW_LANG_Julia, identifier: "140293563576864")
!18 = !{!19}
!19 = !DIBasicType(name: "Int64", size: 64, encoding: DW_ATE_unsigned)
!20 = !DICompositeType(tag: DW_TAG_structure_type, name: "#+", align: 8, elements: !0, runtimeLang: DW_LANG_Julia, identifier: "140293565276864")
!21 = !{!22, !23, !24}
!22 = !DILocalVariable(name: "#self#", arg: 2, scope: !7, file: !8, line: 6, type: !20)
!23 = !DILocalVariable(name: "A", arg: 3, scope: !7, file: !8, line: 6, type: !11)
!24 = !DILocalVariable(name: "B", arg: 4, scope: !7, file: !8, line: 6, type: !11)
!25 = !{!26, !26, i64 0}
!26 = !{!"jtbaa_gcframe", !27, i64 0}
!27 = !{!"jtbaa", !28, i64 0}
!28 = !{!"jtbaa"}
!29 = !DILocation(line: 6, scope: !7)
!30 = !{!31, !31, i64 0}
!31 = !{!"jtbaa_const", !27, i64 0}
!32 = !DILocation(line: 30, scope: !33, inlinedAt: !36)
!33 = distinct !DISubprogram(name: "size;", linkageName: "size", scope: !34, file: !34, type: !35, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !0)
!34 = !DIFile(filename: "REPL[1]", directory: ".")
!35 = !DISubroutineType(types: !0)
!36 = !DILocation(line: 98, scope: !37, inlinedAt: !39)
!37 = distinct !DISubprogram(name: "axes;", linkageName: "axes", scope: !38, file: !38, type: !35, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !0)
!38 = !DIFile(filename: "abstractarray.jl", directory: ".")
!39 = !DILocation(line: 188, scope: !40, inlinedAt: !42)
!40 = distinct !DISubprogram(name: "promote_shape;", linkageName: "promote_shape", scope: !41, file: !41, type: !35, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !0)
!41 = !DIFile(filename: "indices.jl", directory: ".")
!42 = !DILocation(line: 7, scope: !7)
!43 = !DILocation(line: 479, scope: !44, inlinedAt: !46)
!44 = distinct !DISubprogram(name: "unchecked_oneto;", linkageName: "unchecked_oneto", scope: !45, file: !45, type: !35, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !0)
!45 = !DIFile(filename: "range.jl", directory: ".")
!46 = !DILocation(line: 355, scope: !47, inlinedAt: !36)
!47 = distinct !DISubprogram(name: "map;", linkageName: "map", scope: !48, file: !48, type: !35, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !0)
!48 = !DIFile(filename: "tuple.jl", directory: ".")
!49 = !{!27, !27, i64 0}
!50 = !{!51, !53}
!51 = !{!"jnoalias_const", !52}
!52 = !{!"jnoalias"}
!53 = !{!"jnoalias_stack", !52}
!54 = !{!55, !56, !57}
!55 = !{!"jnoalias_gcframe", !52}
!56 = !{!"jnoalias_data", !52}
!57 = !{!"jnoalias_typemd", !52}
!58 = !DILocation(line: 639, scope: !59, inlinedAt: !61)
!59 = distinct !DISubprogram(name: "==;", linkageName: "==", scope: !60, file: !60, type: !35, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !0)
!60 = !DIFile(filename: "promotion.jl", directory: ".")
!61 = !DILocation(line: 1128, scope: !62, inlinedAt: !63)
!62 = distinct !DISubprogram(name: "==;", linkageName: "==", scope: !45, file: !45, type: !35, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !0)
!63 = !DILocation(line: 313, scope: !64, inlinedAt: !66)
!64 = distinct !DISubprogram(name: "!=;", linkageName: "!=", scope: !65, file: !65, type: !35, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !0)
!65 = !DIFile(filename: "operators.jl", directory: ".")
!66 = !DILocation(line: 196, scope: !40, inlinedAt: !39)
!67 = !DILocation(line: 83, scope: !68, inlinedAt: !70)
!68 = distinct !DISubprogram(name: "<;", linkageName: "<", scope: !69, file: !69, type: !35, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !0)
!69 = !DIFile(filename: "int.jl", directory: ".")
!70 = !DILocation(line: 484, scope: !71, inlinedAt: !72)
!71 = distinct !DISubprogram(name: "<;", linkageName: "<", scope: !60, file: !60, type: !35, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !0)
!72 = !DILocation(line: 49, scope: !73, inlinedAt: !74)
!73 = distinct !DISubprogram(name: "#1;", linkageName: "#1", scope: !34, file: !34, type: !35, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !0)
!74 = !DILocation(line: 1229, scope: !75, inlinedAt: !77)
!75 = distinct !DISubprogram(name: "_any;", linkageName: "_any", scope: !76, file: !76, type: !35, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !0)
!76 = !DIFile(filename: "reduce.jl", directory: ".")
!77 = !DILocation(line: 1245, scope: !78, inlinedAt: !79)
!78 = distinct !DISubprogram(name: "any;", linkageName: "any", scope: !76, file: !76, type: !35, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !0)
!79 = !DILocation(line: 49, scope: !80, inlinedAt: !81)
!80 = distinct !DISubprogram(name: "checked_dims;", linkageName: "checked_dims", scope: !34, file: !34, type: !35, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !0)
!81 = !DILocation(line: 14, scope: !82, inlinedAt: !83)
!82 = distinct !DISubprogram(name: "FixedSizeArray;", linkageName: "FixedSizeArray", scope: !34, file: !34, type: !35, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !0)
!83 = !DILocation(line: 23, scope: !82, inlinedAt: !84)
!84 = !DILocation(line: 868, scope: !85, inlinedAt: !86)
!85 = distinct !DISubprogram(name: "similar;", linkageName: "similar", scope: !38, file: !38, type: !35, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !0)
!86 = !DILocation(line: 867, scope: !85, inlinedAt: !87)
!87 = !DILocation(line: 76, scope: !88, inlinedAt: !89)
!88 = distinct !DISubprogram(name: "similar;", linkageName: "similar", scope: !34, file: !34, type: !35, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !0)
!89 = !DILocation(line: 897, scope: !90, inlinedAt: !92)
!90 = distinct !DISubprogram(name: "copy;", linkageName: "copy", scope: !91, file: !91, type: !35, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !0)
!91 = !DIFile(filename: "broadcast.jl", directory: ".")
!92 = !DILocation(line: 872, scope: !93, inlinedAt: !94)
!93 = distinct !DISubprogram(name: "materialize;", linkageName: "materialize", scope: !91, file: !91, type: !35, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !0)
!94 = !DILocation(line: 861, scope: !95, inlinedAt: !96)
!95 = distinct !DISubprogram(name: "broadcast_preserving_zero_d;", linkageName: "broadcast_preserving_zero_d", scope: !91, file: !91, type: !35, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !0)
!96 = !DILocation(line: 8, scope: !7)
!97 = !DILocation(line: 54, scope: !80, inlinedAt: !81)
!98 = !DILocation(line: 55, scope: !80, inlinedAt: !81)
!99 = !{!100, !100, i64 0}
!100 = !{!"jtbaa_tag", !101, i64 0}
!101 = !{!"jtbaa_data", !27, i64 0}
!102 = !{!103, !103, i64 0}
!103 = !{!"jtbaa_immut", !104, i64 0}
!104 = !{!"jtbaa_value", !101, i64 0}
!105 = !{!56}
!106 = !{!55, !53, !57, !51}
!107 = !DILocation(line: 639, scope: !59, inlinedAt: !108)
!108 = !DILocation(line: 50, scope: !109, inlinedAt: !110)
!109 = distinct !DISubprogram(name: "#2;", linkageName: "#2", scope: !34, file: !34, type: !35, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !0)
!110 = !DILocation(line: 1229, scope: !75, inlinedAt: !111)
!111 = !DILocation(line: 1245, scope: !78, inlinedAt: !112)
!112 = !DILocation(line: 50, scope: !80, inlinedAt: !81)
!113 = !DILocation(line: 57, scope: !80, inlinedAt: !81)
!114 = !DILocation(line: 58, scope: !80, inlinedAt: !81)
!115 = !DILocation(line: 525, scope: !116, inlinedAt: !81)
!116 = distinct !DISubprogram(name: "GenericMemory;", linkageName: "GenericMemory", scope: !117, file: !117, type: !35, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !0)
!117 = !DIFile(filename: "boot.jl", directory: ".")
!118 = !DILocation(line: 527, scope: !116, inlinedAt: !81)
!119 = !{!51}
!120 = !{!55, !53, !56, !57}
!121 = !DILocation(line: 946, scope: !122, inlinedAt: !123)
!122 = distinct !DISubprogram(name: "broadcast_unalias;", linkageName: "broadcast_unalias", scope: !91, file: !91, type: !35, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !0)
!123 = !DILocation(line: 953, scope: !124, inlinedAt: !125)
!124 = distinct !DISubprogram(name: "preprocess;", linkageName: "preprocess", scope: !91, file: !91, type: !35, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !0)
!125 = !DILocation(line: 955, scope: !126, inlinedAt: !127)
!126 = distinct !DISubprogram(name: "preprocess_args;", linkageName: "preprocess_args", scope: !91, file: !91, type: !35, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !0)
!127 = !DILocation(line: 952, scope: !124, inlinedAt: !128)
!128 = !DILocation(line: 969, scope: !129, inlinedAt: !130)
!129 = distinct !DISubprogram(name: "copyto!;", linkageName: "copyto!", scope: !91, file: !91, type: !35, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !0)
!130 = !DILocation(line: 925, scope: !129, inlinedAt: !89)
!131 = !{i64 16}
!132 = !{i64 8}
!133 = !DILocation(line: 529, scope: !116, inlinedAt: !81)
!134 = !DILocation(line: 751, scope: !135, inlinedAt: !137)
!135 = distinct !DISubprogram(name: "objectid;", linkageName: "objectid", scope: !136, file: !136, type: !35, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !0)
!136 = !DIFile(filename: "reflection.jl", directory: ".")
!137 = !DILocation(line: 1612, scope: !138, inlinedAt: !139)
!138 = distinct !DISubprogram(name: "dataids;", linkageName: "dataids", scope: !38, file: !38, type: !35, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !0)
!139 = !DILocation(line: 1589, scope: !140, inlinedAt: !141)
!140 = distinct !DISubprogram(name: "mightalias;", linkageName: "mightalias", scope: !38, file: !38, type: !35, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !0)
!141 = !DILocation(line: 1554, scope: !142, inlinedAt: !121)
!142 = distinct !DISubprogram(name: "unalias;", linkageName: "unalias", scope: !38, file: !38, type: !35, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !0)
!143 = !DILocation(line: 639, scope: !59, inlinedAt: !144)
!144 = !DILocation(line: 313, scope: !64, inlinedAt: !145)
!145 = !DILocation(line: 1596, scope: !146, inlinedAt: !139)
!146 = distinct !DISubprogram(name: "_isdisjoint;", linkageName: "_isdisjoint", scope: !38, file: !38, type: !35, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !0)
!147 = !DILocation(line: 30, scope: !33, inlinedAt: !148)
!148 = !DILocation(line: 98, scope: !37, inlinedAt: !149)
!149 = !DILocation(line: 598, scope: !150, inlinedAt: !151)
!150 = distinct !DISubprogram(name: "newindexer;", linkageName: "newindexer", scope: !91, file: !91, type: !35, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !0)
!151 = !DILocation(line: 645, scope: !152, inlinedAt: !123)
!152 = distinct !DISubprogram(name: "extrude;", linkageName: "extrude", scope: !91, file: !91, type: !35, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !0)
!153 = !DILocation(line: 639, scope: !59, inlinedAt: !154)
!154 = !DILocation(line: 313, scope: !64, inlinedAt: !155)
!155 = !DILocation(line: 604, scope: !156, inlinedAt: !157)
!156 = distinct !DISubprogram(name: "_newindexer;", linkageName: "_newindexer", scope: !91, file: !91, type: !35, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !0)
!157 = !DILocation(line: 599, scope: !158, inlinedAt: !149)
!158 = distinct !DISubprogram(name: "shapeindexer;", linkageName: "shapeindexer", scope: !91, file: !91, type: !35, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !0)
!159 = !DILocation(line: 946, scope: !122, inlinedAt: !160)
!160 = !DILocation(line: 953, scope: !124, inlinedAt: !161)
!161 = !DILocation(line: 956, scope: !126, inlinedAt: !125)
!162 = !DILocation(line: 1589, scope: !140, inlinedAt: !163)
!163 = !DILocation(line: 1554, scope: !142, inlinedAt: !159)
!164 = !DILocation(line: 751, scope: !135, inlinedAt: !165)
!165 = !DILocation(line: 1612, scope: !138, inlinedAt: !162)
!166 = !DILocation(line: 639, scope: !59, inlinedAt: !167)
!167 = !DILocation(line: 313, scope: !64, inlinedAt: !168)
!168 = !DILocation(line: 1596, scope: !146, inlinedAt: !162)
!169 = !DILocation(line: 30, scope: !33, inlinedAt: !170)
!170 = !DILocation(line: 98, scope: !37, inlinedAt: !171)
!171 = !DILocation(line: 598, scope: !150, inlinedAt: !172)
!172 = !DILocation(line: 645, scope: !152, inlinedAt: !160)
!173 = !DILocation(line: 72, scope: !174, inlinedAt: !176)
!174 = distinct !DISubprogram(name: "macro expansion;", linkageName: "macro expansion", scope: !175, file: !175, type: !35, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !0)
!175 = !DIFile(filename: "simdloop.jl", directory: ".")
!176 = !DILocation(line: 972, scope: !129, inlinedAt: !130)
!177 = !DILocation(line: 639, scope: !59, inlinedAt: !178)
!178 = !DILocation(line: 313, scope: !64, inlinedAt: !179)
!179 = !DILocation(line: 604, scope: !156, inlinedAt: !180)
!180 = !DILocation(line: 599, scope: !158, inlinedAt: !171)
!181 = !{!182, !182, i64 0}
!182 = !{!"jtbaa_memorylen", !183, i64 0}
!183 = !{!"jtbaa_array", !27, i64 0}
!184 = !{i64 0, i64 576460752303423487}
!185 = !{!57}
!186 = !{!55, !53, !56, !51}
!187 = !DILocation(line: 773, scope: !188, inlinedAt: !190)
!188 = distinct !DISubprogram(name: "ifelse;", linkageName: "ifelse", scope: !189, file: !189, type: !35, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !0)
!189 = !DIFile(filename: "essentials.jl", directory: ".")
!190 = !DILocation(line: 588, scope: !191, inlinedAt: !192)
!191 = distinct !DISubprogram(name: "newindex;", linkageName: "newindex", scope: !91, file: !91, type: !35, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !0)
!192 = !DILocation(line: 644, scope: !193, inlinedAt: !194)
!193 = distinct !DISubprogram(name: "_broadcast_getindex;", linkageName: "_broadcast_getindex", scope: !91, file: !91, type: !35, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !0)
!194 = !DILocation(line: 674, scope: !195, inlinedAt: !196)
!195 = distinct !DISubprogram(name: "_getindex;", linkageName: "_getindex", scope: !91, file: !91, type: !35, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !0)
!196 = !DILocation(line: 650, scope: !193, inlinedAt: !197)
!197 = !DILocation(line: 610, scope: !198, inlinedAt: !199)
!198 = distinct !DISubprogram(name: "getindex;", linkageName: "getindex", scope: !91, file: !91, type: !35, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !0)
!199 = !DILocation(line: 973, scope: !200, inlinedAt: !201)
!200 = distinct !DISubprogram(name: "macro expansion;", linkageName: "macro expansion", scope: !91, file: !91, type: !35, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !0)
!201 = !DILocation(line: 77, scope: !174, inlinedAt: !176)
!202 = !DILocation(line: 364, scope: !203, inlinedAt: !204)
!203 = distinct !DISubprogram(name: "getindex;", linkageName: "getindex", scope: !189, file: !189, type: !35, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !0)
!204 = !DILocation(line: 27, scope: !205, inlinedAt: !192)
!205 = distinct !DISubprogram(name: "getindex;", linkageName: "getindex", scope: !34, file: !34, type: !35, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !0)
!206 = !DILocation(line: 773, scope: !188, inlinedAt: !207)
!207 = !DILocation(line: 588, scope: !191, inlinedAt: !208)
!208 = !DILocation(line: 644, scope: !193, inlinedAt: !209)
!209 = !DILocation(line: 675, scope: !195, inlinedAt: !194)
!210 = !DILocation(line: 87, scope: !211, inlinedAt: !212)
!211 = distinct !DISubprogram(name: "+;", linkageName: "+", scope: !69, file: !69, type: !35, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !0)
!212 = !DILocation(line: 54, scope: !213, inlinedAt: !214)
!213 = distinct !DISubprogram(name: "simd_index;", linkageName: "simd_index", scope: !175, file: !175, type: !35, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !0)
!214 = !DILocation(line: 76, scope: !174, inlinedAt: !176)
!215 = !{!216, !216, i64 0}
!216 = !{!"jtbaa_arraybuf", !101, i64 0}
!217 = !DILocation(line: 364, scope: !203, inlinedAt: !218)
!218 = !DILocation(line: 27, scope: !205, inlinedAt: !208)
!219 = !DILocation(line: 678, scope: !220, inlinedAt: !221)
!220 = distinct !DISubprogram(name: "_broadcast_getindex_evalf;", linkageName: "_broadcast_getindex_evalf", scope: !91, file: !91, type: !35, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !0)
!221 = !DILocation(line: 651, scope: !193, inlinedAt: !197)
!222 = !DILocation(line: 212, scope: !223, inlinedAt: !225)
!223 = distinct !DISubprogram(name: "setindex!;", linkageName: "setindex!", scope: !224, file: !224, type: !35, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !0)
!224 = !DIFile(filename: "genericmemory.jl", directory: ".")
!225 = !DILocation(line: 28, scope: !226, inlinedAt: !199)
!226 = distinct !DISubprogram(name: "setindex!;", linkageName: "setindex!", scope: !34, file: !34, type: !35, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !0)
!227 = !DILocation(line: 213, scope: !223, inlinedAt: !225)
!228 = !{!229, !229, i64 0}
!229 = !{!"jtbaa_stack", !27, i64 0}
!230 = !{!53}
!231 = !{!55, !56, !57, !51}
!232 = !{i64 16, i64 0}
!233 = !{!"branch_weights", i32 1, i32 9}
!234 = !DILocation(line: 83, scope: !68, inlinedAt: !235)
!235 = !DILocation(line: 75, scope: !174, inlinedAt: !176)
!236 = distinct !{!236}
!237 = !DILocation(line: 479, scope: !44, inlinedAt: !238)
!238 = !DILocation(line: 355, scope: !47, inlinedAt: !239)
!239 = !DILocation(line: 98, scope: !37, inlinedAt: !240)
!240 = !DILocation(line: 497, scope: !241, inlinedAt: !242)
!241 = distinct !DISubprogram(name: "combine_axes;", linkageName: "combine_axes", scope: !91, file: !91, type: !35, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !0)
!242 = !DILocation(line: 240, scope: !243, inlinedAt: !244)
!243 = distinct !DISubprogram(name: "_axes;", linkageName: "_axes", scope: !91, file: !91, type: !35, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !0)
!244 = !DILocation(line: 238, scope: !245, inlinedAt: !246)
!245 = distinct !DISubprogram(name: "axes;", linkageName: "axes", scope: !91, file: !91, type: !35, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !0)
!246 = !DILocation(line: 862, scope: !95, inlinedAt: !96)
!247 = !DILocation(line: 639, scope: !59, inlinedAt: !248)
!248 = !DILocation(line: 1128, scope: !62, inlinedAt: !249)
!249 = !DILocation(line: 530, scope: !250, inlinedAt: !251)
!250 = distinct !DISubprogram(name: "_bcsm;", linkageName: "_bcsm", scope: !91, file: !91, type: !35, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !0)
!251 = !DILocation(line: 528, scope: !252, inlinedAt: !253)
!252 = distinct !DISubprogram(name: "_bcs1;", linkageName: "_bcs1", scope: !91, file: !91, type: !35, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !0)
!253 = !DILocation(line: 522, scope: !254, inlinedAt: !255)
!254 = distinct !DISubprogram(name: "_bcs;", linkageName: "_bcs", scope: !91, file: !91, type: !35, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !0)
!255 = !DILocation(line: 516, scope: !256, inlinedAt: !240)
!256 = distinct !DISubprogram(name: "broadcast_shape;", linkageName: "broadcast_shape", scope: !91, file: !91, type: !35, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !0)
!257 = !DILocation(line: 41, scope: !258, inlinedAt: !251)
!258 = distinct !DISubprogram(name: "LazyString;", linkageName: "LazyString", scope: !259, file: !259, type: !35, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !0)
!259 = !DIFile(filename: "strings/lazy.jl", directory: ".")
!260 = !{!261, !261, i64 0}
!261 = !{!"jtbaa_mutab", !104, i64 0}
!262 = distinct !{!262, !263, !264, !265, !266}
!263 = !{!"llvm.loop.unroll.disable"}
!264 = !{!"llvm.loop.vectorize.enable", i1 false}
!265 = !{!"llvm.loop.licm_versioning.disable"}
!266 = !{!"llvm.loop.distribute.enable", i1 false}
!267 = distinct !{!267, !263, !264, !265, !266}
!268 = !{i64 56}
!269 = !{!53, !56}
!270 = !{!55, !57, !51}

this is the bad IR. From an rr trace I deduced that the 16th slot is where we get a corrupted value.

I haven't figured out just yet as to why, but
store ptr %.unpack.postloop, ptr %gc_slot_addr16, align 16 is the store into the gc frame, and it's the buffer pointer of an array, specifically the buffer of the arry we strop in the gc frame just below.

I haven't followed the IR just yet to figure out why we decided to do this store.
Also given that we know what function is doing it might be worth to try and reduce it.
I've had success with calling the reproducer and then running a GC, that is because this doesn't cause memory corruption unless we run a GC while having the badly codegenned function in a frame above.

@gbaraldi
Copy link
Member

gbaraldi commented May 2, 2024

I've minimized this a bit further with

@inline function mybroadcast_preserving_zero_d(f, As...)
           bc = Base.broadcasted(f, As...)
           r = Base.materialize(bc)
           GC.gc()
           return length(axes(bc)) == 0 ? fill!(similar(bc, typeof(r)), r) : r
       end

function myplus(A::AbstractArray, B::AbstractArray)
           Base.promote_shape(A, B)
           mybroadcast_preserving_zero_d(+, A, B)
       end
myplus(data[1],data[2])

instead of the loop

gbaraldi added a commit that referenced this issue May 3, 2024
…ived Pointer (#54335)

Fixes #54266, I've not yet
minimized something to put into a test but in any case we can add the
large test since it executes quite quickly.

This also enables IR verification with `Strong=true` when building with
assertions, this would've caught this bug much earlier.
KristofferC pushed a commit that referenced this issue May 6, 2024
…ived Pointer (#54335)

Fixes #54266, I've not yet
minimized something to put into a test but in any case we can add the
large test since it executes quite quickly.

This also enables IR verification with `Strong=true` when building with
assertions, this would've caught this bug much earlier.

(cherry picked from commit 9d59ecc)
lazarusA pushed a commit to lazarusA/julia that referenced this issue Jul 12, 2024
…ived Pointer (JuliaLang#54335)

Fixes JuliaLang#54266, I've not yet
minimized something to put into a test but in any case we can add the
large test since it executes quite quickly.

This also enables IR verification with `Strong=true` when building with
assertions, this would've caught this bug much earlier.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
kind:bug Indicates an unexpected problem or unintended behavior kind:rr trace included
Projects
None yet
Development

Successfully merging a pull request may close this issue.

4 participants