Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

Differentiating FFTW fftshift #1652

Closed
trostelm opened this issue Jul 19, 2024 · 18 comments
Closed

Differentiating FFTW fftshift #1652

trostelm opened this issue Jul 19, 2024 · 18 comments

Comments

@trostelm
Copy link

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
Copy link
Member

wsmoses commented Jul 20, 2024

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

@trostelm
Copy link
Author

trostelm commented Jul 22, 2024

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
Copy link
Member

wsmoses commented Jul 22, 2024

@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
Copy link
Author

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

@roflmaostc
Copy link

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
Copy link
Member

wsmoses commented Jul 27, 2024

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
Copy link
Member

wsmoses commented Jul 28, 2024

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
Copy link
Member

wsmoses commented Jul 28, 2024

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
Copy link
Member

wsmoses commented Jul 28, 2024

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
Copy link
Member

wsmoses commented Jul 28, 2024

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
Copy link
Member

wsmoses commented Jul 28, 2024

Idk why LLC hates us but the module of relevance:

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

@wsmoses
Copy link
Member

wsmoses commented Jul 29, 2024

@wsmoses
Copy link
Member

wsmoses commented Jul 29, 2024

sn.txt

@wsmoses
Copy link
Member

wsmoses commented Jul 29, 2024

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

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

@wsmoses
Copy link
Member

wsmoses commented Jul 29, 2024

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

@wsmoses
Copy link
Member

wsmoses commented Jul 31, 2024

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

@wsmoses
Copy link
Member

wsmoses commented Jul 31, 2024

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

@wsmoses wsmoses closed this as completed Jul 31, 2024
@trostelm
Copy link
Author

trostelm commented Aug 1, 2024

Thanks for looking into this @wsmoses !

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants