EnzymeAD / Enzyme.jl

Julia bindings for the Enzyme automatic differentiator
https://enzyme.mit.edu
MIT License
437 stars 62 forks source link

Differentiating FFTW fftshift #1652

Closed trostelm closed 1 month ago

trostelm commented 1 month ago

Not sure how to understand this error. This occurs when I use FFTW's fftshift to compute the cost function to be differentiated.

`Enzyme execution failed. Enzyme: The original primal code hits this error condition, thus differentiating it does not make sense Stacktrace: [1] multiple call sites @ unknown:0

Stacktrace: [1] throwerr(cstr::Cstring) @ Enzyme.Compiler ~/.julia/packages/Enzyme/Pljwm/src/compiler.jl:1678 `

wsmoses commented 1 month ago

Can you paste the whole code to reproduce and error log?

trostelm commented 1 month ago

Certainly! Here is a simplified version of the full code that produces the error:

using Enzyme, Pkg, UnPack, Plots, HDF5, LinearAlgebra, LineSearches, DSP, Optim, FFTW, SignalAnalysis, Statistics, Random, LaTeXStrings

Xd = ones(4,200000)
t = range(start=5,step=0.005,length=200000)
dt_data = 0.005
N_t_data = Int(500/dt_data)
X_1011 = transpose(Xd[:, 1:N_t_data])
ts = range(; start=0, step = dt_data, length=N_t_data)
ts = ts*2

# Y variables parameterization

function U_det(Xk, b0, b1, b2, b3)
    U = b0 + b1*Xk + b2/10.0*Xk^2 + b3/100.0*Xk^3
    return U
end

function U_p(Xk, b0, b1, b2, b3, e_tk)
    U = U_det(Xk, b0, b1, b2, b3) + e_tk
    return U
end

# dX rhs
function dXrhs(k, X, b0, b1, b2, b3, e_t)
    dXk = - X[k - 1] * (X[k - 2] - X[k + 1]) - X[k] + F - U_p(X[k], b0, b1, b2, b3, e_t[k])
    return dXk
end

# Euler step
function euler_step(model_struct)

    @unpack N_t, dt, K, h, F, b, c, b0, b1, b2, b3, phi, sig0, sig1, X, dX, dXm1, dXm2, e_t, e_tm1, sig_e_t, sig_e_tm1,  X_array  = model_struct

    # Compute derivatives
    dX[1] = - X[K] * (X[K - 1] - X[2]) - X[1] + F - U_p(X[1], b0, b1, b2, b3, e_t[1])
    dX[2] = - X[1] * (X[K] - X[3]) - X[2] + F - U_p(X[2], b0, b1, b2, b3, e_t[2])
    dX[K] = - X[K - 1] * (X[K - 2] - X[1]) - X[K] + F - U_p(X[K], b0, b1, b2, b3, e_t[K])

    # Update X
    X[1] += dt * dX[1]
    X[2] += dt * dX[2]
    X[K] += dt * dX[3]
    for k = 3:K-1
        dX[k] = dXrhs(k, X, b0, b1, b2, b3, e_t)
        X[k] += dt * dX[k]
    end

    # Update dXs
    dXm1[:] = dX[:]
    dXm2[:] = dXm1[:]

    @pack! model_struct = X, dX, dXm1, dXm2

    return nothing
end

# AB-3 rhs
function adams_bashforth3(x, dt, dx, dxm1, dxm2)
    rhs = x + dt * ((23/12) * dx 
            - (16/12) * dxm1
            + (5/12) * dxm2)
    return rhs
end

# AB-3 step
function ab3_step(model_struct)

    @unpack N_t, dt, K, h, F, b, c, b0, b1, b2, b3, phi, sig0, sig1, X, dX, dXm1, dXm2, e_t, e_tm1, sig_e_t, sig_e_tm1, X_array  = model_struct

    # Compute derivatives
    dX[1] = - X[K] * (X[K - 1] - X[2]) - X[1] + F - U_p(X[1], b0, b1, b2, b3, e_t[1])
    dX[2] = - X[1] * (X[K] - X[3]) - X[2] + F - U_p(X[2], b0, b1, b2, b3, e_t[2])
    dX[K] = - X[K - 1] * (X[K - 2] - X[1]) - X[K] + F - U_p(X[K], b0, b1, b2, b3, e_t[K])

    # Update X
    X[1] = adams_bashforth3(X[1], dt, dX[1], dXm1[1], dXm2[1])
    X[2] = adams_bashforth3(X[2], dt, dX[2], dXm1[2], dXm2[2])
    X[K] = adams_bashforth3(X[K], dt, dX[K], dXm1[K], dXm2[K])
    for k = 3:K-1
        dX[k] = dXrhs(k, X, b0, b1, b2, b3, e_t)
        X[k] = adams_bashforth3(X[k], dt, dX[k], dXm1[k], dXm2[k])
    end

    # Update dXs
    dXm1[:] = dX[:]
    dXm2[:] = dXm1[:]

    @pack! model_struct = X, dX, dXm1, dXm2

    return nothing
end

# AR(1) process
function AR1(model_struct)

    @unpack N_t, dt, K, h, F, b, c, b0, b1, b2, b3, phi, sig0, sig1, X, dX, dXm1, dXm2, e_t, e_tm1, sig_e_t, sig_e_tm1, X_array  = model_struct

    for k = 1:K
        sig_e_t[k] = sig1*abs(X[k]) + sig0
        e_t[k] = sig_e_t[k]*(1-10^(-phi))*e_tm1[k]/sig_e_tm1[k] + sig_e_t[k]*sqrt(1 - (1-10^(-phi))^2)*randn()
    end
    # Update e_t, sig_e_t
    e_tm1[:] = e_t[:]
    sig_e_tm1[:] = sig_e_t[:]

    @pack! model_struct = e_t, e_tm1, sig_e_t, sig_e_tm1

    return nothing
end

mutable struct cost
    # Model set-up parameters
    N_t::Int64
    dt::Float64
    K::Int64
    h::Float64
    F::Float64
    b::Float64
    c::Float64

    # Forecast control parameters
    b0::Float64
    b1::Float64
    b2::Float64
    b3::Float64
    phi::Float64
    sig0::Float64
    sig1::Float64

    # Variables
    X::Vector{Float64}
    dX::Vector{Float64}
    dXm1::Vector{Float64}
    dXm2::Vector{Float64}

    # Random
    e_t::Vector{Float64}
    e_tm1::Vector{Float64}
    sig_e_t::Vector{Float64}
    sig_e_tm1::Vector{Float64}

    # Data in time array
    X_array::Matrix{Float64}

    # Data
    data::Matrix{Float64}
    step_factor::Int64

    # Objective function
    J0::Float64
end

function init_cost(N_t, dt, K, h, F, b, c, b0, b1, b2, b3, phi, sig0, sig1, X, data, step_factor, J0)
    # Memory allocation
    dX = zeros(Float64, K)
    dXm1 = zeros(Float64, K)
    dXm2 = zeros(Float64, K)
    e_t = zeros(Float64, K)
    e_tm1 = zeros(Float64, K)
    sig_e_t = zeros(Float64, K) .+ sig0
    sig_e_tm1 = zeros(Float64, K) .+ sig0
    X_array = zeros(Float64, K, N_t+1)

    # Construct initial L96 object
    J0_L96 = cost(N_t, dt, K, h, F, b, c, b0, b1, b2, b3, phi, sig0, sig1, X, dX, dXm1, dXm2, 
                    e_t, e_tm1, sig_e_t, sig_e_tm1, X_array, data, step_factor, J0)

    # Set intial conditions in X_array
    J0_L96.X_array[:, 1] = J0_L96.X[:]

    return J0_L96
end

function forward_model_cost(model_struct)
    @unpack N_t, dt, K, h, F, b, c, b0, b1, b2, b3, phi, sig0, sig1, X, dX,
            dXm1, dXm2, e_t, e_tm1, sig_e_t, sig_e_tm1, X_array, data, step_factor, J0 = model_struct

    js = 1:step_factor:N_t

    for i in 1:2
        AR1(model_struct)
        euler_step(model_struct)
        X_array[:, i+1] = X[:]
    end

    for i in 2:N_t
        AR1(model_struct)
        ab3_step(model_struct)
        X_array[:, i+1] = X[:]
    end

    model_signal = X_array[2,1:5:N_t].-mean(X_array[2,1:5:N_t])
    data_signal = data[2,:].-mean(data[2,:])

    ff = fftshift(fft(model_signal))[1321:1681]
    ffd = fftshift(fft(data_signal))[1321:1681]

    f = log10.(abs2.(ff))
    fd = log10.(abs2.(ffd))
    misfit = f .- fd

    J0 = J0 + dot(misfit, misfit)

    @pack! model_struct = X_array, J0
    return J0
end

# Data parameter
step_factor = 5

# Model parameters
N_t = 500000
dt = 0.001
K = 4
h = 5.
F = 20.
b = 25.
c = 25.
b0 = 5.4
b1 = 4.4
b2 = -4.3
b3 = 1.2
phi = 0.19
sig0 = 1.5
sig1 = 1.1

X = copy(Xd[:,1])

const data = X_1011'

# Initial conditions
J0 = 0.0
function adjoint_J0(model_struct)
    @unpack N_t, dt, K = model_struct
    @unpack data, step_factor, J0 = model_struct
    adjoint_vars = init_cost(
    N_t, dt,
    K, h, F, b, c,
    b0, b1, b2, b3, phi, sig0, sig1,
    zeros(Float64, K),
    zeros(Float64, K, N_t+1), step_factor, 0.0)

    autodiff(Reverse, forward_model_cost, Duplicated(model_struct, adjoint_vars))

    return adjoint_vars
end

J0_model = init_cost(N_t, dt, K, h, F, b, c, b0, b1, b2, b3, phi, sig0, sig1, X, data,
                    step_factor, J0)

J0_for_adjoint = init_cost(N_t, dt, K, phi, sig0, sig1, h, F, b, c, b0, b1, b2, b3, X, data,
                    step_factor, J0)

forward_model_cost(J0_model)
J0_adj = adjoint_J0(J0_for_adjoint)
print(J0_adj.b0)

The error it produces is:

ERROR: LoadError: Enzyme execution failed.
Enzyme: The original primal code hits this error condition, thus differentiating it does not make sense
Stacktrace:
 [1] multiple call sites
   @ unknown:0

Stacktrace:
 [1] throwerr(cstr::Cstring)
   @ Enzyme.Compiler ~/.julia/packages/Enzyme/Pljwm/src/compiler.jl:1678
in expression starting at /Users/trostel/Desktop/lorenz_june24/test.jl:259

The code runs fine (no errors) if the following block is removed:

    ff = fftshift(fft(model_signal))[1321:1681]
    ffd = fftshift(fft(data_signal))[1321:1681]

    f = log10.(abs2.(ff))
    fd = log10.(abs2.(ffd))
    misfit = f .- fd

    J0 = J0 + dot(misfit, misfit)

I'm not sure how to produce the error log you might be looking for. Apologies for the length of the code and my unfamiliarity with the error log -- I can probably come up with a simpler example to produce this error if needed.

wsmoses commented 1 month ago

@trostelm can you share the "data.h5" file, or update the code to not need it [e.g. make it use zeros or an appropriate size or something]

trostelm commented 1 month ago

Of course, I've updated the code above. Thanks!!

roflmaostc commented 1 month ago

I believe the problem is not fftshift as this runs correctly:

# ╔═╡ 964afc32-481e-11ef-0ce7-ddc5430a25d2
using Enzyme

# ╔═╡ 477e8d70-716c-4b7c-90d6-4e1f6fab6d5a
using FFTW

# ╔═╡ e87d8cd9-ea20-4727-8960-3c3aa7983c5b
using Zygote

# ╔═╡ 1eb7c19c-7ff4-402b-beb6-0df22e28f9de
fftest(x) = sum(abs2, x.^2 .- fftshift(x))

# ╔═╡ 3d8f7184-0f5f-4d19-9aac-81038ff269fa
ll = [1.0,2.0, 3.0, 4.0, 5.0]

# ╔═╡ 294b28b5-2cce-4bfb-8d1a-b9a3809bfc03
dll = make_zero(ll)

# ╔═╡ b0d7a3bb-c87d-43d0-b8ff-0d00ec0927af
Enzyme.autodiff(Enzyme.ReverseWithPrimal, fftest, Duplicated(ll, dll))

# ╔═╡ 16bea1a4-c6a5-441a-baa2-31b0127e1a85
dll

# ╔═╡ 218eb198-015b-4f35-bea5-1ccae095dda7
Zygote.gradient(fftest, ll)

Screenshot_2024-07-25_16-26-20

wsmoses commented 1 month ago
using Enzyme, UnPack, LinearAlgebra, Random

Xd = ones(4,200000)
t = range(start=5,step=0.005,length=200000)
dt_data = 0.005
N_t_data = Int(500/dt_data)
X_1011 = transpose(Xd[:, 1:N_t_data])
ts = range(; start=0, step = dt_data, length=N_t_data)
ts = ts*2

# Y variables parameterization

function U_det(Xk, b0, b1, b2, b3)
    U = b0 + b1*Xk + b2/10.0*Xk^2 + b3/100.0*Xk^3
    return U
end

function U_p(Xk, b0, b1, b2, b3, e_tk)
    U = U_det(Xk, b0, b1, b2, b3) + e_tk
    return U
end

# dX rhs
function dXrhs(k, X, b0, b1, b2, b3, e_t)
    dXk = - X[k - 1] * (X[k - 2] - X[k + 1]) - X[k] + F - U_p(X[k], b0, b1, b2, b3, e_t[k])
    return dXk
end

# Euler step
function euler_step(model_struct)

    @unpack N_t, dt, K, h, F, b, c, b0, b1, b2, b3, phi, sig0, sig1, X, dX, dXm1, dXm2, e_t, e_tm1, sig_e_t, sig_e_tm1,  X_array  = model_struct

    # Compute derivatives
    dX[1] = - X[K] * (X[K - 1] - X[2]) - X[1] + F - U_p(X[1], b0, b1, b2, b3, e_t[1])
    dX[2] = - X[1] * (X[K] - X[3]) - X[2] + F - U_p(X[2], b0, b1, b2, b3, e_t[2])
    dX[K] = - X[K - 1] * (X[K - 2] - X[1]) - X[K] + F - U_p(X[K], b0, b1, b2, b3, e_t[K])

    # Update X
    X[1] += dt * dX[1]
    X[2] += dt * dX[2]
    X[K] += dt * dX[3]
    for k = 3:K-1
        dX[k] = dXrhs(k, X, b0, b1, b2, b3, e_t)
        X[k] += dt * dX[k]
    end

    # Update dXs
    dXm1[:] = dX[:]
    dXm2[:] = dXm1[:]

    return nothing
end

# AB-3 rhs
function adams_bashforth3(x, dt, dx, dxm1, dxm2)
    rhs = x + dt * ((23/12) * dx 
            - (16/12) * dxm1
            + (5/12) * dxm2)
    return rhs
end

# AB-3 step
function ab3_step(model_struct)

    @unpack N_t, dt, K, h, F, b, c, b0, b1, b2, b3, phi, sig0, sig1, X, dX, dXm1, dXm2, e_t, e_tm1, sig_e_t, sig_e_tm1, X_array  = model_struct

    # Compute derivatives
    dX[1] = - X[K] * (X[K - 1] - X[2]) - X[1] + F - U_p(X[1], b0, b1, b2, b3, e_t[1])

    # Update X
    X[1] = dX[1]

    return nothing
end

mutable struct cost
    # Model set-up parameters
    N_t::Int64
    dt::Float64
    K::Int64
    h::Float64
    F::Float64
    b::Float64
    c::Float64

    # Forecast control parameters
    b0::Float64
    b1::Float64
    b2::Float64
    b3::Float64
    phi::Float64
    sig0::Float64
    sig1::Float64

    # Variables
    X::Vector{Float64}
    dX::Vector{Float64}
    dXm1::Vector{Float64}
    dXm2::Vector{Float64}

    # Random
    e_t::Vector{Float64}
    e_tm1::Vector{Float64}
    sig_e_t::Vector{Float64}
    sig_e_tm1::Vector{Float64}

    # Data in time array
    X_array::Matrix{Float64}

    # Data
    data::Matrix{Float64}
    step_factor::Int64

    # Objective function
    J0::Float64
end

function init_cost(N_t, dt, K, h, F, b, c, b0, b1, b2, b3, phi, sig0, sig1, X, data, step_factor, J0)
    # Memory allocation
    dX = zeros(Float64, K)
    dXm1 = zeros(Float64, K)
    dXm2 = zeros(Float64, K)
    e_t = zeros(Float64, K)
    e_tm1 = zeros(Float64, K)
    sig_e_t = zeros(Float64, K) .+ sig0
    sig_e_tm1 = zeros(Float64, K) .+ sig0
    X_array = zeros(Float64, K, N_t+1)

    # Construct initial L96 object
    J0_L96 = cost(N_t, dt, K, h, F, b, c, b0, b1, b2, b3, phi, sig0, sig1, X, dX, dXm1, dXm2, 
                    e_t, e_tm1, sig_e_t, sig_e_tm1, X_array, data, step_factor, J0)

    # Set intial conditions in X_array
    J0_L96.X_array[:, 1] = J0_L96.X[:]

    return J0_L96
end

function forward_model_cost(model_struct)    
    for i in 1:2
        euler_step(model_struct)
    end

    for i in 2:model_struct.N_t
        ab3_step(model_struct)
    end

    ff = model_struct.X

    return dot(ff, ff)
end

# Data parameter
step_factor = 5

# Model parameters
N_t = 500000
dt = 0.001
K = 4
h = 5.
F = 20.
b = 25.
c = 25.
b0 = 5.4
b1 = 4.4
b2 = -4.3
b3 = 1.2
phi = 0.19
sig0 = 1.5
sig1 = 1.1

X = copy(Xd[:,1])

const data = X_1011'

# Initial conditions
J0 = 0.0
function adjoint_J0(model_struct)
    @unpack N_t, dt, K = model_struct
    @unpack data, step_factor, J0 = model_struct
    adjoint_vars = init_cost(
    N_t, dt,
    K, h, F, b, c,
    b0, b1, b2, b3, phi, sig0, sig1,
    zeros(Float64, K),
    zeros(Float64, K, N_t+1), step_factor, 0.0)

    autodiff(Reverse, forward_model_cost, Duplicated(model_struct, adjoint_vars))

    return adjoint_vars
end

J0_model = init_cost(N_t, dt, K, h, F, b, c, b0, b1, b2, b3, phi, sig0, sig1, X, data,
                    step_factor, J0)

J0_for_adjoint = init_cost(N_t, dt, K, phi, sig0, sig1, h, F, b, c, b0, b1, b2, b3, X, data,
                    step_factor, J0)

forward_model_cost(J0_model)
J0_adj = adjoint_J0(J0_for_adjoint)
print(J0_adj.b0)
wsmoses commented 1 month ago
using Enzyme, LinearAlgebra, Random

Enzyme.API.printall!(true)
Enzyme.Compiler.DumpPostOpt[] = true

# Y variables parameterization

function U_det(Xk, b0, b1, b2, b3)
    U = b2 + Xk + b3 + Xk
    return U
end

function U_p(Xk, b0, b1, b2, b3, e_tk)
    U = U_det(Xk, b0, b1, b2, b3)
    return U
end

function euler_step(model_struct)
    X = model_struct.X
    dX = model_struct.dX
    dXm1 = model_struct.dXm1

    @inbounds X[1] = 0.1 * @inbounds dX[1]

    for k = 3:3
        X[k] += X[k] + F 
    end

    # Update dXs
    @inbounds dXm1[:] = dX[:]

    return nothing
end

# AB-3 step
function ab3_step(model_struct)
    b2 = model_struct.b2
    b3 = model_struct.b3
    e_t = model_struct.e_t
    dX = model_struct.dX
    X = model_struct.X
    # Compute derivatives
    X1 = @inbounds X[1]
    X2 = @inbounds X[2]
    e1 = @inbounds e_t[1]
    @inbounds dX[1] = X2 * X2 + F - U_p(X1, 1.0, 1.0, b2, b3, e1)

    # Update X
    @inbounds X[1] = @inbounds dX[1]

    return nothing
end

mutable struct cost
    # Forecast control parameters
    b2::Float64
    b3::Float64

    # Variables
    X::Vector{Float64}
    dX::Vector{Float64}
    dXm1::Vector{Float64}

    # Random
    e_t::Vector{Float64}

    # Data in time array
    X_array::Matrix{Float64}

end

function init_cost(N_t, K, b2, b3, X)
    # Memory allocation
    dX = zeros(Float64, K)
    dXm1 = zeros(Float64, K)
    e_t = zeros(Float64, K)
    X_array = zeros(Float64, K, N_t+1)

    # Construct initial L96 object
    J0_L96 = cost(b2, b3, X, dX, dXm1, 
                  e_t, X_array)

    return J0_L96
end

function forward_model_cost(model_struct, N)    
    for i in 1:2
        euler_step(model_struct)
    end

    for i in 2:N
        ab3_step(model_struct)
    end

    ff = model_struct.X

    return @inbounds ff[1] 
end

# Model parameters
N_t = 500000
K = 4
F = 20.
b2 = -4.3
b3 = 1.2

X = ones(4)

J0_model = init_cost(N_t, K, b2, b3, X)

forward_model_cost(J0_model, N_t)

model_struct = init_cost(N_t, K, b2, b3, X)

adjoint_vars = init_cost(
N_t,
K,
b2, b3,
zeros(Float64, K))

autodiff(Reverse, forward_model_cost, Duplicated(model_struct, adjoint_vars), Const(N_t))

resulting in


[771523] signal (11.1): Segmentation fault
in expression starting at /home/wmoses/git/Enzyme.jl/fft.jl:124
gc_mark_outrefs at /home/wmoses/git/Enzyme.jl/julia10/src/gc.c:2517 [inlined]
gc_mark_loop_serial_ at /home/wmoses/git/Enzyme.jl/julia10/src/gc.c:2697
gc_mark_loop_serial at /home/wmoses/git/Enzyme.jl/julia10/src/gc.c:2720
gc_mark_loop at /home/wmoses/git/Enzyme.jl/julia10/src/gc.c:2901
_jl_gc_collect at /home/wmoses/git/Enzyme.jl/julia10/src/gc.c:3234
ijl_gc_collect at /home/wmoses/git/Enzyme.jl/julia10/src/gc.c:3531
maybe_collect at /home/wmoses/git/Enzyme.jl/julia10/src/gc.c:937
jl_gc_pool_alloc_inner at /home/wmoses/git/Enzyme.jl/julia10/src/gc.c:1300
ijl_gc_pool_alloc at /home/wmoses/git/Enzyme.jl/julia10/src/gc.c:1348
ab3_step at /home/wmoses/git/Enzyme.jl/fft.jl:48
forward_model_cost at /home/wmoses/git/Enzyme.jl/fft.jl:94 [inlined]
diffejulia_forward_model_cost_825wrap at /home/wmoses/git/Enzyme.jl/fft.jl:0
macro expansion at /home/wmoses/git/Enzyme.jl/src/compiler.jl:6819 [inlined]
enzyme_call at /home/wmoses/git/Enzyme.jl/src/compiler.jl:6419 [inlined]
CombinedAdjointThunk at /home/wmoses/git/Enzyme.jl/src/compiler.jl:6296 [inlined]
autodiff at /home/wmoses/git/Enzyme.jl/src/Enzyme.jl:314 [inlined]
autodiff at /home/wmoses/git/Enzyme.jl/src/Enzyme.jl:338 [inlined]
autodiff at /home/wmoses/git/Enzyme.jl/src/Enzyme.jl:323
unknown function (ip: 0x73999dd211de)
_jl_invoke at /home/wmoses/git/Enzyme.jl/julia10/src/gf.c:2895
ijl_apply_generic at /home/wmoses/git/Enzyme.jl/julia10/src/gf.c:3077
jl_apply at /home/wmoses/git/Enzyme.jl/julia10/src/julia.h:1982
do_call at /home/wmoses/git/Enzyme.jl/julia10/src/interpreter.c:126
eval_value at /home/wmoses/git/Enzyme.jl/julia10/src/interpreter.c:223
eval_stmt_value at /home/wmoses/git/Enzyme.jl/julia10/src/interpreter.c:174
eval_body at /home/wmoses/git/Enzyme.jl/julia10/src/interpreter.c:617
jl_interpret_toplevel_thunk at /home/wmoses/git/Enzyme.jl/julia10/src/interpreter.c:775
jl_toplevel_eval_flex at /home/wmoses/git/Enzyme.jl/julia10/src/toplevel.c:934
jl_toplevel_eval_flex at /home/wmoses/git/Enzyme.jl/julia10/src/toplevel.c:877
ijl_toplevel_eval at /home/wmoses/git/Enzyme.jl/julia10/src/toplevel.c:943
ijl_toplevel_eval_in at /home/wmoses/git/Enzyme.jl/julia10/src/toplevel.c:985
eval at ./boot.jl:385 [inlined]
include_string at ./loading.jl:2076
jl_fptr_args at /home/wmoses/git/Enzyme.jl/julia10/src/gf.c:2537
_jl_invoke at /home/wmoses/git/Enzyme.jl/julia10/src/gf.c:2876
ijl_apply_generic at /home/wmoses/git/Enzyme.jl/julia10/src/gf.c:3077
_include at ./loading.jl:2136
include at ./Base.jl:495
jfptr_include_46707 at /home/wmoses/git/Enzyme.jl/julia10/usr/lib/julia/sys-debug.so (unknown line)
_jl_invoke at /home/wmoses/git/Enzyme.jl/julia10/src/gf.c:2876
ijl_apply_generic at /home/wmoses/git/Enzyme.jl/julia10/src/gf.c:3077
exec_options at ./client.jl:318
_start at ./client.jl:552
jfptr__start_83017 at /home/wmoses/git/Enzyme.jl/julia10/usr/lib/julia/sys-debug.so (unknown line)
_jl_invoke at /home/wmoses/git/Enzyme.jl/julia10/src/gf.c:2876
ijl_apply_generic at /home/wmoses/git/Enzyme.jl/julia10/src/gf.c:3077
jl_apply at /home/wmoses/git/Enzyme.jl/julia10/src/julia.h:1982
true_main at /home/wmoses/git/Enzyme.jl/julia10/src/jlapi.c:582
jl_repl_entrypoint at /home/wmoses/git/Enzyme.jl/julia10/src/jlapi.c:731
jl_load_repl at /home/wmoses/git/Enzyme.jl/julia10/cli/loader_lib.c:568
main at /home/wmoses/git/Enzyme.jl/julia10/cli/loader_exe.c:58
unknown function (ip: 0x7399b6629d8f)
__libc_start_main at /lib/x86_64-linux-gnu/libc.so.6 (unknown line)
_start at ./julia10/julia (unknown line)
Allocations: 27268981 (Pool: 27214777; Big: 54204); GC: 30
wsmoses commented 1 month ago
using Enzyme, LinearAlgebra, Random

Enzyme.API.printall!(true)
Enzyme.Compiler.DumpPostOpt[] = true

# Y variables parameterization

function U_det(Xk, b2, b3)
    U = b2 + Xk + b3 + Xk
    return U
end

function U_p(Xk, b0, b1, b2, b3, e_tk)
    U = U_det(Xk, b2, b3)
    return U
end

function euler_step(X, dX, dXm1)

    @inbounds X[1] = 0.1 * @inbounds dX[1]

    for k = 3:3
        Xk = @inbounds X[k]
        X[k] += Xk + F 
    end

    # Update dXs
    @inbounds dXm1[:] = dX[:]

    return nothing
end

# AB-3 step
function ab3_step(X, dX, b2, b3, e1)

    # Compute derivatives
    X1 = @inbounds X[1]
    X2 = @inbounds X[2]
    @inbounds dX[1] = X2 * X2 + F - U_p(X1, 1.0, 1.0, b2, b3, e1)

    # Update X
    @inbounds X[1] = @inbounds dX[1]

    return nothing
end

function forward_model_cost(dXm1, N, b2, b3, e1, X, dX) 
    # dXm1 = model_struct.dXm1

    for i in 1:2
        euler_step(X, dX, dXm1)
    end

    for i in 2:N
        ab3_step(X, dX, b2, b3, e1)
    end

    return @inbounds X[1] 
end

# Model parameters
N_t = 500000
K = 4
F = 20.

X = ones(4)
dXm1 = zeros(Float64, K)

dX = zeros(Float64, K)

forward_model_cost(dXm1, N_t, 1.2, -4.3, 1.2, X, dX)

autodiff(Reverse,
        forward_model_cost,
        Duplicated(dXm1, zero(dXm1)),
        Const(N_t), Const(1.2), Const(-4.3), Const(1.2),
        Duplicated(X, zero(X)),
        Duplicated(dX, zero(dX))
       )
wsmoses commented 1 month ago
after simplification :
; Function Attrs: mustprogress willreturn
define "enzyme_type"="{[-1]:Float@double}" double @preprocess_julia_forward_model_cost_827({} addrspace(10)* noundef nonnull align 16 dereferenceable(40) "enzyme_type"="{[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer}" "enzymejl_parmtype"="127923554507456" "enzymejl_parmtype_ref"="2" %0, i64 signext "enzyme_inactive" "enzyme_type"="{[-1]:Integer}" "enzymejl_parmtype"="127923625262592" "enzymejl_parmtype_ref"="0" %1, double "enzyme_type"="{[-1]:Float@double}" "enzymejl_parmtype"="127923625261792" "enzymejl_parmtype_ref"="0" %2, double "enzyme_type"="{[-1]:Float@double}" "enzymejl_parmtype"="127923625261792" "enzymejl_parmtype_ref"="0" %3, double "enzyme_type"="{[-1]:Float@double}" "enzymejl_parmtype"="127923625261792" "enzymejl_parmtype_ref"="0" %4, {} addrspace(10)* noundef nonnull align 16 dereferenceable(40) "enzyme_type"="{[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer}" "enzymejl_parmtype"="127923554507456" "enzymejl_parmtype_ref"="2" %5, {} addrspace(10)* noundef nonnull align 16 dereferenceable(40) "enzyme_type"="{[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer}" "enzymejl_parmtype"="127923554507456" "enzymejl_parmtype_ref"="2" %6) local_unnamed_addr #17 !dbg !280 {
top:
  %7 = call {}*** @julia.get_pgcstack() #18
  call void @llvm.dbg.value(metadata {} addrspace(10)* null, metadata !289, metadata !DIExpression(DW_OP_deref)) #18, !dbg !290
  call void @llvm.dbg.value(metadata {} addrspace(10)* null, metadata !288, metadata !DIExpression(DW_OP_deref)) #18, !dbg !290
  call void @llvm.dbg.value(metadata {} addrspace(10)* null, metadata !283, metadata !DIExpression(DW_OP_deref)) #18, !dbg !290
  call void @llvm.dbg.value(metadata {} addrspace(10)* %0, metadata !283, metadata !DIExpression(DW_OP_deref)) #18, !dbg !290
  call void @llvm.dbg.value(metadata i64 %1, metadata !284, metadata !DIExpression()) #18, !dbg !290
  call void @llvm.dbg.value(metadata double %2, metadata !285, metadata !DIExpression()) #18, !dbg !290
  call void @llvm.dbg.value(metadata double %3, metadata !286, metadata !DIExpression()) #18, !dbg !290
  call void @llvm.dbg.value(metadata double %4, metadata !287, metadata !DIExpression()) #18, !dbg !290
  call void @llvm.dbg.value(metadata {} addrspace(10)* %5, metadata !288, metadata !DIExpression(DW_OP_deref)) #18, !dbg !290
  call void @llvm.dbg.value(metadata {} addrspace(10)* %6, metadata !289, metadata !DIExpression(DW_OP_deref)) #18, !dbg !290
  %ptls_field14 = getelementptr inbounds {}**, {}*** %7, i64 2
  %8 = bitcast {}*** %ptls_field14 to i64***
  %ptls_load1516 = load i64**, i64*** %8, align 8, !tbaa !26
  %9 = getelementptr inbounds i64*, i64** %ptls_load1516, i64 2
  %safepoint = load i64*, i64** %9, align 8, !tbaa !30
  fence syncscope("singlethread") seq_cst
  call void @julia.safepoint(i64* %safepoint) #18, !dbg !291
  fence syncscope("singlethread") seq_cst
  br label %L2, !dbg !292

L2:                                               ; preds = %L2, %top
  %iv = phi i64 [ %iv.next, %L2 ], [ 0, %top ]
  %iv.next = add nuw nsw i64 %iv, 1, !dbg !293
  call void @julia_euler_step_833({} addrspace(10)* noundef nonnull align 16 dereferenceable(40) %5, {} addrspace(10)* noundef nonnull align 16 dereferenceable(40) %6, {} addrspace(10)* noundef nonnull align 16 dereferenceable(40) %0) #18, !dbg !293
  %.not = icmp eq i64 %iv.next, 2, !dbg !294
  %10 = add nuw nsw i64 %iv.next, 1, !dbg !295
  br i1 %.not, label %L14, label %L2, !dbg !296

L14:                                              ; preds = %L2
  %11 = call i64 @llvm.smax.i64(i64 %1, i64 noundef 1) #18, !dbg !295
  %12 = icmp ult i64 %11, 2, !dbg !297
  br i1 %12, label %L41, label %L29.preheader, !dbg !301

L29.preheader:                                    ; preds = %L14
  br label %L29, !dbg !302

L29:                                              ; preds = %L29.preheader, %L29
  %iv1 = phi i64 [ 0, %L29.preheader ], [ %iv.next2, %L29 ]
  %13 = add nuw i64 %iv1, 2, !dbg !303
  %iv.next2 = add nuw nsw i64 %iv1, 1, !dbg !303
  call void @julia_ab3_step_831({} addrspace(10)* nocapture noundef nonnull readonly align 16 dereferenceable(40) %5, {} addrspace(10)* noundef nonnull align 16 dereferenceable(40) %6, double %2, double %3) #18, !dbg !303
  %.not17 = icmp eq i64 %13, %11, !dbg !304
  %14 = add nuw i64 %13, 1, !dbg !305
  br i1 %.not17, label %L41.loopexit, label %L29, !dbg !302

L41.loopexit:                                     ; preds = %L29
  br label %L41, !dbg !306

L41:                                              ; preds = %L41.loopexit, %L14
  %15 = addrspacecast {} addrspace(10)* %5 to double addrspace(13)* addrspace(11)*, !dbg !306
  %arrayptr18 = load double addrspace(13)*, double addrspace(13)* addrspace(11)* %15, align 16, !dbg !306, !tbaa !96, !alias.scope !308, !noalias !45, !nonnull !19
  %arrayref = load double, double addrspace(13)* %arrayptr18, align 8, !dbg !306, !tbaa !122, !alias.scope !125, !noalias !126
  ret double %arrayref, !dbg !307
}

after simplification :
; Function Attrs: mustprogress willreturn
define internal void @preprocess_julia_euler_step_833({} addrspace(10)* noundef nonnull align 16 dereferenceable(40) "enzyme_type"="{[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer}" "enzymejl_parmtype"="127923554507456" "enzymejl_parmtype_ref"="2" %0, {} addrspace(10)* noundef nonnull align 16 dereferenceable(40) "enzyme_type"="{[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer}" "enzymejl_parmtype"="127923554507456" "enzymejl_parmtype_ref"="2" %1, {} addrspace(10)* noundef nonnull align 16 dereferenceable(40) "enzyme_type"="{[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer}" "enzymejl_parmtype"="127923554507456" "enzymejl_parmtype_ref"="2" %2) unnamed_addr #18 !dbg !351 {
top:
  %3 = call {}*** @julia.get_pgcstack() #19
  call void @llvm.dbg.value(metadata {} addrspace(10)* null, metadata !356, metadata !DIExpression(DW_OP_deref)) #19, !dbg !357
  call void @llvm.dbg.value(metadata {} addrspace(10)* null, metadata !355, metadata !DIExpression(DW_OP_deref)) #19, !dbg !357
  call void @llvm.dbg.value(metadata {} addrspace(10)* null, metadata !354, metadata !DIExpression(DW_OP_deref)) #19, !dbg !357
  call void @llvm.dbg.value(metadata {} addrspace(10)* %0, metadata !354, metadata !DIExpression(DW_OP_deref)) #19, !dbg !357
  call void @llvm.dbg.value(metadata {} addrspace(10)* %1, metadata !355, metadata !DIExpression(DW_OP_deref)) #19, !dbg !357
  call void @llvm.dbg.value(metadata {} addrspace(10)* %2, metadata !356, metadata !DIExpression(DW_OP_deref)) #19, !dbg !357
  %ptls_field29 = getelementptr inbounds {}**, {}*** %3, i64 2
  %4 = bitcast {}*** %ptls_field29 to i64***
  %ptls_load3031 = load i64**, i64*** %4, align 8, !tbaa !26
  %5 = getelementptr inbounds i64*, i64** %ptls_load3031, i64 2
  %safepoint = load i64*, i64** %5, align 8, !tbaa !30
  fence syncscope("singlethread") seq_cst
  call void @julia.safepoint(i64* %safepoint) #19, !dbg !358
  fence syncscope("singlethread") seq_cst
  %6 = addrspacecast {} addrspace(10)* %1 to double addrspace(13)* addrspace(11)*, !dbg !359
  %arrayptr32 = load double addrspace(13)*, double addrspace(13)* addrspace(11)* %6, align 16, !dbg !359, !tbaa !96, !alias.scope !361, !noalias !45, !nonnull !19
  %arrayref = load double, double addrspace(13)* %arrayptr32, align 8, !dbg !359, !tbaa !122, !alias.scope !125, !noalias !126
  %7 = fmul double %arrayref, 1.000000e-01, !dbg !364
  %8 = addrspacecast {} addrspace(10)* %0 to { i8 addrspace(13)*, i64, i16, i16, i32 } addrspace(11)*, !dbg !365
  %9 = addrspacecast {} addrspace(10)* %0 to double addrspace(13)* addrspace(11)*, !dbg !365
  %arrayptr333 = load double addrspace(13)*, double addrspace(13)* addrspace(11)* %9, align 16, !dbg !365, !tbaa !96, !alias.scope !361, !noalias !45, !nonnull !19
  store double %7, double addrspace(13)* %arrayptr333, align 8, !dbg !365, !tbaa !122, !alias.scope !125, !noalias !366
  %arraylen_ptr = getelementptr inbounds { i8 addrspace(13)*, i64, i16, i16, i32 }, { i8 addrspace(13)*, i64, i16, i16, i32 } addrspace(11)* %8, i64 0, i32 1, !dbg !367
  %arraylen = load i64, i64 addrspace(11)* %arraylen_ptr, align 8, !dbg !367, !tbaa !38, !range !41, !alias.scope !42, !noalias !45
  %inbounds = icmp ugt i64 %arraylen, 2, !dbg !367
  br i1 %inbounds, label %idxend, label %oob, !dbg !367

L24:                                              ; preds = %idxend
  %10 = addrspacecast {} addrspace(10)* %2 to {} addrspace(11)*, !dbg !369
  %11 = call token (...) @llvm.julia.gc_preserve_begin({} addrspace(10)* nonnull %2) #19, !dbg !372
  %12 = call token (...) @llvm.julia.gc_preserve_begin({} addrspace(10)* nonnull %27) #19, !dbg !374
  %13 = call nonnull {}* @julia.pointer_from_objref({} addrspace(11)* noundef %10) #20, !dbg !375
  %14 = addrspacecast {} addrspace(10)* %27 to {} addrspace(11)*, !dbg !378
  %15 = call nonnull {}* @julia.pointer_from_objref({} addrspace(11)* %14) #20, !dbg !378
  %16 = shl i64 %arraylen14, 3, !dbg !381
  %17 = and i64 %arraylen14, 1152921504606846976, !dbg !383
  %.not34 = icmp eq i64 %17, 0, !dbg !383
  br i1 %.not34, label %L47, label %L39, !dbg !384

L39:                                              ; preds = %L24
  call void @julia_throw_inexacterror_840(i64 signext %16) #21, !dbg !384
  unreachable, !dbg !384

L47:                                              ; preds = %L24
  %18 = bitcast {}* %15 to i8**, !dbg !378
  %arrayptr20 = load i8*, i8** %18, align 8, !dbg !378, !tbaa !96, !alias.scope !42, !noalias !45, !nonnull !19
  %19 = bitcast {}* %13 to i8**, !dbg !375
  %arrayptr18 = load i8*, i8** %19, align 8, !dbg !375, !tbaa !96, !alias.scope !42, !noalias !45, !nonnull !19
  call void @llvm.memmove.p0i8.p0i8.i64(i8* nonnull align 1 %arrayptr18, i8* nonnull align 1 %arrayptr20, i64 %16, i1 noundef false) #19, !dbg !389, !noalias !390
  call void @llvm.julia.gc_preserve_end(token %12) #19, !dbg !391
  call void @llvm.julia.gc_preserve_end(token %11) #19, !dbg !392
  br label %L56, !dbg !393

L56:                                              ; preds = %idxend, %L47
  ret void, !dbg !394

oob:                                              ; preds = %top
  %errorbox = alloca i64, align 8, !dbg !367
  store i64 3, i64* %errorbox, align 8, !dbg !367, !noalias !390
  %20 = addrspacecast {} addrspace(10)* %0 to {} addrspace(12)*, !dbg !367
  call void @ijl_bounds_error_ints({} addrspace(12)* noundef %20, i64* noundef nonnull align 8 %errorbox, i64 noundef 1) #21, !dbg !367
  unreachable, !dbg !367

idxend:                                           ; preds = %top
  %21 = getelementptr inbounds double, double addrspace(13)* %arrayptr333, i64 2, !dbg !395
  %arrayref6 = load double, double addrspace(13)* %21, align 8, !dbg !395, !tbaa !122, !alias.scope !125, !noalias !126
  %current_task128 = getelementptr inbounds {}**, {}*** %3, i64 -14
  %current_task1 = bitcast {}*** %current_task128 to {}**
  %F = load atomic {} addrspace(10)*, {} addrspace(10)** inttoptr (i64 127923752824944 to {} addrspace(10)**) unordered, align 16, !dbg !368, !tbaa !174, !alias.scope !125, !noalias !126
  %box = call noalias nonnull dereferenceable(8) "enzyme_type"="{[-1]:Pointer, [-1,-1]:Float@double}" {} addrspace(10)* @julia.gc_alloc_obj({}** nonnull %current_task1, i64 noundef 8, {} addrspace(10)* noundef addrspacecast ({}* inttoptr (i64 127923625261792 to {}*) to {} addrspace(10)*)) #22, !dbg !368
  %22 = bitcast {} addrspace(10)* %box to double addrspace(10)*, !dbg !368
  store double %arrayref6, double addrspace(10)* %22, align 8, !dbg !368, !tbaa !176, !alias.scope !125, !noalias !366
  %23 = call nonnull "enzyme_type"="{[-1]:Pointer}" {} addrspace(10)* ({} addrspace(10)* ({} addrspace(10)*, {} addrspace(10)**, i32)*, {} addrspace(10)*, ...) @julia.call({} addrspace(10)* ({} addrspace(10)*, {} addrspace(10)**, i32)* noundef nonnull @ijl_apply_generic, {} addrspace(10)* noundef addrspacecast ({}* inttoptr (i64 127923559984512 to {}*) to {} addrspace(10)*), {} addrspace(10)* nofree nonnull %box, {} addrspace(10)* %F) #23, !dbg !368
  %box12 = call noalias nonnull dereferenceable(8) "enzyme_type"="{[-1]:Pointer, [-1,-1]:Float@double}" {} addrspace(10)* @julia.gc_alloc_obj({}** nonnull %current_task1, i64 noundef 8, {} addrspace(10)* noundef addrspacecast ({}* inttoptr (i64 127923625261792 to {}*) to {} addrspace(10)*)) #22, !dbg !368
  %24 = bitcast {} addrspace(10)* %box12 to double addrspace(10)*, !dbg !368
  store double %arrayref6, double addrspace(10)* %24, align 8, !dbg !368, !tbaa !176, !alias.scope !125, !noalias !366
  %25 = call nonnull "enzyme_type"="{[-1]:Pointer}" {} addrspace(10)* ({} addrspace(10)* ({} addrspace(10)*, {} addrspace(10)**, i32)*, {} addrspace(10)*, ...) @julia.call({} addrspace(10)* ({} addrspace(10)*, {} addrspace(10)**, i32)* noundef nonnull @ijl_apply_generic, {} addrspace(10)* noundef addrspacecast ({}* inttoptr (i64 127923559984512 to {}*) to {} addrspace(10)*), {} addrspace(10)* nofree nonnull %box12, {} addrspace(10)* nonnull %23) #23, !dbg !368
  %26 = call nonnull "enzyme_type"="{[-1]:Pointer}" {} addrspace(10)* ({} addrspace(10)* ({} addrspace(10)*, {} addrspace(10)**, i32)*, {} addrspace(10)*, ...) @julia.call({} addrspace(10)* ({} addrspace(10)*, {} addrspace(10)**, i32)* noundef nonnull @ijl_apply_generic, {} addrspace(10)* noundef addrspacecast ({}* inttoptr (i64 127923593314480 to {}*) to {} addrspace(10)*), {} addrspace(10)* nonnull %0, {} addrspace(10)* nonnull %25, {} addrspace(10)* addrspacecast ({}* inttoptr (i64 127923780723616 to {}*) to {} addrspace(10)*)) #23, !dbg !368
  %27 = call nonnull {} addrspace(10)* @julia_getindex_842({} addrspace(10)* noundef nonnull align 16 dereferenceable(40) %1) #19, !dbg !371
  %28 = addrspacecast {} addrspace(10)* %2 to { i8 addrspace(13)*, i64, i16, i16, i32 } addrspace(11)*, !dbg !369
  %arraylen_ptr13 = getelementptr inbounds { i8 addrspace(13)*, i64, i16, i16, i32 }, { i8 addrspace(13)*, i64, i16, i16, i32 } addrspace(11)* %28, i64 0, i32 1, !dbg !369
  %arraylen14 = load i64, i64 addrspace(11)* %arraylen_ptr13, align 8, !dbg !369, !tbaa !38, !range !41, !alias.scope !42, !noalias !45
  %.not = icmp eq i64 %arraylen14, 0, !dbg !397
  br i1 %.not, label %L56, label %L24, !dbg !399
}

after simplification :
; Function Attrs: mustprogress willreturn
define internal nonnull "enzyme_type"="{[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer}" {} addrspace(10)* @preprocess_julia_getindex_842({} addrspace(10)* noundef nonnull align 16 dereferenceable(40) "enzyme_type"="{[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer}" "enzymejl_parmtype"="127923554507456" "enzymejl_parmtype_ref"="2" %0) unnamed_addr #19 !dbg !496 {
top:
  %1 = call {}*** @julia.get_pgcstack() #20
  call void @llvm.dbg.value(metadata {} addrspace(10)* null, metadata !499, metadata !DIExpression(DW_OP_deref)) #20, !dbg !501
  call void @llvm.dbg.value(metadata {} addrspace(10)* %0, metadata !499, metadata !DIExpression(DW_OP_deref)) #20, !dbg !501
  %ptls_field7 = getelementptr inbounds {}**, {}*** %1, i64 2
  %2 = bitcast {}*** %ptls_field7 to i64***
  %ptls_load89 = load i64**, i64*** %2, align 8, !tbaa !26
  %3 = getelementptr inbounds i64*, i64** %ptls_load89, i64 2
  %safepoint = load i64*, i64** %3, align 8, !tbaa !30
  fence syncscope("singlethread") seq_cst
  call void @julia.safepoint(i64* %safepoint) #20, !dbg !502
  fence syncscope("singlethread") seq_cst
  %4 = addrspacecast {} addrspace(10)* %0 to { i8 addrspace(13)*, i64, i16, i16, i32 } addrspace(11)*, !dbg !503
  %arraylen_ptr = getelementptr inbounds { i8 addrspace(13)*, i64, i16, i16, i32 }, { i8 addrspace(13)*, i64, i16, i16, i32 } addrspace(11)* %4, i64 0, i32 1, !dbg !503
  %arraylen = load i64, i64 addrspace(11)* %arraylen_ptr, align 8, !dbg !503, !tbaa !38, !range !41, !alias.scope !42, !noalias !45
  %5 = call noalias nonnull "enzyme_type"="{[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer}" {} addrspace(10)* @ijl_alloc_array_1d({} addrspace(10)* noundef addrspacecast ({}* inttoptr (i64 127923554507456 to {}*) to {} addrspace(10)*), i64 %arraylen) #21, !dbg !505
  %.not = icmp eq i64 %arraylen, 0, !dbg !508
  br i1 %.not, label %L36, label %L5, !dbg !510

L5:                                               ; preds = %top
  %6 = addrspacecast {} addrspace(10)* %0 to {} addrspace(11)*, !dbg !503
  %7 = call token (...) @llvm.julia.gc_preserve_begin({} addrspace(10)* nonnull %5) #20, !dbg !511
  %8 = call token (...) @llvm.julia.gc_preserve_begin({} addrspace(10)* nonnull %0) #20, !dbg !513
  %9 = addrspacecast {} addrspace(10)* %5 to {} addrspace(11)*, !dbg !514
  %10 = call nonnull {}* @julia.pointer_from_objref({} addrspace(11)* %9) #22, !dbg !514
  %11 = call nonnull {}* @julia.pointer_from_objref({} addrspace(11)* noundef %6) #22, !dbg !517
  %12 = shl i64 %arraylen, 3, !dbg !520
  %13 = and i64 %arraylen, 1152921504606846976, !dbg !522
  %.not10 = icmp eq i64 %13, 0, !dbg !522
  br i1 %.not10, label %L28, label %L20, !dbg !523

L20:                                              ; preds = %L5
  call void @julia_throw_inexacterror_840(i64 signext %12) #23, !dbg !523
  unreachable, !dbg !523

L28:                                              ; preds = %L5
  %14 = bitcast {}* %11 to i8**, !dbg !517
  %arrayptr3 = load i8*, i8** %14, align 8, !dbg !517, !tbaa !96, !alias.scope !42, !noalias !45, !nonnull !19
  %15 = bitcast {}* %10 to i8**, !dbg !514
  %arrayptr = load i8*, i8** %15, align 8, !dbg !514, !tbaa !96, !alias.scope !42, !noalias !45, !nonnull !19
  call void @llvm.memmove.p0i8.p0i8.i64(i8* nonnull align 1 %arrayptr, i8* nonnull align 1 %arrayptr3, i64 %12, i1 noundef false) #20, !dbg !528, !noalias !529
  call void @llvm.julia.gc_preserve_end(token %8) #20, !dbg !532
  call void @llvm.julia.gc_preserve_end(token %7) #20, !dbg !533
  br label %L36, !dbg !534

L36:                                              ; preds = %L28, %top
  ret {} addrspace(10)* %5, !dbg !535
}

; Function Attrs: mustprogress willreturn
define internal { { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)* } @augmented_julia_getindex_842({} addrspace(10)* noundef nonnull align 16 dereferenceable(40) "enzyme_type"="{[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer}" "enzymejl_parmtype"="127923554507456" "enzymejl_parmtype_ref"="2" %0, {} addrspace(10)* align 16 "enzyme_type"="{[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer}" "enzymejl_parmtype"="127923554507456" "enzymejl_parmtype_ref"="2" %"'") unnamed_addr #19 !dbg !536 {
top:
  %1 = alloca { { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)* }, align 8
  %2 = getelementptr inbounds { { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)* }, { { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)* }* %1, i32 0, i32 0
  %3 = getelementptr { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }* %2, i64 0, i32 0
  store {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)** %3, align 8
  %4 = getelementptr { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }* %2, i64 0, i32 1
  store {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)** %4, align 8
  %5 = call {}*** @julia.get_pgcstack() #21
  %ptls_field7 = getelementptr inbounds {}**, {}*** %5, i64 2
  %6 = bitcast {}*** %ptls_field7 to i64***
  %ptls_load89 = load i64**, i64*** %6, align 8, !tbaa !26, !alias.scope !541, !noalias !544
  %7 = getelementptr inbounds i64*, i64** %ptls_load89, i64 2
  %safepoint = load i64*, i64** %7, align 8, !tbaa !30, !alias.scope !546, !noalias !549
  fence syncscope("singlethread") seq_cst
  call void @julia.safepoint(i64* %safepoint) #21, !dbg !551
  fence syncscope("singlethread") seq_cst
  %8 = addrspacecast {} addrspace(10)* %0 to { i8 addrspace(13)*, i64, i16, i16, i32 } addrspace(11)*, !dbg !552
  %arraylen_ptr = getelementptr inbounds { i8 addrspace(13)*, i64, i16, i16, i32 }, { i8 addrspace(13)*, i64, i16, i16, i32 } addrspace(11)* %8, i64 0, i32 1, !dbg !552
  %arraylen = load i64, i64 addrspace(11)* %arraylen_ptr, align 8, !dbg !552, !tbaa !38, !range !41, !alias.scope !554, !noalias !557
  %9 = getelementptr inbounds { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }* %2, i32 0, i32 4, !dbg !559
  store i64 %arraylen, i64* %9, align 8, !dbg !559
  %10 = call {} addrspace(10)* @ijl_alloc_array_1d({} addrspace(10)* addrspacecast ({}* inttoptr (i64 127923554507456 to {}*) to {} addrspace(10)*), i64 %arraylen), !dbg !559
  %11 = getelementptr inbounds { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }* %2, i32 0, i32 0, !dbg !559
  store {} addrspace(10)* %10, {} addrspace(10)** %11, align 8, !dbg !559
  %12 = mul i64 %arraylen, 8, !dbg !559
  %13 = bitcast {} addrspace(10)* %10 to i8 addrspace(13)* addrspace(10)*, !dbg !559
  %14 = load i8 addrspace(13)*, i8 addrspace(13)* addrspace(10)* %13, align 8, !dbg !559
  call void @llvm.memset.p13i8.i64(i8 addrspace(13)* align 8 %14, i8 0, i64 %12, i1 false), !dbg !559
  %15 = call noalias nonnull "enzyme_type"="{[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer}" {} addrspace(10)* @ijl_alloc_array_1d({} addrspace(10)* noundef addrspacecast ({}* inttoptr (i64 127923554507456 to {}*) to {} addrspace(10)*), i64 %arraylen) #22, !dbg !559
  %16 = getelementptr inbounds { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }* %2, i32 0, i32 1, !dbg !562
  store {} addrspace(10)* %15, {} addrspace(10)** %16, align 8, !dbg !562
  %.not = icmp eq i64 %arraylen, 0, !dbg !562
  br i1 %.not, label %L36, label %L5, !dbg !564

L5:                                               ; preds = %top
  %"'ipc" = addrspacecast {} addrspace(10)* %"'" to {} addrspace(11)*, !dbg !552
  %17 = addrspacecast {} addrspace(10)* %0 to {} addrspace(11)*, !dbg !552
  %18 = call token (...) @llvm.julia.gc_preserve_begin({} addrspace(10)* %15, {} addrspace(10)* %10), !dbg !565
  %19 = call token (...) @llvm.julia.gc_preserve_begin({} addrspace(10)* %0, {} addrspace(10)* %"'"), !dbg !567
  %"'ipc2" = addrspacecast {} addrspace(10)* %10 to {} addrspace(11)*, !dbg !568
  %20 = addrspacecast {} addrspace(10)* %15 to {} addrspace(11)*, !dbg !568
  %21 = call {}* @julia.pointer_from_objref({} addrspace(11)* %"'ipc2"), !dbg !568
  %22 = call nonnull {}* @julia.pointer_from_objref({} addrspace(11)* %20) #23, !dbg !568
  %23 = call {}* @julia.pointer_from_objref({} addrspace(11)* %"'ipc"), !dbg !571
  %24 = call nonnull {}* @julia.pointer_from_objref({} addrspace(11)* noundef %17) #23, !dbg !571
  %25 = shl i64 %arraylen, 3, !dbg !574
  %26 = and i64 %arraylen, 1152921504606846976, !dbg !576
  %.not10 = icmp eq i64 %26, 0, !dbg !576
  br i1 %.not10, label %L28, label %L20, !dbg !577

L20:                                              ; preds = %L5
  call void @julia_throw_inexacterror_840(i64 signext %25) #24, !dbg !577
  unreachable, !dbg !577

L28:                                              ; preds = %L5
  %"'ipc4" = bitcast {}* %23 to i8**, !dbg !571
  %27 = bitcast {}* %24 to i8**, !dbg !571
  %"arrayptr3'ipl" = load i8*, i8** %"'ipc4", align 8, !dbg !571, !tbaa !96, !alias.scope !583, !noalias !584, !nonnull !0
  %28 = getelementptr inbounds { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }* %2, i32 0, i32 3, !dbg !571
  store i8* %"arrayptr3'ipl", i8** %28, align 8, !dbg !571
  %arrayptr3 = load i8*, i8** %27, align 8, !dbg !571, !tbaa !96, !alias.scope !554, !noalias !557, !nonnull !0
  %"'ipc3" = bitcast {}* %21 to i8**, !dbg !568
  %29 = bitcast {}* %22 to i8**, !dbg !568
  %"arrayptr'ipl" = load i8*, i8** %"'ipc3", align 8, !dbg !568, !tbaa !96, !alias.scope !585, !noalias !588, !nonnull !0
  %30 = getelementptr inbounds { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }* %2, i32 0, i32 2, !dbg !568
  store i8* %"arrayptr'ipl", i8** %30, align 8, !dbg !568
  %arrayptr = load i8*, i8** %29, align 8, !dbg !568, !tbaa !96, !alias.scope !590, !noalias !591, !nonnull !0
  call void @llvm.memmove.p0i8.p0i8.i64(i8* nonnull align 1 %arrayptr, i8* nonnull align 1 %arrayptr3, i64 %25, i1 noundef false) #21, !dbg !582, !noalias !592
  call void @llvm.julia.gc_preserve_end(token %19) #21, !dbg !595
  call void @llvm.julia.gc_preserve_end(token %18) #21, !dbg !596
  br label %L36, !dbg !597

L36:                                              ; preds = %L28, %top
  %31 = getelementptr inbounds { { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)* }, { { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)* }* %1, i32 0, i32 1, !dbg !598
  store {} addrspace(10)* %15, {} addrspace(10)** %31, align 8, !dbg !598
  %32 = getelementptr inbounds { { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)* }, { { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)* }* %1, i32 0, i32 2, !dbg !598
  store {} addrspace(10)* %10, {} addrspace(10)** %32, align 8, !dbg !598
  %33 = load { { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)* }, { { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)* }* %1, align 8, !dbg !598
  ret { { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)* } %33, !dbg !598
}

; Function Attrs: mustprogress willreturn
define internal { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } @augmented_julia_euler_step_833({} addrspace(10)* noundef nonnull align 16 dereferenceable(40) "enzyme_type"="{[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer}" "enzymejl_parmtype"="127923554507456" "enzymejl_parmtype_ref"="2" %0, {} addrspace(10)* align 16 "enzyme_type"="{[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer}" "enzymejl_parmtype"="127923554507456" "enzymejl_parmtype_ref"="2" %"'", {} addrspace(10)* noundef nonnull align 16 dereferenceable(40) "enzyme_type"="{[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer}" "enzymejl_parmtype"="127923554507456" "enzymejl_parmtype_ref"="2" %1, {} addrspace(10)* align 16 "enzyme_type"="{[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer}" "enzymejl_parmtype"="127923554507456" "enzymejl_parmtype_ref"="2" %"'1", {} addrspace(10)* noundef nonnull align 16 dereferenceable(40) "enzyme_type"="{[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer}" "enzymejl_parmtype"="127923554507456" "enzymejl_parmtype_ref"="2" %2, {} addrspace(10)* align 16 "enzyme_type"="{[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer}" "enzymejl_parmtype"="127923554507456" "enzymejl_parmtype_ref"="2" %"'2") unnamed_addr #18 !dbg !503 {
top:
  %3 = alloca { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }, align 8
  %4 = getelementptr { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }, { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }* %3, i64 0, i32 3
  store {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)** %4, align 8
  %5 = getelementptr { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }, { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }* %3, i64 0, i32 4
  store {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)** %5, align 8
  %6 = getelementptr { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }, { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }* %3, i64 0, i32 5
  store {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)** %6, align 8
  %7 = getelementptr { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }, { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }* %3, i64 0, i32 6
  store {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)** %7, align 8
  %8 = getelementptr { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }, { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }* %3, i64 0, i32 7
  store {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)** %8, align 8
  %9 = getelementptr { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }, { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }* %3, i64 0, i32 8
  store {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)** %9, align 8
  %10 = getelementptr { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }, { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }* %3, i64 0, i32 9
  store {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)** %10, align 8
  %11 = getelementptr { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }, { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }* %3, i64 0, i32 10
  store {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)** %11, align 8
  %12 = getelementptr { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }, { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }* %3, i64 0, i32 11
  store {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)** %12, align 8
  %13 = getelementptr { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }, { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }* %3, i64 0, i32 12
  store {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)** %13, align 8
  %14 = getelementptr { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }, { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }* %3, i64 0, i32 13
  store {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)** %14, align 8
  %15 = getelementptr { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }, { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }* %3, i64 0, i32 14
  store {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)** %15, align 8
  %16 = getelementptr { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }, { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }* %3, i64 0, i32 15
  store {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)** %16, align 8
  %17 = getelementptr { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }, { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }* %3, i64 0, i32 16
  store {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)** %17, align 8
  %18 = getelementptr { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }, { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }* %3, i64 0, i32 2, i32 0
  store {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)** %18, align 8
  %19 = getelementptr { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }, { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }* %3, i64 0, i32 2, i32 1
  store {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)** %19, align 8
  %20 = call {}*** @julia.get_pgcstack() #21
  %ptls_field29 = getelementptr inbounds {}**, {}*** %20, i64 2
  %21 = bitcast {}*** %ptls_field29 to i64***
  %ptls_load3031 = load i64**, i64*** %21, align 8, !tbaa !26, !alias.scope !509, !noalias !512
  %22 = getelementptr inbounds i64*, i64** %ptls_load3031, i64 2
  %safepoint = load i64*, i64** %22, align 8, !tbaa !30, !alias.scope !514, !noalias !517
  fence syncscope("singlethread") seq_cst
  call void @julia.safepoint(i64* %safepoint) #21, !dbg !519
  fence syncscope("singlethread") seq_cst
  %"'ipc7" = addrspacecast {} addrspace(10)* %"'1" to double addrspace(13)* addrspace(11)*, !dbg !520
  %23 = addrspacecast {} addrspace(10)* %1 to double addrspace(13)* addrspace(11)*, !dbg !520
  %"arrayptr32'ipl" = load double addrspace(13)*, double addrspace(13)* addrspace(11)* %"'ipc7", align 16, !dbg !520, !tbaa !96, !alias.scope !522, !noalias !527, !nonnull !0
  %arrayptr32 = load double addrspace(13)*, double addrspace(13)* addrspace(11)* %23, align 16, !dbg !520, !tbaa !96, !alias.scope !529, !noalias !530, !nonnull !0
  %arrayref = load double, double addrspace(13)* %arrayptr32, align 8, !dbg !520, !tbaa !122, !alias.scope !531, !noalias !534
  %24 = fmul double %arrayref, 1.000000e-01, !dbg !536
  %25 = addrspacecast {} addrspace(10)* %0 to { i8 addrspace(13)*, i64, i16, i16, i32 } addrspace(11)*, !dbg !537
  %"'ipc" = addrspacecast {} addrspace(10)* %"'" to double addrspace(13)* addrspace(11)*, !dbg !537
  %26 = addrspacecast {} addrspace(10)* %0 to double addrspace(13)* addrspace(11)*, !dbg !537
  %"arrayptr333'ipl" = load double addrspace(13)*, double addrspace(13)* addrspace(11)* %"'ipc", align 16, !dbg !537, !tbaa !96, !alias.scope !538, !noalias !541, !nonnull !0
  %arrayptr333 = load double addrspace(13)*, double addrspace(13)* addrspace(11)* %26, align 16, !dbg !537, !tbaa !96, !alias.scope !543, !noalias !544, !nonnull !0
  store double %24, double addrspace(13)* %arrayptr333, align 8, !dbg !537, !tbaa !122, !alias.scope !545, !noalias !548
  %arraylen_ptr = getelementptr inbounds { i8 addrspace(13)*, i64, i16, i16, i32 }, { i8 addrspace(13)*, i64, i16, i16, i32 } addrspace(11)* %25, i64 0, i32 1, !dbg !550
  %arraylen = load i64, i64 addrspace(11)* %arraylen_ptr, align 8, !dbg !550, !tbaa !38, !range !41, !alias.scope !552, !noalias !544
  %inbounds = icmp ugt i64 %arraylen, 2, !dbg !550
  br i1 %inbounds, label %idxend, label %oob, !dbg !550

L24:                                              ; preds = %idxend
  %"'ipc9" = addrspacecast {} addrspace(10)* %"'2" to {} addrspace(11)*, !dbg !553
  %27 = addrspacecast {} addrspace(10)* %2 to {} addrspace(11)*, !dbg !553
  %28 = call token (...) @llvm.julia.gc_preserve_begin({} addrspace(10)* %2, {} addrspace(10)* %"'2"), !dbg !556
  %29 = call token (...) @llvm.julia.gc_preserve_begin({} addrspace(10)* %86, {} addrspace(10)* %"'ac"), !dbg !558
  %30 = call {}* @julia.pointer_from_objref({} addrspace(11)* %"'ipc9"), !dbg !559
  %31 = call nonnull {}* @julia.pointer_from_objref({} addrspace(11)* noundef %27) #22, !dbg !559
  %"'ipc8" = addrspacecast {} addrspace(10)* %"'ac" to {} addrspace(11)*, !dbg !562
  %32 = addrspacecast {} addrspace(10)* %86 to {} addrspace(11)*, !dbg !562
  %33 = call {}* @julia.pointer_from_objref({} addrspace(11)* %"'ipc8"), !dbg !562
  %34 = call nonnull {}* @julia.pointer_from_objref({} addrspace(11)* %32) #22, !dbg !562
  %35 = shl i64 %arraylen14, 3, !dbg !565
  %36 = and i64 %arraylen14, 1152921504606846976, !dbg !567
  %.not34 = icmp eq i64 %36, 0, !dbg !567
  br i1 %.not34, label %L47, label %L39, !dbg !568

L39:                                              ; preds = %L24
  call void @julia_throw_inexacterror_840(i64 signext %35) #23, !dbg !568
  unreachable, !dbg !568

L47:                                              ; preds = %L24
  %"'ipc11" = bitcast {}* %33 to i8**, !dbg !562
  %37 = bitcast {}* %34 to i8**, !dbg !562
  %"arrayptr20'ipl" = load i8*, i8** %"'ipc11", align 8, !dbg !562, !tbaa !96, !alias.scope !574, !noalias !577, !nonnull !0
  %38 = getelementptr inbounds { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }, { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }* %3, i32 0, i32 1, !dbg !562
  store i8* %"arrayptr20'ipl", i8** %38, align 8, !dbg !562
  %arrayptr20 = load i8*, i8** %37, align 8, !dbg !562, !tbaa !96, !alias.scope !579, !noalias !580, !nonnull !0
  %"'ipc10" = bitcast {}* %30 to i8**, !dbg !559
  %39 = bitcast {}* %31 to i8**, !dbg !559
  %"arrayptr18'ipl" = load i8*, i8** %"'ipc10", align 8, !dbg !559, !tbaa !96, !alias.scope !581, !noalias !584, !nonnull !0
  %40 = getelementptr inbounds { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }, { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }* %3, i32 0, i32 0, !dbg !559
  store i8* %"arrayptr18'ipl", i8** %40, align 8, !dbg !559
  %arrayptr18 = load i8*, i8** %39, align 8, !dbg !559, !tbaa !96, !alias.scope !586, !noalias !587, !nonnull !0
  call void @llvm.memmove.p0i8.p0i8.i64(i8* nonnull align 1 %arrayptr18, i8* nonnull align 1 %arrayptr20, i64 %35, i1 noundef false) #21, !dbg !573, !noalias !588
  call void @llvm.julia.gc_preserve_end(token %29) #21, !dbg !591
  call void @llvm.julia.gc_preserve_end(token %28) #21, !dbg !592
  br label %L56, !dbg !593

L56:                                              ; preds = %idxend, %L47
  %41 = load { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }, { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }* %3, align 8, !dbg !594
  ret { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } %41, !dbg !594

oob:                                              ; preds = %top
  %errorbox = alloca i64, align 8, !dbg !550
  store i64 3, i64* %errorbox, align 8, !dbg !550, !noalias !588
  %42 = addrspacecast {} addrspace(10)* %0 to {} addrspace(12)*, !dbg !550
  call void @ijl_bounds_error_ints({} addrspace(12)* noundef %42, i64* noundef nonnull align 8 %errorbox, i64 noundef 1) #23, !dbg !550
  unreachable, !dbg !550

idxend:                                           ; preds = %top
  %43 = getelementptr inbounds double, double addrspace(13)* %arrayptr333, i64 2, !dbg !595
  %arrayref6 = load double, double addrspace(13)* %43, align 8, !dbg !595, !tbaa !122, !alias.scope !545, !noalias !597
  %current_task128 = getelementptr inbounds {}**, {}*** %20, i64 -14
  %current_task1 = bitcast {}*** %current_task128 to {}**
  %F = load atomic {} addrspace(10)*, {} addrspace(10)** inttoptr (i64 127923752824944 to {} addrspace(10)**) unordered, align 16, !dbg !551, !tbaa !174, !alias.scope !598, !noalias !601
  %44 = getelementptr inbounds { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }, { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }* %3, i32 0, i32 16, !dbg !551
  store {} addrspace(10)* %F, {} addrspace(10)** %44, align 8, !dbg !551
  %"box'mi" = call noalias nonnull dereferenceable(8) "enzyme_type"="{[-1]:Pointer, [-1,-1]:Float@double}" {} addrspace(10)* @julia.gc_alloc_obj({}** nonnull %current_task1, i64 noundef 8, {} addrspace(10)* noundef addrspacecast ({}* inttoptr (i64 127923574262496 to {}*) to {} addrspace(10)*)) #24, !dbg !551
  %45 = getelementptr inbounds { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }, { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }* %3, i32 0, i32 14, !dbg !551
  store {} addrspace(10)* %"box'mi", {} addrspace(10)** %45, align 8, !dbg !551
  %46 = bitcast {} addrspace(10)* %"box'mi" to i8 addrspace(10)*, !dbg !551
  call void @llvm.memset.p10i8.i64(i8 addrspace(10)* nonnull dereferenceable(8) dereferenceable_or_null(8) %46, i8 0, i64 8, i1 false), !dbg !551
  %box = call noalias nonnull dereferenceable(8) "enzyme_type"="{[-1]:Pointer, [-1,-1]:Float@double}" {} addrspace(10)* @julia.gc_alloc_obj({}** nonnull %current_task1, i64 noundef 8, {} addrspace(10)* noundef addrspacecast ({}* inttoptr (i64 127923625261792 to {}*) to {} addrspace(10)*)) #24, !dbg !551
  %47 = getelementptr inbounds { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }, { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }* %3, i32 0, i32 15, !dbg !551
  store {} addrspace(10)* %box, {} addrspace(10)** %47, align 8, !dbg !551
  %48 = bitcast {} addrspace(10)* %box to double addrspace(10)*, !dbg !551
  store double %arrayref6, double addrspace(10)* %48, align 8, !dbg !551, !tbaa !176, !alias.scope !603, !noalias !606
  %49 = call {} addrspace(10)* ({} addrspace(10)* ({} addrspace(10)*, {} addrspace(10)**, i32)*, {} addrspace(10)*, ...) @julia.call({} addrspace(10)* ({} addrspace(10)*, {} addrspace(10)**, i32)* @ijl_apply_generic, {} addrspace(10)* @ejl_enz_runtime_generic_augfwd, {} addrspace(10)* addrspacecast ({}* inttoptr (i64 127923181517200 to {}*) to {} addrspace(10)*), {} addrspace(10)* @ejl_enz_val_1, {} addrspace(10)* addrspacecast ({}* inttoptr (i64 127923432288592 to {}*) to {} addrspace(10)*), {} addrspace(10)* addrspacecast ({}* inttoptr (i64 127923432288224 to {}*) to {} addrspace(10)*), {} addrspace(10)* addrspacecast ({}* inttoptr (i64 127923559984512 to {}*) to {} addrspace(10)*), {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)* %box, {} addrspace(10)* %"box'mi", {} addrspace(10)* %F, {} addrspace(10)* @ejl_jl_nothing), !dbg !551
  %50 = addrspacecast {} addrspace(10)* %49 to {} addrspace(11)*, !dbg !551
  %51 = bitcast {} addrspace(11)* %50 to [3 x {} addrspace(10)*] addrspace(11)*, !dbg !551
  %52 = getelementptr inbounds [3 x {} addrspace(10)*], [3 x {} addrspace(10)*] addrspace(11)* %51, i64 0, i64 1, !dbg !551
  %53 = load {} addrspace(10)*, {} addrspace(10)* addrspace(11)* %52, align 8, !dbg !551
  %54 = getelementptr inbounds { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }, { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }* %3, i32 0, i32 12, !dbg !551
  store {} addrspace(10)* %53, {} addrspace(10)** %54, align 8, !dbg !551
  %55 = getelementptr inbounds [3 x {} addrspace(10)*], [3 x {} addrspace(10)*] addrspace(11)* %51, i64 0, i64 2, !dbg !551
  %56 = load {} addrspace(10)*, {} addrspace(10)* addrspace(11)* %55, align 8, !dbg !551
  %57 = getelementptr inbounds { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }, { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }* %3, i32 0, i32 11, !dbg !551
  store {} addrspace(10)* %56, {} addrspace(10)** %57, align 8, !dbg !551
  %58 = getelementptr inbounds [3 x {} addrspace(10)*], [3 x {} addrspace(10)*] addrspace(11)* %51, i64 0, i64 0, !dbg !551
  %59 = load {} addrspace(10)*, {} addrspace(10)* addrspace(11)* %58, align 8, !dbg !551
  %60 = getelementptr inbounds { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }, { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }* %3, i32 0, i32 13, !dbg !551
  store {} addrspace(10)* %59, {} addrspace(10)** %60, align 8, !dbg !551
  %"box12'mi" = call noalias nonnull dereferenceable(8) "enzyme_type"="{[-1]:Pointer, [-1,-1]:Float@double}" {} addrspace(10)* @julia.gc_alloc_obj({}** nonnull %current_task1, i64 noundef 8, {} addrspace(10)* noundef addrspacecast ({}* inttoptr (i64 127923574262496 to {}*) to {} addrspace(10)*)) #24, !dbg !551
  %61 = getelementptr inbounds { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }, { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }* %3, i32 0, i32 9, !dbg !551
  store {} addrspace(10)* %"box12'mi", {} addrspace(10)** %61, align 8, !dbg !551
  %62 = bitcast {} addrspace(10)* %"box12'mi" to i8 addrspace(10)*, !dbg !551
  call void @llvm.memset.p10i8.i64(i8 addrspace(10)* nonnull dereferenceable(8) dereferenceable_or_null(8) %62, i8 0, i64 8, i1 false), !dbg !551
  %box12 = call noalias nonnull dereferenceable(8) "enzyme_type"="{[-1]:Pointer, [-1,-1]:Float@double}" {} addrspace(10)* @julia.gc_alloc_obj({}** nonnull %current_task1, i64 noundef 8, {} addrspace(10)* noundef addrspacecast ({}* inttoptr (i64 127923625261792 to {}*) to {} addrspace(10)*)) #24, !dbg !551
  %63 = getelementptr inbounds { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }, { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }* %3, i32 0, i32 10, !dbg !551
  store {} addrspace(10)* %box12, {} addrspace(10)** %63, align 8, !dbg !551
  %64 = bitcast {} addrspace(10)* %box12 to double addrspace(10)*, !dbg !551
  store double %arrayref6, double addrspace(10)* %64, align 8, !dbg !551, !tbaa !176, !alias.scope !608, !noalias !611
  %65 = call {} addrspace(10)* ({} addrspace(10)* ({} addrspace(10)*, {} addrspace(10)**, i32)*, {} addrspace(10)*, ...) @julia.call({} addrspace(10)* ({} addrspace(10)*, {} addrspace(10)**, i32)* @ijl_apply_generic, {} addrspace(10)* @ejl_enz_runtime_generic_augfwd, {} addrspace(10)* addrspacecast ({}* inttoptr (i64 127923180983760 to {}*) to {} addrspace(10)*), {} addrspace(10)* @ejl_enz_val_1, {} addrspace(10)* addrspacecast ({}* inttoptr (i64 127923432288592 to {}*) to {} addrspace(10)*), {} addrspace(10)* addrspacecast ({}* inttoptr (i64 127923432288224 to {}*) to {} addrspace(10)*), {} addrspace(10)* addrspacecast ({}* inttoptr (i64 127923559984512 to {}*) to {} addrspace(10)*), {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)* %box12, {} addrspace(10)* %"box12'mi", {} addrspace(10)* %59, {} addrspace(10)* %53), !dbg !551
  %66 = addrspacecast {} addrspace(10)* %65 to {} addrspace(11)*, !dbg !551
  %67 = bitcast {} addrspace(11)* %66 to [3 x {} addrspace(10)*] addrspace(11)*, !dbg !551
  %68 = getelementptr inbounds [3 x {} addrspace(10)*], [3 x {} addrspace(10)*] addrspace(11)* %67, i64 0, i64 1, !dbg !551
  %69 = load {} addrspace(10)*, {} addrspace(10)* addrspace(11)* %68, align 8, !dbg !551
  %70 = getelementptr inbounds { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }, { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }* %3, i32 0, i32 7, !dbg !551
  store {} addrspace(10)* %69, {} addrspace(10)** %70, align 8, !dbg !551
  %71 = getelementptr inbounds [3 x {} addrspace(10)*], [3 x {} addrspace(10)*] addrspace(11)* %67, i64 0, i64 2, !dbg !551
  %72 = load {} addrspace(10)*, {} addrspace(10)* addrspace(11)* %71, align 8, !dbg !551
  %73 = getelementptr inbounds { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }, { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }* %3, i32 0, i32 6, !dbg !551
  store {} addrspace(10)* %72, {} addrspace(10)** %73, align 8, !dbg !551
  %74 = getelementptr inbounds [3 x {} addrspace(10)*], [3 x {} addrspace(10)*] addrspace(11)* %67, i64 0, i64 0, !dbg !551
  %75 = load {} addrspace(10)*, {} addrspace(10)* addrspace(11)* %74, align 8, !dbg !551
  %76 = getelementptr inbounds { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }, { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }* %3, i32 0, i32 8, !dbg !551
  store {} addrspace(10)* %75, {} addrspace(10)** %76, align 8, !dbg !551
  %77 = call {} addrspace(10)* ({} addrspace(10)* ({} addrspace(10)*, {} addrspace(10)**, i32)*, {} addrspace(10)*, ...) @julia.call({} addrspace(10)* ({} addrspace(10)*, {} addrspace(10)**, i32)* @ijl_apply_generic, {} addrspace(10)* @ejl_enz_runtime_generic_augfwd, {} addrspace(10)* addrspacecast ({}* inttoptr (i64 127923714912016 to {}*) to {} addrspace(10)*), {} addrspace(10)* @ejl_enz_val_1, {} addrspace(10)* addrspacecast ({}* inttoptr (i64 127923432288232 to {}*) to {} addrspace(10)*), {} addrspace(10)* addrspacecast ({}* inttoptr (i64 127923432288224 to {}*) to {} addrspace(10)*), {} addrspace(10)* addrspacecast ({}* inttoptr (i64 127923593314480 to {}*) to {} addrspace(10)*), {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)* %0, {} addrspace(10)* %"'", {} addrspace(10)* %75, {} addrspace(10)* %69, {} addrspace(10)* addrspacecast ({}* inttoptr (i64 127923780723616 to {}*) to {} addrspace(10)*), {} addrspace(10)* @ejl_jl_nothing), !dbg !551
  %78 = addrspacecast {} addrspace(10)* %77 to {} addrspace(11)*, !dbg !551
  %79 = bitcast {} addrspace(11)* %78 to [3 x {} addrspace(10)*] addrspace(11)*, !dbg !551
  %80 = getelementptr inbounds [3 x {} addrspace(10)*], [3 x {} addrspace(10)*] addrspace(11)* %79, i64 0, i64 2, !dbg !551
  %81 = load {} addrspace(10)*, {} addrspace(10)* addrspace(11)* %80, align 8, !dbg !551
  %82 = getelementptr inbounds { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }, { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }* %3, i32 0, i32 5, !dbg !551
  store {} addrspace(10)* %81, {} addrspace(10)** %82, align 8, !dbg !551
  %83 = getelementptr inbounds [3 x {} addrspace(10)*], [3 x {} addrspace(10)*] addrspace(11)* %79, i64 0, i64 0, !dbg !551
  %84 = load {} addrspace(10)*, {} addrspace(10)* addrspace(11)* %83, align 8, !dbg !551
  %_augmented = call { { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)* } @augmented_julia_getindex_842({} addrspace(10)* align 16 %1, {} addrspace(10)* align 16 %"'1"), !dbg !555
  %subcache = extractvalue { { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)* } %_augmented, 0, !dbg !555
  %85 = getelementptr inbounds { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }, { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }* %3, i32 0, i32 2, !dbg !555
  store { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 } %subcache, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }* %85, align 8, !dbg !555
  %86 = extractvalue { { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)* } %_augmented, 1, !dbg !555
  %87 = getelementptr inbounds { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }, { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }* %3, i32 0, i32 3, !dbg !555
  store {} addrspace(10)* %86, {} addrspace(10)** %87, align 8, !dbg !555
  %"'ac" = extractvalue { { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)* } %_augmented, 2, !dbg !555
  %88 = getelementptr inbounds { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }, { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }* %3, i32 0, i32 4, !dbg !553
  store {} addrspace(10)* %"'ac", {} addrspace(10)** %88, align 8, !dbg !553
  %89 = addrspacecast {} addrspace(10)* %2 to { i8 addrspace(13)*, i64, i16, i16, i32 } addrspace(11)*, !dbg !553
  %arraylen_ptr13 = getelementptr inbounds { i8 addrspace(13)*, i64, i16, i16, i32 }, { i8 addrspace(13)*, i64, i16, i16, i32 } addrspace(11)* %89, i64 0, i32 1, !dbg !553
  %arraylen14 = load i64, i64 addrspace(11)* %arraylen_ptr13, align 8, !dbg !553, !tbaa !38, !range !41, !alias.scope !586, !noalias !587
  %90 = getelementptr inbounds { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }, { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }* %3, i32 0, i32 17, !dbg !613
  store i64 %arraylen14, i64* %90, align 8, !dbg !613
  %.not = icmp eq i64 %arraylen14, 0, !dbg !613
  br i1 %.not, label %L56, label %L24, !dbg !615
}

; Function Attrs: mustprogress willreturn
define internal void @diffejulia_getindex_842({} addrspace(10)* align 16 dereferenceable(40) "enzyme_type"="{[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer}" "enzymejl_parmtype"="127923554507456" "enzymejl_parmtype_ref"="2" %0, {} addrspace(10)* align 16 "enzyme_type"="{[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer}" "enzymejl_parmtype"="127923554507456" "enzymejl_parmtype_ref"="2" %"'", { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 } %tapeArg) unnamed_addr #19 !dbg !686 {
top:
  %1 = call {}*** @julia.get_pgcstack() #22
  %arraylen = extractvalue { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 } %tapeArg, 4, !dbg !691
  %2 = extractvalue { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 } %tapeArg, 0, !dbg !691
  %3 = extractvalue { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 } %tapeArg, 1, !dbg !691
  %.not = icmp eq i64 %arraylen, 0, !dbg !694
  br i1 %.not, label %L36, label %L5, !dbg !696

L5:                                               ; preds = %top
  %"'ipc" = addrspacecast {} addrspace(10)* %"'" to {} addrspace(11)*, !dbg !697
  %4 = call token (...) @llvm.julia.gc_preserve_begin({} addrspace(10)* %3, {} addrspace(10)* %2), !dbg !699
  %5 = call token (...) @llvm.julia.gc_preserve_begin({} addrspace(10)* %0, {} addrspace(10)* %"'"), !dbg !701
  %"'ipc7" = addrspacecast {} addrspace(10)* %2 to {} addrspace(11)*, !dbg !702
  %6 = call {}* @julia.pointer_from_objref({} addrspace(11)* %"'ipc7"), !dbg !702
  %7 = call {}* @julia.pointer_from_objref({} addrspace(11)* %"'ipc"), !dbg !705
  %8 = shl i64 %arraylen, 3, !dbg !708
  br i1 true, label %L28, label %L20, !dbg !710

L20:                                              ; preds = %L5
  unreachable

L28:                                              ; preds = %L5
  %"arrayptr3'il_phi" = extractvalue { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 } %tapeArg, 3, !dbg !705
  %"arrayptr'il_phi" = extractvalue { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 } %tapeArg, 2, !dbg !702
  call void @llvm.julia.gc_preserve_end(token %5) #22, !dbg !716
  call void @llvm.julia.gc_preserve_end(token %4) #22, !dbg !717
  br label %L36, !dbg !718

L36:                                              ; preds = %L28, %top
  br label %invertL36, !dbg !719

inverttop:                                        ; preds = %invertL36, %invertL5
  fence syncscope("singlethread") seq_cst
  fence syncscope("singlethread") seq_cst
  ret void

invertL5:                                         ; preds = %__enzyme_memcpyadd_doubleda1sa1.exit
  call void @llvm.julia.gc_preserve_end(token %10), !dbg !701
  call void @llvm.julia.gc_preserve_end(token %9), !dbg !699
  br label %inverttop

invertL28:                                        ; preds = %invertL36
  %9 = call token (...) @llvm.julia.gc_preserve_begin({} addrspace(10)* %3, {} addrspace(10)* %2), !dbg !717
  %10 = call token (...) @llvm.julia.gc_preserve_begin({} addrspace(10)* %0, {} addrspace(10)* %"'"), !dbg !716
  %11 = extractvalue { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 } %tapeArg, 2, !dbg !715
  %12 = extractvalue { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 } %tapeArg, 3, !dbg !715
  %13 = bitcast i8* %11 to double*, !dbg !715
  %14 = bitcast i8* %12 to double*, !dbg !715
  %_unwrap = shl i64 %arraylen, 3, !dbg !715
  %15 = udiv i64 %_unwrap, 8, !dbg !715
  %16 = icmp eq i64 %15, 0, !dbg !715
  br i1 %16, label %__enzyme_memcpyadd_doubleda1sa1.exit, label %for.body.i, !dbg !715

for.body.i:                                       ; preds = %for.body.i, %invertL28
  %idx.i = phi i64 [ 0, %invertL28 ], [ %idx.next.i, %for.body.i ], !dbg !715
  %dst.i.i = getelementptr inbounds double, double* %13, i64 %idx.i, !dbg !715
  %dst.i.l.i = load double, double* %dst.i.i, align 1, !dbg !715
  store double 0.000000e+00, double* %dst.i.i, align 1, !dbg !715
  %src.i.i = getelementptr inbounds double, double* %14, i64 %idx.i, !dbg !715
  %src.i.l.i = load double, double* %src.i.i, align 1, !dbg !715
  %17 = fadd fast double %src.i.l.i, %dst.i.l.i, !dbg !715
  store double %17, double* %src.i.i, align 1, !dbg !715
  %idx.next.i = add nuw i64 %idx.i, 1, !dbg !715
  %18 = icmp eq i64 %15, %idx.next.i, !dbg !715
  br i1 %18, label %__enzyme_memcpyadd_doubleda1sa1.exit, label %for.body.i, !dbg !715

__enzyme_memcpyadd_doubleda1sa1.exit:             ; preds = %invertL28, %for.body.i
  br label %invertL5

invertL36:                                        ; preds = %L36
  br i1 %.not, label %inverttop, label %invertL28
}

; Function Attrs: mustprogress willreturn
define internal void @diffejulia_euler_step_833({} addrspace(10)* align 16 dereferenceable(40) "enzyme_type"="{[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer}" "enzymejl_parmtype"="127923554507456" "enzymejl_parmtype_ref"="2" %0, {} addrspace(10)* align 16 "enzyme_type"="{[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer}" "enzymejl_parmtype"="127923554507456" "enzymejl_parmtype_ref"="2" %"'", {} addrspace(10)* align 16 dereferenceable(40) "enzyme_type"="{[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer}" "enzymejl_parmtype"="127923554507456" "enzymejl_parmtype_ref"="2" %1, {} addrspace(10)* align 16 "enzyme_type"="{[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer}" "enzymejl_parmtype"="127923554507456" "enzymejl_parmtype_ref"="2" %"'1", {} addrspace(10)* align 16 dereferenceable(40) "enzyme_type"="{[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer}" "enzymejl_parmtype"="127923554507456" "enzymejl_parmtype_ref"="2" %2, {} addrspace(10)* align 16 "enzyme_type"="{[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer}" "enzymejl_parmtype"="127923554507456" "enzymejl_parmtype_ref"="2" %"'2", { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } %tapeArg) unnamed_addr #18 !dbg !616 {
top:
  %"'de" = alloca double, align 8
  %3 = getelementptr double, double* %"'de", i64 0
  store double 0.000000e+00, double* %3, align 8
  %"arrayref'de" = alloca double, align 8
  %4 = getelementptr double, double* %"arrayref'de", i64 0
  store double 0.000000e+00, double* %4, align 8
  %"arrayref6'de" = alloca double, align 8
  %5 = getelementptr double, double* %"arrayref6'de", i64 0
  store double 0.000000e+00, double* %5, align 8
  %6 = call {}*** @julia.get_pgcstack() #22
  %"'ipc10" = addrspacecast {} addrspace(10)* %"'1" to double addrspace(13)* addrspace(11)*, !dbg !622
  %"arrayptr32'ipl" = load double addrspace(13)*, double addrspace(13)* addrspace(11)* %"'ipc10", align 16, !dbg !622, !tbaa !96, !alias.scope !624, !noalias !627, !nonnull !0
  %"'ipc" = addrspacecast {} addrspace(10)* %"'" to double addrspace(13)* addrspace(11)*, !dbg !629
  %"arrayptr333'ipl" = load double addrspace(13)*, double addrspace(13)* addrspace(11)* %"'ipc", align 16, !dbg !629, !tbaa !96, !alias.scope !630, !noalias !633, !nonnull !0
  br i1 true, label %idxend, label %oob, !dbg !635

L24:                                              ; preds = %idxend
  %"'ipc18" = addrspacecast {} addrspace(10)* %"'2" to {} addrspace(11)*, !dbg !637
  %7 = call token (...) @llvm.julia.gc_preserve_begin({} addrspace(10)* %2, {} addrspace(10)* %"'2"), !dbg !640
  %8 = call token (...) @llvm.julia.gc_preserve_begin({} addrspace(10)* %17, {} addrspace(10)* %"'ip_phi7"), !dbg !642
  %9 = call {}* @julia.pointer_from_objref({} addrspace(11)* %"'ipc18"), !dbg !643
  %"'ipc15" = addrspacecast {} addrspace(10)* %"'ip_phi7" to {} addrspace(11)*, !dbg !646
  %10 = call {}* @julia.pointer_from_objref({} addrspace(11)* %"'ipc15"), !dbg !646
  %11 = shl i64 %arraylen14, 3, !dbg !649
  br i1 true, label %L47, label %L39, !dbg !651

L39:                                              ; preds = %L24
  unreachable

L47:                                              ; preds = %L24
  %"arrayptr20'il_phi" = extractvalue { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } %tapeArg, 1, !dbg !646
  %"arrayptr18'il_phi" = extractvalue { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } %tapeArg, 0, !dbg !643
  call void @llvm.julia.gc_preserve_end(token %8) #22, !dbg !657
  call void @llvm.julia.gc_preserve_end(token %7) #22, !dbg !658
  br label %L56, !dbg !659

L56:                                              ; preds = %idxend, %L47
  br label %invertL56, !dbg !660

oob:                                              ; preds = %top
  unreachable

idxend:                                           ; preds = %top
  %"'ipg" = getelementptr inbounds double, double addrspace(13)* %"arrayptr333'ipl", i64 2, !dbg !661
  %current_task128 = getelementptr inbounds {}**, {}*** %6, i64 -14
  %current_task1 = bitcast {}*** %current_task128 to {}**
  %F = extractvalue { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } %tapeArg, 16, !dbg !636
  %"box'mi" = extractvalue { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } %tapeArg, 14, !dbg !636
  %box = extractvalue { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } %tapeArg, 15, !dbg !636
  %"'ipc29" = bitcast {} addrspace(10)* %"box'mi" to double addrspace(10)*, !dbg !636
  %12 = extractvalue { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } %tapeArg, 11, !dbg !636
  %"'ip_phi5" = extractvalue { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } %tapeArg, 12, !dbg !636
  %13 = extractvalue { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } %tapeArg, 13, !dbg !636
  %"box12'mi" = extractvalue { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } %tapeArg, 9, !dbg !636
  %box12 = extractvalue { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } %tapeArg, 10, !dbg !636
  %"'ipc27" = bitcast {} addrspace(10)* %"box12'mi" to double addrspace(10)*, !dbg !636
  %14 = extractvalue { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } %tapeArg, 6, !dbg !636
  %"'ip_phi6" = extractvalue { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } %tapeArg, 7, !dbg !636
  %15 = extractvalue { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } %tapeArg, 8, !dbg !636
  %16 = extractvalue { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } %tapeArg, 5, !dbg !636
  %tapeArg25 = extractvalue { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } %tapeArg, 2, !dbg !639
  %17 = extractvalue { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } %tapeArg, 3, !dbg !639
  %"'ip_phi7" = extractvalue { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } %tapeArg, 4, !dbg !639
  %arraylen14 = extractvalue { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } %tapeArg, 17, !dbg !663
  %.not = icmp eq i64 %arraylen14, 0, !dbg !663
  br i1 %.not, label %L56, label %L24, !dbg !665

inverttop:                                        ; preds = %invertidxend
  %18 = load double, double addrspace(13)* %"arrayptr333'ipl", align 8, !dbg !629, !tbaa !122, !alias.scope !666, !noalias !669
  store double 0.000000e+00, double addrspace(13)* %"arrayptr333'ipl", align 8, !dbg !629, !tbaa !122, !alias.scope !666, !noalias !669
  %19 = load double, double* %"'de", align 8, !dbg !629
  %20 = fadd fast double %19, %18, !dbg !629
  store double %20, double* %"'de", align 8, !dbg !629
  %21 = load double, double* %"'de", align 8, !dbg !671
  store double 0.000000e+00, double* %"'de", align 8, !dbg !671
  %22 = fmul fast double %21, 1.000000e-01, !dbg !671
  %23 = load double, double* %"arrayref'de", align 8, !dbg !671
  %24 = fadd fast double %23, %22, !dbg !671
  store double %24, double* %"arrayref'de", align 8, !dbg !671
  %25 = load double, double* %"arrayref'de", align 8, !dbg !622
  store double 0.000000e+00, double* %"arrayref'de", align 8, !dbg !622
  %26 = load double, double addrspace(13)* %"arrayptr32'ipl", align 8, !dbg !622, !tbaa !122, !alias.scope !672, !noalias !675
  %27 = fadd fast double %26, %25, !dbg !622
  store double %27, double addrspace(13)* %"arrayptr32'ipl", align 8, !dbg !622, !tbaa !122, !alias.scope !672, !noalias !675
  fence syncscope("singlethread") seq_cst
  fence syncscope("singlethread") seq_cst
  ret void

invertL24:                                        ; preds = %__enzyme_memcpyadd_doubleda1sa1.exit
  call void @llvm.julia.gc_preserve_end(token %29), !dbg !642
  call void @llvm.julia.gc_preserve_end(token %28), !dbg !640
  br label %invertidxend

invertL47:                                        ; preds = %invertL56
  %28 = call token (...) @llvm.julia.gc_preserve_begin({} addrspace(10)* %2, {} addrspace(10)* %"'2"), !dbg !658
  %29 = call token (...) @llvm.julia.gc_preserve_begin({} addrspace(10)* %17, {} addrspace(10)* %"'ip_phi7"), !dbg !657
  %30 = extractvalue { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } %tapeArg, 0, !dbg !656
  %31 = extractvalue { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } %tapeArg, 1, !dbg !656
  %32 = bitcast i8* %30 to double*, !dbg !656
  %33 = bitcast i8* %31 to double*, !dbg !656
  %_unwrap = shl i64 %arraylen14, 3, !dbg !656
  %34 = udiv i64 %_unwrap, 8, !dbg !656
  %35 = icmp eq i64 %34, 0, !dbg !656
  br i1 %35, label %__enzyme_memcpyadd_doubleda1sa1.exit, label %for.body.i, !dbg !656

for.body.i:                                       ; preds = %for.body.i, %invertL47
  %idx.i = phi i64 [ 0, %invertL47 ], [ %idx.next.i, %for.body.i ], !dbg !656
  %dst.i.i = getelementptr inbounds double, double* %32, i64 %idx.i, !dbg !656
  %dst.i.l.i = load double, double* %dst.i.i, align 1, !dbg !656
  store double 0.000000e+00, double* %dst.i.i, align 1, !dbg !656
  %src.i.i = getelementptr inbounds double, double* %33, i64 %idx.i, !dbg !656
  %src.i.l.i = load double, double* %src.i.i, align 1, !dbg !656
  %36 = fadd fast double %src.i.l.i, %dst.i.l.i, !dbg !656
  store double %36, double* %src.i.i, align 1, !dbg !656
  %idx.next.i = add nuw i64 %idx.i, 1, !dbg !656
  %37 = icmp eq i64 %34, %idx.next.i, !dbg !656
  br i1 %37, label %__enzyme_memcpyadd_doubleda1sa1.exit, label %for.body.i, !dbg !656

__enzyme_memcpyadd_doubleda1sa1.exit:             ; preds = %invertL47, %for.body.i
  br label %invertL24

invertL56:                                        ; preds = %L56
  br i1 %.not, label %invertidxend, label %invertL47

invertidxend:                                     ; preds = %invertL56, %invertL24
  call void @diffejulia_getindex_842({} addrspace(10)* align 16 %1, {} addrspace(10)* align 16 %"'1", { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 } %tapeArg25), !dbg !639
  %38 = call {} addrspace(10)* ({} addrspace(10)* ({} addrspace(10)*, {} addrspace(10)**, i32)*, {} addrspace(10)*, ...) @julia.call({} addrspace(10)* ({} addrspace(10)*, {} addrspace(10)**, i32)* @ijl_apply_generic, {} addrspace(10)* @ejl_enz_runtime_generic_rev, {} addrspace(10)* addrspacecast ({}* inttoptr (i64 127923714912016 to {}*) to {} addrspace(10)*), {} addrspace(10)* @ejl_enz_val_1, {} addrspace(10)* addrspacecast ({}* inttoptr (i64 127923432288232 to {}*) to {} addrspace(10)*), {} addrspace(10)* %16, {} addrspace(10)* addrspacecast ({}* inttoptr (i64 127923593314480 to {}*) to {} addrspace(10)*), {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)* %0, {} addrspace(10)* %"'", {} addrspace(10)* %15, {} addrspace(10)* %"'ip_phi6", {} addrspace(10)* addrspacecast ({}* inttoptr (i64 127923780723616 to {}*) to {} addrspace(10)*), {} addrspace(10)* @ejl_jl_nothing), !dbg !636
  %39 = call {} addrspace(10)* ({} addrspace(10)* ({} addrspace(10)*, {} addrspace(10)**, i32)*, {} addrspace(10)*, ...) @julia.call({} addrspace(10)* ({} addrspace(10)*, {} addrspace(10)**, i32)* @ijl_apply_generic, {} addrspace(10)* @ejl_enz_runtime_generic_rev, {} addrspace(10)* addrspacecast ({}* inttoptr (i64 127923180983760 to {}*) to {} addrspace(10)*), {} addrspace(10)* @ejl_enz_val_1, {} addrspace(10)* addrspacecast ({}* inttoptr (i64 127923432288592 to {}*) to {} addrspace(10)*), {} addrspace(10)* %14, {} addrspace(10)* addrspacecast ({}* inttoptr (i64 127923559984512 to {}*) to {} addrspace(10)*), {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)* %box12, {} addrspace(10)* %"box12'mi", {} addrspace(10)* %13, {} addrspace(10)* %"'ip_phi5"), !dbg !636
  %40 = load double, double addrspace(10)* %"'ipc27", align 8, !dbg !636, !tbaa !176, !alias.scope !677, !noalias !680
  store double 0.000000e+00, double addrspace(10)* %"'ipc27", align 8, !dbg !636, !tbaa !176, !alias.scope !677, !noalias !680
  %41 = load double, double* %"arrayref6'de", align 8, !dbg !636
  %42 = fadd fast double %41, %40, !dbg !636
  store double %42, double* %"arrayref6'de", align 8, !dbg !636
  %43 = call {} addrspace(10)* ({} addrspace(10)* ({} addrspace(10)*, {} addrspace(10)**, i32)*, {} addrspace(10)*, ...) @julia.call({} addrspace(10)* ({} addrspace(10)*, {} addrspace(10)**, i32)* @ijl_apply_generic, {} addrspace(10)* @ejl_enz_runtime_generic_rev, {} addrspace(10)* addrspacecast ({}* inttoptr (i64 127923181517200 to {}*) to {} addrspace(10)*), {} addrspace(10)* @ejl_enz_val_1, {} addrspace(10)* addrspacecast ({}* inttoptr (i64 127923432288592 to {}*) to {} addrspace(10)*), {} addrspace(10)* %12, {} addrspace(10)* addrspacecast ({}* inttoptr (i64 127923559984512 to {}*) to {} addrspace(10)*), {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)* %box, {} addrspace(10)* %"box'mi", {} addrspace(10)* %F, {} addrspace(10)* @ejl_jl_nothing), !dbg !636
  %44 = load double, double addrspace(10)* %"'ipc29", align 8, !dbg !636, !tbaa !176, !alias.scope !682, !noalias !685
  store double 0.000000e+00, double addrspace(10)* %"'ipc29", align 8, !dbg !636, !tbaa !176, !alias.scope !682, !noalias !685
  %45 = load double, double* %"arrayref6'de", align 8, !dbg !636
  %46 = fadd fast double %45, %44, !dbg !636
  store double %46, double* %"arrayref6'de", align 8, !dbg !636
  %47 = load double, double* %"arrayref6'de", align 8, !dbg !661
  store double 0.000000e+00, double* %"arrayref6'de", align 8, !dbg !661
  %48 = load double, double addrspace(13)* %"'ipg", align 8, !dbg !661, !tbaa !122, !alias.scope !666, !noalias !687
  %49 = fadd fast double %48, %47, !dbg !661
  store double %49, double addrspace(13)* %"'ipg", align 8, !dbg !661, !tbaa !122, !alias.scope !666, !noalias !687
  br label %inverttop
}

after simplification :
; Function Attrs: mustprogress willreturn
define internal void @preprocess_julia_ab3_step_831({} addrspace(10)* nocapture noundef nonnull readonly align 16 dereferenceable(40) "enzyme_type"="{[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer}" "enzymejl_parmtype"="127923554507456" "enzymejl_parmtype_ref"="2" %0, {} addrspace(10)* noundef nonnull align 16 dereferenceable(40) "enzyme_type"="{[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer}" "enzymejl_parmtype"="127923554507456" "enzymejl_parmtype_ref"="2" %1, double "enzyme_type"="{[-1]:Float@double}" "enzymejl_parmtype"="127923625261792" "enzymejl_parmtype_ref"="0" %2, double "enzyme_type"="{[-1]:Float@double}" "enzymejl_parmtype"="127923625261792" "enzymejl_parmtype_ref"="0" %3) unnamed_addr #23 !dbg !726 {
top:
  %4 = call {}*** @julia.get_pgcstack() #24
  call void @llvm.dbg.value(metadata {} addrspace(10)* null, metadata !730, metadata !DIExpression(DW_OP_deref)) #24, !dbg !734
  call void @llvm.dbg.value(metadata {} addrspace(10)* null, metadata !729, metadata !DIExpression(DW_OP_deref)) #24, !dbg !734
  call void @llvm.dbg.value(metadata {} addrspace(10)* %0, metadata !729, metadata !DIExpression(DW_OP_deref)) #24, !dbg !734
  call void @llvm.dbg.value(metadata {} addrspace(10)* %1, metadata !730, metadata !DIExpression(DW_OP_deref)) #24, !dbg !734
  call void @llvm.dbg.value(metadata double %2, metadata !731, metadata !DIExpression()) #24, !dbg !734
  call void @llvm.dbg.value(metadata double %3, metadata !732, metadata !DIExpression()) #24, !dbg !734
  call void @llvm.dbg.value(metadata double undef, metadata !733, metadata !DIExpression()) #24, !dbg !734
  %current_task116 = getelementptr inbounds {}**, {}*** %4, i64 -14
  %current_task1 = bitcast {}*** %current_task116 to {}**
  %ptls_field17 = getelementptr inbounds {}**, {}*** %4, i64 2
  %5 = bitcast {}*** %ptls_field17 to i64***
  %ptls_load1819 = load i64**, i64*** %5, align 8, !tbaa !26
  %6 = getelementptr inbounds i64*, i64** %ptls_load1819, i64 2
  %safepoint = load i64*, i64** %6, align 8, !tbaa !30
  fence syncscope("singlethread") seq_cst
  call void @julia.safepoint(i64* %safepoint) #24, !dbg !735
  fence syncscope("singlethread") seq_cst
  %7 = addrspacecast {} addrspace(10)* %0 to double addrspace(13)* addrspace(11)*, !dbg !736
  %arrayptr20 = load double addrspace(13)*, double addrspace(13)* addrspace(11)* %7, align 16, !dbg !736, !tbaa !96, !alias.scope !738, !noalias !45, !nonnull !0
  %arrayref = load double, double addrspace(13)* %arrayptr20, align 8, !dbg !736, !tbaa !122, !alias.scope !125, !noalias !126
  %8 = getelementptr inbounds double, double addrspace(13)* %arrayptr20, i64 1, !dbg !741
  %arrayref4 = load double, double addrspace(13)* %8, align 8, !dbg !741, !tbaa !122, !alias.scope !125, !noalias !126
  %9 = fmul double %arrayref4, %arrayref4, !dbg !743
  %F = load atomic {} addrspace(10)*, {} addrspace(10)** inttoptr (i64 127923752824944 to {} addrspace(10)**) unordered, align 16, !dbg !744, !tbaa !174, !alias.scope !125, !noalias !126
  %box = call noalias nonnull dereferenceable(8) "enzyme_type"="{[-1]:Pointer, [-1,-1]:Float@double}" {} addrspace(10)* @julia.gc_alloc_obj({}** nonnull %current_task1, i64 noundef 8, {} addrspace(10)* noundef addrspacecast ({}* inttoptr (i64 127923625261792 to {}*) to {} addrspace(10)*)) #25, !dbg !744
  %10 = bitcast {} addrspace(10)* %box to double addrspace(10)*, !dbg !744
  store double %9, double addrspace(10)* %10, align 8, !dbg !744, !tbaa !176, !alias.scope !125, !noalias !745
  %11 = call nonnull "enzyme_type"="{[-1]:Pointer}" {} addrspace(10)* ({} addrspace(10)* ({} addrspace(10)*, {} addrspace(10)**, i32)*, {} addrspace(10)*, ...) @julia.call({} addrspace(10)* ({} addrspace(10)*, {} addrspace(10)**, i32)* noundef nonnull @ijl_apply_generic, {} addrspace(10)* noundef addrspacecast ({}* inttoptr (i64 127923559984512 to {}*) to {} addrspace(10)*), {} addrspace(10)* nofree nonnull %box, {} addrspace(10)* %F) #26, !dbg !744
  %12 = fadd double %arrayref, %2, !dbg !746
  %13 = fadd double %12, %3, !dbg !746
  %14 = fadd double %arrayref, %13, !dbg !750
  %box7 = call noalias nonnull dereferenceable(8) "enzyme_type"="{[-1]:Pointer, [-1,-1]:Float@double}" {} addrspace(10)* @julia.gc_alloc_obj({}** nonnull %current_task1, i64 noundef 8, {} addrspace(10)* noundef addrspacecast ({}* inttoptr (i64 127923625261792 to {}*) to {} addrspace(10)*)) #25, !dbg !744
  %15 = bitcast {} addrspace(10)* %box7 to double addrspace(10)*, !dbg !744
  store double %14, double addrspace(10)* %15, align 8, !dbg !744, !tbaa !176, !alias.scope !125, !noalias !745
  %16 = call nonnull "enzyme_type"="{[-1]:Pointer}" {} addrspace(10)* ({} addrspace(10)* ({} addrspace(10)*, {} addrspace(10)**, i32)*, {} addrspace(10)*, ...) @julia.call({} addrspace(10)* ({} addrspace(10)*, {} addrspace(10)**, i32)* noundef nonnull @ijl_apply_generic, {} addrspace(10)* noundef addrspacecast ({}* inttoptr (i64 127923553411328 to {}*) to {} addrspace(10)*), {} addrspace(10)* nonnull %11, {} addrspace(10)* nofree nonnull %box7) #26, !dbg !744
  %17 = call nonnull "enzyme_type"="{[-1]:Pointer}" {} addrspace(10)* ({} addrspace(10)* ({} addrspace(10)*, {} addrspace(10)**, i32)*, {} addrspace(10)*, ...) @julia.call({} addrspace(10)* ({} addrspace(10)*, {} addrspace(10)**, i32)* noundef nonnull @ijl_apply_generic, {} addrspace(10)* noundef addrspacecast ({}* inttoptr (i64 127923593314480 to {}*) to {} addrspace(10)*), {} addrspace(10)* nofree nonnull %1, {} addrspace(10)* nonnull %16, {} addrspace(10)* addrspacecast ({}* inttoptr (i64 127923780723040 to {}*) to {} addrspace(10)*)) #26, !dbg !744
  %18 = addrspacecast {} addrspace(10)* %1 to double addrspace(13)* addrspace(11)*, !dbg !752
  %arrayptr921 = load double addrspace(13)*, double addrspace(13)* addrspace(11)* %18, align 16, !dbg !752, !tbaa !96, !alias.scope !738, !noalias !45, !nonnull !0
  %arrayref10 = load double, double addrspace(13)* %arrayptr921, align 8, !dbg !752, !tbaa !122, !alias.scope !125, !noalias !126
  %arrayptr1222 = load double addrspace(13)*, double addrspace(13)* addrspace(11)* %7, align 16, !dbg !754, !tbaa !96, !alias.scope !738, !noalias !45, !nonnull !0
  store double %arrayref10, double addrspace(13)* %arrayptr1222, align 8, !dbg !754, !tbaa !122, !alias.scope !125, !noalias !745
  ret void, !dbg !755
}

; Function Attrs: mustprogress willreturn
define internal { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* } @augmented_julia_ab3_step_831({} addrspace(10)* nocapture noundef nonnull readonly align 16 dereferenceable(40) "enzyme_type"="{[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer}" "enzymejl_parmtype"="127923554507456" "enzymejl_parmtype_ref"="2" %0, {} addrspace(10)* nocapture align 16 "enzyme_type"="{[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer}" "enzymejl_parmtype"="127923554507456" "enzymejl_parmtype_ref"="2" %"'", {} addrspace(10)* noundef nonnull align 16 dereferenceable(40) "enzyme_type"="{[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer}" "enzymejl_parmtype"="127923554507456" "enzymejl_parmtype_ref"="2" %1, {} addrspace(10)* align 16 "enzyme_type"="{[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer}" "enzymejl_parmtype"="127923554507456" "enzymejl_parmtype_ref"="2" %"'1", double "enzyme_type"="{[-1]:Float@double}" "enzymejl_parmtype"="127923625261792" "enzymejl_parmtype_ref"="0" %2, double "enzyme_type"="{[-1]:Float@double}" "enzymejl_parmtype"="127923625261792" "enzymejl_parmtype_ref"="0" %3) unnamed_addr #23 !dbg !756 {
top:
  %4 = alloca { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }, align 8
  %5 = getelementptr { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }, { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }* %4, i64 0, i32 0
  store {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)** %5, align 8
  %6 = getelementptr { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }, { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }* %4, i64 0, i32 1
  store {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)** %6, align 8
  %7 = getelementptr { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }, { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }* %4, i64 0, i32 2
  store {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)** %7, align 8
  %8 = getelementptr { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }, { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }* %4, i64 0, i32 3
  store {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)** %8, align 8
  %9 = getelementptr { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }, { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }* %4, i64 0, i32 4
  store {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)** %9, align 8
  %10 = getelementptr { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }, { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }* %4, i64 0, i32 5
  store {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)** %10, align 8
  %11 = getelementptr { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }, { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }* %4, i64 0, i32 6
  store {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)** %11, align 8
  %12 = getelementptr { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }, { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }* %4, i64 0, i32 7
  store {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)** %12, align 8
  %13 = getelementptr { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }, { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }* %4, i64 0, i32 8
  store {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)** %13, align 8
  %14 = getelementptr { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }, { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }* %4, i64 0, i32 9
  store {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)** %14, align 8
  %15 = getelementptr { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }, { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }* %4, i64 0, i32 10
  store {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)** %15, align 8
  %16 = getelementptr { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }, { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }* %4, i64 0, i32 12
  store {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)** %16, align 8
  %17 = call {}*** @julia.get_pgcstack() #24
  %current_task116 = getelementptr inbounds {}**, {}*** %17, i64 -14
  %current_task1 = bitcast {}*** %current_task116 to {}**
  %ptls_field17 = getelementptr inbounds {}**, {}*** %17, i64 2
  %18 = bitcast {}*** %ptls_field17 to i64***
  %ptls_load1819 = load i64**, i64*** %18, align 8, !tbaa !26, !alias.scope !764, !noalias !767
  %19 = getelementptr inbounds i64*, i64** %ptls_load1819, i64 2
  %safepoint = load i64*, i64** %19, align 8, !tbaa !30, !alias.scope !769, !noalias !772
  fence syncscope("singlethread") seq_cst
  call void @julia.safepoint(i64* %safepoint) #24, !dbg !774
  fence syncscope("singlethread") seq_cst
  %"'ipc" = addrspacecast {} addrspace(10)* %"'" to double addrspace(13)* addrspace(11)*, !dbg !775
  %20 = addrspacecast {} addrspace(10)* %0 to double addrspace(13)* addrspace(11)*, !dbg !775
  %"arrayptr20'ipl" = load double addrspace(13)*, double addrspace(13)* addrspace(11)* %"'ipc", align 16, !dbg !775, !tbaa !96, !alias.scope !777, !noalias !782, !nonnull !0
  %arrayptr20 = load double addrspace(13)*, double addrspace(13)* addrspace(11)* %20, align 16, !dbg !775, !tbaa !96, !alias.scope !784, !noalias !785, !nonnull !0
  %arrayref = load double, double addrspace(13)* %arrayptr20, align 8, !dbg !775, !tbaa !122, !alias.scope !786, !noalias !789
  %21 = getelementptr inbounds double, double addrspace(13)* %arrayptr20, i64 1, !dbg !791
  %arrayref4 = load double, double addrspace(13)* %21, align 8, !dbg !791, !tbaa !122, !alias.scope !786, !noalias !789
  %22 = getelementptr inbounds { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }, { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }* %4, i32 0, i32 11, !dbg !793
  store double %arrayref4, double* %22, align 8, !dbg !793
  %23 = fmul double %arrayref4, %arrayref4, !dbg !793
  %F = load atomic {} addrspace(10)*, {} addrspace(10)** inttoptr (i64 127923752824944 to {} addrspace(10)**) unordered, align 16, !dbg !794, !tbaa !174, !alias.scope !795, !noalias !798
  %24 = getelementptr inbounds { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }, { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }* %4, i32 0, i32 12, !dbg !794
  store {} addrspace(10)* %F, {} addrspace(10)** %24, align 8, !dbg !794
  %"box'mi" = call noalias nonnull dereferenceable(8) "enzyme_type"="{[-1]:Pointer, [-1,-1]:Float@double}" {} addrspace(10)* @julia.gc_alloc_obj({}** nonnull %current_task1, i64 noundef 8, {} addrspace(10)* noundef addrspacecast ({}* inttoptr (i64 127923574262496 to {}*) to {} addrspace(10)*)) #25, !dbg !794
  %25 = getelementptr inbounds { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }, { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }* %4, i32 0, i32 9, !dbg !794
  store {} addrspace(10)* %"box'mi", {} addrspace(10)** %25, align 8, !dbg !794
  %26 = bitcast {} addrspace(10)* %"box'mi" to i8 addrspace(10)*, !dbg !794
  call void @llvm.memset.p10i8.i64(i8 addrspace(10)* nonnull dereferenceable(8) dereferenceable_or_null(8) %26, i8 0, i64 8, i1 false), !dbg !794
  %box = call noalias nonnull dereferenceable(8) "enzyme_type"="{[-1]:Pointer, [-1,-1]:Float@double}" {} addrspace(10)* @julia.gc_alloc_obj({}** nonnull %current_task1, i64 noundef 8, {} addrspace(10)* noundef addrspacecast ({}* inttoptr (i64 127923625261792 to {}*) to {} addrspace(10)*)) #25, !dbg !794
  %27 = getelementptr inbounds { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }, { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }* %4, i32 0, i32 10, !dbg !794
  store {} addrspace(10)* %box, {} addrspace(10)** %27, align 8, !dbg !794
  %28 = bitcast {} addrspace(10)* %box to double addrspace(10)*, !dbg !794
  store double %23, double addrspace(10)* %28, align 8, !dbg !794, !tbaa !176, !alias.scope !800, !noalias !803
  %29 = call {} addrspace(10)* ({} addrspace(10)* ({} addrspace(10)*, {} addrspace(10)**, i32)*, {} addrspace(10)*, ...) @julia.call({} addrspace(10)* ({} addrspace(10)*, {} addrspace(10)**, i32)* @ijl_apply_generic, {} addrspace(10)* @ejl_enz_runtime_generic_augfwd, {} addrspace(10)* addrspacecast ({}* inttoptr (i64 127923181517200 to {}*) to {} addrspace(10)*), {} addrspace(10)* @ejl_enz_val_1, {} addrspace(10)* addrspacecast ({}* inttoptr (i64 127923432288592 to {}*) to {} addrspace(10)*), {} addrspace(10)* addrspacecast ({}* inttoptr (i64 127923432288224 to {}*) to {} addrspace(10)*), {} addrspace(10)* addrspacecast ({}* inttoptr (i64 127923559984512 to {}*) to {} addrspace(10)*), {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)* %box, {} addrspace(10)* %"box'mi", {} addrspace(10)* %F, {} addrspace(10)* @ejl_jl_nothing), !dbg !794
  %30 = addrspacecast {} addrspace(10)* %29 to {} addrspace(11)*, !dbg !794
  %31 = bitcast {} addrspace(11)* %30 to [3 x {} addrspace(10)*] addrspace(11)*, !dbg !794
  %32 = getelementptr inbounds [3 x {} addrspace(10)*], [3 x {} addrspace(10)*] addrspace(11)* %31, i64 0, i64 1, !dbg !794
  %33 = load {} addrspace(10)*, {} addrspace(10)* addrspace(11)* %32, align 8, !dbg !794
  %34 = getelementptr inbounds { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }, { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }* %4, i32 0, i32 7, !dbg !794
  store {} addrspace(10)* %33, {} addrspace(10)** %34, align 8, !dbg !794
  %35 = getelementptr inbounds [3 x {} addrspace(10)*], [3 x {} addrspace(10)*] addrspace(11)* %31, i64 0, i64 2, !dbg !794
  %36 = load {} addrspace(10)*, {} addrspace(10)* addrspace(11)* %35, align 8, !dbg !794
  %37 = getelementptr inbounds { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }, { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }* %4, i32 0, i32 6, !dbg !794
  store {} addrspace(10)* %36, {} addrspace(10)** %37, align 8, !dbg !794
  %38 = getelementptr inbounds [3 x {} addrspace(10)*], [3 x {} addrspace(10)*] addrspace(11)* %31, i64 0, i64 0, !dbg !794
  %39 = load {} addrspace(10)*, {} addrspace(10)* addrspace(11)* %38, align 8, !dbg !794
  %40 = getelementptr inbounds { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }, { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }* %4, i32 0, i32 8, !dbg !805
  store {} addrspace(10)* %39, {} addrspace(10)** %40, align 8, !dbg !805
  %41 = fadd double %arrayref, %2, !dbg !805
  %42 = fadd double %41, %3, !dbg !805
  %43 = fadd double %arrayref, %42, !dbg !809
  %"box7'mi" = call noalias nonnull dereferenceable(8) "enzyme_type"="{[-1]:Pointer, [-1,-1]:Float@double}" {} addrspace(10)* @julia.gc_alloc_obj({}** nonnull %current_task1, i64 noundef 8, {} addrspace(10)* noundef addrspacecast ({}* inttoptr (i64 127923574262496 to {}*) to {} addrspace(10)*)) #25, !dbg !794
  %44 = getelementptr inbounds { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }, { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }* %4, i32 0, i32 4, !dbg !794
  store {} addrspace(10)* %"box7'mi", {} addrspace(10)** %44, align 8, !dbg !794
  %45 = bitcast {} addrspace(10)* %"box7'mi" to i8 addrspace(10)*, !dbg !794
  call void @llvm.memset.p10i8.i64(i8 addrspace(10)* nonnull dereferenceable(8) dereferenceable_or_null(8) %45, i8 0, i64 8, i1 false), !dbg !794
  %box7 = call noalias nonnull dereferenceable(8) "enzyme_type"="{[-1]:Pointer, [-1,-1]:Float@double}" {} addrspace(10)* @julia.gc_alloc_obj({}** nonnull %current_task1, i64 noundef 8, {} addrspace(10)* noundef addrspacecast ({}* inttoptr (i64 127923625261792 to {}*) to {} addrspace(10)*)) #25, !dbg !794
  %46 = getelementptr inbounds { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }, { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }* %4, i32 0, i32 5, !dbg !794
  store {} addrspace(10)* %box7, {} addrspace(10)** %46, align 8, !dbg !794
  %47 = bitcast {} addrspace(10)* %box7 to double addrspace(10)*, !dbg !794
  store double %43, double addrspace(10)* %47, align 8, !dbg !794, !tbaa !176, !alias.scope !811, !noalias !814
  %48 = call {} addrspace(10)* ({} addrspace(10)* ({} addrspace(10)*, {} addrspace(10)**, i32)*, {} addrspace(10)*, ...) @julia.call({} addrspace(10)* ({} addrspace(10)*, {} addrspace(10)**, i32)* @ijl_apply_generic, {} addrspace(10)* @ejl_enz_runtime_generic_augfwd, {} addrspace(10)* addrspacecast ({}* inttoptr (i64 127923180983760 to {}*) to {} addrspace(10)*), {} addrspace(10)* @ejl_enz_val_1, {} addrspace(10)* addrspacecast ({}* inttoptr (i64 127923432288592 to {}*) to {} addrspace(10)*), {} addrspace(10)* addrspacecast ({}* inttoptr (i64 127923432288224 to {}*) to {} addrspace(10)*), {} addrspace(10)* addrspacecast ({}* inttoptr (i64 127923553411328 to {}*) to {} addrspace(10)*), {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)* %39, {} addrspace(10)* %33, {} addrspace(10)* %box7, {} addrspace(10)* %"box7'mi"), !dbg !794
  %49 = addrspacecast {} addrspace(10)* %48 to {} addrspace(11)*, !dbg !794
  %50 = bitcast {} addrspace(11)* %49 to [3 x {} addrspace(10)*] addrspace(11)*, !dbg !794
  %51 = getelementptr inbounds [3 x {} addrspace(10)*], [3 x {} addrspace(10)*] addrspace(11)* %50, i64 0, i64 1, !dbg !794
  %52 = load {} addrspace(10)*, {} addrspace(10)* addrspace(11)* %51, align 8, !dbg !794
  %53 = getelementptr inbounds { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }, { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }* %4, i32 0, i32 2, !dbg !794
  store {} addrspace(10)* %52, {} addrspace(10)** %53, align 8, !dbg !794
  %54 = getelementptr inbounds [3 x {} addrspace(10)*], [3 x {} addrspace(10)*] addrspace(11)* %50, i64 0, i64 2, !dbg !794
  %55 = load {} addrspace(10)*, {} addrspace(10)* addrspace(11)* %54, align 8, !dbg !794
  %56 = getelementptr inbounds { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }, { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }* %4, i32 0, i32 1, !dbg !794
  store {} addrspace(10)* %55, {} addrspace(10)** %56, align 8, !dbg !794
  %57 = getelementptr inbounds [3 x {} addrspace(10)*], [3 x {} addrspace(10)*] addrspace(11)* %50, i64 0, i64 0, !dbg !794
  %58 = load {} addrspace(10)*, {} addrspace(10)* addrspace(11)* %57, align 8, !dbg !794
  %59 = getelementptr inbounds { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }, { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }* %4, i32 0, i32 3, !dbg !794
  store {} addrspace(10)* %58, {} addrspace(10)** %59, align 8, !dbg !794
  %60 = call {} addrspace(10)* ({} addrspace(10)* ({} addrspace(10)*, {} addrspace(10)**, i32)*, {} addrspace(10)*, ...) @julia.call({} addrspace(10)* ({} addrspace(10)*, {} addrspace(10)**, i32)* @ijl_apply_generic, {} addrspace(10)* @ejl_enz_runtime_generic_augfwd, {} addrspace(10)* addrspacecast ({}* inttoptr (i64 127923714912016 to {}*) to {} addrspace(10)*), {} addrspace(10)* @ejl_enz_val_1, {} addrspace(10)* addrspacecast ({}* inttoptr (i64 127923432288232 to {}*) to {} addrspace(10)*), {} addrspace(10)* addrspacecast ({}* inttoptr (i64 127923432288224 to {}*) to {} addrspace(10)*), {} addrspace(10)* addrspacecast ({}* inttoptr (i64 127923593314480 to {}*) to {} addrspace(10)*), {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)* %1, {} addrspace(10)* %"'1", {} addrspace(10)* %58, {} addrspace(10)* %52, {} addrspace(10)* addrspacecast ({}* inttoptr (i64 127923780723040 to {}*) to {} addrspace(10)*), {} addrspace(10)* @ejl_jl_nothing), !dbg !794
  %61 = addrspacecast {} addrspace(10)* %60 to {} addrspace(11)*, !dbg !794
  %62 = bitcast {} addrspace(11)* %61 to [3 x {} addrspace(10)*] addrspace(11)*, !dbg !794
  %63 = getelementptr inbounds [3 x {} addrspace(10)*], [3 x {} addrspace(10)*] addrspace(11)* %62, i64 0, i64 2, !dbg !794
  %64 = load {} addrspace(10)*, {} addrspace(10)* addrspace(11)* %63, align 8, !dbg !794
  %65 = getelementptr inbounds { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }, { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }* %4, i32 0, i32 0, !dbg !794
  store {} addrspace(10)* %64, {} addrspace(10)** %65, align 8, !dbg !794
  %66 = getelementptr inbounds [3 x {} addrspace(10)*], [3 x {} addrspace(10)*] addrspace(11)* %62, i64 0, i64 0, !dbg !794
  %67 = load {} addrspace(10)*, {} addrspace(10)* addrspace(11)* %66, align 8, !dbg !794
  %"'ipc3" = addrspacecast {} addrspace(10)* %"'1" to double addrspace(13)* addrspace(11)*, !dbg !816
  %68 = addrspacecast {} addrspace(10)* %1 to double addrspace(13)* addrspace(11)*, !dbg !816
  %"arrayptr921'ipl" = load double addrspace(13)*, double addrspace(13)* addrspace(11)* %"'ipc3", align 16, !dbg !816, !tbaa !96, !alias.scope !818, !noalias !821, !nonnull !0
  %arrayptr921 = load double addrspace(13)*, double addrspace(13)* addrspace(11)* %68, align 16, !dbg !816, !tbaa !96, !alias.scope !823, !noalias !824, !nonnull !0
  %arrayref10 = load double, double addrspace(13)* %arrayptr921, align 8, !dbg !816, !tbaa !122, !alias.scope !825, !noalias !828
  %"arrayptr1222'ipl" = load double addrspace(13)*, double addrspace(13)* addrspace(11)* %"'ipc", align 16, !dbg !830, !tbaa !96, !alias.scope !777, !noalias !782, !nonnull !0
  %arrayptr1222 = load double addrspace(13)*, double addrspace(13)* addrspace(11)* %20, align 16, !dbg !830, !tbaa !96, !alias.scope !784, !noalias !785, !nonnull !0
  store double %arrayref10, double addrspace(13)* %arrayptr1222, align 8, !dbg !830, !tbaa !122, !alias.scope !831, !noalias !834
  %69 = load { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }, { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }* %4, align 8, !dbg !836
  ret { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* } %69, !dbg !836
}

; Function Attrs: mustprogress willreturn
define internal void @diffejulia_ab3_step_831({} addrspace(10)* nocapture readonly align 16 dereferenceable(40) "enzyme_type"="{[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer}" "enzymejl_parmtype"="127923554507456" "enzymejl_parmtype_ref"="2" %0, {} addrspace(10)* nocapture align 16 "enzyme_type"="{[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer}" "enzymejl_parmtype"="127923554507456" "enzymejl_parmtype_ref"="2" %"'", {} addrspace(10)* align 16 dereferenceable(40) "enzyme_type"="{[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer}" "enzymejl_parmtype"="127923554507456" "enzymejl_parmtype_ref"="2" %1, {} addrspace(10)* align 16 "enzyme_type"="{[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer}" "enzymejl_parmtype"="127923554507456" "enzymejl_parmtype_ref"="2" %"'1", double "enzyme_type"="{[-1]:Float@double}" "enzymejl_parmtype"="127923625261792" "enzymejl_parmtype_ref"="0" %2, double "enzyme_type"="{[-1]:Float@double}" "enzymejl_parmtype"="127923625261792" "enzymejl_parmtype_ref"="0" %3, { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* } %tapeArg) unnamed_addr #23 !dbg !837 {
top:
  %"arrayref10'de" = alloca double, align 8
  %4 = getelementptr double, double* %"arrayref10'de", i64 0
  store double 0.000000e+00, double* %4, align 8
  %"'de" = alloca double, align 8
  %5 = getelementptr double, double* %"'de", i64 0
  store double 0.000000e+00, double* %5, align 8
  %"arrayref'de" = alloca double, align 8
  %6 = getelementptr double, double* %"arrayref'de", i64 0
  store double 0.000000e+00, double* %6, align 8
  %"'de8" = alloca double, align 8
  %7 = getelementptr double, double* %"'de8", i64 0
  store double 0.000000e+00, double* %7, align 8
  %"'de10" = alloca double, align 8
  %8 = getelementptr double, double* %"'de10", i64 0
  store double 0.000000e+00, double* %8, align 8
  %"'de13" = alloca double, align 8
  %9 = getelementptr double, double* %"'de13", i64 0
  store double 0.000000e+00, double* %9, align 8
  %"arrayref4'de" = alloca double, align 8
  %10 = getelementptr double, double* %"arrayref4'de", i64 0
  store double 0.000000e+00, double* %10, align 8
  %11 = call {}*** @julia.get_pgcstack() #24
  %current_task116 = getelementptr inbounds {}**, {}*** %11, i64 -14
  %current_task1 = bitcast {}*** %current_task116 to {}**
  %"'ipc" = addrspacecast {} addrspace(10)* %"'" to double addrspace(13)* addrspace(11)*, !dbg !845
  %"arrayptr20'ipl" = load double addrspace(13)*, double addrspace(13)* addrspace(11)* %"'ipc", align 16, !dbg !845, !tbaa !96, !alias.scope !847, !noalias !850, !nonnull !0
  %"'ipg" = getelementptr inbounds double, double addrspace(13)* %"arrayptr20'ipl", i64 1, !dbg !852
  %arrayref4 = extractvalue { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* } %tapeArg, 11, !dbg !854
  %F = extractvalue { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* } %tapeArg, 12, !dbg !855
  %"box'mi" = extractvalue { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* } %tapeArg, 9, !dbg !855
  %box = extractvalue { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* } %tapeArg, 10, !dbg !855
  %"'ipc12" = bitcast {} addrspace(10)* %"box'mi" to double addrspace(10)*, !dbg !855
  %12 = extractvalue { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* } %tapeArg, 6, !dbg !855
  %"'ip_phi" = extractvalue { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* } %tapeArg, 7, !dbg !855
  %13 = extractvalue { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* } %tapeArg, 8, !dbg !855
  %"box7'mi" = extractvalue { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* } %tapeArg, 4, !dbg !855
  %box7 = extractvalue { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* } %tapeArg, 5, !dbg !855
  %"'ipc5" = bitcast {} addrspace(10)* %"box7'mi" to double addrspace(10)*, !dbg !855
  %14 = extractvalue { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* } %tapeArg, 1, !dbg !855
  %"'ip_phi2" = extractvalue { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* } %tapeArg, 2, !dbg !855
  %15 = extractvalue { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* } %tapeArg, 3, !dbg !855
  %16 = extractvalue { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* } %tapeArg, 0, !dbg !855
  %"'ipc3" = addrspacecast {} addrspace(10)* %"'1" to double addrspace(13)* addrspace(11)*, !dbg !856
  %"arrayptr921'ipl" = load double addrspace(13)*, double addrspace(13)* addrspace(11)* %"'ipc3", align 16, !dbg !856, !tbaa !96, !alias.scope !858, !noalias !861, !nonnull !0
  %"arrayptr1222'ipl" = load double addrspace(13)*, double addrspace(13)* addrspace(11)* %"'ipc", align 16, !dbg !863, !tbaa !96, !alias.scope !847, !noalias !850, !nonnull !0
  br label %inverttop, !dbg !864

inverttop:                                        ; preds = %top
  %17 = load double, double addrspace(13)* %"arrayptr1222'ipl", align 8, !dbg !863, !tbaa !122, !alias.scope !865, !noalias !868
  store double 0.000000e+00, double addrspace(13)* %"arrayptr1222'ipl", align 8, !dbg !863, !tbaa !122, !alias.scope !865, !noalias !868
  %18 = load double, double* %"arrayref10'de", align 8, !dbg !863
  %19 = fadd fast double %18, %17, !dbg !863
  store double %19, double* %"arrayref10'de", align 8, !dbg !863
  %20 = load double, double* %"arrayref10'de", align 8, !dbg !856
  store double 0.000000e+00, double* %"arrayref10'de", align 8, !dbg !856
  %21 = load double, double addrspace(13)* %"arrayptr921'ipl", align 8, !dbg !856, !tbaa !122, !alias.scope !870, !noalias !873
  %22 = fadd fast double %21, %20, !dbg !856
  store double %22, double addrspace(13)* %"arrayptr921'ipl", align 8, !dbg !856, !tbaa !122, !alias.scope !870, !noalias !873
  %23 = call {} addrspace(10)* ({} addrspace(10)* ({} addrspace(10)*, {} addrspace(10)**, i32)*, {} addrspace(10)*, ...) @julia.call({} addrspace(10)* ({} addrspace(10)*, {} addrspace(10)**, i32)* @ijl_apply_generic, {} addrspace(10)* @ejl_enz_runtime_generic_rev, {} addrspace(10)* addrspacecast ({}* inttoptr (i64 127923714912016 to {}*) to {} addrspace(10)*), {} addrspace(10)* @ejl_enz_val_1, {} addrspace(10)* addrspacecast ({}* inttoptr (i64 127923432288232 to {}*) to {} addrspace(10)*), {} addrspace(10)* %16, {} addrspace(10)* addrspacecast ({}* inttoptr (i64 127923593314480 to {}*) to {} addrspace(10)*), {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)* %1, {} addrspace(10)* %"'1", {} addrspace(10)* %15, {} addrspace(10)* %"'ip_phi2", {} addrspace(10)* addrspacecast ({}* inttoptr (i64 127923780723040 to {}*) to {} addrspace(10)*), {} addrspace(10)* @ejl_jl_nothing), !dbg !855
  %24 = call {} addrspace(10)* ({} addrspace(10)* ({} addrspace(10)*, {} addrspace(10)**, i32)*, {} addrspace(10)*, ...) @julia.call({} addrspace(10)* ({} addrspace(10)*, {} addrspace(10)**, i32)* @ijl_apply_generic, {} addrspace(10)* @ejl_enz_runtime_generic_rev, {} addrspace(10)* addrspacecast ({}* inttoptr (i64 127923180983760 to {}*) to {} addrspace(10)*), {} addrspace(10)* @ejl_enz_val_1, {} addrspace(10)* addrspacecast ({}* inttoptr (i64 127923432288592 to {}*) to {} addrspace(10)*), {} addrspace(10)* %14, {} addrspace(10)* addrspacecast ({}* inttoptr (i64 127923553411328 to {}*) to {} addrspace(10)*), {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)* %13, {} addrspace(10)* %"'ip_phi", {} addrspace(10)* %box7, {} addrspace(10)* %"box7'mi"), !dbg !855
  %25 = load double, double addrspace(10)* %"'ipc5", align 8, !dbg !855, !tbaa !176, !alias.scope !875, !noalias !878
  store double 0.000000e+00, double addrspace(10)* %"'ipc5", align 8, !dbg !855, !tbaa !176, !alias.scope !875, !noalias !878
  %26 = load double, double* %"'de", align 8, !dbg !855
  %27 = fadd fast double %26, %25, !dbg !855
  store double %27, double* %"'de", align 8, !dbg !855
  %28 = load double, double* %"'de", align 8, !dbg !880
  store double 0.000000e+00, double* %"'de", align 8, !dbg !880
  %29 = load double, double* %"arrayref'de", align 8, !dbg !880
  %30 = fadd fast double %29, %28, !dbg !880
  store double %30, double* %"arrayref'de", align 8, !dbg !880
  %31 = load double, double* %"'de8", align 8, !dbg !880
  %32 = fadd fast double %31, %28, !dbg !880
  store double %32, double* %"'de8", align 8, !dbg !880
  %33 = load double, double* %"'de8", align 8, !dbg !885
  store double 0.000000e+00, double* %"'de8", align 8, !dbg !885
  %34 = load double, double* %"'de10", align 8, !dbg !885
  %35 = fadd fast double %34, %33, !dbg !885
  store double %35, double* %"'de10", align 8, !dbg !885
  %36 = load double, double* %"'de10", align 8, !dbg !885
  store double 0.000000e+00, double* %"'de10", align 8, !dbg !885
  %37 = load double, double* %"arrayref'de", align 8, !dbg !885
  %38 = fadd fast double %37, %36, !dbg !885
  store double %38, double* %"arrayref'de", align 8, !dbg !885
  %39 = call {} addrspace(10)* ({} addrspace(10)* ({} addrspace(10)*, {} addrspace(10)**, i32)*, {} addrspace(10)*, ...) @julia.call({} addrspace(10)* ({} addrspace(10)*, {} addrspace(10)**, i32)* @ijl_apply_generic, {} addrspace(10)* @ejl_enz_runtime_generic_rev, {} addrspace(10)* addrspacecast ({}* inttoptr (i64 127923181517200 to {}*) to {} addrspace(10)*), {} addrspace(10)* @ejl_enz_val_1, {} addrspace(10)* addrspacecast ({}* inttoptr (i64 127923432288592 to {}*) to {} addrspace(10)*), {} addrspace(10)* %12, {} addrspace(10)* addrspacecast ({}* inttoptr (i64 127923559984512 to {}*) to {} addrspace(10)*), {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)* %box, {} addrspace(10)* %"box'mi", {} addrspace(10)* %F, {} addrspace(10)* @ejl_jl_nothing), !dbg !855
  %40 = load double, double addrspace(10)* %"'ipc12", align 8, !dbg !855, !tbaa !176, !alias.scope !886, !noalias !889
  store double 0.000000e+00, double addrspace(10)* %"'ipc12", align 8, !dbg !855, !tbaa !176, !alias.scope !886, !noalias !889
  %41 = load double, double* %"'de13", align 8, !dbg !855
  %42 = fadd fast double %41, %40, !dbg !855
  store double %42, double* %"'de13", align 8, !dbg !855
  %43 = load double, double* %"'de13", align 8, !dbg !854
  store double 0.000000e+00, double* %"'de13", align 8, !dbg !854
  %44 = fmul fast double %43, %arrayref4, !dbg !854
  %45 = load double, double* %"arrayref4'de", align 8, !dbg !854
  %46 = fadd fast double %45, %44, !dbg !854
  store double %46, double* %"arrayref4'de", align 8, !dbg !854
  %47 = fmul fast double %43, %arrayref4, !dbg !854
  %48 = load double, double* %"arrayref4'de", align 8, !dbg !854
  %49 = fadd fast double %48, %47, !dbg !854
  store double %49, double* %"arrayref4'de", align 8, !dbg !854
  %50 = load double, double* %"arrayref4'de", align 8, !dbg !852
  store double 0.000000e+00, double* %"arrayref4'de", align 8, !dbg !852
  %51 = load double, double addrspace(13)* %"'ipg", align 8, !dbg !852, !tbaa !122, !alias.scope !891, !noalias !894
  %52 = fadd fast double %51, %50, !dbg !852
  store double %52, double addrspace(13)* %"'ipg", align 8, !dbg !852, !tbaa !122, !alias.scope !891, !noalias !894
  %53 = load double, double* %"arrayref'de", align 8, !dbg !845
  store double 0.000000e+00, double* %"arrayref'de", align 8, !dbg !845
  %54 = load double, double addrspace(13)* %"arrayptr20'ipl", align 8, !dbg !845, !tbaa !122, !alias.scope !891, !noalias !894
  %55 = fadd fast double %54, %53, !dbg !845
  store double %55, double addrspace(13)* %"arrayptr20'ipl", align 8, !dbg !845, !tbaa !122, !alias.scope !891, !noalias !894
  fence syncscope("singlethread") seq_cst
  fence syncscope("singlethread") seq_cst
  ret void
}

; Function Attrs: mustprogress willreturn
define internal void @diffejulia_forward_model_cost_827({} addrspace(10)* noundef nonnull align 16 dereferenceable(40) "enzyme_type"="{[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer}" "enzymejl_parmtype"="127923554507456" "enzymejl_parmtype_ref"="2" %0, {} addrspace(10)* align 16 "enzyme_type"="{[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer}" "enzymejl_parmtype"="127923554507456" "enzymejl_parmtype_ref"="2" %"'", i64 signext "enzyme_inactive" "enzyme_type"="{[-1]:Integer}" "enzymejl_parmtype"="127923625262592" "enzymejl_parmtype_ref"="0" %1, double "enzyme_type"="{[-1]:Float@double}" "enzymejl_parmtype"="127923625261792" "enzymejl_parmtype_ref"="0" %2, double "enzyme_type"="{[-1]:Float@double}" "enzymejl_parmtype"="127923625261792" "enzymejl_parmtype_ref"="0" %3, double "enzyme_type"="{[-1]:Float@double}" "enzymejl_parmtype"="127923625261792" "enzymejl_parmtype_ref"="0" %4, {} addrspace(10)* noundef nonnull align 16 dereferenceable(40) "enzyme_type"="{[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer}" "enzymejl_parmtype"="127923554507456" "enzymejl_parmtype_ref"="2" %5, {} addrspace(10)* align 16 "enzyme_type"="{[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer}" "enzymejl_parmtype"="127923554507456" "enzymejl_parmtype_ref"="2" %"'1", {} addrspace(10)* noundef nonnull align 16 dereferenceable(40) "enzyme_type"="{[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer}" "enzymejl_parmtype"="127923554507456" "enzymejl_parmtype_ref"="2" %6, {} addrspace(10)* align 16 "enzyme_type"="{[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer}" "enzymejl_parmtype"="127923554507456" "enzymejl_parmtype_ref"="2" %"'2", double %differeturn) local_unnamed_addr #17 !dbg !311 {
top:
  %"iv'ac" = alloca i64, align 8
  %"iv1'ac" = alloca i64, align 8
  %"arrayref'de" = alloca double, align 8
  %7 = getelementptr double, double* %"arrayref'de", i64 0
  store double 0.000000e+00, double* %7, align 8
  %_augmented_cache = alloca { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } addrspace(10)*, align 8
  %_augmented4_cache = alloca { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* } addrspace(10)*, align 8
  %8 = call {}*** @julia.get_pgcstack()
  %9 = call {}*** @julia.get_pgcstack()
  %10 = call {}*** @julia.get_pgcstack()
  %11 = call {}*** @julia.get_pgcstack()
  %12 = call {}*** @julia.get_pgcstack()
  %13 = call {}*** @julia.get_pgcstack()
  %14 = call {}*** @julia.get_pgcstack()
  %15 = call {}*** @julia.get_pgcstack()
  %16 = call {}*** @julia.get_pgcstack() #24
  %ptls_field14 = getelementptr inbounds {}**, {}*** %16, i64 2
  %17 = bitcast {}*** %ptls_field14 to i64***
  %ptls_load1516 = load i64**, i64*** %17, align 8, !tbaa !26, !alias.scope !321, !noalias !324
  %18 = getelementptr inbounds i64*, i64** %ptls_load1516, i64 2
  %safepoint = load i64*, i64** %18, align 8, !tbaa !30, !alias.scope !326, !noalias !329
  fence syncscope("singlethread") seq_cst
  call void @julia.safepoint(i64* %safepoint) #24, !dbg !331
  fence syncscope("singlethread") seq_cst
  %19 = bitcast {}*** %14 to {}**, !dbg !332
  %20 = getelementptr inbounds {}*, {}** %19, i64 -14, !dbg !332
  %21 = getelementptr inbounds {}*, {}** %20, i64 16, !dbg !332
  %22 = bitcast {}** %21 to i8**, !dbg !332
  %23 = load i8*, i8** %22, align 8, !dbg !332
  %24 = call noalias nonnull dereferenceable(352) dereferenceable_or_null(352) {} addrspace(10)* @julia.gc_alloc_obj({}** %20, i64 352, {} addrspace(10)* addrspacecast ({}* inttoptr (i64 127923759687952 to {}*) to {} addrspace(10)*)), !dbg !332
  %25 = bitcast {} addrspace(10)* %24 to { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } addrspace(10)*, !dbg !332
  br label %loop.i, !dbg !332

loop.i:                                           ; preds = %loop.i, %top
  %26 = phi i64 [ 0, %top ], [ %27, %loop.i ], !dbg !332
  %27 = add i64 %26, 1, !dbg !332
  %28 = getelementptr { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }, { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } addrspace(10)* %25, i64 %26, i32 3, !dbg !332
  store {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)* addrspace(10)* %28, align 8, !dbg !332
  %29 = getelementptr { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }, { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } addrspace(10)* %25, i64 %26, i32 4, !dbg !332
  store {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)* addrspace(10)* %29, align 8, !dbg !332
  %30 = getelementptr { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }, { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } addrspace(10)* %25, i64 %26, i32 5, !dbg !332
  store {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)* addrspace(10)* %30, align 8, !dbg !332
  %31 = getelementptr { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }, { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } addrspace(10)* %25, i64 %26, i32 6, !dbg !332
  store {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)* addrspace(10)* %31, align 8, !dbg !332
  %32 = getelementptr { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }, { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } addrspace(10)* %25, i64 %26, i32 7, !dbg !332
  store {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)* addrspace(10)* %32, align 8, !dbg !332
  %33 = getelementptr { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }, { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } addrspace(10)* %25, i64 %26, i32 8, !dbg !332
  store {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)* addrspace(10)* %33, align 8, !dbg !332
  %34 = getelementptr { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }, { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } addrspace(10)* %25, i64 %26, i32 9, !dbg !332
  store {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)* addrspace(10)* %34, align 8, !dbg !332
  %35 = getelementptr { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }, { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } addrspace(10)* %25, i64 %26, i32 10, !dbg !332
  store {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)* addrspace(10)* %35, align 8, !dbg !332
  %36 = getelementptr { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }, { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } addrspace(10)* %25, i64 %26, i32 11, !dbg !332
  store {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)* addrspace(10)* %36, align 8, !dbg !332
  %37 = getelementptr { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }, { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } addrspace(10)* %25, i64 %26, i32 12, !dbg !332
  store {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)* addrspace(10)* %37, align 8, !dbg !332
  %38 = getelementptr { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }, { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } addrspace(10)* %25, i64 %26, i32 13, !dbg !332
  store {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)* addrspace(10)* %38, align 8, !dbg !332
  %39 = getelementptr { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }, { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } addrspace(10)* %25, i64 %26, i32 14, !dbg !332
  store {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)* addrspace(10)* %39, align 8, !dbg !332
  %40 = getelementptr { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }, { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } addrspace(10)* %25, i64 %26, i32 15, !dbg !332
  store {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)* addrspace(10)* %40, align 8, !dbg !332
  %41 = getelementptr { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }, { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } addrspace(10)* %25, i64 %26, i32 16, !dbg !332
  store {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)* addrspace(10)* %41, align 8, !dbg !332
  %42 = getelementptr { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }, { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } addrspace(10)* %25, i64 %26, i32 2, i32 0, !dbg !332
  store {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)* addrspace(10)* %42, align 8, !dbg !332
  %43 = getelementptr { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }, { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } addrspace(10)* %25, i64 %26, i32 2, i32 1, !dbg !332
  store {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)* addrspace(10)* %43, align 8, !dbg !332
  %44 = icmp eq i64 %27, 2, !dbg !332
  br i1 %44, label %zeroType.3.exit, label %loop.i, !dbg !332

zeroType.3.exit:                                  ; preds = %loop.i
  %_augmented_malloccache = bitcast {} addrspace(10)* %24 to { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } addrspace(10)*, !dbg !332
  store { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } addrspace(10)* %_augmented_malloccache, { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } addrspace(10)** %_augmented_cache, align 8, !dbg !332, !invariant.group !333
  br label %L2, !dbg !332

L2:                                               ; preds = %L2, %zeroType.3.exit
  %iv = phi i64 [ %iv.next, %L2 ], [ 0, %zeroType.3.exit ]
  %iv.next = add nuw nsw i64 %iv, 1, !dbg !334
  %_augmented = call { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } @augmented_julia_euler_step_833({} addrspace(10)* align 16 %5, {} addrspace(10)* align 16 %"'1", {} addrspace(10)* align 16 %6, {} addrspace(10)* align 16 %"'2", {} addrspace(10)* align 16 %0, {} addrspace(10)* align 16 %"'"), !dbg !334
  %45 = load { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } addrspace(10)*, { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } addrspace(10)** %_augmented_cache, align 8, !dbg !335, !dereferenceable !338, !invariant.group !333
  %46 = getelementptr inbounds { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }, { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } addrspace(10)* %45, i64 %iv, !dbg !335
  store { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } %_augmented, { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } addrspace(10)* %46, align 8, !dbg !335, !invariant.group !339
  %47 = bitcast { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } addrspace(10)* %45 to {} addrspace(10)*, !dbg !335
  %48 = extractvalue { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } %_augmented, 2, !dbg !335
  %49 = extractvalue { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } %_augmented, 3, !dbg !335
  %50 = extractvalue { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } %_augmented, 4, !dbg !335
  %51 = extractvalue { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } %_augmented, 5, !dbg !335
  %52 = extractvalue { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } %_augmented, 6, !dbg !335
  %53 = extractvalue { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } %_augmented, 7, !dbg !335
  %54 = extractvalue { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } %_augmented, 8, !dbg !335
  %55 = extractvalue { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } %_augmented, 9, !dbg !335
  %56 = extractvalue { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } %_augmented, 10, !dbg !335
  %57 = extractvalue { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } %_augmented, 11, !dbg !335
  %58 = extractvalue { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } %_augmented, 12, !dbg !335
  %59 = extractvalue { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } %_augmented, 13, !dbg !335
  %60 = extractvalue { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } %_augmented, 14, !dbg !335
  %61 = extractvalue { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } %_augmented, 15, !dbg !335
  %62 = extractvalue { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } %_augmented, 16, !dbg !335
  %63 = extractvalue { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 } %48, 0, !dbg !335
  %64 = extractvalue { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 } %48, 1, !dbg !335
  call void ({} addrspace(10)*, ...) @julia.write_barrier({} addrspace(10)* %47, {} addrspace(10)* %49, {} addrspace(10)* %50, {} addrspace(10)* %51, {} addrspace(10)* %52, {} addrspace(10)* %53, {} addrspace(10)* %54, {} addrspace(10)* %55, {} addrspace(10)* %56, {} addrspace(10)* %57, {} addrspace(10)* %58, {} addrspace(10)* %59, {} addrspace(10)* %60, {} addrspace(10)* %61, {} addrspace(10)* %62, {} addrspace(10)* %63, {} addrspace(10)* %64), !dbg !335
  %.not = icmp eq i64 %iv.next, 2, !dbg !335
  br i1 %.not, label %L14, label %L2, !dbg !337

L14:                                              ; preds = %L2
  %65 = call i64 @llvm.smax.i64(i64 %1, i64 noundef 1) #24, !dbg !336
  %66 = icmp ult i64 %65, 2, !dbg !340
  br i1 %66, label %L41, label %L29.preheader, !dbg !344

L29.preheader:                                    ; preds = %L14
  %67 = add nsw i64 %65, -2, !dbg !345
  %68 = add nuw i64 %67, 1, !dbg !345
  %69 = mul nuw i64 %68, 104, !dbg !345
  %70 = call {} addrspace(10)* @ijl_box_int64(i64 %68), !dbg !345
  %71 = call {} addrspace(10)* ({} addrspace(10)* ({} addrspace(10)*, {} addrspace(10)**, i32)*, {} addrspace(10)*, ...) @julia.call({} addrspace(10)* ({} addrspace(10)*, {} addrspace(10)**, i32)* @jl_f_apply_type, {} addrspace(10)* null, {} addrspace(10)* addrspacecast ({}* inttoptr (i64 127923554537216 to {}*) to {} addrspace(10)*), {} addrspace(10)* %70, {} addrspace(10)* addrspacecast ({}* inttoptr (i64 127923195707536 to {}*) to {} addrspace(10)*)), !dbg !345
  %72 = bitcast {}*** %10 to {}**, !dbg !345
  %73 = getelementptr inbounds {}*, {}** %72, i64 -14, !dbg !345
  %74 = getelementptr inbounds {}*, {}** %73, i64 16, !dbg !345
  %75 = bitcast {}** %74 to i8**, !dbg !345
  %76 = load i8*, i8** %75, align 8, !dbg !345
  %77 = call noalias nonnull {} addrspace(10)* @julia.gc_alloc_obj({}** %73, i64 %69, {} addrspace(10)* %71), !dbg !345
  %78 = bitcast {} addrspace(10)* %77 to { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* } addrspace(10)*, !dbg !345
  br label %loop.i8, !dbg !345

loop.i8:                                          ; preds = %loop.i8, %L29.preheader
  %79 = phi i64 [ 0, %L29.preheader ], [ %80, %loop.i8 ], !dbg !345
  %80 = add i64 %79, 1, !dbg !345
  %81 = getelementptr { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }, { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* } addrspace(10)* %78, i64 %79, i32 0, !dbg !345
  store {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)* addrspace(10)* %81, align 8, !dbg !345
  %82 = getelementptr { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }, { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* } addrspace(10)* %78, i64 %79, i32 1, !dbg !345
  store {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)* addrspace(10)* %82, align 8, !dbg !345
  %83 = getelementptr { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }, { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* } addrspace(10)* %78, i64 %79, i32 2, !dbg !345
  store {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)* addrspace(10)* %83, align 8, !dbg !345
  %84 = getelementptr { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }, { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* } addrspace(10)* %78, i64 %79, i32 3, !dbg !345
  store {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)* addrspace(10)* %84, align 8, !dbg !345
  %85 = getelementptr { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }, { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* } addrspace(10)* %78, i64 %79, i32 4, !dbg !345
  store {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)* addrspace(10)* %85, align 8, !dbg !345
  %86 = getelementptr { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }, { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* } addrspace(10)* %78, i64 %79, i32 5, !dbg !345
  store {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)* addrspace(10)* %86, align 8, !dbg !345
  %87 = getelementptr { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }, { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* } addrspace(10)* %78, i64 %79, i32 6, !dbg !345
  store {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)* addrspace(10)* %87, align 8, !dbg !345
  %88 = getelementptr { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }, { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* } addrspace(10)* %78, i64 %79, i32 7, !dbg !345
  store {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)* addrspace(10)* %88, align 8, !dbg !345
  %89 = getelementptr { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }, { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* } addrspace(10)* %78, i64 %79, i32 8, !dbg !345
  store {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)* addrspace(10)* %89, align 8, !dbg !345
  %90 = getelementptr { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }, { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* } addrspace(10)* %78, i64 %79, i32 9, !dbg !345
  store {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)* addrspace(10)* %90, align 8, !dbg !345
  %91 = getelementptr { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }, { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* } addrspace(10)* %78, i64 %79, i32 10, !dbg !345
  store {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)* addrspace(10)* %91, align 8, !dbg !345
  %92 = getelementptr { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }, { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* } addrspace(10)* %78, i64 %79, i32 12, !dbg !345
  store {} addrspace(10)* @ejl_jl_nothing, {} addrspace(10)* addrspace(10)* %92, align 8, !dbg !345
  %93 = icmp eq i64 %80, %68, !dbg !345
  br i1 %93, label %zeroType.7.exit, label %loop.i8, !dbg !345

zeroType.7.exit:                                  ; preds = %loop.i8
  %_augmented4_malloccache = bitcast {} addrspace(10)* %77 to { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* } addrspace(10)*, !dbg !345
  store { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* } addrspace(10)* %_augmented4_malloccache, { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* } addrspace(10)** %_augmented4_cache, align 8, !dbg !345, !invariant.group !346
  br label %L29, !dbg !345

L29:                                              ; preds = %L29, %zeroType.7.exit
  %iv1 = phi i64 [ 0, %zeroType.7.exit ], [ %iv.next2, %L29 ]
  %iv.next2 = add nuw nsw i64 %iv1, 1, !dbg !347
  %94 = add nuw i64 %iv1, 2, !dbg !347
  %_augmented4 = call { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* } @augmented_julia_ab3_step_831({} addrspace(10)* nocapture readonly align 16 %5, {} addrspace(10)* nocapture align 16 %"'1", {} addrspace(10)* align 16 %6, {} addrspace(10)* align 16 %"'2", double %2, double %3), !dbg !347
  %95 = load { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* } addrspace(10)*, { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* } addrspace(10)** %_augmented4_cache, align 8, !dbg !348, !dereferenceable !338, !invariant.group !346
  %96 = getelementptr inbounds { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }, { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* } addrspace(10)* %95, i64 %iv1, !dbg !348
  store { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* } %_augmented4, { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* } addrspace(10)* %96, align 8, !dbg !348, !invariant.group !350
  %97 = bitcast { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* } addrspace(10)* %95 to {} addrspace(10)*, !dbg !348
  %98 = extractvalue { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* } %_augmented4, 0, !dbg !348
  %99 = extractvalue { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* } %_augmented4, 1, !dbg !348
  %100 = extractvalue { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* } %_augmented4, 2, !dbg !348
  %101 = extractvalue { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* } %_augmented4, 3, !dbg !348
  %102 = extractvalue { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* } %_augmented4, 4, !dbg !348
  %103 = extractvalue { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* } %_augmented4, 5, !dbg !348
  %104 = extractvalue { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* } %_augmented4, 6, !dbg !348
  %105 = extractvalue { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* } %_augmented4, 7, !dbg !348
  %106 = extractvalue { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* } %_augmented4, 8, !dbg !348
  %107 = extractvalue { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* } %_augmented4, 9, !dbg !348
  %108 = extractvalue { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* } %_augmented4, 10, !dbg !348
  %109 = extractvalue { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* } %_augmented4, 12, !dbg !348
  call void ({} addrspace(10)*, ...) @julia.write_barrier({} addrspace(10)* %97, {} addrspace(10)* %98, {} addrspace(10)* %99, {} addrspace(10)* %100, {} addrspace(10)* %101, {} addrspace(10)* %102, {} addrspace(10)* %103, {} addrspace(10)* %104, {} addrspace(10)* %105, {} addrspace(10)* %106, {} addrspace(10)* %107, {} addrspace(10)* %108, {} addrspace(10)* %109), !dbg !348
  %.not17 = icmp eq i64 %94, %65, !dbg !348
  br i1 %.not17, label %L41.loopexit, label %L29, !dbg !345

L41.loopexit:                                     ; preds = %L29
  br label %L41, !dbg !351

L41:                                              ; preds = %L41.loopexit, %L14
  %"'ipc" = addrspacecast {} addrspace(10)* %"'1" to double addrspace(13)* addrspace(11)*, !dbg !351
  %"arrayptr18'ipl" = load double addrspace(13)*, double addrspace(13)* addrspace(11)* %"'ipc", align 16, !dbg !351, !tbaa !96, !alias.scope !353, !noalias !356, !nonnull !0
  br label %invertL41, !dbg !352

inverttop:                                        ; preds = %invertL2
  fence syncscope("singlethread") seq_cst
  fence syncscope("singlethread") seq_cst
  %110 = load i64, i64* %"iv'ac", align 8
  %forfree = load { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } addrspace(10)*, { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } addrspace(10)** %_augmented_cache, align 8, !dereferenceable !358, !invariant.group !333
  ret void

invertL2:                                         ; preds = %mergeinvertL2_L14, %incinvertL2
  %111 = load i64, i64* %"iv'ac", align 8, !dbg !334
  %112 = load { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } addrspace(10)*, { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } addrspace(10)** %_augmented_cache, align 8, !dbg !334, !dereferenceable !338, !invariant.group !333
  %113 = getelementptr inbounds { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }, { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } addrspace(10)* %112, i64 %111, !dbg !334
  %114 = load { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 }, { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } addrspace(10)* %113, align 8, !dbg !334, !invariant.group !339
  call void @diffejulia_euler_step_833({} addrspace(10)* align 16 %5, {} addrspace(10)* align 16 %"'1", {} addrspace(10)* align 16 %6, {} addrspace(10)* align 16 %"'2", {} addrspace(10)* align 16 %0, {} addrspace(10)* align 16 %"'", { i8*, i8*, { {} addrspace(10)*, {} addrspace(10)*, i8*, i8*, i64 }, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64 } %114), !dbg !334
  %115 = load i64, i64* %"iv'ac", align 8
  %116 = icmp eq i64 %115, 0
  %117 = xor i1 %116, true
  br i1 %116, label %inverttop, label %incinvertL2

incinvertL2:                                      ; preds = %invertL2
  %118 = load i64, i64* %"iv'ac", align 8
  %119 = add nsw i64 %118, -1
  store i64 %119, i64* %"iv'ac", align 8
  br label %invertL2

invertL14:                                        ; preds = %invertL41, %invertL29.preheader
  br label %mergeinvertL2_L14

mergeinvertL2_L14:                                ; preds = %invertL14
  store i64 1, i64* %"iv'ac", align 8
  br label %invertL2

invertL29.preheader:                              ; preds = %invertL29
  %120 = load i64, i64* %"iv1'ac", align 8
  %forfree5 = load { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* } addrspace(10)*, { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* } addrspace(10)** %_augmented4_cache, align 8, !dereferenceable !359, !invariant.group !346
  br label %invertL14

invertL29:                                        ; preds = %mergeinvertL29_L41.loopexit, %incinvertL29
  %121 = load i64, i64* %"iv1'ac", align 8, !dbg !347
  %122 = call i64 @llvm.smax.i64(i64 %1, i64 noundef 1) #24, !dbg !336
  %_unwrap = add nsw i64 %122, -2, !dbg !347
  %123 = add nuw i64 %_unwrap, 1, !dbg !347
  %124 = load { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* } addrspace(10)*, { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* } addrspace(10)** %_augmented4_cache, align 8, !dbg !347, !dereferenceable !338, !invariant.group !346
  %125 = getelementptr inbounds { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }, { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* } addrspace(10)* %124, i64 %121, !dbg !347
  %126 = load { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* }, { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* } addrspace(10)* %125, align 8, !dbg !347, !invariant.group !350
  call void @diffejulia_ab3_step_831({} addrspace(10)* nocapture readonly align 16 %5, {} addrspace(10)* nocapture align 16 %"'1", {} addrspace(10)* align 16 %6, {} addrspace(10)* align 16 %"'2", double %2, double %3, { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, double, {} addrspace(10)* } %126), !dbg !347
  %127 = load i64, i64* %"iv1'ac", align 8
  %128 = icmp eq i64 %127, 0
  %129 = xor i1 %128, true
  br i1 %128, label %invertL29.preheader, label %incinvertL29

incinvertL29:                                     ; preds = %invertL29
  %130 = load i64, i64* %"iv1'ac", align 8
  %131 = add nsw i64 %130, -1
  store i64 %131, i64* %"iv1'ac", align 8
  br label %invertL29

invertL41.loopexit:                               ; preds = %invertL41
  %_unwrap6 = add nsw i64 %65, -2
  br label %mergeinvertL29_L41.loopexit

mergeinvertL29_L41.loopexit:                      ; preds = %invertL41.loopexit
  store i64 %_unwrap6, i64* %"iv1'ac", align 8
  br label %invertL29

invertL41:                                        ; preds = %L41
  store double %differeturn, double* %"arrayref'de", align 8
  %132 = load double, double* %"arrayref'de", align 8, !dbg !351
  store double 0.000000e+00, double* %"arrayref'de", align 8, !dbg !351
  %133 = load double, double addrspace(13)* %"arrayptr18'ipl", align 8, !dbg !351, !tbaa !122, !alias.scope !360, !noalias !363
  %134 = fadd fast double %133, %132, !dbg !351
  store double %134, double addrspace(13)* %"arrayptr18'ipl", align 8, !dbg !351, !tbaa !122, !alias.scope !360, !noalias !363
  br i1 %66, label %invertL14, label %invertL41.loopexit
}

cc @gbaraldi

wsmoses commented 1 month ago
after simplification :
; Function Attrs: mustprogress nofree readonly willreturn
define "enzyme_type"="{[-1]:Float@double}" double @preprocess_julia___2607(double "enzyme_type"="{[-1]:Float@double}" "enzymejl_parmtype"="127923625261792" "enzymejl_parmtype_ref"="0" %0, double "enzyme_type"="{[-1]:Float@double}" "enzymejl_parmtype"="127923625261792" "enzymejl_parmtype_ref"="0" %1) local_unnamed_addr #4 !dbg !23 {
top:
  %2 = call {}*** @julia.get_pgcstack() #5
  call void @llvm.dbg.value(metadata double %0, metadata !26, metadata !DIExpression()) #5, !dbg !28
  call void @llvm.dbg.value(metadata double %1, metadata !27, metadata !DIExpression()) #5, !dbg !28
  %ptls_field3 = getelementptr inbounds {}**, {}*** %2, i64 2
  %3 = bitcast {}*** %ptls_field3 to i64***
  %ptls_load45 = load i64**, i64*** %3, align 8, !tbaa !16
  %4 = getelementptr inbounds i64*, i64** %ptls_load45, i64 2
  %safepoint = load i64*, i64** %4, align 8, !tbaa !20
  fence syncscope("singlethread") seq_cst
  call void @julia.safepoint(i64* %safepoint) #5, !dbg !29
  fence syncscope("singlethread") seq_cst
  %5 = fadd double %0, %1, !dbg !29
  ret double %5, !dbg !29
}

; Function Attrs: mustprogress nofree readonly willreturn
define internal double @augmented_julia___2607(double "enzyme_type"="{[-1]:Float@double}" "enzymejl_parmtype"="127923625261792" "enzymejl_parmtype_ref"="0" %0, double "enzyme_type"="{[-1]:Float@double}" "enzymejl_parmtype"="127923625261792" "enzymejl_parmtype_ref"="0" %1) local_unnamed_addr #4 !dbg !30 {
top:
  %2 = alloca double, align 8
  %3 = call {}*** @julia.get_pgcstack() #5
  %ptls_field3 = getelementptr inbounds {}**, {}*** %3, i64 2
  %4 = bitcast {}*** %ptls_field3 to i64***
  %ptls_load45 = load i64**, i64*** %4, align 8, !tbaa !16, !alias.scope !35, !noalias !38
  %5 = getelementptr inbounds i64*, i64** %ptls_load45, i64 2
  %safepoint = load i64*, i64** %5, align 8, !tbaa !20, !alias.scope !40, !noalias !43
  fence syncscope("singlethread") seq_cst
  call void @julia.safepoint(i64* %safepoint) #5, !dbg !45
  fence syncscope("singlethread") seq_cst
  %6 = fadd double %0, %1, !dbg !45
  store double %6, double* %2, align 8, !dbg !45
  %7 = load double, double* %2, align 8, !dbg !45
  ret double %7, !dbg !45
}

; Function Attrs: mustprogress nofree readonly willreturn
define internal { double } @diffejulia___2607(double "enzyme_type"="{[-1]:Float@double}" "enzymejl_parmtype"="127923625261792" "enzymejl_parmtype_ref"="0" %0, double "enzyme_type"="{[-1]:Float@double}" "enzymejl_parmtype"="127923625261792" "enzymejl_parmtype_ref"="0" %1, double %differeturn) local_unnamed_addr #4 !dbg !49 {
top:
  %"'de" = alloca double, align 8
  %2 = getelementptr double, double* %"'de", i64 0
  store double 0.000000e+00, double* %2, align 8
  %"'de1" = alloca double, align 8
  %3 = getelementptr double, double* %"'de1", i64 0
  store double 0.000000e+00, double* %3, align 8
  %4 = call {}*** @julia.get_pgcstack() #7
  br label %inverttop, !dbg !54

inverttop:                                        ; preds = %top
  store double %differeturn, double* %"'de", align 8
  %5 = load double, double* %"'de", align 8, !dbg !54
  store double 0.000000e+00, double* %"'de", align 8, !dbg !54
  %6 = load double, double* %"'de1", align 8, !dbg !54
  %7 = fadd fast double %6, %5, !dbg !54
  store double %7, double* %"'de1", align 8, !dbg !54
  fence syncscope("singlethread") seq_cst
  fence syncscope("singlethread") seq_cst
  %8 = load double, double* %"'de1", align 8
  %9 = insertvalue { double } undef, double %8, 0
  ret { double } %9
}

; ModuleID = 'start'
source_filename = "start"
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-linux-gnu"

; Function Attrs: inaccessiblemem_or_argmemonly nofree noinline optnone
declare void @julia.safepoint(i64*) local_unnamed_addr #0

; Function Attrs: nofree noinline optnone readonly
define { double } @augmented_julia___2607wrap(double %0, double %1) #1 !dbg !4 {
entry:
  %thread_ptr = call i8* asm "movq %fs:0, $0", "=r"() #7
  %tls_ppgcstack = getelementptr i8, i8* %thread_ptr, i64 -8
  %2 = bitcast i8* %tls_ppgcstack to {}****
  %tls_pgcstack = load {}***, {}**** %2, align 8
  %ptls_field3.i = getelementptr inbounds {}**, {}*** %tls_pgcstack, i64 2
  %3 = bitcast {}*** %ptls_field3.i to i64***
  %ptls_load45.i = load i64**, i64*** %3, align 8, !tbaa !8, !alias.scope !12, !noalias !15
  %4 = getelementptr inbounds i64*, i64** %ptls_load45.i, i64 2
  %safepoint.i = load i64*, i64** %4, align 8, !tbaa !17, !alias.scope !19, !noalias !22
  fence syncscope("singlethread") seq_cst
  %5 = load volatile i64, i64* %safepoint.i, align 8, !dbg !24
  fence syncscope("singlethread") seq_cst
  %6 = fadd double %0, %1, !dbg !24
  %7 = insertvalue { double } zeroinitializer, double %6, 0
  ret { double } %7
}

; Function Attrs: nofree noinline nosync optnone readonly
define [1 x { double }] @diffejulia___2607wrap(double %0, double %1, double %2) #2 !dbg !35 {
entry:
  fence syncscope("singlethread") seq_cst
  %.unpack1 = insertvalue { double } zeroinitializer, double %2, 0
  %3 = insertvalue [1 x { double }] zeroinitializer, { double } %.unpack1, 0
  ret [1 x { double }] %3
}

; Function Attrs: argmemonly nocallback nofree noinline nosync nounwind optnone willreturn
declare void @llvm.lifetime.start.p0i8(i64 immarg, i8* nocapture) #3

; Function Attrs: argmemonly nocallback nofree noinline nosync nounwind optnone willreturn
declare void @llvm.lifetime.end.p0i8(i64 immarg, i8* nocapture) #3

; Function Attrs: inaccessiblemem_or_argmemonly noinline optnone
declare void @ijl_gc_queue_root({} addrspace(10)*) #4

; Function Attrs: noinline optnone allocsize(2)
declare noalias nonnull {} addrspace(10)* @ijl_gc_pool_alloc(i8*, i32, i32) #5

; Function Attrs: noinline optnone allocsize(1)
declare noalias nonnull {} addrspace(10)* @ijl_gc_big_alloc(i8*, i64) #6

; Function Attrs: noinline optnone allocsize(1)
declare noalias nonnull {} addrspace(10)* @ijl_gc_alloc_typed(i8*, i64, i8*) #6

attributes #0 = { inaccessiblemem_or_argmemonly nofree noinline optnone "enzyme_inactive" "enzyme_no_escaping_allocation" "enzymejl_world"="31477" }
attributes #1 = { nofree noinline optnone readonly "enzymejl_world"="31477" }
attributes #2 = { nofree noinline nosync optnone readonly "enzymejl_world"="31477" }
attributes #3 = { argmemonly nocallback nofree noinline nosync nounwind optnone willreturn }
attributes #4 = { inaccessiblemem_or_argmemonly noinline optnone }
attributes #5 = { noinline optnone allocsize(2) }
attributes #6 = { noinline optnone allocsize(1) }
attributes #7 = { nounwind }

!llvm.module.flags = !{!0, !1}
!llvm.dbg.cu = !{!2}

!0 = !{i32 2, !"Dwarf Version", i32 4}
!1 = !{i32 2, !"Debug Info Version", i32 3}
!2 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !3, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, nameTableKind: None)
!3 = !DIFile(filename: "julia", directory: ".")
!4 = distinct !DISubprogram(name: "augmented_julia___2607wrap", linkageName: "augmented_julia___2607wrap", scope: null, file: !5, type: !6, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition | DISPFlagOptimized, unit: !2, retainedNodes: !7)
!5 = !DIFile(filename: "float.jl", directory: ".")
!6 = !DISubroutineType(types: !7)
!7 = !{}
!8 = !{!9, !9, i64 0}
!9 = !{!"jtbaa_gcframe", !10, i64 0}
!10 = !{!"jtbaa", !11, i64 0}
!11 = !{!"jtbaa"}
!12 = !{!13}
!13 = distinct !{!13, !14, !"primal"}
!14 = distinct !{!14, !" diff: %"}
!15 = !{!16}
!16 = distinct !{!16, !14, !"shadow_0"}
!17 = !{!18, !18, i64 0, i64 0}
!18 = !{!"jtbaa_const", !10, i64 0}
!19 = !{!20}
!20 = distinct !{!20, !21, !"primal"}
!21 = distinct !{!21, !" diff: %ptls_load45"}
!22 = !{!23}
!23 = distinct !{!23, !21, !"shadow_0"}
!24 = !DILocation(line: 409, scope: !25, inlinedAt: !34)
!25 = distinct !DISubprogram(name: "+", linkageName: "julia_+_2607", scope: null, file: !5, line: 409, type: !26, scopeLine: 409, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !2, retainedNodes: !30)
!26 = !DISubroutineType(types: !27)
!27 = !{!28, !29, !28, !28}
!28 = !DIBasicType(name: "Float64", size: 64, encoding: DW_ATE_unsigned)
!29 = !DICompositeType(tag: DW_TAG_structure_type, name: "#+", align: 8, elements: !7, runtimeLang: DW_LANG_Julia, identifier: "127923598536992")
!30 = !{!31, !32, !33}
!31 = !DILocalVariable(name: "#self#", arg: 1, scope: !25, file: !5, line: 409, type: !29)
!32 = !DILocalVariable(name: "x", arg: 2, scope: !25, file: !5, line: 409, type: !28)
!33 = !DILocalVariable(name: "y", arg: 3, scope: !25, file: !5, line: 409, type: !28)
!34 = distinct !DILocation(line: 0, scope: !4)
!35 = distinct !DISubprogram(name: "diffejulia___2607wrap", linkageName: "diffejulia___2607wrap", scope: null, file: !5, type: !6, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition | DISPFlagOptimized, unit: !2, retainedNodes: !7)

after simplification :
; Function Attrs: mustprogress nofree readonly willreturn
define "enzyme_type"="{[-1]:Float@double}" double @preprocess_julia___2738(double "enzyme_type"="{[-1]:Float@double}" "enzymejl_parmtype"="127923625261792" "enzymejl_parmtype_ref"="0" %0, double "enzyme_type"="{[-1]:Float@double}" "enzymejl_parmtype"="127923625261792" "enzymejl_parmtype_ref"="0" %1) local_unnamed_addr #4 !dbg !23 {
top:
  %2 = call {}*** @julia.get_pgcstack() #5
  call void @llvm.dbg.value(metadata double %0, metadata !26, metadata !DIExpression()) #5, !dbg !28
  call void @llvm.dbg.value(metadata double %1, metadata !27, metadata !DIExpression()) #5, !dbg !28
  %ptls_field3 = getelementptr inbounds {}**, {}*** %2, i64 2
  %3 = bitcast {}*** %ptls_field3 to i64***
  %ptls_load45 = load i64**, i64*** %3, align 8, !tbaa !16
  %4 = getelementptr inbounds i64*, i64** %ptls_load45, i64 2
  %safepoint = load i64*, i64** %4, align 8, !tbaa !20
  fence syncscope("singlethread") seq_cst
  call void @julia.safepoint(i64* %safepoint) #5, !dbg !29
  fence syncscope("singlethread") seq_cst
  %5 = fadd double %0, %1, !dbg !29
  ret double %5, !dbg !29
}

; Function Attrs: mustprogress nofree readonly willreturn
define internal double @augmented_julia___2738(double "enzyme_type"="{[-1]:Float@double}" "enzymejl_parmtype"="127923625261792" "enzymejl_parmtype_ref"="0" %0, double "enzyme_type"="{[-1]:Float@double}" "enzymejl_parmtype"="127923625261792" "enzymejl_parmtype_ref"="0" %1) local_unnamed_addr #4 !dbg !30 {
top:
  %2 = alloca double, align 8
  %3 = call {}*** @julia.get_pgcstack() #5
  %ptls_field3 = getelementptr inbounds {}**, {}*** %3, i64 2
  %4 = bitcast {}*** %ptls_field3 to i64***
  %ptls_load45 = load i64**, i64*** %4, align 8, !tbaa !16, !alias.scope !35, !noalias !38
  %5 = getelementptr inbounds i64*, i64** %ptls_load45, i64 2
  %safepoint = load i64*, i64** %5, align 8, !tbaa !20, !alias.scope !40, !noalias !43
  fence syncscope("singlethread") seq_cst
  call void @julia.safepoint(i64* %safepoint) #5, !dbg !45
  fence syncscope("singlethread") seq_cst
  %6 = fadd double %0, %1, !dbg !45
  store double %6, double* %2, align 8, !dbg !45
  %7 = load double, double* %2, align 8, !dbg !45
  ret double %7, !dbg !45
}

; Function Attrs: mustprogress nofree readonly willreturn
define internal { double, double } @diffejulia___2738(double "enzyme_type"="{[-1]:Float@double}" "enzymejl_parmtype"="127923625261792" "enzymejl_parmtype_ref"="0" %0, double "enzyme_type"="{[-1]:Float@double}" "enzymejl_parmtype"="127923625261792" "enzymejl_parmtype_ref"="0" %1, double %differeturn) local_unnamed_addr #4 !dbg !49 {
top:
  %"'de" = alloca double, align 8
  %2 = getelementptr double, double* %"'de", i64 0
  store double 0.000000e+00, double* %2, align 8
  %"'de1" = alloca double, align 8
  %3 = getelementptr double, double* %"'de1", i64 0
  store double 0.000000e+00, double* %3, align 8
  %"'de2" = alloca double, align 8
  %4 = getelementptr double, double* %"'de2", i64 0
  store double 0.000000e+00, double* %4, align 8
  %5 = call {}*** @julia.get_pgcstack() #7
  br label %inverttop, !dbg !54

inverttop:                                        ; preds = %top
  store double %differeturn, double* %"'de", align 8
  %6 = load double, double* %"'de", align 8, !dbg !54
  store double 0.000000e+00, double* %"'de", align 8, !dbg !54
  %7 = load double, double* %"'de1", align 8, !dbg !54
  %8 = fadd fast double %7, %6, !dbg !54
  store double %8, double* %"'de1", align 8, !dbg !54
  %9 = load double, double* %"'de2", align 8, !dbg !54
  %10 = fadd fast double %9, %6, !dbg !54
  store double %10, double* %"'de2", align 8, !dbg !54
  fence syncscope("singlethread") seq_cst
  fence syncscope("singlethread") seq_cst
  %11 = load double, double* %"'de1", align 8
  %12 = load double, double* %"'de2", align 8
  %13 = insertvalue { double, double } undef, double %11, 0
  %14 = insertvalue { double, double } %13, double %12, 1
  ret { double, double } %14
}

; ModuleID = 'start'
source_filename = "start"
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-linux-gnu"

; Function Attrs: inaccessiblemem_or_argmemonly nofree noinline optnone
declare void @julia.safepoint(i64*) local_unnamed_addr #0

; Function Attrs: nofree noinline optnone readonly
define { double } @augmented_julia___2738wrap(double %0, double %1) #1 !dbg !4 {
entry:
  %thread_ptr = call i8* asm "movq %fs:0, $0", "=r"() #7
  %tls_ppgcstack = getelementptr i8, i8* %thread_ptr, i64 -8
  %2 = bitcast i8* %tls_ppgcstack to {}****
  %tls_pgcstack = load {}***, {}**** %2, align 8
  %ptls_field3.i = getelementptr inbounds {}**, {}*** %tls_pgcstack, i64 2
  %3 = bitcast {}*** %ptls_field3.i to i64***
  %ptls_load45.i = load i64**, i64*** %3, align 8, !tbaa !8, !alias.scope !12, !noalias !15
  %4 = getelementptr inbounds i64*, i64** %ptls_load45.i, i64 2
  %safepoint.i = load i64*, i64** %4, align 8, !tbaa !17, !alias.scope !19, !noalias !22
  fence syncscope("singlethread") seq_cst
  %5 = load volatile i64, i64* %safepoint.i, align 8, !dbg !24
  fence syncscope("singlethread") seq_cst
  %6 = fadd double %0, %1, !dbg !24
  %7 = insertvalue { double } zeroinitializer, double %6, 0
  ret { double } %7
}

; Function Attrs: nofree noinline nosync optnone readonly
define [1 x [2 x double]] @diffejulia___2738wrap(double %0, double %1, double %2) #2 !dbg !35 {
entry:
  fence syncscope("singlethread") seq_cst
  %3 = insertvalue [2 x double] zeroinitializer, double %2, 0
  %.unpack3 = insertvalue [2 x double] %3, double %2, 1
  %4 = insertvalue [1 x [2 x double]] zeroinitializer, [2 x double] %.unpack3, 0
  ret [1 x [2 x double]] %4
}

; Function Attrs: argmemonly nocallback nofree noinline nosync nounwind optnone willreturn
declare void @llvm.lifetime.start.p0i8(i64 immarg, i8* nocapture) #3

; Function Attrs: argmemonly nocallback nofree noinline nosync nounwind optnone willreturn
declare void @llvm.lifetime.end.p0i8(i64 immarg, i8* nocapture) #3

; Function Attrs: inaccessiblemem_or_argmemonly noinline optnone
declare void @ijl_gc_queue_root({} addrspace(10)*) #4

; Function Attrs: noinline optnone allocsize(2)
declare noalias nonnull {} addrspace(10)* @ijl_gc_pool_alloc(i8*, i32, i32) #5

; Function Attrs: noinline optnone allocsize(1)
declare noalias nonnull {} addrspace(10)* @ijl_gc_big_alloc(i8*, i64) #6

; Function Attrs: noinline optnone allocsize(1)
declare noalias nonnull {} addrspace(10)* @ijl_gc_alloc_typed(i8*, i64, i8*) #6

attributes #0 = { inaccessiblemem_or_argmemonly nofree noinline optnone "enzyme_inactive" "enzyme_no_escaping_allocation" "enzymejl_world"="31477" }
attributes #1 = { nofree noinline optnone readonly "enzymejl_world"="31477" }
attributes #2 = { nofree noinline nosync optnone readonly "enzymejl_world"="31477" }
attributes #3 = { argmemonly nocallback nofree noinline nosync nounwind optnone willreturn }
attributes #4 = { inaccessiblemem_or_argmemonly noinline optnone }
attributes #5 = { noinline optnone allocsize(2) }
attributes #6 = { noinline optnone allocsize(1) }
attributes #7 = { nounwind }

!llvm.module.flags = !{!0, !1}
!llvm.dbg.cu = !{!2}

!0 = !{i32 2, !"Dwarf Version", i32 4}
!1 = !{i32 2, !"Debug Info Version", i32 3}
!2 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !3, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, nameTableKind: None)
!3 = !DIFile(filename: "julia", directory: ".")
!4 = distinct !DISubprogram(name: "augmented_julia___2738wrap", linkageName: "augmented_julia___2738wrap", scope: null, file: !5, type: !6, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition | DISPFlagOptimized, unit: !2, retainedNodes: !7)
!5 = !DIFile(filename: "float.jl", directory: ".")
!6 = !DISubroutineType(types: !7)
!7 = !{}
!8 = !{!9, !9, i64 0}
!9 = !{!"jtbaa_gcframe", !10, i64 0}
!10 = !{!"jtbaa", !11, i64 0}
!11 = !{!"jtbaa"}
!12 = !{!13}
!13 = distinct !{!13, !14, !"primal"}
!14 = distinct !{!14, !" diff: %"}
!15 = !{!16}
!16 = distinct !{!16, !14, !"shadow_0"}
!17 = !{!18, !18, i64 0, i64 0}
!18 = !{!"jtbaa_const", !10, i64 0}
!19 = !{!20}
!20 = distinct !{!20, !21, !"primal"}
!21 = distinct !{!21, !" diff: %ptls_load45"}
!22 = !{!23}
!23 = distinct !{!23, !21, !"shadow_0"}
!24 = !DILocation(line: 409, scope: !25, inlinedAt: !34)
!25 = distinct !DISubprogram(name: "+", linkageName: "julia_+_2738", scope: null, file: !5, line: 409, type: !26, scopeLine: 409, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !2, retainedNodes: !30)
!26 = !DISubroutineType(types: !27)
!27 = !{!28, !29, !28, !28}
!28 = !DIBasicType(name: "Float64", size: 64, encoding: DW_ATE_unsigned)
!29 = !DICompositeType(tag: DW_TAG_structure_type, name: "#+", align: 8, elements: !7, runtimeLang: DW_LANG_Julia, identifier: "127923598536992")
!30 = !{!31, !32, !33}
!31 = !DILocalVariable(name: "#self#", arg: 1, scope: !25, file: !5, line: 409, type: !29)
!32 = !DILocalVariable(name: "x", arg: 2, scope: !25, file: !5, line: 409, type: !28)
!33 = !DILocalVariable(name: "y", arg: 3, scope: !25, file: !5, line: 409, type: !28)
!34 = distinct !DILocation(line: 0, scope: !4)
!35 = distinct !DISubprogram(name: "diffejulia___2738wrap", linkageName: "diffejulia___2738wrap", scope: null, file: !5, type: !6, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition | DISPFlagOptimized, unit: !2, retainedNodes: !7)

after simplification :
; Function Attrs: mustprogress willreturn
define noundef nonnull align 16 dereferenceable(40) "enzyme_type"="{[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer}" {} addrspace(10)* @preprocess_julia_setindex__2765({} addrspace(10)* noundef nonnull returned align 16 dereferenceable(40) "enzyme_type"="{[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer}" "enzymejl_parmtype"="127923554507456" "enzymejl_parmtype_ref"="2" %0, double "enzyme_type"="{[-1]:Float@double}" "enzymejl_parmtype"="127923625261792" "enzymejl_parmtype_ref"="0" %1, i64 signext "enzyme_inactive" "enzyme_type"="{[-1]:Integer}" "enzymejl_parmtype"="127923625262592" "enzymejl_parmtype_ref"="0" %2) local_unnamed_addr #5 !dbg !53 {
top:
  %3 = call {}*** @julia.get_pgcstack() #6
  call void @llvm.dbg.value(metadata {} addrspace(10)* null, metadata !56, metadata !DIExpression(DW_OP_deref)) #6, !dbg !59
  call void @llvm.dbg.value(metadata {} addrspace(10)* %0, metadata !56, metadata !DIExpression(DW_OP_deref)) #6, !dbg !59
  call void @llvm.dbg.value(metadata double %1, metadata !57, metadata !DIExpression()) #6, !dbg !59
  call void @llvm.dbg.value(metadata i64 %2, metadata !58, metadata !DIExpression()) #6, !dbg !59
  %ptls_field3 = getelementptr inbounds {}**, {}*** %3, i64 2
  %4 = bitcast {}*** %ptls_field3 to i64***
  %ptls_load45 = load i64**, i64*** %4, align 8, !tbaa !23
  %5 = getelementptr inbounds i64*, i64** %ptls_load45, i64 2
  %safepoint = load i64*, i64** %5, align 8, !tbaa !27
  fence syncscope("singlethread") seq_cst
  call void @julia.safepoint(i64* %safepoint) #6, !dbg !60
  fence syncscope("singlethread") seq_cst
  %6 = add i64 %2, -1, !dbg !60
  %7 = addrspacecast {} addrspace(10)* %0 to { i8 addrspace(13)*, i64, i16, i16, i32 } addrspace(11)*, !dbg !60
  %arraylen_ptr = getelementptr inbounds { i8 addrspace(13)*, i64, i16, i16, i32 }, { i8 addrspace(13)*, i64, i16, i16, i32 } addrspace(11)* %7, i64 0, i32 1, !dbg !60
  %arraylen = load i64, i64 addrspace(11)* %arraylen_ptr, align 8, !dbg !60, !tbaa !30, !range !33, !alias.scope !34, !noalias !37
  %inbounds = icmp ult i64 %6, %arraylen, !dbg !60
  br i1 %inbounds, label %idxend, label %oob, !dbg !60

oob:                                              ; preds = %top
  %errorbox = alloca i64, align 8, !dbg !60
  store i64 %2, i64* %errorbox, align 8, !dbg !60, !noalias !61
  %8 = addrspacecast {} addrspace(10)* %0 to {} addrspace(12)*, !dbg !60
  call void @ijl_bounds_error_ints({} addrspace(12)* noundef %8, i64* noundef nonnull align 8 %errorbox, i64 noundef 1) #7, !dbg !60
  unreachable, !dbg !60

idxend:                                           ; preds = %top
  %9 = addrspacecast {} addrspace(10)* %0 to double addrspace(13)* addrspace(11)*, !dbg !60
  %arrayptr6 = load double addrspace(13)*, double addrspace(13)* addrspace(11)* %9, align 16, !dbg !60, !tbaa !45, !alias.scope !64, !noalias !37, !nonnull !14
  %10 = getelementptr inbounds double, double addrspace(13)* %arrayptr6, i64 %6, !dbg !60
  store double %1, double addrspace(13)* %10, align 8, !dbg !60, !tbaa !48, !alias.scope !51, !noalias !65
  ret {} addrspace(10)* %0, !dbg !60
}

; Function Attrs: mustprogress willreturn
define internal { {} addrspace(10)*, {} addrspace(10)* } @augmented_julia_setindex__2765({} addrspace(10)* noundef nonnull align 16 dereferenceable(40) "enzyme_type"="{[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer}" "enzymejl_parmtype"="127923554507456" "enzymejl_parmtype_ref"="2" %0, {} addrspace(10)* align 16 "enzyme_type"="{[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer}" "enzymejl_parmtype"="127923554507456" "enzymejl_parmtype_ref"="2" %"'", double "enzyme_type"="{[-1]:Float@double}" "enzymejl_parmtype"="127923625261792" "enzymejl_parmtype_ref"="0" %1, i64 signext "enzyme_inactive" "enzyme_type"="{[-1]:Integer}" "enzymejl_parmtype"="127923625262592" "enzymejl_parmtype_ref"="0" %2) local_unnamed_addr #5 !dbg !66 {
top:
  %3 = alloca { {} addrspace(10)*, {} addrspace(10)* }, align 8
  %4 = call {}*** @julia.get_pgcstack() #6
  %ptls_field3 = getelementptr inbounds {}**, {}*** %4, i64 2
  %5 = bitcast {}*** %ptls_field3 to i64***
  %ptls_load45 = load i64**, i64*** %5, align 8, !tbaa !23, !alias.scope !72, !noalias !75
  %6 = getelementptr inbounds i64*, i64** %ptls_load45, i64 2
  %safepoint = load i64*, i64** %6, align 8, !tbaa !27, !alias.scope !77, !noalias !80
  fence syncscope("singlethread") seq_cst
  call void @julia.safepoint(i64* %safepoint) #6, !dbg !82
  fence syncscope("singlethread") seq_cst
  %7 = add i64 %2, -1, !dbg !82
  %8 = addrspacecast {} addrspace(10)* %0 to { i8 addrspace(13)*, i64, i16, i16, i32 } addrspace(11)*, !dbg !82
  %arraylen_ptr = getelementptr inbounds { i8 addrspace(13)*, i64, i16, i16, i32 }, { i8 addrspace(13)*, i64, i16, i16, i32 } addrspace(11)* %8, i64 0, i32 1, !dbg !82
  %arraylen = load i64, i64 addrspace(11)* %arraylen_ptr, align 8, !dbg !82, !tbaa !30, !range !33, !alias.scope !83, !noalias !86
  %inbounds = icmp ult i64 %7, %arraylen, !dbg !82
  br i1 %inbounds, label %idxend, label %oob, !dbg !82

oob:                                              ; preds = %top
  %errorbox = alloca i64, align 8, !dbg !82
  store i64 %2, i64* %errorbox, align 8, !dbg !82, !noalias !88
  %9 = addrspacecast {} addrspace(10)* %0 to {} addrspace(12)*, !dbg !82
  call void @ijl_bounds_error_ints({} addrspace(12)* noundef %9, i64* noundef nonnull align 8 %errorbox, i64 noundef 1) #7, !dbg !82
  unreachable, !dbg !82

idxend:                                           ; preds = %top
  %"'ipc" = addrspacecast {} addrspace(10)* %"'" to double addrspace(13)* addrspace(11)*, !dbg !82
  %10 = addrspacecast {} addrspace(10)* %0 to double addrspace(13)* addrspace(11)*, !dbg !82
  %"arrayptr6'ipl" = load double addrspace(13)*, double addrspace(13)* addrspace(11)* %"'ipc", align 16, !dbg !82, !tbaa !45, !alias.scope !91, !noalias !94, !nonnull !14
  %arrayptr6 = load double addrspace(13)*, double addrspace(13)* addrspace(11)* %10, align 16, !dbg !82, !tbaa !45, !alias.scope !95, !noalias !86, !nonnull !14
  %11 = getelementptr inbounds double, double addrspace(13)* %arrayptr6, i64 %7, !dbg !82
  store double %1, double addrspace(13)* %11, align 8, !dbg !82, !tbaa !48, !alias.scope !96, !noalias !99
  %12 = getelementptr inbounds { {} addrspace(10)*, {} addrspace(10)* }, { {} addrspace(10)*, {} addrspace(10)* }* %3, i32 0, i32 0, !dbg !82
  store {} addrspace(10)* %0, {} addrspace(10)** %12, align 8, !dbg !82
  %13 = getelementptr inbounds { {} addrspace(10)*, {} addrspace(10)* }, { {} addrspace(10)*, {} addrspace(10)* }* %3, i32 0, i32 1, !dbg !82
  store {} addrspace(10)* %"'", {} addrspace(10)** %13, align 8, !dbg !82
  %14 = load { {} addrspace(10)*, {} addrspace(10)* }, { {} addrspace(10)*, {} addrspace(10)* }* %3, align 8, !dbg !82
  ret { {} addrspace(10)*, {} addrspace(10)* } %14, !dbg !82
}

; Function Attrs: mustprogress willreturn
define internal { double } @diffejulia_setindex__2765({} addrspace(10)* align 16 dereferenceable(40) "enzyme_type"="{[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer}" "enzymejl_parmtype"="127923554507456" "enzymejl_parmtype_ref"="2" %0, {} addrspace(10)* align 16 "enzyme_type"="{[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer}" "enzymejl_parmtype"="127923554507456" "enzymejl_parmtype_ref"="2" %"'", double "enzyme_type"="{[-1]:Float@double}" "enzymejl_parmtype"="127923625261792" "enzymejl_parmtype_ref"="0" %1, i64 signext "enzyme_inactive" "enzyme_type"="{[-1]:Integer}" "enzymejl_parmtype"="127923625262592" "enzymejl_parmtype_ref"="0" %2) local_unnamed_addr #5 !dbg !104 {
top:
  %"'de" = alloca double, align 8
  %3 = getelementptr double, double* %"'de", i64 0
  store double 0.000000e+00, double* %3, align 8
  %4 = call {}*** @julia.get_pgcstack() #8
  %5 = add i64 %2, -1, !dbg !110
  br i1 true, label %idxend, label %oob, !dbg !110

oob:                                              ; preds = %top
  unreachable

idxend:                                           ; preds = %top
  %"'ipc" = addrspacecast {} addrspace(10)* %"'" to double addrspace(13)* addrspace(11)*, !dbg !110
  %"arrayptr6'ipl" = load double addrspace(13)*, double addrspace(13)* addrspace(11)* %"'ipc", align 16, !dbg !110, !tbaa !45, !alias.scope !111, !noalias !114, !nonnull !14
  %"'ipg" = getelementptr inbounds double, double addrspace(13)* %"arrayptr6'ipl", i64 %5, !dbg !110
  br label %invertidxend, !dbg !110

inverttop:                                        ; preds = %invertidxend
  fence syncscope("singlethread") seq_cst
  fence syncscope("singlethread") seq_cst
  %6 = load double, double* %"'de", align 8
  %7 = insertvalue { double } undef, double %6, 0
  ret { double } %7

invertidxend:                                     ; preds = %idxend
  %8 = load double, double addrspace(13)* %"'ipg", align 8, !dbg !110, !tbaa !48, !alias.scope !116, !noalias !119
  store double 0.000000e+00, double addrspace(13)* %"'ipg", align 8, !dbg !110, !tbaa !48, !alias.scope !116, !noalias !119
  %9 = load double, double* %"'de", align 8, !dbg !110
  %10 = fadd fast double %9, %8, !dbg !110
  store double %10, double* %"'de", align 8, !dbg !110
  br label %inverttop
}

; ModuleID = 'start'
source_filename = "start"
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-linux-gnu"

; Function Attrs: inaccessiblemem_or_argmemonly nofree noinline optnone
declare void @julia.safepoint(i64*) local_unnamed_addr #0

; Function Attrs: noinline noreturn optnone
declare void @ijl_bounds_error_ints({} addrspace(12)*, i64*, i64) local_unnamed_addr #1

; Function Attrs: noinline optnone
define { {} addrspace(10)*, {} addrspace(10)* } @augmented_julia_setindex__2765wrap({} addrspace(10)* %0, {} addrspace(10)* %1, double %2, i64 %3) #2 !dbg !4 {
entry:
  %thread_ptr = call i8* asm "movq %fs:0, $0", "=r"() #9
  %tls_ppgcstack = getelementptr i8, i8* %thread_ptr, i64 -8
  %4 = bitcast i8* %tls_ppgcstack to {}****
  %tls_pgcstack = load {}***, {}**** %4, align 8
  %ptls_field3.i = getelementptr inbounds {}**, {}*** %tls_pgcstack, i64 2
  %5 = bitcast {}*** %ptls_field3.i to i64***
  %ptls_load45.i = load i64**, i64*** %5, align 8, !tbaa !8, !alias.scope !12, !noalias !15
  %6 = getelementptr inbounds i64*, i64** %ptls_load45.i, i64 2
  %safepoint.i = load i64*, i64** %6, align 8, !tbaa !17, !alias.scope !19, !noalias !22
  fence syncscope("singlethread") seq_cst
  %7 = load volatile i64, i64* %safepoint.i, align 8, !dbg !24
  fence syncscope("singlethread") seq_cst
  %8 = add i64 %3, -1, !dbg !24
  %9 = bitcast {} addrspace(10)* %0 to { i8 addrspace(13)*, i64, i16, i16, i32 } addrspace(10)*, !dbg !24
  %10 = addrspacecast { i8 addrspace(13)*, i64, i16, i16, i32 } addrspace(10)* %9 to { i8 addrspace(13)*, i64, i16, i16, i32 } addrspace(11)*, !dbg !24
  %arraylen_ptr.i = getelementptr inbounds { i8 addrspace(13)*, i64, i16, i16, i32 }, { i8 addrspace(13)*, i64, i16, i16, i32 } addrspace(11)* %10, i64 0, i32 1, !dbg !24
  %arraylen.i = load i64, i64 addrspace(11)* %arraylen_ptr.i, align 8, !dbg !24, !tbaa !42, !range !45, !alias.scope !46, !noalias !51
  %inbounds.i = icmp ult i64 %8, %arraylen.i, !dbg !24
  br i1 %inbounds.i, label %augmented_julia_setindex__2765.exit, label %oob.i, !dbg !24

oob.i:                                            ; preds = %entry
  %errorbox.i = alloca i64, align 8, !dbg !24
  store i64 %3, i64* %errorbox.i, align 8, !dbg !24, !noalias !57
  %11 = addrspacecast {} addrspace(10)* %0 to {} addrspace(12)*, !dbg !24
  call void @ijl_bounds_error_ints({} addrspace(12)* noundef %11, i64* noundef nonnull align 8 %errorbox.i, i64 noundef 1) #10, !dbg !24
  unreachable, !dbg !24

augmented_julia_setindex__2765.exit:              ; preds = %entry
  %12 = bitcast {} addrspace(10)* %0 to double addrspace(13)* addrspace(10)*, !dbg !24
  %13 = addrspacecast double addrspace(13)* addrspace(10)* %12 to double addrspace(13)* addrspace(11)*, !dbg !24
  %arrayptr6.i = load double addrspace(13)*, double addrspace(13)* addrspace(11)* %13, align 16, !dbg !24, !tbaa !62, !alias.scope !64, !noalias !51, !nonnull !7
  %14 = getelementptr inbounds double, double addrspace(13)* %arrayptr6.i, i64 %8, !dbg !24
  store double %2, double addrspace(13)* %14, align 8, !dbg !24, !tbaa !67, !alias.scope !70, !noalias !73
  %15 = insertvalue { {} addrspace(10)*, {} addrspace(10)* } zeroinitializer, {} addrspace(10)* %0, 0
  %16 = insertvalue { {} addrspace(10)*, {} addrspace(10)* } %15, {} addrspace(10)* %1, 1
  ret { {} addrspace(10)*, {} addrspace(10)* } %16
}

; Function Attrs: nofree noinline nosync optnone
define [1 x { double }] @diffejulia_setindex__2765wrap({} addrspace(10)* nocapture nofree readnone %0, {} addrspace(10)* nocapture nofree readonly %1, double %2, i64 %3) #3 !dbg !75 {
entry:
  %4 = add i64 %3, -1, !dbg !76
  %5 = bitcast {} addrspace(10)* %1 to double addrspace(13)* addrspace(10)*, !dbg !76
  %"'ipc.i" = addrspacecast double addrspace(13)* addrspace(10)* %5 to double addrspace(13)* addrspace(11)*, !dbg !76
  %"arrayptr6'ipl.i" = load double addrspace(13)*, double addrspace(13)* addrspace(11)* %"'ipc.i", align 16, !dbg !76, !tbaa !62, !alias.scope !84, !noalias !89, !nonnull !7
  %"'ipg.i" = getelementptr inbounds double, double addrspace(13)* %"arrayptr6'ipl.i", i64 %4, !dbg !76
  %6 = load double, double addrspace(13)* %"'ipg.i", align 8, !dbg !76, !tbaa !67, !alias.scope !91, !noalias !94
  store double 0.000000e+00, double addrspace(13)* %"'ipg.i", align 8, !dbg !76, !tbaa !67, !alias.scope !91, !noalias !96
  fence syncscope("singlethread") seq_cst
  %.unpack1 = insertvalue { double } zeroinitializer, double %6, 0
  %7 = insertvalue [1 x { double }] zeroinitializer, { double } %.unpack1, 0
  ret [1 x { double }] %7
}

; Function Attrs: argmemonly nocallback nofree noinline nosync nounwind optnone willreturn
declare void @llvm.lifetime.start.p0i8(i64 immarg, i8* nocapture) #4

; Function Attrs: argmemonly nocallback nofree noinline nosync nounwind optnone willreturn
declare void @llvm.lifetime.end.p0i8(i64 immarg, i8* nocapture) #4

; Function Attrs: nocallback nofree noinline nosync nounwind optnone willreturn
declare i8* @llvm.stacksave() #5

; Function Attrs: nocallback nofree noinline nosync nounwind optnone willreturn
declare void @llvm.stackrestore(i8*) #5

; Function Attrs: inaccessiblemem_or_argmemonly noinline optnone
declare void @ijl_gc_queue_root({} addrspace(10)*) #6

; Function Attrs: noinline optnone allocsize(2)
declare noalias nonnull {} addrspace(10)* @ijl_gc_pool_alloc(i8*, i32, i32) #7

; Function Attrs: noinline optnone allocsize(1)
declare noalias nonnull {} addrspace(10)* @ijl_gc_big_alloc(i8*, i64) #8

; Function Attrs: noinline optnone allocsize(1)
declare noalias nonnull {} addrspace(10)* @ijl_gc_alloc_typed(i8*, i64, i8*) #8

attributes #0 = { inaccessiblemem_or_argmemonly nofree noinline optnone "enzyme_inactive" "enzyme_no_escaping_allocation" "enzymejl_world"="31477" }
attributes #1 = { noinline noreturn optnone "enzymejl_world"="31477" }
attributes #2 = { noinline optnone "enzymejl_world"="31477" }
attributes #3 = { nofree noinline nosync optnone "enzymejl_world"="31477" }
attributes #4 = { argmemonly nocallback nofree noinline nosync nounwind optnone willreturn }
attributes #5 = { nocallback nofree noinline nosync nounwind optnone willreturn }
attributes #6 = { inaccessiblemem_or_argmemonly noinline optnone }
attributes #7 = { noinline optnone allocsize(2) }
attributes #8 = { noinline optnone allocsize(1) }
attributes #9 = { nounwind }
attributes #10 = { mustprogress noreturn willreturn }

!llvm.module.flags = !{!0, !1}
!llvm.dbg.cu = !{!2}

!0 = !{i32 2, !"Dwarf Version", i32 4}
!1 = !{i32 2, !"Debug Info Version", i32 3}
!2 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !3, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, nameTableKind: None)
!3 = !DIFile(filename: "julia", directory: ".")
!4 = distinct !DISubprogram(name: "augmented_julia_setindex__2765wrap", linkageName: "augmented_julia_setindex__2765wrap", scope: null, file: !5, type: !6, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition | DISPFlagOptimized, unit: !2, retainedNodes: !7)
!5 = !DIFile(filename: "array.jl", directory: ".")
!6 = !DISubroutineType(types: !7)
!7 = !{}
!8 = !{!9, !9, i64 0}
!9 = !{!"jtbaa_gcframe", !10, i64 0}
!10 = !{!"jtbaa", !11, i64 0}
!11 = !{!"jtbaa"}
!12 = !{!13}
!13 = distinct !{!13, !14, !"primal"}
!14 = distinct !{!14, !" diff: %"}
!15 = !{!16}
!16 = distinct !{!16, !14, !"shadow_0"}
!17 = !{!18, !18, i64 0, i64 0}
!18 = !{!"jtbaa_const", !10, i64 0}
!19 = !{!20}
!20 = distinct !{!20, !21, !"primal"}
!21 = distinct !{!21, !" diff: %ptls_load45"}
!22 = !{!23}
!23 = distinct !{!23, !21, !"shadow_0"}
!24 = !DILocation(line: 1021, scope: !25, inlinedAt: !41)
!25 = distinct !DISubprogram(name: "setindex!", linkageName: "julia_setindex!_2765", scope: null, file: !5, line: 1021, type: !26, scopeLine: 1021, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !2, retainedNodes: !36)
!26 = !DISubroutineType(types: !27)
!27 = !{!28, !33, !28, !34, !35}
!28 = !DIDerivedType(tag: DW_TAG_typedef, name: "Array", baseType: !29)
!29 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !30, size: 64, align: 64)
!30 = !DICompositeType(tag: DW_TAG_structure_type, name: "jl_value_t", file: !31, line: 71, align: 64, elements: !32)
!31 = !DIFile(filename: "julia.h", directory: "")
!32 = !{!29}
!33 = !DICompositeType(tag: DW_TAG_structure_type, name: "#setindex!", align: 8, elements: !7, runtimeLang: DW_LANG_Julia, identifier: "127923603541552")
!34 = !DIBasicType(name: "Float64", size: 64, encoding: DW_ATE_unsigned)
!35 = !DIBasicType(name: "Int64", size: 64, encoding: DW_ATE_unsigned)
!36 = !{!37, !38, !39, !40}
!37 = !DILocalVariable(name: "#self#", arg: 1, scope: !25, file: !5, line: 1021, type: !33)
!38 = !DILocalVariable(name: "A", arg: 2, scope: !25, file: !5, line: 1021, type: !28)
!39 = !DILocalVariable(name: "x", arg: 3, scope: !25, file: !5, line: 1021, type: !34)
!40 = !DILocalVariable(name: "i1", arg: 4, scope: !25, file: !5, line: 1021, type: !35)
!41 = distinct !DILocation(line: 0, scope: !4)
!42 = !{!43, !43, i64 0}
!43 = !{!"jtbaa_arraylen", !44, i64 0}
!44 = !{!"jtbaa_array", !10, i64 0}
!45 = !{i64 0, i64 9223372036854775807}
!46 = !{!47, !49}
!47 = distinct !{!47, !48, !"primal"}
!48 = distinct !{!48, !" diff: %"}
!49 = !{!"jnoalias_typemd", !50}
!50 = !{!"jnoalias"}
!51 = !{!52, !53, !54, !55, !56}
!52 = distinct !{!52, !48, !"shadow_0"}
!53 = !{!"jnoalias_gcframe", !50}
!54 = !{!"jnoalias_stack", !50}
!55 = !{!"jnoalias_data", !50}
!56 = !{!"jnoalias_const", !50}
!57 = !{!58, !60}
!58 = distinct !{!58, !59, !"na_addr13"}
!59 = distinct !{!59, !"addr13"}
!60 = distinct !{!60, !61, !"na_addr13"}
!61 = distinct !{!61, !"addr13"}
!62 = !{!63, !63, i64 0}
!63 = !{!"jtbaa_arrayptr", !44, i64 0}
!64 = !{!58, !47, !65, !49}
!65 = distinct !{!65, !66, !"na_addr13"}
!66 = distinct !{!66, !"addr13"}
!67 = !{!68, !68, i64 0}
!68 = !{!"jtbaa_arraybuf", !69, i64 0}
!69 = !{!"jtbaa_data", !10, i64 0}
!70 = !{!71, !55}
!71 = distinct !{!71, !72, !"primal"}
!72 = distinct !{!72, !" diff: %arrayptr6"}
!73 = !{!58, !74, !65, !53, !54, !49, !56}
!74 = distinct !{!74, !72, !"shadow_0"}
!75 = distinct !DISubprogram(name: "diffejulia_setindex__2765wrap", linkageName: "diffejulia_setindex__2765wrap", scope: null, file: !5, type: !6, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition | DISPFlagOptimized, unit: !2, retainedNodes: !7)
!76 = !DILocation(line: 1021, scope: !77, inlinedAt: !83)
!77 = distinct !DISubprogram(name: "setindex!", linkageName: "julia_setindex!_2765", scope: null, file: !5, line: 1021, type: !26, scopeLine: 1021, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !2, retainedNodes: !78)
!78 = !{!79, !80, !81, !82}
!79 = !DILocalVariable(name: "#self#", arg: 1, scope: !77, file: !5, line: 1021, type: !33)
!80 = !DILocalVariable(name: "A", arg: 2, scope: !77, file: !5, line: 1021, type: !28)
!81 = !DILocalVariable(name: "x", arg: 3, scope: !77, file: !5, line: 1021, type: !34)
!82 = !DILocalVariable(name: "i1", arg: 4, scope: !77, file: !5, line: 1021, type: !35)
!83 = distinct !DILocation(line: 0, scope: !75)
!84 = !{!58, !85, !87, !49}
!85 = distinct !{!85, !86, !"shadow_0"}
!86 = distinct !{!86, !" diff: %"}
!87 = distinct !{!87, !88, !"na_addr13"}
!88 = distinct !{!88, !"addr13"}
!89 = !{!90, !53, !54, !55, !56}
!90 = distinct !{!90, !86, !"primal"}
!91 = !{!92, !55}
!92 = distinct !{!92, !93, !"shadow_0"}
!93 = distinct !{!93, !" diff: %arrayptr6"}
!94 = !{!95, !87, !53, !54, !49, !56}
!95 = distinct !{!95, !93, !"primal"}
!96 = !{!58, !95, !87, !53, !54, !49, !56}

GC error (probable corruption)
Allocations: 27089595 (Pool: 27035466; Big: 54129); GC: 39
Base.getindex

thread 0 ptr queue:
~~~~~~~~~~ ptr queue top ~~~~~~~~~~
<?#0x745891cbf8e0::(nil)>
==========

!!! ERROR in jl_ -- ABORTING !!!
==========
Array{Float64, (4,)}[0, 0, 0, 0]
==========
Array{Float64, (4,)}[inf, 0, 0, 0]
==========
<?#0x745891d17a00::(nil)>
==========
~~~~~~~~~~ ptr queue bottom ~~~~~~~~~~

[774624] signal (6.-6): Aborted
in expression starting at /home/wmoses/git/Enzyme.jl/fft.jl:76
pthread_kill at /lib/x86_64-linux-gnu/libc.so.6 (unknown line)
raise at /lib/x86_64-linux-gnu/libc.so.6 (unknown line)
abort at /lib/x86_64-linux-gnu/libc.so.6 (unknown line)
gc_dump_queue_and_abort at /home/wmoses/git/Enzyme.jl/julia10/src/gc.c:1822
gc_mark_outrefs at /home/wmoses/git/Enzyme.jl/julia10/src/gc.c:2528 [inlined]
gc_mark_loop_serial_ at /home/wmoses/git/Enzyme.jl/julia10/src/gc.c:2697
gc_mark_loop_serial at /home/wmoses/git/Enzyme.jl/julia10/src/gc.c:2720
gc_mark_loop at /home/wmoses/git/Enzyme.jl/julia10/src/gc.c:2901
_jl_gc_collect at /home/wmoses/git/Enzyme.jl/julia10/src/gc.c:3234
ijl_gc_collect at /home/wmoses/git/Enzyme.jl/julia10/src/gc.c:3531
maybe_collect at /home/wmoses/git/Enzyme.jl/julia10/src/gc.c:937
jl_gc_pool_alloc_inner at /home/wmoses/git/Enzyme.jl/julia10/src/gc.c:1300
ijl_gc_pool_alloc at /home/wmoses/git/Enzyme.jl/julia10/src/gc.c:1348
ab3_step at /home/wmoses/git/Enzyme.jl/fft.jl:41
forward_model_cost at /home/wmoses/git/Enzyme.jl/fft.jl:57 [inlined]
diffejulia_forward_model_cost_827wrap at /home/wmoses/git/Enzyme.jl/fft.jl:0
macro expansion at /home/wmoses/git/Enzyme.jl/src/compiler.jl:6819 [inlined]
enzyme_call at /home/wmoses/git/Enzyme.jl/src/compiler.jl:6419 [inlined]
CombinedAdjointThunk at /home/wmoses/git/Enzyme.jl/src/compiler.jl:6296 [inlined]
autodiff at /home/wmoses/git/Enzyme.jl/src/Enzyme.jl:314 [inlined]
autodiff at /home/wmoses/git/Enzyme.jl/src/Enzyme.jl:338 [inlined]
autodiff at /home/wmoses/git/Enzyme.jl/src/Enzyme.jl:323
unknown function (ip: 0x745883f1da8a)
_jl_invoke at /home/wmoses/git/Enzyme.jl/julia10/src/gf.c:2895
ijl_apply_generic at /home/wmoses/git/Enzyme.jl/julia10/src/gf.c:3077
jl_apply at /home/wmoses/git/Enzyme.jl/julia10/src/julia.h:1982
do_call at /home/wmoses/git/Enzyme.jl/julia10/src/interpreter.c:126
eval_value at /home/wmoses/git/Enzyme.jl/julia10/src/interpreter.c:223
eval_stmt_value at /home/wmoses/git/Enzyme.jl/julia10/src/interpreter.c:174
eval_body at /home/wmoses/git/Enzyme.jl/julia10/src/interpreter.c:617
jl_interpret_toplevel_thunk at /home/wmoses/git/Enzyme.jl/julia10/src/interpreter.c:775
jl_toplevel_eval_flex at /home/wmoses/git/Enzyme.jl/julia10/src/toplevel.c:934
jl_toplevel_eval_flex at /home/wmoses/git/Enzyme.jl/julia10/src/toplevel.c:877
ijl_toplevel_eval at /home/wmoses/git/Enzyme.jl/julia10/src/toplevel.c:943
ijl_toplevel_eval_in at /home/wmoses/git/Enzyme.jl/julia10/src/toplevel.c:985
eval at ./boot.jl:385 [inlined]
include_string at ./loading.jl:2076
jl_fptr_args at /home/wmoses/git/Enzyme.jl/julia10/src/gf.c:2537
_jl_invoke at /home/wmoses/git/Enzyme.jl/julia10/src/gf.c:2876
ijl_apply_generic at /home/wmoses/git/Enzyme.jl/julia10/src/gf.c:3077
_include at ./loading.jl:2136
include at ./Base.jl:495
jfptr_include_46707 at /home/wmoses/git/Enzyme.jl/julia10/usr/lib/julia/sys-debug.so (unknown line)
_jl_invoke at /home/wmoses/git/Enzyme.jl/julia10/src/gf.c:2876
ijl_apply_generic at /home/wmoses/git/Enzyme.jl/julia10/src/gf.c:3077
exec_options at ./client.jl:318
_start at ./client.jl:552
jfptr__start_83017 at /home/wmoses/git/Enzyme.jl/julia10/usr/lib/julia/sys-debug.so (unknown line)
_jl_invoke at /home/wmoses/git/Enzyme.jl/julia10/src/gf.c:2876
ijl_apply_generic at /home/wmoses/git/Enzyme.jl/julia10/src/gf.c:3077
jl_apply at /home/wmoses/git/Enzyme.jl/julia10/src/julia.h:1982
true_main at /home/wmoses/git/Enzyme.jl/julia10/src/jlapi.c:582
jl_repl_entrypoint at /home/wmoses/git/Enzyme.jl/julia10/src/jlapi.c:731
jl_load_repl at /home/wmoses/git/Enzyme.jl/julia10/cli/loader_lib.c:568
main at /home/wmoses/git/Enzyme.jl/julia10/cli/loader_exe.c:58
unknown function (ip: 0x74589c829d8f)
__libc_start_main at /lib/x86_64-linux-gnu/libc.so.6 (unknown line)
_start at ./julia10/julia (unknown line)
Allocations: 27089595 (Pool: 27035466; Big: 54129); GC: 39
wmoses@beast:~/git/Enzyme.jl (fcc2) $ 
wsmoses commented 1 month ago

Idk why LLC hates us but the module of relevance:

https://godbolt.org/z/6j6YjjYzn

wsmoses commented 1 month ago

https://godbolt.org/z/EEE1dj6aE

wsmoses commented 1 month ago

sn.txt

wsmoses commented 1 month ago

from https://godbolt.org/z/EacKPahbf

estimated problem child in 735: movq %r13, 8(%rdi,%r12)

wsmoses commented 1 month ago

Running Julia alloc opt on https://godbolt.org/z/77f9K43bj breaks

wsmoses commented 1 month ago

FYI for those following here. This turns out to be a bug in the julia compiler itself (fixed here https://github.com/JuliaLang/julia/pull/55306)

wsmoses commented 1 month ago

Closing as a relevant issue is open in julia proper -- and unfortauntely there's nothing we can do in this package.

trostelm commented 1 month ago

Thanks for looking into this @wsmoses !