Enzyme.jl icon indicating copy to clipboard operation
Enzyme.jl copied to clipboard

Enzyme failing in Julia: ERROR: LoadError: Enzyme execution failed.

Open miguelborrero5 opened this issue 1 year ago • 7 comments

Hi there,

Opening this issue to see whether I could get some help with making Reverse mode in autodiff work. I made it work on trivial examples, even containing conditional statements but for some reason it won’t work on the function I am interested. This function takes in various parameters and then a vector of floats over which we want to calculate the gradient. It is a long function so for now I will only provide a reduced example. I am sorry if this is still too long. Below you can find self-contained code which includes a function at the end that calls autodiff using Enzyme. Moreover, after the code I post the error message.

using Distributions 
using Polynomials
using Combinatorics
using Statistics
using FastGaussQuadrature
using Interpolations
using LinearAlgebra
using Printf
using BenchmarkTools
using StaticArrays
using Enzyme

struct SpecFormat
    special_banks::Vector{Int64} # list of banks that are special
    home_bank::Int64
    max_banks_in_choice_set::Int64 # max number of banks in the choice set 

    hermite_order::Int64
    bernstein_order::Int64

    initial_search_cost_X::Vector{Union{Symbol, String}}
    per_bank_search_cost_X::Vector{Union{Symbol, String}}
    ρ_X::Vector{Union{Symbol, String}}
    γ_X::Vector{Union{Symbol, String}}
    γ_std_X::Vector{Union{Symbol, String}}
    κ_X::Vector{Union{Symbol, String}}
    initial_mean_shifters::Vector{Union{Symbol, String}}
    initial_std_shifters::Vector{Union{Symbol, String}}
    final_mean_shifters::Vector{Union{Symbol, String}}
    final_std_shifters::Vector{Union{Symbol, String}}

end

struct SubParamIndices
    κ::Int64
    γ::Int64
    γ_std::Int64
    initial_search_cost::Int64
    ρ::Int64
    initial_bank_μ::Int64
    initial_bank_σ::Int64
    final_bank_μ::Int64
    final_bank_σ::Int64
    σinv_choice::Int64
    σinv_start_search::Int64

    per_bank_search_cost::Vector{Int64}
    bank_params::Vector{Vector{Int64}}
    jump_bid_params::Vector{Int64}
    implied_jump_bid_params::Vector{Int64}

    n_params::Int64

end

struct ParamIndices
    bank_params::Vector{Vector{Int64}}
    jump_bid_params::Vector{Int64}
    implied_jump_bid_params::Vector{Int64}
    initial_search_cost_X::Vector{Int64}
    per_bank_search_cost_X::Vector{Int64}
    ρ_X::Vector{Int64}
    γ_X::Vector{Int64}
    γ_std_X::Vector{Int64}
    κ_X::Vector{Int64}
    bank_mean_shifters::Vector{Int64}
    bank_std_shifters::Vector{Int64}
    initial_search_cost_X_indices::Vector{Int64}
    ρ_X_indices::Vector{Int64}
    γ_X_indices::Vector{Int64}
    γ_std_X_indices::Vector{Int64}
    κ_X_indices::Vector{Int64}
    initial_mean_indices::Vector{Int64}
    initial_std_indices::Vector{Int64}
    final_mean_indices::Vector{Int64}
    final_std_indices::Vector{Int64}
    σinv_choice::Int64
    σinv_start_search::Int64
    n_params::Int64
end

function cumtrapz_upper(x::Vector{Float64}, y::AbstractArray{TV, 1})::Vector{TV} where TV
    z::Vector{TV} = zeros(Float64, length(x))
    z[1] = 0.0
    @inbounds @fastmath for i = 1:length(x)-1
        z[i+1] = z[i] + (x[i+1] - x[i]) * (y[i+1] + y[i]) 
    end
    z = z[end] .- z
    return 0.5 * z
end

function hermite5_cdf(a::AbstractArray{TV, 1}, μ::TV, σ::TV) where TV
    poly_coeffs::Vector{TV} = [-48 * a[1] * a[2] - 24 * sqrt(2) * a[2] * a[3] + 8 * sqrt(6) * a[1] * a[4] - 24 * sqrt(3) * a[3] * a[4] + 4 * sqrt(6) * a[2] * a[5] - 36 * a[4] * a[5], 
        -24 * a[2]^2 - 24 * sqrt(2) * a[1] * a[3] - 12 * a[3]^2 - 24 * a[4]^2 + 12 * sqrt(6) * a[1] * a[5] - 12 * sqrt(3) * a[3] * a[5] - 15 * a[5]^2, 
        -24 * sqrt(2) * a[2] * a[3] - 8 * sqrt(6) * a[1] * a[4] + 8 * sqrt(6) * a[2] * a[5] - 36 * a[4] * a[5],
        -12 * a[3]^2 - 8 * sqrt(6) * a[2] * a[4] + 4 * a[4]^2 - 4 * sqrt(6) * a[1] * a[5] + 8 * sqrt(3) * a[3] * a[5] - 17 * a[5]^2,
        -8 * sqrt(3) * a[3] * a[4] - 4 * sqrt(6) * a[2] * a[5] + 12 * a[4] * a[5],
        -4 * a[4]^2 - 4 * sqrt(3) * a[3] * a[5] + 5 * a[5]^2,
        -4 * a[4] * a[5],
        -a[5]^2]
    func(x) = σ * Polynomial(poly_coeffs).((x .- μ) / σ) .* pdf.(Normal(μ, σ), x) ./ 24.0 .+ cdf.(Normal(μ, σ), x)
    return func
end

function hermite5_pdf(a::AbstractArray{TV, 1}, μ::TV, σ::TV) where TV
    poly_coeffs::Vector{TV} = [a[1] - a[3] / sqrt(2) + sqrt(3/8) * a[5], 
        a[2] - sqrt(3/2) * a[4], 
        a[3] / sqrt(2) - sqrt(3/2) * a[5], 
        a[4] / sqrt(6), 
        a[5] / sqrt(24)]
    func(x) = (Polynomial(poly_coeffs).((x .- μ) / σ)).^2 .* pdf.(Normal(μ, σ), x)
    return func
end

function bernstein3(a::AbstractArray{TV, 1}; upper::Float64 = 1.0, lower::Float64 = 0.0) where TV
    base_func(x) = a[1] * (1 - x)^3 + 3 * a[2] * x * (1 - x)^2 + 3 * a[3] * x^2 * (1 - x) + a[4] * x^3
    func(x) = base_func((x - lower) / (upper - lower))
    return func
end

function solve_cubic_eq(poly::AbstractVector{Complex{T}}) where T
    # Cubic equation solver for complex polynomial (degree=3)
    # http://en.wikipedia.org/wiki/Cubic_function   Lagrange's method
    a1  =  1 / poly[4]
    E1  = -poly[3]*a1
    E2  =  poly[2]*a1
    E3  = -poly[1]*a1
    s0  =  E1
    E12 =  E1*E1
    A   =  2*E1*E12 - 9*E1*E2 + 27*E3 # = s1^3 + s2^3
    B   =  E12 - 3*E2                 # = s1 s2
    # quadratic equation: z^2 - Az + B^3=0  where roots are equal to s1^3 and s2^3
    Δ = sqrt(A*A - 4*B*B*B)
    if real(conj(A)*Δ)>=0 # scalar product to decide the sign yielding bigger magnitude
        s1 = exp(log(0.5 * (A + Δ)) * (1/3))
    else
        s1 = exp(log(0.5 * (A - Δ)) * (1/3))
    end
    if s1 == 0
        s2 = s1
    else
        s2 = B / s1
    end
    zeta1 = complex(-0.5, sqrt(T(3.0))*0.5)
    zeta2 = conj(zeta1)
    # return third*(s0 + s1 + s2), third*(s0 + s1*zeta2 + s2*zeta1), third*(s0 + s1*zeta1 + s2*zeta2)

    sol1 = (1/3) * (s0 + s1 + s2)
    sol2 = (1/3) * (s0 + s1 * zeta2 + s2 * zeta1)
    sol3 = (1/3) * (s0 + s1 * zeta1 + s2 * zeta2)

    if abs(imag(sol1)) < 1e-8 && real(sol1) > 0.0 && real(sol1) < 1.0
        return real(sol1)
    elseif abs(imag(sol2)) < 1e-8 && real(sol2) > 0.0 && real(sol2) < 1.0
        return real(sol2)
    elseif abs(imag(sol3)) < 1e-8 && real(sol3) > 0.0 && real(sol3) < 1.0
        return real(sol3)
    else
        return NaN
    end
end

function bernstein3_inv(p::AbstractArray{TV, 1}, val::Float64; upper::Float64 = 1.0, lower::Float64 = 0.0) where TV
    # Get this in the form ax^3 + bx^2 + cx + d = 0
    a = p[4] + 3 * p[2] - 3 * p[3] - p[1]
    b = 3 * p[1] - 6 * p[2] + 3 * p[3]
    c = 3 * p[2] - 3 * p[1]
    d = p[1] - val
    coeffs = [d, c, b, a]

    if d >= 0.0 # (poly(0.0))
        return lower
    elseif a + b + c + d <= 0.0 # (poly(1.0))
        return upper
    end

    x = solve_cubic_eq(Complex.(coeffs))
    return x * (upper - lower) + lower
end

# From PolynomialRoots.jl
function solve_cubic_eq(poly::AbstractVector{Complex{T}}) where T
    # Cubic equation solver for complex polynomial (degree=3)
    # http://en.wikipedia.org/wiki/Cubic_function   Lagrange's method
    a1  =  1 / poly[4]
    E1  = -poly[3]*a1
    E2  =  poly[2]*a1
    E3  = -poly[1]*a1
    s0  =  E1
    E12 =  E1*E1
    A   =  2*E1*E12 - 9*E1*E2 + 27*E3 # = s1^3 + s2^3
    B   =  E12 - 3*E2                 # = s1 s2
    # quadratic equation: z^2 - Az + B^3=0  where roots are equal to s1^3 and s2^3
    Δ = sqrt(A*A - 4*B*B*B)
    if real(conj(A)*Δ)>=0 # scalar product to decide the sign yielding bigger magnitude
        s1 = exp(log(0.5 * (A + Δ)) * (1/3))
    else
        s1 = exp(log(0.5 * (A - Δ)) * (1/3))
    end
    if s1 == 0
        s2 = s1
    else
        s2 = B / s1
    end
    zeta1 = complex(-0.5, sqrt(T(3.0))*0.5)
    zeta2 = conj(zeta1)
    # return third*(s0 + s1 + s2), third*(s0 + s1*zeta2 + s2*zeta1), third*(s0 + s1*zeta1 + s2*zeta2)

    sol1 = (1/3) * (s0 + s1 + s2)
    sol2 = (1/3) * (s0 + s1 * zeta2 + s2 * zeta1)
    sol3 = (1/3) * (s0 + s1 * zeta1 + s2 * zeta2)

    if abs(imag(sol1)) < 1e-8 && real(sol1) > 0.0 && real(sol1) < 1.0
        return real(sol1)
    elseif abs(imag(sol2)) < 1e-8 && real(sol2) > 0.0 && real(sol2) < 1.0
        return real(sol2)
    elseif abs(imag(sol3)) < 1e-8 && real(sol3) > 0.0 && real(sol3) < 1.0
        return real(sol3)
    else
        return NaN
    end
end

function bernstein3_inv(p::AbstractArray{TV, 1}, val::Float64; upper::Float64 = 1.0, lower::Float64 = 0.0) where TV
    # Get this in the form ax^3 + bx^2 + cx + d = 0
    a = p[4] + 3 * p[2] - 3 * p[3] - p[1]
    b = 3 * p[1] - 6 * p[2] + 3 * p[3]
    c = 3 * p[2] - 3 * p[1]
    d = p[1] - val
    coeffs = [d, c, b, a]

    if d >= 0.0 # (poly(0.0))
        return lower
    elseif a + b + c + d <= 0.0 # (poly(1.0))
        return upper
    end

    x = solve_cubic_eq(Complex.(coeffs))
    return x * (upper - lower) + lower
end

# Here, we take in a set of choice sets, each of with can be repeated N times.
function logit_probabilities!(inside_probabilities::Array{TV, 3}, outside_probabilities::Matrix{TV}, utilities::Array{TV, 3}, N::Vector{Int64}, σinv::TV) where TV

    for uJ_index in axes(utilities, 2)
        for bias_index in axes(utilities, 3)
            this_exp_probs = @views exp.(utilities[:, uJ_index, bias_index] * σinv)
            inv_denom = 1.0 / (1.0 + dot(this_exp_probs, N))
            inside_probabilities[:, uJ_index, bias_index] .= inv_denom * this_exp_probs
            outside_probabilities[uJ_index, bias_index] = inv_denom
        end
    end

    return nothing
end

function partial_interpolate(x::AbstractArray{Float64, 1}, y::AbstractArray{TV, 1}, idx::Int64, val::Float64) where TV
    z::TV = 0.0
    if idx == 0
        z = x[1]
    elseif idx == length(x)
        z = x[end]
    else
        z = ((y[idx+1] - y[idx]) * (val - x[idx]) / (x[idx+1] - x[idx])) + y[idx]
    end

    return z
end

function get_spec()::SpecFormat

    special_banks::Vector{Int64} = [1, 14, 16] 
    home_bank::Int64 = 12
    max_banks_in_choice_set::Int64 = 3

    hermite_order::Int64 = 5
    bernstein_order::Int64 = 4

    initial_search_cost_X::Vector{Union{Symbol, String}} = [:ones, :x_educ_high, :x_income]
    per_bank_search_cost_X::Vector{Union{Symbol, String}} = [:ones, :x_educ_high, :x_income, :s_n_branches]
    ρ_X::Vector{Union{Symbol, String}} = [:ones, :x_educ_high, :x_income]
    γ_X::Vector{Union{Symbol, String}} = [:ones, :x_educ_high, :x_income]
    γ_std_X::Vector{Union{Symbol, String}} = [:ones]
    κ_X::Vector{Union{Symbol, String}} = [:ones, :x_educ_high, :x_income]
    initial_mean_shifters::Vector{Union{Symbol, String}} = [:ones, :x_educ_high, :x_income, :b_term, :b_amount]
    initial_std_shifters::Vector{Union{Symbol, String}} = [:ones, :b_term, :b_amount]
    final_mean_shifters::Vector{Union{Symbol, String}} = [:ones, :x_educ_high, :x_income, :b_term, :b_amount]
    final_std_shifters::Vector{Union{Symbol, String}} = [:ones, :b_term, :b_amount]

    spec::SpecFormat = SpecFormat(special_banks, home_bank, max_banks_in_choice_set, hermite_order, bernstein_order,
        initial_search_cost_X, per_bank_search_cost_X, ρ_X, γ_X, γ_std_X, κ_X, initial_mean_shifters, initial_std_shifters,
        final_mean_shifters, final_std_shifters)
    return spec

end

function get_indices(grid::AbstractArray{Float64, 1}, vals::AbstractArray{Float64, 1})::Vector{Int64}
    indices = zeros(Int64, length(vals))
    for (i, val) in enumerate(vals)
        indices[i] = searchsortedlast(grid, val)
    end

    return indices
end

function get_param_indices(spec::SpecFormat)::Tuple{ParamIndices, SubParamIndices}
    param_val::Int64 = 0

    bank_params::Vector{Vector{Int64}} = []
    for b = 1:(length(spec.special_banks)+1)
        this_bank_params::Vector{Int64}, param_val = param_update(spec.hermite_order, param_val)
        push!(bank_params, this_bank_params)
    end

    jump_bid_params::Vector{Int64}, param_val = param_update(spec.hermite_order, param_val)
    implied_jump_bid_params::Vector{Int64}, param_val = param_update(spec.bernstein_order, param_val)

    initial_search_cost_X::Vector{Int64}, param_val = param_update(length(spec.initial_search_cost_X), param_val)
    per_bank_search_cost_X::Vector{Int64}, param_val = param_update(length(spec.per_bank_search_cost_X), param_val)
    ρ_X::Vector{Int64}, param_val = param_update(length(spec.ρ_X), param_val)
    γ_X::Vector{Int64}, param_val = param_update(length(spec.γ_X), param_val)
    γ_std_X::Vector{Int64}, param_val = param_update(length(spec.γ_std_X), param_val)
    κ_X::Vector{Int64}, param_val = param_update(length(spec.κ_X), param_val)

    @assert(length(spec.initial_mean_shifters) == length(spec.final_mean_shifters))
    @assert(length(spec.initial_std_shifters) == length(spec.final_std_shifters))
    bank_mean_shifters::Vector{Int64}, param_val = param_update(length(spec.initial_mean_shifters), param_val)
    bank_std_shifters::Vector{Int64}, param_val = param_update(length(spec.initial_std_shifters), param_val)
    σinv_choice::Int64, param_val = param_update(1, param_val; return_as_vector = false)
    σinv_start_search::Int64, param_val = param_update(1, param_val; return_as_vector = false)

    # Now get the inidices: Will have one X matrix at the individual level (N_individuals x total parameters)
    # and then indices for which subsets of this X to use for various parameters
    all_X = sort!(union(spec.initial_search_cost_X, spec.ρ_X, spec.γ_X, spec.γ_std_X, spec.κ_X, 
        spec.initial_mean_shifters, spec.initial_std_shifters, spec.final_mean_shifters, spec.final_std_shifters)) # per-bank search cost will be at the individual-bank level
    initial_search_cost_X_indices::Vector{Int64} = [findall(x -> x == i, all_X)[1] for i in spec.initial_search_cost_X]
    ρ_X_indices::Vector{Int64} = [findall(x -> x == i, all_X)[1] for i in spec.ρ_X]
    γ_X_indices::Vector{Int64} = [findall(x -> x == i, all_X)[1] for i in spec.γ_X]
    γ_std_X_indices::Vector{Int64} = [findall(x -> x == i, all_X)[1] for i in spec.γ_std_X]
    κ_X_indices::Vector{Int64} = [findall(x -> x == i, all_X)[1] for i in spec.κ_X]
    initial_mean_indices::Vector{Int64} = [findall(x -> x == i, all_X)[1] for i in spec.initial_mean_shifters]
    initial_std_indices::Vector{Int64} = [findall(x -> x == i, all_X)[1] for i in spec.initial_std_shifters]
    final_mean_indices::Vector{Int64} = [findall(x -> x == i, all_X)[1] for i in spec.final_mean_shifters]
    final_std_indices::Vector{Int64} = [findall(x -> x == i, all_X)[1] for i in spec.final_std_shifters]

    param_indices = ParamIndices(bank_params, jump_bid_params, implied_jump_bid_params, 
        initial_search_cost_X, per_bank_search_cost_X, ρ_X, γ_X, γ_std_X, κ_X,
        bank_mean_shifters, bank_std_shifters,
        initial_search_cost_X_indices, ρ_X_indices, γ_X_indices, γ_std_X_indices, κ_X_indices, 
        initial_mean_indices, initial_std_indices, final_mean_indices, final_std_indices, 
        σinv_choice, σinv_start_search, param_val)

    sub_param_val::Int64 = 0
    sub_κ::Int64, sub_param_val = param_update(1, sub_param_val; return_as_vector = false)
    sub_γ::Int64, sub_param_val = param_update(1, sub_param_val; return_as_vector = false)
    sub_γ_std::Int64, sub_param_val = param_update(1, sub_param_val; return_as_vector = false)
    sub_initial_search_cost::Int64, sub_param_val = param_update(1, sub_param_val; return_as_vector = false)
    sub_ρ::Int64, sub_param_val = param_update(1, sub_param_val; return_as_vector = false)
    sub_initial_bank_μ::Int64, sub_param_val = param_update(1, sub_param_val; return_as_vector = false)
    sub_initial_bank_σ::Int64, sub_param_val = param_update(1, sub_param_val; return_as_vector = false)
    sub_final_bank_μ::Int64, sub_param_val = param_update(1, sub_param_val; return_as_vector = false)
    sub_final_bank_σ::Int64, sub_param_val = param_update(1, sub_param_val; return_as_vector = false)
    sub_σinv_choice::Int64, sub_param_val = param_update(1, sub_param_val; return_as_vector = false)
    sub_σinv_start_search::Int64, sub_param_val = param_update(1, sub_param_val; return_as_vector = false)
    sub_per_bank_search_cost::Vector{Int64}, sub_param_val = param_update(length(spec.special_banks)+1, sub_param_val)
    sub_bank_params::Vector{Vector{Int64}} = []
    for b = 1:(length(spec.special_banks)+1)
        this_bank_params::Vector{Int64}, sub_param_val = param_update(spec.hermite_order, sub_param_val)
        push!(sub_bank_params, this_bank_params)
    end
    sub_jump_bid_params::Vector{Int64}, sub_param_val = param_update(spec.hermite_order, sub_param_val)
    sub_implied_jump_bid_params::Vector{Int64}, sub_param_val = param_update(spec.bernstein_order, sub_param_val)

    sub_param_indices = SubParamIndices(sub_κ, sub_γ, sub_γ_std, sub_initial_search_cost, sub_ρ, 
        sub_initial_bank_μ, sub_initial_bank_σ, sub_final_bank_μ, sub_final_bank_σ, 
        sub_σinv_choice, sub_σinv_start_search, sub_per_bank_search_cost, sub_bank_params, 
        sub_jump_bid_params, sub_implied_jump_bid_params, sub_param_val)
        

    return (param_indices, sub_param_indices)
end

function param_update(N::Int64, param_val::Int64; return_as_vector::Bool = true)
    if N > 1 || return_as_vector
        indices::Vector{Int64} = collect(1:N) .+ param_val
        param_val += N
        return indices, param_val
    else
        indices_int::Int64 = param_val + 1
        param_val += 1
        return indices_int, param_val
    end
end

function get_ll_single(params::AbstractArray{TV, 1}, param_indices::SubParamIndices, uJ_grid::Vector{Float64}, base_nodes::SVector{9, Float64}, weights::SVector{9, Float64}
        , u_current_idx::Int64, remaining_term::Float64, amount::Float64, chosen_bank::Int64, current_monthly_payment::Float64, final_monthly_payment::Float64,
    search_type::Int64, choice_sets::Vector{Vector{Int64}}, choice_sets_N::Vector{Int64}, chosen_choice_set::Int64) where TV


    # Initialize the values of the frictions -- this applies for everyone
    κ::TV = params[param_indices.κ] 
    γ::TV = params[param_indices.γ] 
    γ_std::TV = params[param_indices.γ_std]
    initial_search_cost::TV = params[param_indices.initial_search_cost] 
    ρ::TV = params[param_indices.ρ] 
    initial_bank_μ::TV = params[param_indices.initial_bank_μ]  
    initial_bank_σ::TV = params[param_indices.initial_bank_σ] 
    final_bank_μ::TV = params[param_indices.final_bank_μ] 
    final_bank_σ::TV = params[param_indices.final_bank_σ] 
    σinv_choice::TV = params[param_indices.σinv_choice]
    σinv_start_search::TV = params[param_indices.σinv_start_search]
    
    ## Now the loop begins
    # Note that the cdf of zero-profit rates is written in terms of monthly payments if A = 1, scaled by number of 
    # payments. So, a value of m corresponds to a monthly payment of m * A / T.
    # 
    # We know that monthly utility = (delta - m * A / T) - kappa / NPVrate(T), 
    # So, Pr(utility <= u) = Pr((delta - m * A / T) - kappa/NPV <= u) = Pr(scaled monthly payment >= (T/A) * (delta - (u + kappa/NPV)))
    # The bias is in terms of monthly payments. So, we just add the bias.
    β_customer_m::Float64 = 0.95^(1/12)
    per_bank_search_costs::Vector{TV} = params[param_indices.per_bank_search_cost]
    npv_scale::Float64 = (1.0 - β_customer_m^remaining_term) / (1 - β_customer_m)
    overall_scale::Float64 = remaining_term / amount
    bias_grid = base_nodes * γ_std * sqrt(2) .+ γ # in units of dollars
    scaled_κ::TV = κ / npv_scale # in units of dollars per month


    # Generate the cdfs and pdfs for the banks: cdfs at the time of search, and both later if needed 

    # Maps utilities ($) to utilities ($) <--- could rethink whether this is the best map
    implied_jump_bid::Function = bernstein3(params[param_indices.implied_jump_bid_params]; upper = maximum(uJ_grid) + 2.0, lower = minimum(uJ_grid) - 2.0)
    implied_jump_bid_inv(val::Float64) = bernstein3_inv(params[param_indices.implied_jump_bid_params], val; upper = maximum(uJ_grid) + 2.0, lower = minimum(uJ_grid) - 2.0)

    
    initial_bank_cdf = [x -> 1.0 .- hermite5_cdf(params[a], initial_bank_μ, initial_bank_σ)(-overall_scale .* (x .+ scaled_κ)) for a in param_indices.bank_params]
    initial_jump_bid_cdf::Function = x -> 1.0 .- hermite5_cdf(params[param_indices.jump_bid_params], initial_bank_μ, initial_bank_σ)(-overall_scale .* x) 
    initial_jump_bid_pdf::Function = x -> overall_scale .* hermite5_pdf(params[param_indices.jump_bid_params], initial_bank_μ, initial_bank_σ)(-overall_scale .* x)
    initial_home_bank_cdf(x) = initial_jump_bid_cdf(implied_jump_bid.(x))

    final_bank_cdf = [x -> 1.0 .- hermite5_cdf(params[a], final_bank_μ, final_bank_σ)(@. -overall_scale * (x + scaled_κ)) for a in param_indices.bank_params]
    final_bank_pdf = [x -> overall_scale .* hermite5_pdf(params[a], final_bank_μ, final_bank_σ)(@. -overall_scale * (x + scaled_κ)) for a in param_indices.bank_params]
    final_jump_bid_cdf::Function = x -> 1.0 .- hermite5_cdf(params[param_indices.jump_bid_params], final_bank_μ, final_bank_σ)(@. -overall_scale * x) 
    final_jump_bid_pdf::Function = x -> overall_scale .* hermite5_pdf(params[param_indices.jump_bid_params], final_bank_μ, final_bank_σ)(@. -overall_scale * x)
    final_home_bank_cdf(x) = final_jump_bid_cdf(implied_jump_bid.(x))


    refi_at_home_bank::Bool = chosen_bank == 0
    u_current::Float64 = -current_monthly_payment
    u_final::TV = -final_monthly_payment - scaled_κ * refi_at_home_bank


    choice_set_utilities::Array{TV, 3} = zeros(length(choice_sets), length(uJ_grid), length(bias_grid)) ### CONTAINER 3D-FLOAT

    base_0::Vector{TV} = zeros(length(uJ_grid)) ### CONTAINER 1D FLOAT SIZE UJ_GRID
    base_1::Vector{TV} = zeros(length(uJ_grid)) ### CONTAINER 1D FLOAT SIZE UJ_GRID
    to_add::Vector{TV} = zeros(length(uJ_grid)) ### CONTAINER 1D FLOAT SIZE UJ_GRID


    initial_bank_cdf_vals::Matrix{Float64} = zeros(Float64, length(initial_bank_cdf), length(uJ_grid))
    one_minus_initial_bank_cdf_vals::Matrix{TV} = zeros(Float64, length(initial_bank_cdf), length(uJ_grid))


    @inbounds for (bias_index, bias) in enumerate(bias_grid)

        biased_uJ = uJ_grid .+ bias 

        for b = 1:length(initial_bank_cdf)
            initial_bank_cdf_vals[b, :] .= initial_bank_cdf[b](biased_uJ) 
            one_minus_initial_bank_cdf_vals[b, :] .= @views 1.0 .- initial_bank_cdf_vals[b, :]
        end

        initial_home_bank_cdf_vals::Vector{Float64} = initial_home_bank_cdf(biased_uJ)
        good_indices::BitVector = (initial_home_bank_cdf_vals[end] .- initial_home_bank_cdf_vals) .>= 1e-7
        
        @inbounds for (choice_set_index, choice_set) in enumerate(choice_sets)

            base_0 .= @views initial_bank_cdf_vals[choice_set[1], :]
            for (b_idx, b) in enumerate(choice_set)
                b_idx > 1 || continue
                base_0 .*= @views initial_bank_cdf_vals[b, :]
            end
            cumtrapz_0 = cumtrapz_upper(uJ_grid, base_0)

            base_1 .= 0.0
            for (b_index, b) in enumerate(choice_set)
                to_add .= @views one_minus_initial_bank_cdf_vals[b, :]
                for (bprime_index, bprime) in enumerate(choice_set)
                    if bprime_index != b_index
                        to_add .*= @views initial_bank_cdf_vals[bprime, :]
                    end
                end
                base_1 .+= to_add
            end
            cumtrapz_1 = cumtrapz_upper(uJ_grid, base_1)

            base_1 .*= initial_home_bank_cdf_vals
            cumtrapz_1_with_home = cumtrapz_upper(uJ_grid, base_1)

            next_part = base_0
            for i in eachindex(next_part)
                good_indices[i] ? next_part[i] = uJ_grid[end] - uJ_grid[i] - cumtrapz_0[i] - (cumtrapz_1_with_home[i] - initial_home_bank_cdf_vals[i] * cumtrapz_1[i]) / (initial_home_bank_cdf_vals[end] - initial_home_bank_cdf_vals[i]) : uJ_grid[end] - uJ_grid[i] - cumtrapz_0[i] - cumtrapz_1[i]
            end


            this_search_cost::TV = sum([per_bank_search_costs[b] for b in choice_set])
            choice_set_utilities[choice_set_index, :, bias_index] .= @. next_part - this_search_cost            

        end
    end


    choice_set_probabilities::Array{TV, 3} = zeros(size(choice_set_utilities))
    outside_option_probabilities::Array{TV, 2} = zeros(length(uJ_grid), length(bias_grid))
    logit_probabilities!(choice_set_probabilities, outside_option_probabilities,
        choice_set_utilities, choice_sets_N, σinv_choice)

    benefit_of_search_uJ::Array{TV, 2} = dropdims(sum((choice_sets_N .* choice_set_probabilities) .* choice_set_utilities, dims = 1), dims = 1)
    S_base::Vector{TV} = zeros(length(bias_grid)) 

    for (bias_index, bias) in enumerate(bias_grid)
        initial_jump_bid_pdf_vals = initial_jump_bid_pdf(uJ_grid .+ bias)

        S_base[bias_index] = @views partial_cumtrapz(uJ_grid, benefit_of_search_uJ[1:(u_current_idx+1), bias_index] .* initial_jump_bid_pdf_vals[1:(u_current_idx+1)], u_current_idx, u_current) + initial_jump_bid_cdf(u_current + bias) * 
            partial_interpolate(uJ_grid, benefit_of_search_uJ[:, bias_index], u_current_idx, u_current)

    end

    pr_search::Vector{TV} = @. (exp(σinv_start_search * (S_base - initial_search_cost))) / (1.0 + (exp(σinv_start_search * (S_base - initial_search_cost)))) ### THIS ARE VECTORS OF SIZE |CHOICE SETS|=9
    pr_no_search = 1 .- pr_search


    likelihood = 1 - ρ + ρ * dot(pr_no_search, weights)

    
    return log(likelihood)

end 

function call_autodiff_example()

    spec::SpecFormat = get_spec()
    sub_param_indices::SubParamIndices = get_param_indices(spec)[2]

    uJ_grid::Vector{Float64} = union(collect(0:0.05:2.0), [2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 5.5, 6.0]) # this will be a constant 
    uJ_grid = sort!(-uJ_grid)

    base_nodes, base_weights = SVector{9}.(FastGaussQuadrature.gausshermite(9))
    weights = SVector{9}(base_weights / sqrt(π))

    params = [0.0, 0.0, 0.25, 0.0, 0.1, 1.2, 0.25, 1.2, 0.25, 0.25, 0.25, 0.0, 0.0, 0.0, 0.0, 
                1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 
                0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, -1.0, 0.0, 0.0, 0.0]

    u_current_idx = 44
    remaining_term = 67.0
    amount = 13.32
    chosen_bank = -1
    current_monthly_payment = 0.24
    final_monthly_payment = NaN
    search_type = 1 
    choice_sets = [[1], [1, 2], [1, 2, 3], [1, 2, 4], [1, 3], [1, 3, 4], 
                    [1, 4], [1, 4, 4], [2], [2, 3], [2, 3, 4], [2, 4], [2, 4, 4], 
                    [3], [3, 4], [3, 4, 4], [4], [4, 4], [4, 4, 4]]
    choice_sets_N = [1, 1, 1, 15, 1, 15, 15, 105, 1, 1, 15, 15, 105, 1, 15, 105, 15, 105, 455]
    chosen_choice_set = 0
    dx = zeros(44)

    single_ll(x) = get_ll_single(x, sub_param_indices, uJ_grid, base_nodes, weights, u_current_idx,
    remaining_term, amount, chosen_bank, current_monthly_payment, final_monthly_payment, search_type, choice_sets, choice_sets_N, chosen_choice_set)
    autodiff(Reverse, single_ll, Active, Duplicated(params, dx))

end

call_autodiff_example()

When I run this I get an error with the Stacktrace reading:

ERROR: LoadError: Enzyme execution failed.
Mismatched activity for:   store {} addrspace(10)* %value_phi5253395, {} addrspace(10)** %.fca.1.gep, align 8, !dbg !1671, !noalias !216 const val:   %value_phi5253395 = phi {} addrspace(10)* [ %arrayref514, %L1631.lr.ph ], [ %arrayref1084, %L3207 ]
Type tree: {[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Integer, [-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}
 llvalue=  %arrayref514 = load {} addrspace(10)*, {} addrspace(10)* addrspace(13)* %arrayptr5112966, align 8, !dbg !1096, !tbaa !1097, !alias.scope !197, !noalias !198
You may be using a constant variable as temporary storage for active memory (https://enzyme.mit.edu/julia/stable/faq/#Activity-of-temporary-storage). If not, please open an issue, and either rewrite this variable to not be conditionally active or use Enzyme.API.runtimeActivity!(true) as a workaround for now

Stacktrace:
 [1] get_ll_single
   @ ~/Documents/refinancing/multistep/example_Enzyme.jl:527

Stacktrace:
  [1] throwerr(cstr::Cstring)
    @ Enzyme.Compiler ~/.julia/packages/Enzyme/aioBJ/src/compiler.jl:1612
  [2] get_ll_single
    @ ~/Documents/refinancing/multistep/example_Enzyme.jl:527
  [3] *
    @ ./float.jl:411 [inlined]
  [4] trapz
    @ ~/Documents/refinancing/multistep/example_Enzyme.jl:87
  [5] macro expansion
    @ ~/.julia/packages/Enzyme/aioBJ/src/compiler.jl:6587 [inlined]
  [6] enzyme_call
    @ ~/.julia/packages/Enzyme/aioBJ/src/compiler.jl:6188 [inlined]
  [7] CombinedAdjointThunk
    @ ~/.julia/packages/Enzyme/aioBJ/src/compiler.jl:6065 [inlined]
  [8] autodiff
    @ ~/.julia/packages/Enzyme/aioBJ/src/Enzyme.jl:309 [inlined]
  [9] autodiff
    @ ~/.julia/packages/Enzyme/aioBJ/src/Enzyme.jl:321 [inlined]
 [10] call_autofiff_example()
    @ Main ~/Documents/refinancing/multistep/example_Enzyme.jl:592
 [11] top-level scope
    @ ~/Documents/refinancing/multistep/example_Enzyme.jl:596
 [12] include(fname::String)
    @ Base.MainInclude ./client.jl:489
 [13] top-level scope
    @ REPL[2]:1
in expression starting at /Users/miguelborrero/Documents/refinancing/multistep/example_Enzyme.jl:596

Any advice would be greatly appreciated! Thanks a lot in advance!

miguelborrero5 avatar Jun 25 '24 23:06 miguelborrero5

What happens if you enable Enzyme.API.runtimeActivity!(true) right after loading Enzyme like the error message suggests?

wsmoses avatar Jun 26 '24 09:06 wsmoses

Okay, that made it work in my example! Thats great. Nevertheless when added that change to the actual program it crashed with the following Stacktrace:

Stacktrace:
     [1] getindex
       @ ./essentials.jl:13
     [2] solve_cubic_eq
       @ ~/Documents/refinancing/multistep/scratch_full_likelihood.jl:170
    
    Stacktrace:
      [1] julia_error(cstr::Cstring, val::Ptr{…}, errtype::Enzyme.API.ErrorType, data::Ptr{…}, data2::Ptr{…}, B::Ptr{…})
        @ Enzyme.Compiler ~/.julia/packages/Enzyme/3mqec/src/compiler.jl:2057
      [2] EnzymeCreatePrimalAndGradient(logic::Enzyme.Logic, todiff::LLVM.Function, retType::Enzyme.API.CDIFFE_TYPE, constant_args::Vector{…}, TA::Enzyme.TypeAnalysis, returnValue::Bool, dretUsed::Bool, mode::Enzyme.API.CDerivativeMode, width::Int64, additionalArg::Ptr{…}, forceAnonymousTape::Bool, typeInfo::Enzyme.FnTypeInfo, uncacheable_args::Vector{…}, augmented::Ptr{…}, atomicAdd::Bool)
        @ Enzyme.API ~/.julia/packages/Enzyme/3mqec/src/api.jl:156
      [3] enzyme!(job::GPUCompiler.CompilerJob{…}, mod::LLVM.Module, primalf::LLVM.Function, TT::Type, mode::Enzyme.API.CDerivativeMode, width::Int64, parallel::Bool, actualRetType::Type, wrap::Bool, modifiedBetween::Tuple{…}, returnPrimal::Bool, expectedTapeType::Type, loweredArgs::Set{…}, boxedArgs::Set{…})
        @ Enzyme.Compiler ~/.julia/packages/Enzyme/3mqec/src/compiler.jl:3708
      [4] codegen(output::Symbol, job::GPUCompiler.CompilerJob{…}; libraries::Bool, deferred_codegen::Bool, optimize::Bool, toplevel::Bool, strip::Bool, validate::Bool, only_entry::Bool, parent_job::Nothing)
        @ Enzyme.Compiler ~/.julia/packages/Enzyme/3mqec/src/compiler.jl:5845
      [5] codegen
        @ ~/.julia/packages/Enzyme/3mqec/src/compiler.jl:5123 [inlined]
      [6] _thunk(job::GPUCompiler.CompilerJob{Enzyme.Compiler.EnzymeTarget, Enzyme.Compiler.EnzymeCompilerParams}, postopt::Bool) (repeats 2 times)
        @ Enzyme.Compiler ~/.julia/packages/Enzyme/3mqec/src/compiler.jl:6652
      [7] cached_compilation
        @ ~/.julia/packages/Enzyme/3mqec/src/compiler.jl:6690 [inlined]
      [8] (::Enzyme.Compiler.var"#28587#28588"{…})(ctx::LLVM.Context)
        @ Enzyme.Compiler ~/.julia/packages/Enzyme/3mqec/src/compiler.jl:6759
      [9] JuliaContext(f::Enzyme.Compiler.var"#28587#28588"{…}; kwargs::@Kwargs{})
        @ GPUCompiler ~/.julia/packages/GPUCompiler/nWT2N/src/driver.jl:52
     [10] JuliaContext(f::Function)
        @ GPUCompiler ~/.julia/packages/GPUCompiler/nWT2N/src/driver.jl:42
     [11] #s2010#28586
        @ ~/.julia/packages/Enzyme/3mqec/src/compiler.jl:6710 [inlined]
     [12] 
        @ Enzyme.Compiler ./none:0
     [13] (::Core.GeneratedFunctionStub)(::UInt64, ::LineNumberNode, ::Any, ::Vararg{Any})
        @ Core ./boot.jl:602
     [14] autodiff
        @ ~/.julia/packages/Enzyme/3mqec/src/Enzyme.jl:304 [inlined]
     [15] autodiff
        @ ~/.julia/packages/Enzyme/3mqec/src/Enzyme.jl:321 [inlined]
     [16] macro expansion
        @ ./timing.jl:279 [inlined]
     [17] macro expansion
        @ ~/Documents/refinancing/multistep/scratch_full_likelihood.jl:343 [inlined]
     [18] (::var"#31#threadsfor_fun#8"{var"#31#threadsfor_fun#7#9"{…}})(tid::Int64; onethread::Bool)
        @ Main ./threadingconstructs.jl:214
     [19] #31#threadsfor_fun
        @ Main ./threadingconstructs.jl:181 [inlined]
     [20] (::Base.Threads.var"#1#2"{var"#31#threadsfor_fun#8"{var"#31#threadsfor_fun#7#9"{…}}, Int64})()
        @ Base.Threads ./threadingconstructs.jl:153
Stacktrace:
 [1] threading_run(fun::var"#31#threadsfor_fun#8"{var"#31#threadsfor_fun#7#9"{…}}, static::Bool)
   @ Base.Threads ./threadingconstructs.jl:171
 [2] macro expansion
   @ ./threadingconstructs.jl:219 [inlined]
 [3] get_ll_loop!(grad::Vector{…}, params::Vector{…}, data::DataFormat, param_indices::ParamIndices, sub_param_indices::SubParamIndices, uJ_grid::Vector{…}, u_current_idx::Vector{…})
   @ Main ~/Documents/refinancing/multistep/scratch_full_likelihood.jl:331
 [4] top-level scope
   @ ./timing.jl:279 [inlined]
 [5] top-level scope
   @ ~/Documents/refinancing/multistep/scratch_full_likelihood.jl:0
 [6] include(fname::String)
   @ Base.MainInclude ./client.jl:489
 [7] top-level scope
   @ REPL[2]:1
in expression starting at /Users/miguelborrero/Documents/refinancing/multistep/scratch_full_likelihood.jl:1079
Some type information was truncated. Use `show(err)` to see complete types.

Before that I get a long message which ends with: Captura de pantalla 2024-06-26 a la(s) 21 50 18

But the message is so long that I can not scroll all the way up. Any ideas about what it could happen? Like message [2] of the stacktrace points to an auxiliary function that was also used in the simplified example and the later worked.

miguelborrero5 avatar Jun 27 '24 04:06 miguelborrero5

Can you post the entire log?

And open an MWE for this other error?

wsmoses avatar Jun 27 '24 16:06 wsmoses

Sorry for the delay, I was travelling. I managed to reduce the code to a significantly simplified version by identifying the single line that was causing the problem. I will in this order include the information you asked for: 1. copy of the log file outputed by Julia using Logging package 2. The file seemed to be missing the Julia stacktrace so I will copy this from the terminal (its the same as in the previously posted example but code lines where the code crashes have changed. 3. MWE

┌ Error: An error occurred: Enzyme.Compiler.EnzymeInternalError("Illegal replace ficticious phi for:   %arrayref.sroa.2.0.copyload_replacementA = phi double , !dbg !36 of   %arrayref.sroa.2.0.copyload = load double, double addrspace(13)* %arrayref.sroa.2.0..sroa_idx256, align 1, !dbg !44, !tbaa !213, !alias.scope !214, !noalias !215\n; Function Attrs: mustprogress willreturn\ndefine internal fastcc \"enzyme_type\"=\"{[-1]:Float@double}\" void @diffejulia_solve_cubic_eq_4262({} 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\"=\"4507947536\" \"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\"=\"4507947536\" \"enzymejl_parmtype_ref\"=\"2\" %\"'\", double %differeturn, { i8*, i8*, i8*, { i8*, i8*, double, double }, { i8*, i8*, double, double }, { i8*, double, double, double, double }, [2 x double], double, double, double, double, double, double } %tapeArg) unnamed_addr #42 !dbg !4820 {\ntop:\n  %\"'ai17\" = alloca [2 x double], i64 1, align 8\n  %1 = bitcast [2 x double]* %\"'ai17\" to i8*\n  call void @llvm.memset.p0i8.i64(i8* nonnull dereferenceable(16) dereferenceable_or_null(16) %1, i8 0, i64 16, i1 false)\n  %\"'ipc77\" = bitcast i8* %1 to [2 x double]*\n  %2 = bitcast i8* %201 to [2 x double]*, !enzyme_caststack !35\n  %\"'ai16\" = alloca [2 x double], i64 1, align 8\n  %3 = bitcast [2 x double]* %\"'ai16\" to i8*\n  call void @llvm.memset.p0i8.i64(i8* nonnull dereferenceable(16) dereferenceable_or_null(16) %3, i8 0, i64 16, i1 false)\n  %4 = extractvalue { i8*, i8*, i8*, { i8*, i8*, double, double }, { i8*, i8*, double, double }, { i8*, double, double, double, double }, [2 x double], double, double, double, double, double, double } %tapeArg, 2\n  %\"'ipc\" = bitcast i8* %3 to [2 x double]*\n  %5 = bitcast i8* %4 to [2 x double]*, !enzyme_caststack !35\n  %\"'ai14\" = alloca [2 x double], i64 1, align 8\n  %6 = bitcast [2 x double]* %\"'ai14\" to i8*\n  call void @llvm.memset.p0i8.i64(i8* nonnull dereferenceable(16) dereferenceable_or_null(16) %6, i8 0, i64 16, i1 false)\n  %7 = extractvalue { i8*, i8*, i8*, { i8*, i8*, double, double }, { i8*, i8*, double, double }, { i8*, double, double, double, double }, [2 x double], double, double, double, double, double, double } %tapeArg, 1\n  %\"'ipc85\" = bitcast i8* %6 to [2 x double]*\n  %8 = bitcast i8* %7 to [2 x double]*, !enzyme_caststack !35\n  %\"newstruct46'ai\" = alloca [2 x double], i64 1, align 8\n  %9 = bitcast [2 x double]* %\"newstruct46'ai\" to i8*\n  call void @llvm.memset.p0i8.i64(i8* nonnull dereferenceable(16) dereferenceable_or_null(16) %9, i8 0, i64 16, i1 false)\n  %\"newstruct46'ipc\" = bitcast i8* %9 to [2 x double]*\n  %10 = bitcast i8* %199 to [2 x double]*, !enzyme_caststack !35\n  %\"newstruct95'ai\" = alloca [2 x double], i64 1, align 8\n  %11 = bitcast [2 x double]* %\"newstruct95'ai\" to i8*\n  call void @llvm.memset.p0i8.i64(i8* nonnull dereferenceable(16) dereferenceable_or_null(16) %11, i8 0, i64 16, i1 false)\n  %\"newstruct95'ipc\" = bitcast i8* %11 to [2 x double]*\n  %12 = bitcast i8* %198 to [2 x double]*, !enzyme_caststack !35\n  %\"newstruct40'ai\" = alloca [2 x double], i64 1, align 8\n  %13 = bitcast [2 x double]* %\"newstruct40'ai\" to i8*\n  call void @llvm.memset.p0i8.i64(i8* nonnull dereferenceable(16) dereferenceable_or_null(16) %13, i8 0, i64 16, i1 false)\n  %\"newstruct40'ipc\" = bitcast i8* %13 to [2 x double]*\n  %14 = bitcast i8* %197 to [2 x double]*, !enzyme_caststack !35\n  %\"'ai\" = alloca [2 x double], i64 1, align 8\n  %15 = bitcast [2 x double]* %\"'ai\" to i8*\n  call void @llvm.memset.p0i8.i64(i8* nonnull dereferenceable(16) dereferenceable_or_null(16) %15, i8 0, i64 16, i1 false)\n  %16 = extractvalue { i8*, i8*, i8*, { i8*, i8*, double, double }, { i8*, i8*, double, double }, { i8*, double, double, double, double }, [2 x double], double, double, double, double, double, double } %tapeArg, 0\n  %\"'ipc47\" = bitcast i8* %15 to [2 x double]*\n  %17 = bitcast i8* %16 to [2 x double]*, !enzyme_caststack !35\n  %18 = call {}*** @julia.get_pgcstack() #47\n  %ptls_field263_replacementA = phi {}*** \n  %ptls_load264265_replacementA = phi i64** \n  %_replacementA7 = phi i64** \n  %_replacementA = phi { i8 addrspace(13)*, i64, i16, i16, i32 } addrspace(11)* , !dbg !4821\n  %arraylen_ptr_replacementA = phi i64 addrspace(11)* , !dbg !4821\n  %arraylen_replacementA = phi i64 , !dbg !4821\n  %inbounds_replacementA = phi i1 , !dbg !4821\n  br i1 true, label %idxend, label %oob, !dbg !4821\n\nL111:                                             ; preds = %idxend\n  %19 = fadd double %162, %.fca.0.extract244, !dbg !4823\n  %20 = fadd double %163, %.fca.1.extract245, !dbg !4823\n  %21 = fmul double %19, 5.000000e-01, !dbg !4826\n  %22 = fmul double %20, 5.000000e-01, !dbg !4826\n  %\"'ipg24\" = getelementptr inbounds [2 x double], [2 x double]* %\"newstruct46'ipc\", i64 0, i64 0, !dbg !4828\n  %23 = getelementptr inbounds [2 x double], [2 x double]* %10, i64 0, i64 0, !dbg !4828\n  store double %21, double* %23, align 8, !dbg !4828, !tbaa !1201, !alias.scope !4829, !noalias !4832\n  %\"'ipg22\" = getelementptr inbounds [2 x double], [2 x double]* %\"newstruct46'ipc\", i64 0, i64 1, !dbg !4828\n  %24 = getelementptr inbounds [2 x double], [2 x double]* %10, i64 0, i64 1, !dbg !4828\n  store double %22, double* %24, align 8, !dbg !4828, !tbaa !1201, !alias.scope !4829, !noalias !4832\n  %\"'ipc20\" = addrspacecast [2 x double]* %\"newstruct46'ipc\" to [2 x double] addrspace(11)*, !dbg !4825\n  %25 = addrspacecast [2 x double]* %10 to [2 x double] addrspace(11)*, !dbg !4825\n  %tapeArg21 = extractvalue { i8*, i8*, i8*, { i8*, i8*, double, double }, { i8*, i8*, double, double }, { i8*, double, double, double, double }, [2 x double], double, double, double, double, double, double } %tapeArg, 3, !dbg !4825\n  %\"'ipg19\" = getelementptr inbounds [2 x double], [2 x double]* %\"'ipc\", i64 0, i64 0, !dbg !4834\n  %26 = getelementptr inbounds [2 x double], [2 x double]* %5, i64 0, i64 0, !dbg !4834\n  %unbox47 = load double, double* %26, align 8, !dbg !4837, !tbaa !1201, !alias.scope !4838, !noalias !4841, !invariant.group !4843\n  %27 = fmul double %unbox47, 0x3FD5555555555555, !dbg !4837\n  %\"'ipg\" = getelementptr inbounds [2 x double], [2 x double]* %\"'ipc\", i64 0, i64 1, !dbg !4844\n  %28 = getelementptr inbounds [2 x double], [2 x double]* %5, i64 0, i64 1, !dbg !4844\n  %unbox48 = load double, double* %28, align 8, !dbg !4837, !tbaa !1201, !alias.scope !4838, !noalias !4841, !invariant.group !4846\n  %29 = fmul double %unbox48, 0x3FD5555555555555, !dbg !4837\n  %30 = fcmp ord double %27, 0.000000e+00, !dbg !4847\n  br i1 %30, label %L134, label %L125, !dbg !4849\n\nL125:                                             ; preds = %L111\n  %31 = fcmp une double %29, 0.000000e+00, !dbg !4850\n  %. = select i1 %31, double %27, double %29, !dbg !4853\n  store i8 0, i8* %_cache83, align 1, !invariant.group !4854\n  store i8 0, i8* %_cache84, align 1, !invariant.group !4855\n  br label %L242\n\nL134:                                             ; preds = %L111\n  %32 = fsub double %29, %29, !dbg !4856\n  %33 = fcmp ord double %32, 0.000000e+00, !dbg !4859\n  br i1 %33, label %L151, label %L139, !dbg !4858\n\nL139:                                             ; preds = %L134\n  %34 = fcmp une double %27, 0x7FF0000000000000, !dbg !4861\n  store i8 0, i8* %_cache, align 1, !dbg !4862, !invariant.group !4863\n  br i1 %34, label %L145, label %L242.thread, !dbg !4862\n\nL145:                                             ; preds = %L139\n  %35 = fcmp une double %27, 0xFFF0000000000000, !dbg !4864\n  store i8 1, i8* %_cache, align 1, !dbg !4865, !invariant.group !4863\n  br i1 %35, label %L242.thread, label %L147, !dbg !4865\n\nL147:                                             ; preds = %L145\n  %36 = call double @llvm.copysign.f64(double noundef 0.000000e+00, double %29) #47, !dbg !4866\n  store i8 4, i8* %_cache83, align 1, !invariant.group !4854\n  store i8 1, i8* %_cache84, align 1, !invariant.group !4855\n  br label %L242\n\nL151:                                             ; preds = %L134\n  %37 = call fastcc double @julia_exp_4278(double %27) #48, !dbg !4868\n  %38 = fcmp une double %29, 0.000000e+00, !dbg !4869\n  store i8 1, i8* %_cache83, align 1, !dbg !4871, !invariant.group !4854\n  store i8 2, i8* %_cache84, align 1, !dbg !4871, !invariant.group !4855\n  br i1 %38, label %L156, label %L242, !dbg !4871\n\nL156:                                             ; preds = %L151\n  %39 = call [2 x double] @julia_sincos_4270_inner.1(double %29) #49, !dbg !4872\n  %.fca.0.extract217 = extractvalue [2 x double] %39, 0, !dbg !4872\n  %.fca.1.extract218 = extractvalue [2 x double] %39, 1, !dbg !4872\n  %40 = fmul double %37, %.fca.1.extract218, !dbg !4873\n  %41 = fmul double %37, %.fca.0.extract217, !dbg !4873\n  store i8 2, i8* %_cache83, align 1, !invariant.group !4854\n  store i8 3, i8* %_cache84, align 1, !invariant.group !4855\n  br label %L242\n\nL177:                                             ; preds = %idxend\n  %42 = fsub double %162, %.fca.0.extract244, !dbg !4875\n  %43 = fsub double %163, %.fca.1.extract245, !dbg !4875\n  %44 = fmul double %42, 5.000000e-01, !dbg !4878\n  %45 = fmul double %43, 5.000000e-01, !dbg !4878\n  %\"'ipg56\" = getelementptr inbounds [2 x double], [2 x double]* %\"newstruct95'ipc\", i64 0, i64 0, !dbg !4880\n  %46 = getelementptr inbounds [2 x double], [2 x double]* %12, i64 0, i64 0, !dbg !4880\n  store double %44, double* %46, align 8, !dbg !4880, !tbaa !1201, !alias.scope !4881, !noalias !4884\n  %\"'ipg54\" = getelementptr inbounds [2 x double], [2 x double]* %\"newstruct95'ipc\", i64 0, i64 1, !dbg !4880\n  %47 = getelementptr inbounds [2 x double], [2 x double]* %12, i64 0, i64 1, !dbg !4880\n  store double %45, double* %47, align 8, !dbg !4880, !tbaa !1201, !alias.scope !4881, !noalias !4884\n  %\"'ipc52\" = addrspacecast [2 x double]* %\"newstruct95'ipc\" to [2 x double] addrspace(11)*, !dbg !4877\n  %48 = addrspacecast [2 x double]* %12 to [2 x double] addrspace(11)*, !dbg !4877\n  %tapeArg53 = extractvalue { i8*, i8*, i8*, { i8*, i8*, double, double }, { i8*, i8*, double, double }, { i8*, double, double, double, double }, [2 x double], double, double, double, double, double, double } %tapeArg, 4, !dbg !4877\n  %\"'ipg50\" = getelementptr inbounds [2 x double], [2 x double]* %\"'ipc47\", i64 0, i64 0, !dbg !4886\n  %49 = getelementptr inbounds [2 x double], [2 x double]* %17, i64 0, i64 0, !dbg !4886\n  %unbox96 = load double, double* %49, align 8, !dbg !4889, !tbaa !1201, !alias.scope !4890, !noalias !4893, !invariant.group !4895\n  %50 = fmul double %unbox96, 0x3FD5555555555555, !dbg !4889\n  %\"'ipg48\" = getelementptr inbounds [2 x double], [2 x double]* %\"'ipc47\", i64 0, i64 1, !dbg !4896\n  %51 = getelementptr inbounds [2 x double], [2 x double]* %17, i64 0, i64 1, !dbg !4896\n  %unbox97 = load double, double* %51, align 8, !dbg !4889, !tbaa !1201, !alias.scope !4890, !noalias !4893, !invariant.group !4898\n  %52 = fmul double %unbox97, 0x3FD5555555555555, !dbg !4889\n  %53 = fcmp ord double %50, 0.000000e+00, !dbg !4899\n  br i1 %53, label %L200, label %L191, !dbg !4901\n\nL191:                                             ; preds = %L177\n  %54 = fcmp une double %52, 0.000000e+00, !dbg !4902\n  %.191 = select i1 %54, double %50, double %52, !dbg !4853\n  store i8 3, i8* %_cache83, align 1, !invariant.group !4854\n  store i8 4, i8* %_cache84, align 1, !invariant.group !4855\n  br label %L242\n\nL200:                                             ; preds = %L177\n  %55 = fsub double %52, %52, !dbg !4905\n  %56 = fcmp ord double %55, 0.000000e+00, !dbg !4908\n  br i1 %56, label %L217, label %L205, !dbg !4907\n\nL205:                                             ; preds = %L200\n  %57 = fcmp une double %50, 0x7FF0000000000000, !dbg !4910\n  store i8 2, i8* %_cache, align 1, !dbg !4911, !invariant.group !4863\n  br i1 %57, label %L211, label %L242.thread, !dbg !4911\n\nL211:                                             ; preds = %L205\n  %58 = fcmp une double %50, 0xFFF0000000000000, !dbg !4912\n  store i8 3, i8* %_cache, align 1, !dbg !4913, !invariant.group !4863\n  br i1 %58, label %L242.thread, label %L213, !dbg !4913\n\nL213:                                             ; preds = %L211\n  %59 = call double @llvm.copysign.f64(double noundef 0.000000e+00, double %52) #47, !dbg !4914\n  store i8 4, i8* %_cache83, align 1, !invariant.group !4854\n  store i8 5, i8* %_cache84, align 1, !invariant.group !4855\n  br label %L242\n\nL217:                                             ; preds = %L200\n  %60 = call fastcc double @julia_exp_4278(double %50) #48, !dbg !4916\n  %61 = fcmp une double %52, 0.000000e+00, !dbg !4917\n  store i8 5, i8* %_cache83, align 1, !dbg !4919, !invariant.group !4854\n  store i8 6, i8* %_cache84, align 1, !dbg !4919, !invariant.group !4855\n  br i1 %61, label %L222, label %L242, !dbg !4919\n\nL222:                                             ; preds = %L217\n  %62 = call [2 x double] @julia_sincos_4270_inner.1(double %52) #49, !dbg !4920\n  %.fca.0.extract = extractvalue [2 x double] %62, 0, !dbg !4920\n  %.fca.1.extract = extractvalue [2 x double] %62, 1, !dbg !4920\n  %63 = fmul double %60, %.fca.1.extract, !dbg !4921\n  %64 = fmul double %60, %.fca.0.extract, !dbg !4921\n  store i8 6, i8* %_cache83, align 1, !invariant.group !4854\n  store i8 7, i8* %_cache84, align 1, !invariant.group !4855\n  br label %L242\n\nL242.thread:                                      ; preds = %L211, %L205, %L145, %L139\n  %.sroa.0296.0.ph = phi double [ 0x7FF8000000000000, %L211 ], [ 0x7FF8000000000000, %L145 ], [ 0xFFF0000000000000, %L139 ], [ 0xFFF0000000000000, %L205 ]\n  %\".sroa.0296.0..sroa_idx298328'ipg\" = getelementptr inbounds [2 x double], [2 x double]* %\"'ipc77\", i64 0, i64 0, !dbg !4923\n  %.sroa.0296.0..sroa_idx298328 = getelementptr inbounds [2 x double], [2 x double]* %2, i64 0, i64 0, !dbg !4923\n  store double %.sroa.0296.0.ph, double* %.sroa.0296.0..sroa_idx298328, align 8, !dbg !4923, !alias.scope !4924, !noalias !4927\n  %\".sroa.6.0..sroa_idx303329'ipg\" = getelementptr inbounds [2 x double], [2 x double]* %\"'ipc77\", i64 0, i64 1, !dbg !4923\n  %.sroa.6.0..sroa_idx303329 = getelementptr inbounds [2 x double], [2 x double]* %2, i64 0, i64 1, !dbg !4923\n  store double 0x7FF8000000000000, double* %.sroa.6.0..sroa_idx303329, align 8, !dbg !4923, !alias.scope !4924, !noalias !4927\n  store i1 false, i1* %_cache91, align 1, !dbg !4923, !invariant.group !4929\n  store i1 false, i1* %_cache92, align 1, !dbg !4923, !invariant.group !4930\n  br label %L265, !dbg !4923\n\nL242:                                             ; preds = %L222, %L217, %L213, %L191, %L156, %L151, %L147, %L125\n  %.sroa.0223.0.copyload = phi double [ %40, %L156 ], [ -0.000000e+00, %L147 ], [ %27, %L125 ], [ %37, %L151 ], [ %63, %L222 ], [ -0.000000e+00, %L213 ], [ %50, %L191 ], [ %60, %L217 ], !dbg !4931\n  %.sroa.6.0 = phi double [ %41, %L156 ], [ %36, %L147 ], [ %., %L125 ], [ %29, %L151 ], [ %64, %L222 ], [ %59, %L213 ], [ %.191, %L191 ], [ %52, %L217 ], !dbg !4931\n  %\".sroa.0296.0..sroa_idx298'ipg\" = getelementptr inbounds [2 x double], [2 x double]* %\"'ipc77\", i64 0, i64 0, !dbg !4923\n  %.sroa.0296.0..sroa_idx298 = getelementptr inbounds [2 x double], [2 x double]* %2, i64 0, i64 0, !dbg !4923\n  store double %.sroa.0223.0.copyload, double* %.sroa.0296.0..sroa_idx298, align 8, !dbg !4923, !alias.scope !4924, !noalias !4927\n  %\".sroa.6.0..sroa_idx303'ipg\" = getelementptr inbounds [2 x double], [2 x double]* %\"'ipc77\", i64 0, i64 1, !dbg !4923\n  %.sroa.6.0..sroa_idx303 = getelementptr inbounds [2 x double], [2 x double]* %2, i64 0, i64 1, !dbg !4923\n  store double %.sroa.6.0, double* %.sroa.6.0..sroa_idx303, align 8, !dbg !4923, !alias.scope !4924, !noalias !4927\n  %65 = fcmp une double %.sroa.6.0, 0.000000e+00, !dbg !4932\n  %66 = fcmp une double %.sroa.0223.0.copyload, 0.000000e+00, !dbg !4935\n  %narrow = select i1 %65, i1 true, i1 %66, !dbg !4935\n  store i1 true, i1* %_cache91, align 1, !dbg !4923, !invariant.group !4929\n  store i1 true, i1* %_cache92, align 1, !dbg !4923, !invariant.group !4930\n  store i1 false, i1* %_cache107, align 1, !dbg !4923, !invariant.group !4936\n  store i1 false, i1* %_cache108, align 1, !dbg !4923, !invariant.group !4937\n  br i1 %narrow, label %L265, label %L266, !dbg !4923\n\nL265:                                             ; preds = %L242, %L242.thread\n  %.sroa.6.0334 = phi double [ 0x7FF8000000000000, %L242.thread ], [ %.sroa.6.0, %L242 ]\n  %.sroa.0296.0332 = phi double [ %.sroa.0296.0.ph, %L242.thread ], [ %.sroa.0223.0.copyload, %L242 ]\n  %\"'ipc87\" = addrspacecast [2 x double]* %\"newstruct40'ipc\" to [2 x double] addrspace(11)*, !dbg !4938\n  %67 = addrspacecast [2 x double]* %14 to [2 x double] addrspace(11)*, !dbg !4938\n  %\"'ipc89\" = addrspacecast [2 x double]* %\"'ipc77\" to [2 x double] addrspace(11)*, !dbg !4938\n  %68 = addrspacecast [2 x double]* %2 to [2 x double] addrspace(11)*, !dbg !4938\n  %tapeArg90 = extractvalue { i8*, i8*, i8*, { i8*, i8*, double, double }, { i8*, i8*, double, double }, { i8*, double, double, double, double }, [2 x double], double, double, double, double, double, double } %tapeArg, 5, !dbg !4938\n  %\".sroa.0223.0..sroa_idx226'ipg\" = getelementptr inbounds [2 x double], [2 x double]* %\"'ipc85\", i64 0, i64 0, !dbg !4931\n  %.sroa.0223.0..sroa_idx226 = getelementptr inbounds [2 x double], [2 x double]* %8, i64 0, i64 0, !dbg !4931\n  %.sroa.0223.0.copyload227 = load double, double* %.sroa.0223.0..sroa_idx226, align 8, !dbg !4931, !tbaa !1201, !alias.scope !4939, !noalias !4942\n  %\".sroa.6228.0..sroa_idx232'ipg\" = getelementptr inbounds [2 x double], [2 x double]* %\"'ipc85\", i64 0, i64 1, !dbg !4931\n  %.sroa.6228.0..sroa_idx232 = getelementptr inbounds [2 x double], [2 x double]* %8, i64 0, i64 1, !dbg !4931\n  %.sroa.6228.0.copyload233 = load double, double* %.sroa.6228.0..sroa_idx232, align 8, !dbg !4931, !tbaa !1201, !alias.scope !4939, !noalias !4942\n  store i1 true, i1* %_cache107, align 1, !invariant.group !4936\n  store i1 true, i1* %_cache108, align 1, !invariant.group !4937\n  br label %L266\n\nL266:                                             ; preds = %L265, %L242\n  %.sroa.6.0333 = phi double [ %.sroa.6.0334, %L265 ], [ %.sroa.6.0, %L242 ]\n  %.sroa.0296.0331 = phi double [ %.sroa.0296.0332, %L265 ], [ %.sroa.0223.0.copyload, %L242 ]\n  %.sroa.0223.0 = phi double [ %.sroa.0223.0.copyload227, %L265 ], [ %.sroa.0223.0.copyload, %L242 ]\n  %.sroa.6228.0 = phi double [ %.sroa.6228.0.copyload233, %L265 ], [ %.sroa.6.0, %L242 ]\n  %69 = fadd double %120, %.sroa.0296.0331, !dbg !4944\n  %70 = fadd double %123, %.sroa.6.0333, !dbg !4944\n  %71 = fadd double %69, %.sroa.0223.0, !dbg !4944\n  %72 = fadd double %70, %.sroa.6228.0, !dbg !4944\n  %73 = fmul double %71, 0x3FD5555555555555, !dbg !4948\n  %74 = fmul double %72, 0x3FD5555555555555, !dbg !4948\n  %75 = fmul double %.sroa.0296.0331, -5.000000e-01, !dbg !4950\n  %76 = fmul double %.sroa.6.0333, -5.000000e-01, !dbg !4950\n  %77 = fmul double %.sroa.0223.0, -5.000000e-01, !dbg !4950\n  %78 = fmul double %.sroa.6228.0, -5.000000e-01, !dbg !4950\n  %79 = fmul double %.sroa.6.0333, 0x3FEBB67AE8584CAA, !dbg !4953\n  %80 = fsub double %75, %79, !dbg !4956\n  %81 = fmul double %.sroa.0296.0331, 0x3FEBB67AE8584CAA, !dbg !4953\n  %82 = fadd double %76, %81, !dbg !4957\n  %83 = fmul double %.sroa.6228.0, 0x3FEBB67AE8584CAA, !dbg !4953\n  %84 = fadd double %77, %83, !dbg !4956\n  %85 = fmul double %.sroa.0223.0, 0x3FEBB67AE8584CAA, !dbg !4953\n  %86 = fsub double %78, %85, !dbg !4957\n  %87 = fadd double %120, %80, !dbg !4958\n  %88 = fadd double %123, %82, !dbg !4958\n  %89 = fadd double %87, %84, !dbg !4958\n  %90 = fadd double %88, %86, !dbg !4958\n  %91 = fmul double %89, 0x3FD5555555555555, !dbg !4961\n  %92 = fmul double %90, 0x3FD5555555555555, !dbg !4961\n  %93 = call double @llvm.fabs.f64(double %74) #47, !dbg !4963\n  %94 = fcmp uge double %93, 1.000000e-08, !dbg !4965\n  %95 = fcmp ule double %73, 0.000000e+00\n  %or.cond = select i1 %94, i1 true, i1 %95, !dbg !4964\n  %96 = fcmp uge double %73, 1.000000e+00\n  %or.cond201 = select i1 %or.cond, i1 true, i1 %96, !dbg !4964\n  br i1 %or.cond201, label %L327, label %common.ret, !dbg !4964\n\ncommon.ret:                                       ; preds = %L335, %L327, %L266\n  %common.ret.op_replacementA = phi double \n  br label %invertcommon.ret, !dbg !4853\n\nL327:                                             ; preds = %L266\n  %97 = fsub double %76, %81, !dbg !4966\n  %98 = fadd double %123, %97, !dbg !4967\n  %99 = fadd double %85, %78, !dbg !4966\n  %100 = fadd double %98, %99, !dbg !4967\n  %101 = fmul double %100, 0x3FD5555555555555, !dbg !4970\n  %102 = fadd double %79, %75, !dbg !4972\n  %103 = fadd double %120, %102, !dbg !4967\n  %104 = fsub double %77, %83, !dbg !4972\n  %105 = fadd double %103, %104, !dbg !4967\n  %106 = fmul double %105, 0x3FD5555555555555, !dbg !4970\n  %107 = call double @llvm.fabs.f64(double %101) #47, !dbg !4973\n  %108 = fcmp uge double %107, 1.000000e-08, !dbg !4975\n  %109 = fcmp ule double %106, 0.000000e+00\n  %or.cond203 = select i1 %108, i1 true, i1 %109, !dbg !4974\n  %110 = fcmp uge double %106, 1.000000e+00\n  %or.cond205 = select i1 %or.cond203, i1 true, i1 %110, !dbg !4974\n  br i1 %or.cond205, label %L335, label %common.ret, !dbg !4974\n\nL335:                                             ; preds = %L327\n  %111 = call double @llvm.fabs.f64(double %92) #47, !dbg !4976\n  %112 = fcmp uge double %111, 1.000000e-08, !dbg !4978\n  %113 = fcmp ule double %91, 0.000000e+00\n  %or.cond207 = select i1 %112, i1 true, i1 %113, !dbg !4977\n  %114 = fcmp uge double %91, 1.000000e+00\n  %or.cond209 = select i1 %or.cond207, i1 true, i1 %114, !dbg !4977\n  %spec.select210_replacementA = phi double , !dbg !4977\n  br label %common.ret, !dbg !4977\n\noob:                                              ; preds = %top\n  %errorbox_replacementA = phi i64* , !dbg !4821\n  %_replacementA133 = phi {} addrspace(12)* , !dbg !4821\n  unreachable\n\nidxend:                                           ; preds = %top\n  %\"'ipc209\" = addrspacecast {} addrspace(10)* %\"'\" to [2 x double] addrspace(13)* addrspace(11)*, !dbg !4821\n  %115 = addrspacecast {} addrspace(10)* %0 to [2 x double] addrspace(13)* addrspace(11)*, !dbg !4821\n  %\"arrayptr266'ipl\" = load [2 x double] addrspace(13)*, [2 x double] addrspace(13)* addrspace(11)* %\"'ipc209\", align 16, !dbg !4821, !tbaa !1584, !alias.scope !4979, !noalias !4982, !nonnull !35\n  %arrayptr266 = load [2 x double] addrspace(13)*, [2 x double] addrspace(13)* addrspace(11)* %115, align 16, !dbg !4821, !tbaa !1584, !alias.scope !4984, !noalias !4985, !nonnull !35\n  %\"arrayref.sroa.0.0..sroa_idx'ipg\" = getelementptr inbounds [2 x double], [2 x double] addrspace(13)* %\"arrayptr266'ipl\", i64 3, i64 0, !dbg !4821\n  %arrayref.sroa.0.0..sroa_idx = getelementptr inbounds [2 x double], [2 x double] addrspace(13)* %arrayptr266, i64 3, i64 0, !dbg !4821\n  %arrayref.sroa.0.0.copyload_replacementA = phi double , !dbg !4821\n  %\"arrayref.sroa.2.0..sroa_idx256'ipg\" = getelementptr inbounds [2 x double], [2 x double] addrspace(13)* %\"arrayptr266'ipl\", i64 3, i64 1, !dbg !4821\n  %arrayref.sroa.2.0..sroa_idx256 = getelementptr inbounds [2 x double], [2 x double] addrspace(13)* %arrayptr266, i64 3, i64 1, !dbg !4821\n  %arrayref.sroa.2.0.copyload_replacementA = phi double , !dbg !4821\n  %.fca.0.insert254_replacementA = phi [2 x double] , !dbg !4986\n  %.fca.1.insert255 = extractvalue { i8*, i8*, i8*, { i8*, i8*, double, double }, { i8*, i8*, double, double }, { i8*, double, double, double, double }, [2 x double], double, double, double, double, double, double } %tapeArg, 6, !dbg !4986\n  %116 = call fastcc [2 x double] @julia_inv_4319_inner.2([2 x double] %.fca.1.insert255) #49, !dbg !4986\n  %.fca.0.extract250 = extractvalue [2 x double] %116, 0, !dbg !4986\n  %.fca.1.extract251 = extractvalue [2 x double] %116, 1, !dbg !4986\n  %\"arrayref13.sroa.0.0..sroa_idx'ipg\" = getelementptr inbounds [2 x double], [2 x double] addrspace(13)* %\"arrayptr266'ipl\", i64 2, i64 0, !dbg !4987\n  %arrayref13.sroa.0.0..sroa_idx = getelementptr inbounds [2 x double], [2 x double] addrspace(13)* %arrayptr266, i64 2, i64 0, !dbg !4987\n  %arrayref13.sroa.0.0.copyload = extractvalue { i8*, i8*, i8*, { i8*, i8*, double, double }, { i8*, i8*, double, double }, { i8*, double, double, double, double }, [2 x double], double, double, double, double, double, double } %tapeArg, 7, !dbg !4987\n  %\"arrayref13.sroa.2.0..sroa_idx249'ipg\" = getelementptr inbounds [2 x double], [2 x double] addrspace(13)* %\"arrayptr266'ipl\", i64 2, i64 1, !dbg !4987\n  %arrayref13.sroa.2.0..sroa_idx249 = getelementptr inbounds [2 x double], [2 x double] addrspace(13)* %arrayptr266, i64 2, i64 1, !dbg !4987\n  %arrayref13.sroa.2.0.copyload = extractvalue { i8*, i8*, i8*, { i8*, i8*, double, double }, { i8*, i8*, double, double }, { i8*, double, double, double, double }, [2 x double], double, double, double, double, double, double } %tapeArg, 8, !dbg !4989\n  %117 = fneg double %arrayref13.sroa.2.0.copyload, !dbg !4989\n  %118 = fmul double %.fca.1.extract251, %arrayref13.sroa.2.0.copyload, !dbg !4991\n  %119 = fmul double %arrayref13.sroa.0.0.copyload, %.fca.0.extract250, !dbg !4991\n  %120 = fsub double %118, %119, !dbg !4991\n  %121 = fmul double %.fca.0.extract250, %117, !dbg !4993\n  %122 = fmul double %arrayref13.sroa.0.0.copyload, %.fca.1.extract251, !dbg !4994\n  %123 = fsub double %121, %122, !dbg !4994\n  %\"arrayref24.sroa.0.0..sroa_idx'ipg\" = getelementptr inbounds [2 x double], [2 x double] addrspace(13)* %\"arrayptr266'ipl\", i64 1, i64 0, !dbg !4995\n  %arrayref24.sroa.0.0..sroa_idx = getelementptr inbounds [2 x double], [2 x double] addrspace(13)* %arrayptr266, i64 1, i64 0, !dbg !4995\n  %arrayref24.sroa.0.0.copyload = extractvalue { i8*, i8*, i8*, { i8*, i8*, double, double }, { i8*, i8*, double, double }, { i8*, double, double, double, double }, [2 x double], double, double, double, double, double, double } %tapeArg, 9, !dbg !4997\n  %124 = fmul double %.fca.1.extract251, %arrayref24.sroa.0.0.copyload, !dbg !4997\n  %\"arrayref24.sroa.3.0..sroa_idx248'ipg\" = getelementptr inbounds [2 x double], [2 x double] addrspace(13)* %\"arrayptr266'ipl\", i64 1, i64 1, !dbg !4995\n  %arrayref24.sroa.3.0..sroa_idx248 = getelementptr inbounds [2 x double], [2 x double] addrspace(13)* %arrayptr266, i64 1, i64 1, !dbg !4995\n  %arrayref24.sroa.3.0.copyload = extractvalue { i8*, i8*, i8*, { i8*, i8*, double, double }, { i8*, i8*, double, double }, { i8*, double, double, double, double }, [2 x double], double, double, double, double, double, double } %tapeArg, 10, !dbg !4997\n  %125 = fmul double %.fca.0.extract250, %arrayref24.sroa.3.0.copyload, !dbg !4997\n  %126 = fadd double %124, %125, !dbg !4999\n  %127 = fmul double %.fca.0.extract250, %arrayref24.sroa.0.0.copyload, !dbg !4997\n  %128 = fmul double %.fca.1.extract251, %arrayref24.sroa.3.0.copyload, !dbg !4997\n  %129 = fsub double %127, %128, !dbg !5000\n  %\"arrayref37.sroa.0.0..sroa_idx'ipg\" = getelementptr inbounds [2 x double], [2 x double] addrspace(13)* %\"arrayptr266'ipl\", i64 0, i64 0, !dbg !5001\n  %arrayref37.sroa.0.0..sroa_idx = getelementptr inbounds [2 x double], [2 x double] addrspace(13)* %arrayptr266, i64 0, i64 0, !dbg !5001\n  %arrayref37.sroa.0.0.copyload = extractvalue { i8*, i8*, i8*, { i8*, i8*, double, double }, { i8*, i8*, double, double }, { i8*, double, double, double, double }, [2 x double], double, double, double, double, double, double } %tapeArg, 11, !dbg !5001\n  %\"arrayref37.sroa.2.0..sroa_idx247'ipg\" = getelementptr inbounds [2 x double], [2 x double] addrspace(13)* %\"arrayptr266'ipl\", i64 0, i64 1, !dbg !5001\n  %arrayref37.sroa.2.0..sroa_idx247 = getelementptr inbounds [2 x double], [2 x double] addrspace(13)* %arrayptr266, i64 0, i64 1, !dbg !5001\n  %arrayref37.sroa.2.0.copyload = extractvalue { i8*, i8*, i8*, { i8*, i8*, double, double }, { i8*, i8*, double, double }, { i8*, double, double, double, double }, [2 x double], double, double, double, double, double, double } %tapeArg, 12, !dbg !5003\n  %130 = fneg double %arrayref37.sroa.2.0.copyload, !dbg !5003\n  %131 = fmul double %.fca.1.extract251, %arrayref37.sroa.2.0.copyload, !dbg !5005\n  %132 = fmul double %.fca.0.extract250, %arrayref37.sroa.0.0.copyload, !dbg !5005\n  %133 = fsub double %131, %132, !dbg !5005\n  %134 = fmul double %.fca.0.extract250, %130, !dbg !5007\n  %135 = fmul double %.fca.1.extract251, %arrayref37.sroa.0.0.copyload, !dbg !5008\n  %136 = fsub double %134, %135, !dbg !5008\n  %137 = fmul double %120, %120, !dbg !5009\n  %138 = fmul double %123, %123, !dbg !5009\n  %139 = fsub double %137, %138, !dbg !5012\n  %140 = fmul double %120, %123, !dbg !5009\n  %141 = fadd double %140, %140, !dbg !5013\n  %142 = fmul double %120, 2.000000e+00, !dbg !5014\n  %143 = fmul double %123, 2.000000e+00, !dbg !5014\n  %144 = fmul double %142, %139, !dbg !5019\n  %145 = fmul double %143, %141, !dbg !5019\n  %146 = fsub double %144, %145, !dbg !5021\n  %147 = fmul double %142, %141, !dbg !5019\n  %148 = fmul double %143, %139, !dbg !5019\n  %149 = fadd double %147, %148, !dbg !5022\n  %150 = fmul double %120, 9.000000e+00, !dbg !5014\n  %151 = fmul double %123, 9.000000e+00, !dbg !5014\n  %152 = fmul double %150, %129, !dbg !5019\n  %153 = fmul double %151, %126, !dbg !5019\n  %154 = fsub double %152, %153, !dbg !5021\n  %155 = fmul double %150, %126, !dbg !5019\n  %156 = fmul double %151, %129, !dbg !5019\n  %157 = fadd double %155, %156, !dbg !5022\n  %158 = fsub double %146, %154, !dbg !5023\n  %159 = fsub double %149, %157, !dbg !5023\n  %160 = fmul double %133, 2.700000e+01, !dbg !5025\n  %161 = fmul double %136, 2.700000e+01, !dbg !5025\n  %162 = fadd double %158, %160, !dbg !5028\n  %163 = fadd double %159, %161, !dbg !5028\n  %164 = fmul double %129, 3.000000e+00, !dbg !5030\n  %165 = fmul double %126, 3.000000e+00, !dbg !5030\n  %166 = fsub double %139, %164, !dbg !5034\n  %167 = fsub double %141, %165, !dbg !5034\n  %\"'ipg159\" = getelementptr inbounds [2 x double], [2 x double]* %\"newstruct40'ipc\", i64 0, i64 0, !dbg !5036\n  %168 = getelementptr inbounds [2 x double], [2 x double]* %14, i64 0, i64 0, !dbg !5036\n  store double %166, double* %168, align 8, !dbg !5036, !tbaa !1201, !alias.scope !5037, !noalias !5040\n  %\"'ipg158\" = getelementptr inbounds [2 x double], [2 x double]* %\"newstruct40'ipc\", i64 0, i64 1, !dbg !5036\n  %169 = getelementptr inbounds [2 x double], [2 x double]* %14, i64 0, i64 1, !dbg !5036\n  store double %167, double* %169, align 8, !dbg !5036, !tbaa !1201, !alias.scope !5037, !noalias !5040\n  %170 = fmul double %162, %162, !dbg !5042\n  %171 = fmul double %163, %163, !dbg !5042\n  %172 = fsub double %170, %171, !dbg !5045\n  %173 = fmul double %162, %163, !dbg !5042\n  %174 = fadd double %173, %173, !dbg !5046\n  %175 = fmul double %166, 4.000000e+00, !dbg !5047\n  %176 = fmul double %167, 4.000000e+00, !dbg !5047\n  %177 = fmul double %166, %175, !dbg !5051\n  %178 = fmul double %167, %176, !dbg !5051\n  %179 = fsub double %177, %178, !dbg !5053\n  %180 = fmul double %167, %175, !dbg !5051\n  %181 = fmul double %166, %176, !dbg !5051\n  %182 = fadd double %180, %181, !dbg !5054\n  %183 = fmul double %166, %179, !dbg !5055\n  %184 = fmul double %167, %182, !dbg !5055\n  %185 = fsub double %183, %184, !dbg !5058\n  %186 = fmul double %167, %179, !dbg !5055\n  %187 = fmul double %166, %182, !dbg !5055\n  %188 = fadd double %186, %187, !dbg !5059\n  %189 = fsub double %172, %185, !dbg !5060\n  %190 = fsub double %174, %188, !dbg !5060\n  %.fca.0.insert = insertvalue [2 x double] poison, double %189, 0, !dbg !5044\n  %.fca.1.insert = insertvalue [2 x double] %.fca.0.insert, double %190, 1, !dbg !5044\n  %191 = call fastcc [2 x double] @julia_sqrt_4312_inner.3([2 x double] %.fca.1.insert) #48, !dbg !5044\n  %.fca.0.extract244 = extractvalue [2 x double] %191, 0, !dbg !5044\n  %.fca.1.extract245 = extractvalue [2 x double] %191, 1, !dbg !5044\n  %192 = fmul double %162, %.fca.0.extract244, !dbg !5062\n  %193 = fmul double %163, %.fca.1.extract245, !dbg !5065\n  %194 = fadd double %192, %193, !dbg !5065\n  %195 = fcmp ult double %194, 0.000000e+00, !dbg !5066\n  br i1 %195, label %L177, label %L111, !dbg !5064\n\nallocsForInversion:                               ; No predecessors!\n  %\"common.ret.op'de\" = alloca double, align 8\n  %196 = getelementptr double, double* %\"common.ret.op'de\", i64 0\n  store double 0.000000e+00, double* %196, align 8\n  %newstruct40 = alloca [2 x double], i64 1, align 8\n  %197 = bitcast [2 x double]* %newstruct40 to i8*\n  %newstruct95 = alloca [2 x double], i64 1, align 8\n  %198 = bitcast [2 x double]* %newstruct95 to i8*\n  %newstruct46 = alloca [2 x double], i64 1, align 8\n  %199 = bitcast [2 x double]* %newstruct46 to i8*\n  %200 = alloca [2 x double], i64 1, align 8\n  %201 = bitcast [2 x double]* %200 to i8*\n  %\"'de\" = alloca double, align 8\n  %202 = getelementptr double, double* %\"'de\", i64 0\n  store double 0.000000e+00, double* %202, align 8\n  %\"unbox48'de\" = alloca double, align 8\n  %203 = getelementptr double, double* %\"unbox48'de\", i64 0\n  store double 0.000000e+00, double* %203, align 8\n  %\"'de18\" = alloca double, align 8\n  %204 = getelementptr double, double* %\"'de18\", i64 0\n  store double 0.000000e+00, double* %204, align 8\n  %\"unbox47'de\" = alloca double, align 8\n  %205 = getelementptr double, double* %\"unbox47'de\", i64 0\n  store double 0.000000e+00, double* %205, align 8\n  %\"'de23\" = alloca double, align 8\n  %206 = getelementptr double, double* %\"'de23\", i64 0\n  store double 0.000000e+00, double* %206, align 8\n  %\"'de25\" = alloca double, align 8\n  %207 = getelementptr double, double* %\"'de25\", i64 0\n  store double 0.000000e+00, double* %207, align 8\n  %\"'de26\" = alloca double, align 8\n  %208 = getelementptr double, double* %\"'de26\", i64 0\n  store double 0.000000e+00, double* %208, align 8\n  %\"'de27\" = alloca double, align 8\n  %209 = getelementptr double, double* %\"'de27\", i64 0\n  store double 0.000000e+00, double* %209, align 8\n  %\"'de28\" = alloca double, align 8\n  %210 = getelementptr double, double* %\"'de28\", i64 0\n  store double 0.000000e+00, double* %210, align 8\n  %\".fca.1.extract245'de\" = alloca double, align 8\n  %211 = getelementptr double, double* %\".fca.1.extract245'de\", i64 0\n  store double 0.000000e+00, double* %211, align 8\n  %\"'de29\" = alloca double, align 8\n  %212 = getelementptr double, double* %\"'de29\", i64 0\n  store double 0.000000e+00, double* %212, align 8\n  %\".fca.0.extract244'de\" = alloca double, align 8\n  %213 = getelementptr double, double* %\".fca.0.extract244'de\", i64 0\n  store double 0.000000e+00, double* %213, align 8\n  %\".'de\" = alloca double, align 8\n  %214 = getelementptr double, double* %\".'de\", i64 0\n  store double 0.000000e+00, double* %214, align 8\n  %\"'de34\" = alloca double, align 8\n  %215 = getelementptr double, double* %\"'de34\", i64 0\n  store double 0.000000e+00, double* %215, align 8\n  %\"'de37\" = alloca double, align 8\n  %216 = getelementptr double, double* %\"'de37\", i64 0\n  store double 0.000000e+00, double* %216, align 8\n  %\".fca.0.extract217'de\" = alloca double, align 8\n  %217 = getelementptr double, double* %\".fca.0.extract217'de\", i64 0\n  store double 0.000000e+00, double* %217, align 8\n  %\"'de44\" = alloca double, align 8\n  %218 = getelementptr double, double* %\"'de44\", i64 0\n  store double 0.000000e+00, double* %218, align 8\n  %\".fca.1.extract218'de\" = alloca double, align 8\n  %219 = getelementptr double, double* %\".fca.1.extract218'de\", i64 0\n  store double 0.000000e+00, double* %219, align 8\n  %\"'de45\" = alloca [2 x double], align 8\n  %220 = getelementptr [2 x double], [2 x double]* %\"'de45\", i64 0, i32 0\n  store double 0.000000e+00, double* %220, align 8\n  %221 = getelementptr [2 x double], [2 x double]* %\"'de45\", i64 0, i32 1\n  store double 0.000000e+00, double* %221, align 8\n  %\"'de46\" = alloca double, align 8\n  %222 = getelementptr double, double* %\"'de46\", i64 0\n  store double 0.000000e+00, double* %222, align 8\n  %\"unbox97'de\" = alloca double, align 8\n  %223 = getelementptr double, double* %\"unbox97'de\", i64 0\n  store double 0.000000e+00, double* %223, align 8\n  %\"'de49\" = alloca double, align 8\n  %224 = getelementptr double, double* %\"'de49\", i64 0\n  store double 0.000000e+00, double* %224, align 8\n  %\"unbox96'de\" = alloca double, align 8\n  %225 = getelementptr double, double* %\"unbox96'de\", i64 0\n  store double 0.000000e+00, double* %225, align 8\n  %\"'de55\" = alloca double, align 8\n  %226 = getelementptr double, double* %\"'de55\", i64 0\n  store double 0.000000e+00, double* %226, align 8\n  %\"'de57\" = alloca double, align 8\n  %227 = getelementptr double, double* %\"'de57\", i64 0\n  store double 0.000000e+00, double* %227, align 8\n  %\"'de58\" = alloca double, align 8\n  %228 = getelementptr double, double* %\"'de58\", i64 0\n  store double 0.000000e+00, double* %228, align 8\n  %\"'de59\" = alloca double, align 8\n  %229 = getelementptr double, double* %\"'de59\", i64 0\n  store double 0.000000e+00, double* %229, align 8\n  %\".191'de\" = alloca double, align 8\n  %230 = getelementptr double, double* %\".191'de\", i64 0\n  store double 0.000000e+00, double* %230, align 8\n  %\"'de65\" = alloca double, align 8\n  %231 = getelementptr double, double* %\"'de65\", i64 0\n  store double 0.000000e+00, double* %231, align 8\n  %\"'de68\" = alloca double, align 8\n  %232 = getelementptr double, double* %\"'de68\", i64 0\n  store double 0.000000e+00, double* %232, align 8\n  %\".fca.0.extract'de\" = alloca double, align 8\n  %233 = getelementptr double, double* %\".fca.0.extract'de\", i64 0\n  store double 0.000000e+00, double* %233, align 8\n  %\"'de75\" = alloca double, align 8\n  %234 = getelementptr double, double* %\"'de75\", i64 0\n  store double 0.000000e+00, double* %234, align 8\n  %\".fca.1.extract'de\" = alloca double, align 8\n  %235 = getelementptr double, double* %\".fca.1.extract'de\", i64 0\n  store double 0.000000e+00, double* %235, align 8\n  %\"'de76\" = alloca [2 x double], align 8\n  %236 = getelementptr [2 x double], [2 x double]* %\"'de76\", i64 0, i32 0\n  store double 0.000000e+00, double* %236, align 8\n  %237 = getelementptr [2 x double], [2 x double]* %\"'de76\", i64 0, i32 1\n  store double 0.000000e+00, double* %237, align 8\n  %_cache = alloca i8, align 1\n  %\".sroa.6.0'de\" = alloca double, align 8\n  %238 = getelementptr double, double* %\".sroa.6.0'de\", i64 0\n  store double 0.000000e+00, double* %238, align 8\n  %\".sroa.0223.0.copyload'de\" = alloca double, align 8\n  %239 = getelementptr double, double* %\".sroa.0223.0.copyload'de\", i64 0\n  store double 0.000000e+00, double* %239, align 8\n  %_cache83 = alloca i8, align 1\n  %_cache84 = alloca i8, align 1\n  %\".sroa.6228.0.copyload233'de\" = alloca double, align 8\n  %240 = getelementptr double, double* %\".sroa.6228.0.copyload233'de\", i64 0\n  store double 0.000000e+00, double* %240, align 8\n  %\".sroa.0223.0.copyload227'de\" = alloca double, align 8\n  %241 = getelementptr double, double* %\".sroa.0223.0.copyload227'de\", i64 0\n  store double 0.000000e+00, double* %241, align 8\n  %\".sroa.6.0334'de\" = alloca double, align 8\n  %242 = getelementptr double, double* %\".sroa.6.0334'de\", i64 0\n  store double 0.000000e+00, double* %242, align 8\n  %\".sroa.0296.0332'de\" = alloca double, align 8\n  %243 = getelementptr double, double* %\".sroa.0296.0332'de\", i64 0\n  store double 0.000000e+00, double* %243, align 8\n  %_cache91 = alloca i1, align 1\n  %_cache92 = alloca i1, align 1\n  %\"'de93\" = alloca double, align 8\n  %244 = getelementptr double, double* %\"'de93\", i64 0\n  store double 0.000000e+00, double* %244, align 8\n  %\"'de94\" = alloca double, align 8\n  %245 = getelementptr double, double* %\"'de94\", i64 0\n  store double 0.000000e+00, double* %245, align 8\n  %\"'de95\" = alloca double, align 8\n  %246 = getelementptr double, double* %\"'de95\", i64 0\n  store double 0.000000e+00, double* %246, align 8\n  %\"'de96\" = alloca double, align 8\n  %247 = getelementptr double, double* %\"'de96\", i64 0\n  store double 0.000000e+00, double* %247, align 8\n  %\"'de97\" = alloca double, align 8\n  %248 = getelementptr double, double* %\"'de97\", i64 0\n  store double 0.000000e+00, double* %248, align 8\n  %\"'de98\" = alloca double, align 8\n  %249 = getelementptr double, double* %\"'de98\", i64 0\n  store double 0.000000e+00, double* %249, align 8\n  %\"'de99\" = alloca double, align 8\n  %250 = getelementptr double, double* %\"'de99\", i64 0\n  store double 0.000000e+00, double* %250, align 8\n  %\"'de100\" = alloca double, align 8\n  %251 = getelementptr double, double* %\"'de100\", i64 0\n  store double 0.000000e+00, double* %251, align 8\n  %\".sroa.6228.0'de\" = alloca double, align 8\n  %252 = getelementptr double, double* %\".sroa.6228.0'de\", i64 0\n  store double 0.000000e+00, double* %252, align 8\n  %\"'de101\" = alloca double, align 8\n  %253 = getelementptr double, double* %\"'de101\", i64 0\n  store double 0.000000e+00, double* %253, align 8\n  %\"'de102\" = alloca double, align 8\n  %254 = getelementptr double, double* %\"'de102\", i64 0\n  store double 0.000000e+00, double* %254, align 8\n  %\".sroa.6.0333'de\" = alloca double, align 8\n  %255 = getelementptr double, double* %\".sroa.6.0333'de\", i64 0\n  store double 0.000000e+00, double* %255, align 8\n  %\".sroa.0223.0'de\" = alloca double, align 8\n  %256 = getelementptr double, double* %\".sroa.0223.0'de\", i64 0\n  store double 0.000000e+00, double* %256, align 8\n  %\".sroa.0296.0331'de\" = alloca double, align 8\n  %257 = getelementptr double, double* %\".sroa.0296.0331'de\", i64 0\n  store double 0.000000e+00, double* %257, align 8\n  %\"'de103\" = alloca double, align 8\n  %258 = getelementptr double, double* %\"'de103\", i64 0\n  store double 0.000000e+00, double* %258, align 8\n  %\"'de104\" = alloca double, align 8\n  %259 = getelementptr double, double* %\"'de104\", i64 0\n  store double 0.000000e+00, double* %259, align 8\n  %\"'de105\" = alloca double, align 8\n  %260 = getelementptr double, double* %\"'de105\", i64 0\n  store double 0.000000e+00, double* %260, align 8\n  %_cache107 = alloca i1, align 1\n  %_cache108 = alloca i1, align 1\n  %\"spec.select210'de\" = alloca double, align 8\n  %261 = getelementptr double, double* %\"spec.select210'de\", i64 0\n  store double 0.000000e+00, double* %261, align 8\n  %\"'de110\" = alloca double, align 8\n  %262 = getelementptr double, double* %\"'de110\", i64 0\n  store double 0.000000e+00, double* %262, align 8\n  %\"'de125\" = alloca double, align 8\n  %263 = getelementptr double, double* %\"'de125\", i64 0\n  store double 0.000000e+00, double* %263, align 8\n  %\"'de126\" = alloca double, align 8\n  %264 = getelementptr double, double* %\"'de126\", i64 0\n  store double 0.000000e+00, double* %264, align 8\n  %\"'de127\" = alloca double, align 8\n  %265 = getelementptr double, double* %\"'de127\", i64 0\n  store double 0.000000e+00, double* %265, align 8\n  %\"'de128\" = alloca double, align 8\n  %266 = getelementptr double, double* %\"'de128\", i64 0\n  store double 0.000000e+00, double* %266, align 8\n  %\"'de134\" = alloca [2 x double], align 8\n  %267 = getelementptr [2 x double], [2 x double]* %\"'de134\", i64 0, i32 0\n  store double 0.000000e+00, double* %267, align 8\n  %268 = getelementptr [2 x double], [2 x double]* %\"'de134\", i64 0, i32 1\n  store double 0.000000e+00, double* %268, align 8\n  %\".fca.1.insert'de\" = alloca [2 x double], align 8\n  %269 = getelementptr [2 x double], [2 x double]* %\".fca.1.insert'de\", i64 0, i32 0\n  store double 0.000000e+00, double* %269, align 8\n  %270 = getelementptr [2 x double], [2 x double]* %\".fca.1.insert'de\", i64 0, i32 1\n  store double 0.000000e+00, double* %270, align 8\n  %\"'de135\" = alloca double, align 8\n  %271 = getelementptr double, double* %\"'de135\", i64 0\n  store double 0.000000e+00, double* %271, align 8\n  %\".fca.0.insert'de\" = alloca [2 x double], align 8\n  %272 = getelementptr [2 x double], [2 x double]* %\".fca.0.insert'de\", i64 0, i32 0\n  store double 0.000000e+00, double* %272, align 8\n  %273 = getelementptr [2 x double], [2 x double]* %\".fca.0.insert'de\", i64 0, i32 1\n  store double 0.000000e+00, double* %273, align 8\n  %\"'de136\" = alloca double, align 8\n  %274 = getelementptr double, double* %\"'de136\", i64 0\n  store double 0.000000e+00, double* %274, align 8\n  %\"'de137\" = alloca double, align 8\n  %275 = getelementptr double, double* %\"'de137\", i64 0\n  store double 0.000000e+00, double* %275, align 8\n  %\"'de138\" = alloca double, align 8\n  %276 = getelementptr double, double* %\"'de138\", i64 0\n  store double 0.000000e+00, double* %276, align 8\n  %\"'de139\" = alloca double, align 8\n  %277 = getelementptr double, double* %\"'de139\", i64 0\n  store double 0.000000e+00, double* %277, align 8\n  %\"'de140\" = alloca double, align 8\n  %278 = getelementptr double, double* %\"'de140\", i64 0\n  store double 0.000000e+00, double* %278, align 8\n  %\"'de141\" = alloca double, align 8\n  %279 = getelementptr double, double* %\"'de141\", i64 0\n  store double 0.000000e+00, double* %279, align 8\n  %\"'de142\" = alloca double, align 8\n  %280 = getelementptr double, double* %\"'de142\", i64 0\n  store double 0.000000e+00, double* %280, align 8\n  %\"'de143\" = alloca double, align 8\n  %281 = getelementptr double, double* %\"'de143\", i64 0\n  store double 0.000000e+00, double* %281, align 8\n  %\"'de144\" = alloca double, align 8\n  %282 = getelementptr double, double* %\"'de144\", i64 0\n  store double 0.000000e+00, double* %282, align 8\n  %\"'de145\" = alloca double, align 8\n  %283 = getelementptr double, double* %\"'de145\", i64 0\n  store double 0.000000e+00, double* %283, align 8\n  %\"'de146\" = alloca double, align 8\n  %284 = getelementptr double, double* %\"'de146\", i64 0\n  store double 0.000000e+00, double* %284, align 8\n  %\"'de147\" = alloca double, align 8\n  %285 = getelementptr double, double* %\"'de147\", i64 0\n  store double 0.000000e+00, double* %285, align 8\n  %\"'de148\" = alloca double, align 8\n  %286 = getelementptr double, double* %\"'de148\", i64 0\n  store double 0.000000e+00, double* %286, align 8\n  %\"'de149\" = alloca double, align 8\n  %287 = getelementptr double, double* %\"'de149\", i64 0\n  store double 0.000000e+00, double* %287, align 8\n  %\"'de150\" = alloca double, align 8\n  %288 = getelementptr double, double* %\"'de150\", i64 0\n  store double 0.000000e+00, double* %288, align 8\n  %\"'de151\" = alloca double, align 8\n  %289 = getelementptr double, double* %\"'de151\", i64 0\n  store double 0.000000e+00, double* %289, align 8\n  %\"'de152\" = alloca double, align 8\n  %290 = getelementptr double, double* %\"'de152\", i64 0\n  store double 0.000000e+00, double* %290, align 8\n  %\"'de153\" = alloca double, align 8\n  %291 = getelementptr double, double* %\"'de153\", i64 0\n  store double 0.000000e+00, double* %291, align 8\n  %\"'de154\" = alloca double, align 8\n  %292 = getelementptr double, double* %\"'de154\", i64 0\n  store double 0.000000e+00, double* %292, align 8\n  %\"'de155\" = alloca double, align 8\n  %293 = getelementptr double, double* %\"'de155\", i64 0\n  store double 0.000000e+00, double* %293, align 8\n  %\"'de156\" = alloca double, align 8\n  %294 = getelementptr double, double* %\"'de156\", i64 0\n  store double 0.000000e+00, double* %294, align 8\n  %\"'de157\" = alloca double, align 8\n  %295 = getelementptr double, double* %\"'de157\", i64 0\n  store double 0.000000e+00, double* %295, align 8\n  %\"'de160\" = alloca double, align 8\n  %296 = getelementptr double, double* %\"'de160\", i64 0\n  store double 0.000000e+00, double* %296, align 8\n  %\"'de161\" = alloca double, align 8\n  %297 = getelementptr double, double* %\"'de161\", i64 0\n  store double 0.000000e+00, double* %297, align 8\n  %\"'de162\" = alloca double, align 8\n  %298 = getelementptr double, double* %\"'de162\", i64 0\n  store double 0.000000e+00, double* %298, align 8\n  %\"'de163\" = alloca double, align 8\n  %299 = getelementptr double, double* %\"'de163\", i64 0\n  store double 0.000000e+00, double* %299, align 8\n  %\"'de164\" = alloca double, align 8\n  %300 = getelementptr double, double* %\"'de164\", i64 0\n  store double 0.000000e+00, double* %300, align 8\n  %\"'de165\" = alloca double, align 8\n  %301 = getelementptr double, double* %\"'de165\", i64 0\n  store double 0.000000e+00, double* %301, align 8\n  %\"'de166\" = alloca double, align 8\n  %302 = getelementptr double, double* %\"'de166\", i64 0\n  store double 0.000000e+00, double* %302, align 8\n  %\"'de167\" = alloca double, align 8\n  %303 = getelementptr double, double* %\"'de167\", i64 0\n  store double 0.000000e+00, double* %303, align 8\n  %\"'de168\" = alloca double, align 8\n  %304 = getelementptr double, double* %\"'de168\", i64 0\n  store double 0.000000e+00, double* %304, align 8\n  %\"'de169\" = alloca double, align 8\n  %305 = getelementptr double, double* %\"'de169\", i64 0\n  store double 0.000000e+00, double* %305, align 8\n  %\"'de170\" = alloca double, align 8\n  %306 = getelementptr double, double* %\"'de170\", i64 0\n  store double 0.000000e+00, double* %306, align 8\n  %\"'de171\" = alloca double, align 8\n  %307 = getelementptr double, double* %\"'de171\", i64 0\n  store double 0.000000e+00, double* %307, align 8\n  %\"'de172\" = alloca double, align 8\n  %308 = getelementptr double, double* %\"'de172\", i64 0\n  store double 0.000000e+00, double* %308, align 8\n  %\"'de173\" = alloca double, align 8\n  %309 = getelementptr double, double* %\"'de173\", i64 0\n  store double 0.000000e+00, double* %309, align 8\n  %\"'de174\" = alloca double, align 8\n  %310 = getelementptr double, double* %\"'de174\", i64 0\n  store double 0.000000e+00, double* %310, align 8\n  %\"'de175\" = alloca double, align 8\n  %311 = getelementptr double, double* %\"'de175\", i64 0\n  store double 0.000000e+00, double* %311, align 8\n  %\"'de176\" = alloca double, align 8\n  %312 = getelementptr double, double* %\"'de176\", i64 0\n  store double 0.000000e+00, double* %312, align 8\n  %\"'de177\" = alloca double, align 8\n  %313 = getelementptr double, double* %\"'de177\", i64 0\n  store double 0.000000e+00, double* %313, align 8\n  %\"'de178\" = alloca double, align 8\n  %314 = getelementptr double, double* %\"'de178\", i64 0\n  store double 0.000000e+00, double* %314, align 8\n  %\"'de179\" = alloca double, align 8\n  %315 = getelementptr double, double* %\"'de179\", i64 0\n  store double 0.000000e+00, double* %315, align 8\n  %\"'de180\" = alloca double, align 8\n  %316 = getelementptr double, double* %\"'de180\", i64 0\n  store double 0.000000e+00, double* %316, align 8\n  %\"'de181\" = alloca double, align 8\n  %317 = getelementptr double, double* %\"'de181\", i64 0\n  store double 0.000000e+00, double* %317, align 8\n  %\"'de182\" = alloca double, align 8\n  %318 = getelementptr double, double* %\"'de182\", i64 0\n  store double 0.000000e+00, double* %318, align 8\n  %\"'de183\" = alloca double, align 8\n  %319 = getelementptr double, double* %\"'de183\", i64 0\n  store double 0.000000e+00, double* %319, align 8\n  %\"'de184\" = alloca double, align 8\n  %320 = getelementptr double, double* %\"'de184\", i64 0\n  store double 0.000000e+00, double* %320, align 8\n  %\"'de185\" = alloca double, align 8\n  %321 = getelementptr double, double* %\"'de185\", i64 0\n  store double 0.000000e+00, double* %321, align 8\n  %\"'de186\" = alloca double, align 8\n  %322 = getelementptr double, double* %\"'de186\", i64 0\n  store double 0.000000e+00, double* %322, align 8\n  %\"'de187\" = alloca double, align 8\n  %323 = getelementptr double, double* %\"'de187\", i64 0\n  store double 0.000000e+00, double* %323, align 8\n  %\"'de188\" = alloca double, align 8\n  %324 = getelementptr double, double* %\"'de188\", i64 0\n  store double 0.000000e+00, double* %324, align 8\n  %\"'de189\" = alloca double, align 8\n  %325 = getelementptr double, double* %\"'de189\", i64 0\n  store double 0.000000e+00, double* %325, align 8\n  %\"'de190\" = alloca double, align 8\n  %326 = getelementptr double, double* %\"'de190\", i64 0\n  store double 0.000000e+00, double* %326, align 8\n  %\"'de191\" = alloca double, align 8\n  %327 = getelementptr double, double* %\"'de191\", i64 0\n  store double 0.000000e+00, double* %327, align 8\n  %\"'de192\" = alloca double, align 8\n  %328 = getelementptr double, double* %\"'de192\", i64 0\n  store double 0.000000e+00, double* %328, align 8\n  %\"'de193\" = alloca double, align 8\n  %329 = getelementptr double, double* %\"'de193\", i64 0\n  store double 0.000000e+00, double* %329, align 8\n  %\".fca.1.extract251'de\" = alloca double, align 8\n  %330 = getelementptr double, double* %\".fca.1.extract251'de\", i64 0\n  store double 0.000000e+00, double* %330, align 8\n  %\"arrayref37.sroa.0.0.copyload'de\" = alloca double, align 8\n  %331 = getelementptr double, double* %\"arrayref37.sroa.0.0.copyload'de\", i64 0\n  store double 0.000000e+00, double* %331, align 8\n  %\".fca.0.extract250'de\" = alloca double, align 8\n  %332 = getelementptr double, double* %\".fca.0.extract250'de\", i64 0\n  store double 0.000000e+00, double* %332, align 8\n  %\"'de194\" = alloca double, align 8\n  %333 = getelementptr double, double* %\"'de194\", i64 0\n  store double 0.000000e+00, double* %333, align 8\n  %\"'de195\" = alloca double, align 8\n  %334 = getelementptr double, double* %\"'de195\", i64 0\n  store double 0.000000e+00, double* %334, align 8\n  %\"'de196\" = alloca double, align 8\n  %335 = getelementptr double, double* %\"'de196\", i64 0\n  store double 0.000000e+00, double* %335, align 8\n  %\"arrayref37.sroa.2.0.copyload'de\" = alloca double, align 8\n  %336 = getelementptr double, double* %\"arrayref37.sroa.2.0.copyload'de\", i64 0\n  store double 0.000000e+00, double* %336, align 8\n  %\"'de197\" = alloca double, align 8\n  %337 = getelementptr double, double* %\"'de197\", i64 0\n  store double 0.000000e+00, double* %337, align 8\n  %\"'de198\" = alloca double, align 8\n  %338 = getelementptr double, double* %\"'de198\", i64 0\n  store double 0.000000e+00, double* %338, align 8\n  %\"arrayref24.sroa.3.0.copyload'de\" = alloca double, align 8\n  %339 = getelementptr double, double* %\"arrayref24.sroa.3.0.copyload'de\", i64 0\n  store double 0.000000e+00, double* %339, align 8\n  %\"arrayref24.sroa.0.0.copyload'de\" = alloca double, align 8\n  %340 = getelementptr double, double* %\"arrayref24.sroa.0.0.copyload'de\", i64 0\n  store double 0.000000e+00, double* %340, align 8\n  %\"'de199\" = alloca double, align 8\n  %341 = getelementptr double, double* %\"'de199\", i64 0\n  store double 0.000000e+00, double* %341, align 8\n  %\"'de200\" = alloca double, align 8\n  %342 = getelementptr double, double* %\"'de200\", i64 0\n  store double 0.000000e+00, double* %342, align 8\n  %\"'de201\" = alloca double, align 8\n  %343 = getelementptr double, double* %\"'de201\", i64 0\n  store double 0.000000e+00, double* %343, align 8\n  %\"'de202\" = alloca double, align 8\n  %344 = getelementptr double, double* %\"'de202\", i64 0\n  store double 0.000000e+00, double* %344, align 8\n  %\"arrayref13.sroa.0.0.copyload'de\" = alloca double, align 8\n  %345 = getelementptr double, double* %\"arrayref13.sroa.0.0.copyload'de\", i64 0\n  store double 0.000000e+00, double* %345, align 8\n  %\"'de203\" = alloca double, align 8\n  %346 = getelementptr double, double* %\"'de203\", i64 0\n  store double 0.000000e+00, double* %346, align 8\n  %\"'de204\" = alloca double, align 8\n  %347 = getelementptr double, double* %\"'de204\", i64 0\n  store double 0.000000e+00, double* %347, align 8\n  %\"'de205\" = alloca double, align 8\n  %348 = getelementptr double, double* %\"'de205\", i64 0\n  store double 0.000000e+00, double* %348, align 8\n  %\"arrayref13.sroa.2.0.copyload'de\" = alloca double, align 8\n  %349 = getelementptr double, double* %\"arrayref13.sroa.2.0.copyload'de\", i64 0\n  store double 0.000000e+00, double* %349, align 8\n  %\"'de206\" = alloca [2 x double], align 8\n  %350 = getelementptr [2 x double], [2 x double]* %\"'de206\", i64 0, i32 0\n  store double 0.000000e+00, double* %350, align 8\n  %351 = getelementptr [2 x double], [2 x double]* %\"'de206\", i64 0, i32 1\n  store double 0.000000e+00, double* %351, align 8\n  %\".fca.1.insert255'de\" = alloca [2 x double], align 8\n  %352 = getelementptr [2 x double], [2 x double]* %\".fca.1.insert255'de\", i64 0, i32 0\n  store double 0.000000e+00, double* %352, align 8\n  %353 = getelementptr [2 x double], [2 x double]* %\".fca.1.insert255'de\", i64 0, i32 1\n  store double 0.000000e+00, double* %353, align 8\n  %\"arrayref.sroa.2.0.copyload'de\" = alloca double, align 8\n  %354 = getelementptr double, double* %\"arrayref.sroa.2.0.copyload'de\", i64 0\n  store double 0.000000e+00, double* %354, align 8\n  %\".fca.0.insert254'de\" = alloca [2 x double], align 8\n  %355 = getelementptr [2 x double], [2 x double]* %\".fca.0.insert254'de\", i64 0, i32 0\n  store double 0.000000e+00, double* %355, align 8\n  %356 = getelementptr [2 x double], [2 x double]* %\".fca.0.insert254'de\", i64 0, i32 1\n  store double 0.000000e+00, double* %356, align 8\n  %\"arrayref.sroa.0.0.copyload'de\" = alloca double, align 8\n  %357 = getelementptr double, double* %\"arrayref.sroa.0.0.copyload'de\", i64 0\n  store double 0.000000e+00, double* %357, align 8\n\ninverttop:                                        ; preds = %invertidxend_amerge_amerge_amerge_amerge_amerge_amerge_amerge_amerge\n  fence syncscope(\"singlethread\") seq_cst\n  fence syncscope(\"singlethread\") seq_cst\n  call void @free(i8* %16)\n  call void @free(i8* %7)\n  call void @free(i8* %4)\n  ret void\n\ninvertL111:                                       ; preds = %invertL134, %invertL125\n  %358 = load double, double* %\"'de\", align 8, !dbg !4837\n  store double 0.000000e+00, double* %\"'de\", align 8, !dbg !4837\n  %359 = fmul fast double %358, 0x3FD5555555555555, !dbg !4837\n  %360 = load double, double* %\"unbox48'de\", align 8, !dbg !4837\n  %361 = fadd fast double %360, %359, !dbg !4837\n  store double %361, double* %\"unbox48'de\", align 8, !dbg !4837\n  %362 = load double, double* %\"unbox48'de\", align 8, !dbg !4837\n  store double 0.000000e+00, double* %\"unbox48'de\", align 8, !dbg !4837\n  %\"'ipg_unwrap\" = getelementptr inbounds [2 x double], [2 x double]* %\"'ipc\", i64 0, i64 1, !dbg !4837\n  %363 = load double, double* %\"'ipg_unwrap\", align 8, !dbg !4837, !tbaa !1201, !alias.scope !5069, !noalias !5070\n  %364 = fadd fast double %363, %362, !dbg !4837\n  store double %364, double* %\"'ipg_unwrap\", align 8, !dbg !4837, !tbaa !1201, !alias.scope !5069, !noalias !5070\n  %365 = load double, double* %\"'de18\", align 8, !dbg !4837\n  store double 0.000000e+00, double* %\"'de18\", align 8, !dbg !4837\n  %366 = fmul fast double %365, 0x3FD5555555555555, !dbg !4837\n  %367 = load double, double* %\"unbox47'de\", align 8, !dbg !4837\n  %368 = fadd fast double %367, %366, !dbg !4837\n  store double %368, double* %\"unbox47'de\", align 8, !dbg !4837\n  %369 = load double, double* %\"unbox47'de\", align 8, !dbg !4837\n  store double 0.000000e+00, double* %\"unbox47'de\", align 8, !dbg !4837\n  %\"'ipg19_unwrap\" = getelementptr inbounds [2 x double], [2 x double]* %\"'ipc\", i64 0, i64 0, !dbg !4837\n  %370 = load double, double* %\"'ipg19_unwrap\", align 8, !dbg !4837, !tbaa !1201, !alias.scope !5069, !noalias !5070\n  %371 = fadd fast double %370, %369, !dbg !4837\n  store double %371, double* %\"'ipg19_unwrap\", align 8, !dbg !4837, !tbaa !1201, !alias.scope !5069, !noalias !5070\n  %_unwrap = addrspacecast [2 x double]* %10 to [2 x double] addrspace(11)*, !dbg !4825\n  %\"'ipc20_unwrap\" = addrspacecast [2 x double]* %\"newstruct46'ipc\" to [2 x double] addrspace(11)*, !dbg !4825\n  %tapeArg21_unwrap = extractvalue { i8*, i8*, i8*, { i8*, i8*, double, double }, { i8*, i8*, double, double }, { i8*, double, double, double, double }, [2 x double], double, double, double, double, double, double } %tapeArg, 3, !dbg !4825\n  call fastcc void @diffejulia_log_4285([2 x double]* nocapture nofree writeonly align 8 \"enzyme_sret\" undef, [2 x double]* nocapture nofree align 8 \"enzyme_sret\" %\"'ipc\", [2 x double] addrspace(11)* nocapture nofree readonly align 8 %_unwrap, [2 x double] addrspace(11)* nocapture nofree align 8 %\"'ipc20_unwrap\", { i8*, i8*, double, double } %tapeArg21_unwrap), !dbg !4825\n  %\"'ipg22_unwrap\" = getelementptr inbounds [2 x double], [2 x double]* %\"newstruct46'ipc\", i64 0, i64 1, !dbg !4828\n  %372 = load double, double* %\"'ipg22_unwrap\", align 8, !dbg !4828, !tbaa !1201, !alias.scope !5071, !noalias !5072\n  store double 0.000000e+00, double* %\"'ipg22_unwrap\", align 8, !dbg !4828, !tbaa !1201, !alias.scope !5071, !noalias !5072\n  %373 = load double, double* %\"'de23\", align 8, !dbg !4828\n  %374 = fadd fast double %373, %372, !dbg !4828\n  store double %374, double* %\"'de23\", align 8, !dbg !4828\n  %\"'ipg24_unwrap\" = getelementptr inbounds [2 x double], [2 x double]* %\"newstruct46'ipc\", i64 0, i64 0, !dbg !4828\n  %375 = load double, double* %\"'ipg24_unwrap\", align 8, !dbg !4828, !tbaa !1201, !alias.scope !5071, !noalias !5072\n  store double 0.000000e+00, double* %\"'ipg24_unwrap\", align 8, !dbg !4828, !tbaa !1201, !alias.scope !5071, !noalias !5072\n  %376 = load double, double* %\"'de25\", align 8, !dbg !4828\n  %377 = fadd fast double %376, %375, !dbg !4828\n  store double %377, double* %\"'de25\", align 8, !dbg !4828\n  %378 = load double, double* %\"'de23\", align 8, !dbg !4826\n  store double 0.000000e+00, double* %\"'de23\", align 8, !dbg !4826\n  %379 = fmul fast double %378, 5.000000e-01, !dbg !4826\n  %380 = load double, double* %\"'de26\", align 8, !dbg !4826\n  %381 = fadd fast double %380, %379, !dbg !4826\n  store double %381, double* %\"'de26\", align 8, !dbg !4826\n  %382 = load double, double* %\"'de25\", align 8, !dbg !4826\n  store double 0.000000e+00, double* %\"'de25\", align 8, !dbg !4826\n  %383 = fmul fast double %382, 5.000000e-01, !dbg !4826\n  %384 = load double, double* %\"'de27\", align 8, !dbg !4826\n  %385 = fadd fast double %384, %383, !dbg !4826\n  store double %385, double* %\"'de27\", align 8, !dbg !4826\n  %386 = load double, double* %\"'de26\", align 8, !dbg !4823\n  store double 0.000000e+00, double* %\"'de26\", align 8, !dbg !4823\n  %387 = load double, double* %\"'de28\", align 8, !dbg !4823\n  %388 = fadd fast double %387, %386, !dbg !4823\n  store double %388, double* %\"'de28\", align 8, !dbg !4823\n  %389 = load double, double* %\".fca.1.extract245'de\", align 8, !dbg !4823\n  %390 = fadd fast double %389, %386, !dbg !4823\n  store double %390, double* %\".fca.1.extract245'de\", align 8, !dbg !4823\n  %391 = load double, double* %\"'de27\", align 8, !dbg !4823\n  store double 0.000000e+00, double* %\"'de27\", align 8, !dbg !4823\n  %392 = load double, double* %\"'de29\", align 8, !dbg !4823\n  %393 = fadd fast double %392, %391, !dbg !4823\n  store double %393, double* %\"'de29\", align 8, !dbg !4823\n  %394 = load double, double* %\".fca.0.extract244'de\", align 8, !dbg !4823\n  %395 = fadd fast double %394, %391, !dbg !4823\n  store double %395, double* %\".fca.0.extract244'de\", align 8, !dbg !4823\n  br label %invertidxend\n\ninvertL125:                                       ; preds = %invertL242\n  %_unwrap30 = getelementptr inbounds [2 x double], [2 x double]* %5, i64 0, i64 1, !dbg !4853\n  %unbox48_unwrap = load double, double* %_unwrap30, align 8, !dbg !4837, !tbaa !1201, !alias.scope !4838, !noalias !4841, !invariant.group !4846\n  %_unwrap31 = fmul double %unbox48_unwrap, 0x3FD5555555555555, !dbg !4853\n  %_unwrap32 = fcmp une double %_unwrap31, 0.000000e+00, !dbg !4853\n  %396 = load double, double* %\".'de\", align 8, !dbg !4853\n  %diffe = select fast i1 %_unwrap32, double %396, double 0.000000e+00, !dbg !4853\n  %397 = load double, double* %\".'de\", align 8, !dbg !4853\n  %diffe33 = select fast i1 %_unwrap32, double 0.000000e+00, double %397, !dbg !4853\n  store double 0.000000e+00, double* %\".'de\", align 8, !dbg !4853\n  %398 = load double, double* %\"'de18\", align 8, !dbg !4853\n  %399 = fadd fast double %398, %396, !dbg !4853\n  %400 = select fast i1 %_unwrap32, double %399, double %398, !dbg !4853\n  store double %400, double* %\"'de18\", align 8, !dbg !4853\n  %401 = load double, double* %\"'de\", align 8, !dbg !4853\n  %402 = fadd fast double %401, %397, !dbg !4853\n  %403 = select fast i1 %_unwrap32, double %401, double %402, !dbg !4853\n  store double %403, double* %\"'de\", align 8, !dbg !4853\n  br label %invertL111\n\ninvertL134:                                       ; preds = %invertL151, %invertL139\n  br label %invertL111\n\ninvertL139:                                       ; preds = %invertL242.thread, %invertL145\n  br label %invertL134\n\ninvertL145:                                       ; preds = %invertL242.thread, %invertL147\n  br label %invertL139\n\ninvertL147:                                       ; preds = %invertL242\n  br label %invertL145\n\ninvertL151:                                       ; preds = %invertL242, %invertL156\n  %404 = load double, double* %\"'de34\", align 8, !dbg !4868\n  store double 0.000000e+00, double* %\"'de34\", align 8, !dbg !4868\n  %_unwrap35 = getelementptr inbounds [2 x double], [2 x double]* %5, i64 0, i64 0, !dbg !4868\n  %unbox47_unwrap = load double, double* %_unwrap35, align 8, !dbg !4837, !tbaa !1201, !alias.scope !4838, !noalias !4841, !invariant.group !4843\n  %_unwrap36 = fmul double %unbox47_unwrap, 0x3FD5555555555555, !dbg !4868\n  %405 = call fast fastcc double @julia_exp_4278(double %_unwrap36), !dbg !4868\n  %406 = fmul fast double %404, %405, !dbg !4868\n  %407 = load double, double* %\"'de18\", align 8, !dbg !4868\n  %408 = fadd fast double %407, %406, !dbg !4868\n  store double %408, double* %\"'de18\", align 8, !dbg !4868\n  br label %invertL134\n\ninvertL156:                                       ; preds = %invertL242\n  %409 = load double, double* %\"'de37\", align 8, !dbg !4873\n  store double 0.000000e+00, double* %\"'de37\", align 8, !dbg !4873\n  %_unwrap38 = getelementptr inbounds [2 x double], [2 x double]* %5, i64 0, i64 1, !dbg !4873\n  %unbox48_unwrap39 = load double, double* %_unwrap38, align 8, !dbg !4837, !tbaa !1201, !alias.scope !4838, !noalias !4841, !invariant.group !4846\n  %_unwrap40 = fmul double %unbox48_unwrap39, 0x3FD5555555555555, !dbg !4873\n  %410 = call [2 x double] @julia_sincos_4270_inner.1(double %_unwrap40) #49, !dbg !4872\n  %.fca.0.extract217_unwrap = extractvalue [2 x double] %410, 0, !dbg !4873\n  %411 = fmul fast double %409, %.fca.0.extract217_unwrap, !dbg !4873\n  %412 = load double, double* %\"'de34\", align 8, !dbg !4873\n  %413 = fadd fast double %412, %411, !dbg !4873\n  store double %413, double* %\"'de34\", align 8, !dbg !4873\n  %_unwrap41 = getelementptr inbounds [2 x double], [2 x double]* %5, i64 0, i64 0, !dbg !4873\n  %unbox47_unwrap42 = load double, double* %_unwrap41, align 8, !dbg !4837, !tbaa !1201, !alias.scope !4838, !noalias !4841, !invariant.group !4843\n  %_unwrap43 = fmul double %unbox47_unwrap42, 0x3FD5555555555555, !dbg !4873\n  %414 = call fastcc double @julia_exp_4278(double %_unwrap43) #48, !dbg !4868\n  %415 = fmul fast double %409, %414, !dbg !4873\n  %416 = load double, double* %\".fca.0.extract217'de\", align 8, !dbg !4873\n  %417 = fadd fast double %416, %415, !dbg !4873\n  store double %417, double* %\".fca.0.extract217'de\", align 8, !dbg !4873\n  %418 = load double, double* %\"'de44\", align 8, !dbg !4873\n  store double 0.000000e+00, double* %\"'de44\", align 8, !dbg !4873\n  %.fca.1.extract218_unwrap = extractvalue [2 x double] %410, 1, !dbg !4873\n  %419 = fmul fast double %418, %.fca.1.extract218_unwrap, !dbg !4873\n  %420 = load double, double* %\"'de34\", align 8, !dbg !4873\n  %421 = fadd fast double %420, %419, !dbg !4873\n  store double %421, double* %\"'de34\", align 8, !dbg !4873\n  %422 = fmul fast double %418, %414, !dbg !4873\n  %423 = load double, double* %\".fca.1.extract218'de\", align 8, !dbg !4873\n  %424 = fadd fast double %423, %422, !dbg !4873\n  store double %424, double* %\".fca.1.extract218'de\", align 8, !dbg !4873\n  %425 = load double, double* %\".fca.1.extract218'de\", align 8, !dbg !4872\n  %426 = getelementptr inbounds [2 x double], [2 x double]* %\"'de45\", i32 0, i32 1, !dbg !4872\n  %427 = load double, double* %426, align 8, !dbg !4872\n  %428 = fadd fast double %427, %425, !dbg !4872\n  store double %428, double* %426, align 8, !dbg !4872\n  store double 0.000000e+00, double* %\".fca.1.extract218'de\", align 8, !dbg !4872\n  %429 = load double, double* %\".fca.0.extract217'de\", align 8, !dbg !4872\n  %430 = getelementptr inbounds [2 x double], [2 x double]* %\"'de45\", i32 0, i32 0, !dbg !4872\n  %431 = load double, double* %430, align 8, !dbg !4872\n  %432 = fadd fast double %431, %429, !dbg !4872\n  store double %432, double* %430, align 8, !dbg !4872\n  store double 0.000000e+00, double* %\".fca.0.extract217'de\", align 8, !dbg !4872\n  %433 = load [2 x double], [2 x double]* %\"'de45\", align 8, !dbg !4872\n  store [2 x double] zeroinitializer, [2 x double]* %\"'de45\", align 8, !dbg !4872\n  %434 = call fast [2 x double] @julia_sincos_4270_inner.1(double %_unwrap40) #50, !dbg !4872\n  %435 = extractvalue [2 x double] %434, 1, !dbg !4872\n  %436 = extractvalue [2 x double] %433, 0, !dbg !4872\n  %437 = fmul fast double %435, %436, !dbg !4872\n  %438 = extractvalue [2 x double] %434, 0, !dbg !4872\n  %439 = extractvalue [2 x double] %433, 1, !dbg !4872\n  %440 = fmul fast double %438, %439, !dbg !4872\n  %441 = fneg fast double %440, !dbg !4872\n  %442 = fadd fast double %437, %441, !dbg !4872\n  %443 = load double, double* %\"'de\", align 8, !dbg !4872\n  %444 = fadd fast double %443, %442, !dbg !4872\n  store double %444, double* %\"'de\", align 8, !dbg !4872\n  br label %invertL151\n\ninvertL177:                                       ; preds = %invertL200, %invertL191\n  %445 = load double, double* %\"'de46\", align 8, !dbg !4889\n  store double 0.000000e+00, double* %\"'de46\", align 8, !dbg !4889\n  %446 = fmul fast double %445, 0x3FD5555555555555, !dbg !4889\n  %447 = load double, double* %\"unbox97'de\", align 8, !dbg !4889\n  %448 = fadd fast double %447, %446, !dbg !4889\n  store double %448, double* %\"unbox97'de\", align 8, !dbg !4889\n  %449 = load double, double* %\"unbox97'de\", align 8, !dbg !4889\n  store double 0.000000e+00, double* %\"unbox97'de\", align 8, !dbg !4889\n  %\"'ipg48_unwrap\" = getelementptr inbounds [2 x double], [2 x double]* %\"'ipc47\", i64 0, i64 1, !dbg !4889\n  %450 = load double, double* %\"'ipg48_unwrap\", align 8, !dbg !4889, !tbaa !1201, !alias.scope !5073, !noalias !5074\n  %451 = fadd fast double %450, %449, !dbg !4889\n  store double %451, double* %\"'ipg48_unwrap\", align 8, !dbg !4889, !tbaa !1201, !alias.scope !5073, !noalias !5074\n  %452 = load double, double* %\"'de49\", align 8, !dbg !4889\n  store double 0.000000e+00, double* %\"'de49\", align 8, !dbg !4889\n  %453 = fmul fast double %452, 0x3FD5555555555555, !dbg !4889\n  %454 = load double, double* %\"unbox96'de\", align 8, !dbg !4889\n  %455 = fadd fast double %454, %453, !dbg !4889\n  store double %455, double* %\"unbox96'de\", align 8, !dbg !4889\n  %456 = load double, double* %\"unbox96'de\", align 8, !dbg !4889\n  store double 0.000000e+00, double* %\"unbox96'de\", align 8, !dbg !4889\n  %\"'ipg50_unwrap\" = getelementptr inbounds [2 x double], [2 x double]* %\"'ipc47\", i64 0, i64 0, !dbg !4889\n  %457 = load double, double* %\"'ipg50_unwrap\", align 8, !dbg !4889, !tbaa !1201, !alias.scope !5073, !noalias !5074\n  %458 = fadd fast double %457, %456, !dbg !4889\n  store double %458, double* %\"'ipg50_unwrap\", align 8, !dbg !4889, !tbaa !1201, !alias.scope !5073, !noalias !5074\n  %_unwrap51 = addrspacecast [2 x double]* %12 to [2 x double] addrspace(11)*, !dbg !4877\n  %\"'ipc52_unwrap\" = addrspacecast [2 x double]* %\"newstruct95'ipc\" to [2 x double] addrspace(11)*, !dbg !4877\n  %tapeArg53_unwrap = extractvalue { i8*, i8*, i8*, { i8*, i8*, double, double }, { i8*, i8*, double, double }, { i8*, double, double, double, double }, [2 x double], double, double, double, double, double, double } %tapeArg, 4, !dbg !4877\n  call fastcc void @diffejulia_log_4285([2 x double]* nocapture nofree writeonly align 8 \"enzyme_sret\" undef, [2 x double]* nocapture nofree align 8 \"enzyme_sret\" %\"'ipc47\", [2 x double] addrspace(11)* nocapture nofree readonly align 8 %_unwrap51, [2 x double] addrspace(11)* nocapture nofree align 8 %\"'ipc52_unwrap\", { i8*, i8*, double, double } %tapeArg53_unwrap), !dbg !4877\n  %\"'ipg54_unwrap\" = getelementptr inbounds [2 x double], [2 x double]* %\"newstruct95'ipc\", i64 0, i64 1, !dbg !4880\n  %459 = load double, double* %\"'ipg54_unwrap\", align 8, !dbg !4880, !tbaa !1201, !alias.scope !5075, !noalias !5076\n  store double 0.000000e+00, double* %\"'ipg54_unwrap\", align 8, !dbg !4880, !tbaa !1201, !alias.scope !5075, !noalias !5076\n  %460 = load double, double* %\"'de55\", align 8, !dbg !4880\n  %461 = fadd fast double %460, %459, !dbg !4880\n  store double %461, double* %\"'de55\", align 8, !dbg !4880\n  %\"'ipg56_unwrap\" = getelementptr inbounds [2 x double], [2 x double]* %\"newstruct95'ipc\", i64 0, i64 0, !dbg !4880\n  %462 = load double, double* %\"'ipg56_unwrap\", align 8, !dbg !4880, !tbaa !1201, !alias.scope !5075, !noalias !5076\n  store double 0.000000e+00, double* %\"'ipg56_unwrap\", align 8, !dbg !4880, !tbaa !1201, !alias.scope !5075, !noalias !5076\n  %463 = load double, double* %\"'de57\", align 8, !dbg !4880\n  %464 = fadd fast double %463, %462, !dbg !4880\n  store double %464, double* %\"'de57\", align 8, !dbg !4880\n  %465 = load double, double* %\"'de55\", align 8, !dbg !4878\n  store double 0.000000e+00, double* %\"'de55\", align 8, !dbg !4878\n  %466 = fmul fast double %465, 5.000000e-01, !dbg !4878\n  %467 = load double, double* %\"'de58\", align 8, !dbg !4878\n  %468 = fadd fast double %467, %466, !dbg !4878\n  store double %468, double* %\"'de58\", align 8, !dbg !4878\n  %469 = load double, double* %\"'de57\", align 8, !dbg !4878\n  store double 0.000000e+00, double* %\"'de57\", align 8, !dbg !4878\n  %470 = fmul fast double %469, 5.000000e-01, !dbg !4878\n  %471 = load double, double* %\"'de59\", align 8, !dbg !4878\n  %472 = fadd fast double %471, %470, !dbg !4878\n  store double %472, double* %\"'de59\", align 8, !dbg !4878\n  %473 = load double, double* %\"'de58\", align 8, !dbg !4875\n  store double 0.000000e+00, double* %\"'de58\", align 8, !dbg !4875\n  %474 = load double, double* %\"'de28\", align 8, !dbg !4875\n  %475 = fadd fast double %474, %473, !dbg !4875\n  store double %475, double* %\"'de28\", align 8, !dbg !4875\n  %476 = fneg fast double %473, !dbg !4875\n  %477 = load double, double* %\".fca.1.extract245'de\", align 8, !dbg !4875\n  %478 = fadd fast double %477, %476, !dbg !4875\n  store double %478, double* %\".fca.1.extract245'de\", align 8, !dbg !4875\n  %479 = load double, double* %\"'de59\", align 8, !dbg !4875\n  store double 0.000000e+00, double* %\"'de59\", align 8, !dbg !4875\n  %480 = load double, double* %\"'de29\", align 8, !dbg !4875\n  %481 = fadd fast double %480, %479, !dbg !4875\n  store double %481, double* %\"'de29\", align 8, !dbg !4875\n  %482 = fneg fast double %479, !dbg !4875\n  %483 = load double, double* %\".fca.0.extract244'de\", align 8, !dbg !4875\n  %484 = fadd fast double %483, %482, !dbg !4875\n  store double %484, double* %\".fca.0.extract244'de\", align 8, !dbg !4875\n  br label %invertidxend\n\ninvertL191:                                       ; preds = %invertL242\n  %_unwrap60 = getelementptr inbounds [2 x double], [2 x double]* %17, i64 0, i64 1, !dbg !4853\n  %unbox97_unwrap = load double, double* %_unwrap60, align 8, !dbg !4889, !tbaa !1201, !alias.scope !4890, !noalias !4893, !invariant.group !4898\n  %_unwrap61 = fmul double %unbox97_unwrap, 0x3FD5555555555555, !dbg !4853\n  %_unwrap62 = fcmp une double %_unwrap61, 0.000000e+00, !dbg !4853\n  %485 = load double, double* %\".191'de\", align 8, !dbg !4853\n  %diffe63 = select fast i1 %_unwrap62, double %485, double 0.000000e+00, !dbg !4853\n  %486 = load double, double* %\".191'de\", align 8, !dbg !4853\n  %diffe64 = select fast i1 %_unwrap62, double 0.000000e+00, double %486, !dbg !4853\n  store double 0.000000e+00, double* %\".191'de\", align 8, !dbg !4853\n  %487 = load double, double* %\"'de49\", align 8, !dbg !4853\n  %488 = fadd fast double %487, %485, !dbg !4853\n  %489 = select fast i1 %_unwrap62, double %488, double %487, !dbg !4853\n  store double %489, double* %\"'de49\", align 8, !dbg !4853\n  %490 = load double, double* %\"'de46\", align 8, !dbg !4853\n  %491 = fadd fast double %490, %486, !dbg !4853\n  %492 = select fast i1 %_unwrap62, double %490, double %491, !dbg !4853\n  store double %492, double* %\"'de46\", align 8, !dbg !4853\n  br label %invertL177\n\ninvertL200:                                       ; preds = %invertL217, %invertL205\n  br label %invertL177\n\ninvertL205:                                       ; preds = %invertL242.thread, %invertL211\n  br label %invertL200\n\ninvertL211:                                       ; preds = %invertL242.thread, %invertL213\n  br label %invertL205\n\ninvertL213:                                       ; preds = %invertL242\n  br label %invertL211\n\ninvertL217:                                       ; preds = %invertL242, %invertL222\n  %493 = load double, double* %\"'de65\", align 8, !dbg !4916\n  store double 0.000000e+00, double* %\"'de65\", align 8, !dbg !4916\n  %_unwrap66 = getelementptr inbounds [2 x double], [2 x double]* %17, i64 0, i64 0, !dbg !4916\n  %unbox96_unwrap = load double, double* %_unwrap66, align 8, !dbg !4889, !tbaa !1201, !alias.scope !4890, !noalias !4893, !invariant.group !4895\n  %_unwrap67 = fmul double %unbox96_unwrap, 0x3FD5555555555555, !dbg !4916\n  %494 = call fast fastcc double @julia_exp_4278(double %_unwrap67), !dbg !4916\n  %495 = fmul fast double %493, %494, !dbg !4916\n  %496 = load double, double* %\"'de49\", align 8, !dbg !4916\n  %497 = fadd fast double %496, %495, !dbg !4916\n  store double %497, double* %\"'de49\", align 8, !dbg !4916\n  br label %invertL200\n\ninvertL222:                                       ; preds = %invertL242\n  %498 = load double, double* %\"'de68\", align 8, !dbg !4921\n  store double 0.000000e+00, double* %\"'de68\", align 8, !dbg !4921\n  %_unwrap69 = getelementptr inbounds [2 x double], [2 x double]* %17, i64 0, i64 1, !dbg !4921\n  %unbox97_unwrap70 = load double, double* %_unwrap69, align 8, !dbg !4889, !tbaa !1201, !alias.scope !4890, !noalias !4893, !invariant.group !4898\n  %_unwrap71 = fmul double %unbox97_unwrap70, 0x3FD5555555555555, !dbg !4921\n  %499 = call [2 x double] @julia_sincos_4270_inner.1(double %_unwrap71) #49, !dbg !4920\n  %.fca.0.extract_unwrap = extractvalue [2 x double] %499, 0, !dbg !4921\n  %500 = fmul fast double %498, %.fca.0.extract_unwrap, !dbg !4921\n  %501 = load double, double* %\"'de65\", align 8, !dbg !4921\n  %502 = fadd fast double %501, %500, !dbg !4921\n  store double %502, double* %\"'de65\", align 8, !dbg !4921\n  %_unwrap72 = getelementptr inbounds [2 x double], [2 x double]* %17, i64 0, i64 0, !dbg !4921\n  %unbox96_unwrap73 = load double, double* %_unwrap72, align 8, !dbg !4889, !tbaa !1201, !alias.scope !4890, !noalias !4893, !invariant.group !4895\n  %_unwrap74 = fmul double %unbox96_unwrap73, 0x3FD5555555555555, !dbg !4921\n  %503 = call fastcc double @julia_exp_4278(double %_unwrap74) #48, !dbg !4916\n  %504 = fmul fast double %498, %503, !dbg !4921\n  %505 = load double, double* %\".fca.0.extract'de\", align 8, !dbg !4921\n  %506 = fadd fast double %505, %504, !dbg !4921\n  store double %506, double* %\".fca.0.extract'de\", align 8, !dbg !4921\n  %507 = load double, double* %\"'de75\", align 8, !dbg !4921\n  store double 0.000000e+00, double* %\"'de75\", align 8, !dbg !4921\n  %.fca.1.extract_unwrap = extractvalue [2 x double] %499, 1, !dbg !4921\n  %508 = fmul fast double %507, %.fca.1.extract_unwrap, !dbg !4921\n  %509 = load double, double* %\"'de65\", align 8, !dbg !4921\n  %510 = fadd fast double %509, %508, !dbg !4921\n  store double %510, double* %\"'de65\", align 8, !dbg !4921\n  %511 = fmul fast double %507, %503, !dbg !4921\n  %512 = load double, double* %\".fca.1.extract'de\", align 8, !dbg !4921\n  %513 = fadd fast double %512, %511, !dbg !4921\n  store double %513, double* %\".fca.1.extract'de\", align 8, !dbg !4921\n  %514 = load double, double* %\".fca.1.extract'de\", align 8, !dbg !4920\n  %515 = getelementptr inbounds [2 x double], [2 x double]* %\"'de76\", i32 0, i32 1, !dbg !4920\n  %516 = load double, double* %515, align 8, !dbg !4920\n  %517 = fadd fast double %516, %514, !dbg !4920\n  store double %517, double* %515, align 8, !dbg !4920\n  store double 0.000000e+00, double* %\".fca.1.extract'de\", align 8, !dbg !4920\n  %518 = load double, double* %\".fca.0.extract'de\", align 8, !dbg !4920\n  %519 = getelementptr inbounds [2 x double], [2 x double]* %\"'de76\", i32 0, i32 0, !dbg !4920\n  %520 = load double, double* %519, align 8, !dbg !4920\n  %521 = fadd fast double %520, %518, !dbg !4920\n  store double %521, double* %519, align 8, !dbg !4920\n  store double 0.000000e+00, double* %\".fca.0.extract'de\", align 8, !dbg !4920\n  %522 = load [2 x double], [2 x double]* %\"'de76\", align 8, !dbg !4920\n  store [2 x double] zeroinitializer, [2 x double]* %\"'de76\", align 8, !dbg !4920\n  %523 = call fast [2 x double] @julia_sincos_4270_inner.1(double %_unwrap71) #50, !dbg !4920\n  %524 = extractvalue [2 x double] %523, 1, !dbg !4920\n  %525 = extractvalue [2 x double] %522, 0, !dbg !4920\n  %526 = fmul fast double %524, %525, !dbg !4920\n  %527 = extractvalue [2 x double] %523, 0, !dbg !4920\n  %528 = extractvalue [2 x double] %522, 1, !dbg !4920\n  %529 = fmul fast double %527, %528, !dbg !4920\n  %530 = fneg fast double %529, !dbg !4920\n  %531 = fadd fast double %526, %530, !dbg !4920\n  %532 = load double, double* %\"'de46\", align 8, !dbg !4920\n  %533 = fadd fast double %532, %531, !dbg !4920\n  store double %533, double* %\"'de46\", align 8, !dbg !4920\n  br label %invertL217\n\ninvertL242.thread:                                ; preds = %invertL265\n  %\".sroa.6.0..sroa_idx303329'ipg_unwrap\" = getelementptr inbounds [2 x double], [2 x double]* %\"'ipc77\", i64 0, i64 1, !dbg !4923\n  store double 0.000000e+00, double* %\".sroa.6.0..sroa_idx303329'ipg_unwrap\", align 8, !dbg !4923, !alias.scope !5077, !noalias !5078\n  %\".sroa.0296.0..sroa_idx298328'ipg_unwrap\" = getelementptr inbounds [2 x double], [2 x double]* %\"'ipc77\", i64 0, i64 0, !dbg !4923\n  store double 0.000000e+00, double* %\".sroa.0296.0..sroa_idx298328'ipg_unwrap\", align 8, !dbg !4923, !alias.scope !5077, !noalias !5078\n  %534 = load i8, i8* %_cache, align 1, !invariant.group !4863\n  switch i8 %534, label %invertL211 [\n    i8 0, label %invertL139\n    i8 1, label %invertL145\n    i8 2, label %invertL205\n  ]\n\ninvertL242:                                       ; preds = %invertL266, %invertL265\n  %\".sroa.6.0..sroa_idx303'ipg_unwrap\" = getelementptr inbounds [2 x double], [2 x double]* %\"'ipc77\", i64 0, i64 1, !dbg !4923\n  %535 = load double, double* %\".sroa.6.0..sroa_idx303'ipg_unwrap\", align 8, !dbg !4923, !alias.scope !5077, !noalias !5078\n  store double 0.000000e+00, double* %\".sroa.6.0..sroa_idx303'ipg_unwrap\", align 8, !dbg !4923, !alias.scope !5077, !noalias !5078\n  %536 = load double, double* %\".sroa.6.0'de\", align 8, !dbg !4923\n  %537 = fadd fast double %536, %535, !dbg !4923\n  store double %537, double* %\".sroa.6.0'de\", align 8, !dbg !4923\n  %\".sroa.0296.0..sroa_idx298'ipg_unwrap\" = getelementptr inbounds [2 x double], [2 x double]* %\"'ipc77\", i64 0, i64 0, !dbg !4923\n  %538 = load double, double* %\".sroa.0296.0..sroa_idx298'ipg_unwrap\", align 8, !dbg !4923, !alias.scope !5077, !noalias !5078\n  store double 0.000000e+00, double* %\".sroa.0296.0..sroa_idx298'ipg_unwrap\", align 8, !dbg !4923, !alias.scope !5077, !noalias !5078\n  %539 = load double, double* %\".sroa.0223.0.copyload'de\", align 8, !dbg !4923\n  %540 = fadd fast double %539, %538, !dbg !4923\n  store double %540, double* %\".sroa.0223.0.copyload'de\", align 8, !dbg !4923\n  %541 = load double, double* %\".sroa.0223.0.copyload'de\", align 8\n  store double 0.000000e+00, double* %\".sroa.0223.0.copyload'de\", align 8\n  %542 = load i8, i8* %_cache83, align 1, !invariant.group !4854\n  %543 = icmp eq i8 0, %542\n  %544 = icmp eq i8 1, %542\n  %545 = icmp eq i8 2, %542\n  %546 = icmp eq i8 3, %542\n  %547 = icmp eq i8 5, %542\n  %548 = icmp eq i8 6, %542\n  %549 = select fast i1 %548, double %541, double 0.000000e+00\n  %550 = load double, double* %\"'de75\", align 8\n  %551 = fadd fast double %550, %541\n  %552 = select fast i1 %548, double %551, double %550\n  store double %552, double* %\"'de75\", align 8\n  %553 = select fast i1 %547, double %541, double 0.000000e+00\n  %554 = load double, double* %\"'de65\", align 8\n  %555 = fadd fast double %554, %541\n  %556 = select fast i1 %547, double %555, double %554\n  store double %556, double* %\"'de65\", align 8\n  %557 = select fast i1 %546, double %541, double 0.000000e+00\n  %558 = load double, double* %\"'de49\", align 8\n  %559 = fadd fast double %558, %541\n  %560 = select fast i1 %546, double %559, double %558\n  store double %560, double* %\"'de49\", align 8\n  %561 = select fast i1 %545, double %541, double 0.000000e+00\n  %562 = load double, double* %\"'de44\", align 8\n  %563 = fadd fast double %562, %541\n  %564 = select fast i1 %545, double %563, double %562\n  store double %564, double* %\"'de44\", align 8\n  %565 = select fast i1 %544, double %541, double 0.000000e+00\n  %566 = load double, double* %\"'de34\", align 8\n  %567 = fadd fast double %566, %541\n  %568 = select fast i1 %544, double %567, double %566\n  store double %568, double* %\"'de34\", align 8\n  %569 = select fast i1 %543, double %541, double 0.000000e+00\n  %570 = load double, double* %\"'de18\", align 8\n  %571 = fadd fast double %570, %541\n  %572 = select fast i1 %543, double %571, double %570\n  store double %572, double* %\"'de18\", align 8\n  %573 = load double, double* %\".sroa.6.0'de\", align 8\n  store double 0.000000e+00, double* %\".sroa.6.0'de\", align 8\n  %574 = select fast i1 %548, double %573, double 0.000000e+00\n  %575 = load double, double* %\"'de68\", align 8\n  %576 = fadd fast double %575, %573\n  %577 = select fast i1 %548, double %576, double %575\n  store double %577, double* %\"'de68\", align 8\n  %578 = select fast i1 %547, double %573, double 0.000000e+00\n  %579 = load double, double* %\"'de46\", align 8\n  %580 = fadd fast double %579, %573\n  %581 = select fast i1 %547, double %580, double %579\n  store double %581, double* %\"'de46\", align 8\n  %582 = select fast i1 %546, double %573, double 0.000000e+00\n  %583 = load double, double* %\".191'de\", align 8\n  %584 = fadd fast double %583, %573\n  %585 = select fast i1 %546, double %584, double %583\n  store double %585, double* %\".191'de\", align 8\n  %586 = select fast i1 %545, double %573, double 0.000000e+00\n  %587 = load double, double* %\"'de37\", align 8\n  %588 = fadd fast double %587, %573\n  %589 = select fast i1 %545, double %588, double %587\n  store double %589, double* %\"'de37\", align 8\n  %590 = select fast i1 %544, double %573, double 0.000000e+00\n  %591 = load double, double* %\"'de\", align 8\n  %592 = fadd fast double %591, %573\n  %593 = select fast i1 %544, double %592, double %591\n  store double %593, double* %\"'de\", align 8\n  %594 = select fast i1 %543, double %573, double 0.000000e+00\n  %595 = load double, double* %\".'de\", align 8\n  %596 = fadd fast double %595, %573\n  %597 = select fast i1 %543, double %596, double %595\n  store double %597, double* %\".'de\", align 8\n  %598 = load i8, i8* %_cache84, align 1, !invariant.group !4855\n  switch i8 %598, label %invertL222 [\n    i8 0, label %invertL125\n    i8 1, label %invertL147\n    i8 2, label %invertL151\n    i8 3, label %invertL156\n    i8 4, label %invertL191\n    i8 5, label %invertL213\n    i8 6, label %invertL217\n  ]\n\ninvertL265:                                       ; preds = %invertL266\n  %599 = load double, double* %\".sroa.6228.0.copyload233'de\", align 8, !dbg !4931\n  store double 0.000000e+00, double* %\".sroa.6228.0.copyload233'de\", align 8, !dbg !4931\n  %\".sroa.6228.0..sroa_idx232'ipg_unwrap\" = getelementptr inbounds [2 x double], [2 x double]* %\"'ipc85\", i64 0, i64 1, !dbg !4931\n  %600 = load double, double* %\".sroa.6228.0..sroa_idx232'ipg_unwrap\", align 8, !dbg !4931, !tbaa !1201, !alias.scope !5079, !noalias !5080\n  %601 = fadd fast double %600, %599, !dbg !4931\n  store double %601, double* %\".sroa.6228.0..sroa_idx232'ipg_unwrap\", align 8, !dbg !4931, !tbaa !1201, !alias.scope !5079, !noalias !5080\n  %602 = load double, double* %\".sroa.0223.0.copyload227'de\", align 8, !dbg !4931\n  store double 0.000000e+00, double* %\".sroa.0223.0.copyload227'de\", align 8, !dbg !4931\n  %\".sroa.0223.0..sroa_idx226'ipg_unwrap\" = getelementptr inbounds [2 x double], [2 x double]* %\"'ipc85\", i64 0, i64 0, !dbg !4931\n  %603 = load double, double* %\".sroa.0223.0..sroa_idx226'ipg_unwrap\", align 8, !dbg !4931, !tbaa !1201, !alias.scope !5079, !noalias !5080\n  %604 = fadd fast double %603, %602, !dbg !4931\n  store double %604, double* %\".sroa.0223.0..sroa_idx226'ipg_unwrap\", align 8, !dbg !4931, !tbaa !1201, !alias.scope !5079, !noalias !5080\n  %_unwrap86 = addrspacecast [2 x double]* %14 to [2 x double] addrspace(11)*, !dbg !4938\n  %\"'ipc87_unwrap\" = addrspacecast [2 x double]* %\"newstruct40'ipc\" to [2 x double] addrspace(11)*, !dbg !4938\n  %_unwrap88 = addrspacecast [2 x double]* %2 to [2 x double] addrspace(11)*, !dbg !4938\n  %\"'ipc89_unwrap\" = addrspacecast [2 x double]* %\"'ipc77\" to [2 x double] addrspace(11)*, !dbg !4938\n  %tapeArg90_unwrap = extractvalue { i8*, i8*, i8*, { i8*, i8*, double, double }, { i8*, i8*, double, double }, { i8*, double, double, double, double }, [2 x double], double, double, double, double, double, double } %tapeArg, 5, !dbg !4938\n  call fastcc void @diffejulia___4280([2 x double]* nocapture nofree writeonly align 8 \"enzyme_sret\" undef, [2 x double]* nocapture nofree align 8 \"enzyme_sret\" %\"'ipc85\", [2 x double] addrspace(11)* nocapture nofree readonly align 8 %_unwrap86, [2 x double] addrspace(11)* nocapture nofree align 8 %\"'ipc87_unwrap\", [2 x double] addrspace(11)* nocapture nofree readonly align 8 %_unwrap88, [2 x double] addrspace(11)* nocapture nofree align 8 %\"'ipc89_unwrap\", { i8*, double, double, double, double } %tapeArg90_unwrap), !dbg !4938\n  %605 = load double, double* %\".sroa.6.0334'de\", align 8\n  store double 0.000000e+00, double* %\".sroa.6.0334'de\", align 8\n  %606 = load i1, i1* %_cache91, align 1, !invariant.group !4929\n  %607 = select fast i1 %606, double %605, double 0.000000e+00\n  %608 = load double, double* %\".sroa.6.0'de\", align 8\n  %609 = fadd fast double %608, %605\n  %610 = select fast i1 %606, double %609, double %608\n  store double %610, double* %\".sroa.6.0'de\", align 8\n  %611 = load double, double* %\".sroa.0296.0332'de\", align 8\n  store double 0.000000e+00, double* %\".sroa.0296.0332'de\", align 8\n  %612 = select fast i1 %606, double %611, double 0.000000e+00\n  %613 = load double, double* %\".sroa.0223.0.copyload'de\", align 8\n  %614 = fadd fast double %613, %611\n  %615 = select fast i1 %606, double %614, double %613\n  store double %615, double* %\".sroa.0223.0.copyload'de\", align 8\n  %616 = load i1, i1* %_cache92, align 1, !invariant.group !4930\n  br i1 %616, label %invertL242, label %invertL242.thread\n\ninvertL266:                                       ; preds = %invertL327, %invertcommon.ret\n  %617 = load double, double* %\"'de93\", align 8, !dbg !4961\n  store double 0.000000e+00, double* %\"'de93\", align 8, !dbg !4961\n  %618 = fmul fast double %617, 0x3FD5555555555555, !dbg !4961\n  %619 = load double, double* %\"'de94\", align 8, !dbg !4961\n  %620 = fadd fast double %619, %618, !dbg !4961\n  store double %620, double* %\"'de94\", align 8, !dbg !4961\n  %621 = load double, double* %\"'de94\", align 8, !dbg !4958\n  store double 0.000000e+00, double* %\"'de94\", align 8, !dbg !4958\n  %622 = load double, double* %\"'de95\", align 8, !dbg !4958\n  %623 = fadd fast double %622, %621, !dbg !4958\n  store double %623, double* %\"'de95\", align 8, !dbg !4958\n  %624 = load double, double* %\"'de96\", align 8, !dbg !4958\n  %625 = fadd fast double %624, %621, !dbg !4958\n  store double %625, double* %\"'de96\", align 8, !dbg !4958\n  %626 = load double, double* %\"'de95\", align 8, !dbg !4958\n  store double 0.000000e+00, double* %\"'de95\", align 8, !dbg !4958\n  %627 = load double, double* %\"'de97\", align 8, !dbg !4958\n  %628 = fadd fast double %627, %626, !dbg !4958\n  store double %628, double* %\"'de97\", align 8, !dbg !4958\n  %629 = load double, double* %\"'de98\", align 8, !dbg !4958\n  %630 = fadd fast double %629, %626, !dbg !4958\n  store double %630, double* %\"'de98\", align 8, !dbg !4958\n  %631 = load double, double* %\"'de96\", align 8, !dbg !4956\n  store double 0.000000e+00, double* %\"'de96\", align 8, !dbg !4956\n  %632 = load double, double* %\"'de99\", align 8, !dbg !4956\n  %633 = fadd fast double %632, %631, !dbg !4956\n  store double %633, double* %\"'de99\", align 8, !dbg !4956\n  %634 = load double, double* %\"'de100\", align 8, !dbg !4956\n  %635 = fadd fast double %634, %631, !dbg !4956\n  store double %635, double* %\"'de100\", align 8, !dbg !4956\n  %636 = load double, double* %\"'de100\", align 8, !dbg !4953\n  store double 0.000000e+00, double* %\"'de100\", align 8, !dbg !4953\n  %637 = fmul fast double %636, 0x3FEBB67AE8584CAA, !dbg !4953\n  %638 = load double, double* %\".sroa.6228.0'de\", align 8, !dbg !4953\n  %639 = fadd fast double %638, %637, !dbg !4953\n  store double %639, double* %\".sroa.6228.0'de\", align 8, !dbg !4953\n  %640 = load double, double* %\"'de98\", align 8, !dbg !4956\n  store double 0.000000e+00, double* %\"'de98\", align 8, !dbg !4956\n  %641 = load double, double* %\"'de101\", align 8, !dbg !4956\n  %642 = fadd fast double %641, %640, !dbg !4956\n  store double %642, double* %\"'de101\", align 8, !dbg !4956\n  %643 = fneg fast double %640, !dbg !4956\n  %644 = load double, double* %\"'de102\", align 8, !dbg !4956\n  %645 = fadd fast double %644, %643, !dbg !4956\n  store double %645, double* %\"'de102\", align 8, !dbg !4956\n  %646 = load double, double* %\"'de102\", align 8, !dbg !4953\n  store double 0.000000e+00, double* %\"'de102\", align 8, !dbg !4953\n  %647 = fmul fast double %646, 0x3FEBB67AE8584CAA, !dbg !4953\n  %648 = load double, double* %\".sroa.6.0333'de\", align 8, !dbg !4953\n  %649 = fadd fast double %648, %647, !dbg !4953\n  store double %649, double* %\".sroa.6.0333'de\", align 8, !dbg !4953\n  %650 = load double, double* %\"'de99\", align 8, !dbg !4950\n  store double 0.000000e+00, double* %\"'de99\", align 8, !dbg !4950\n  %651 = fmul fast double %650, -5.000000e-01, !dbg !4950\n  %652 = load double, double* %\".sroa.0223.0'de\", align 8, !dbg !4950\n  %653 = fadd fast double %652, %651, !dbg !4950\n  store double %653, double* %\".sroa.0223.0'de\", align 8, !dbg !4950\n  %654 = load double, double* %\"'de101\", align 8, !dbg !4950\n  store double 0.000000e+00, double* %\"'de101\", align 8, !dbg !4950\n  %655 = fmul fast double %654, -5.000000e-01, !dbg !4950\n  %656 = load double, double* %\".sroa.0296.0331'de\", align 8, !dbg !4950\n  %657 = fadd fast double %656, %655, !dbg !4950\n  store double %657, double* %\".sroa.0296.0331'de\", align 8, !dbg !4950\n  %658 = load double, double* %\"'de103\", align 8, !dbg !4948\n  store double 0.000000e+00, double* %\"'de103\", align 8, !dbg !4948\n  %659 = fmul fast double %658, 0x3FD5555555555555, !dbg !4948\n  %660 = load double, double* %\"'de104\", align 8, !dbg !4948\n  %661 = fadd fast double %660, %659, !dbg !4948\n  store double %661, double* %\"'de104\", align 8, !dbg !4948\n  %662 = load double, double* %\"'de104\", align 8, !dbg !4944\n  store double 0.000000e+00, double* %\"'de104\", align 8, !dbg !4944\n  %663 = load double, double* %\"'de105\", align 8, !dbg !4944\n  %664 = fadd fast double %663, %662, !dbg !4944\n  store double %664, double* %\"'de105\", align 8, !dbg !4944\n  %665 = load double, double* %\".sroa.0223.0'de\", align 8, !dbg !4944\n  %666 = fadd fast double %665, %662, !dbg !4944\n  store double %666, double* %\".sroa.0223.0'de\", align 8, !dbg !4944\n  %667 = load double, double* %\"'de105\", align 8, !dbg !4944\n  store double 0.000000e+00, double* %\"'de105\", align 8, !dbg !4944\n  %668 = load double, double* %\"'de97\", align 8, !dbg !4944\n  %669 = fadd fast double %668, %667, !dbg !4944\n  store double %669, double* %\"'de97\", align 8, !dbg !4944\n  %670 = load double, double* %\".sroa.0296.0331'de\", align 8, !dbg !4944\n  %671 = fadd fast double %670, %667, !dbg !4944\n  store double %671, double* %\".sroa.0296.0331'de\", align 8, !dbg !4944\n  %672 = load double, double* %\".sroa.6.0333'de\", align 8\n  store double 0.000000e+00, double* %\".sroa.6.0333'de\", align 8\n  %673 = load i1, i1* %_cache107, align 1, !invariant.group !4936\n  %674 = xor i1 %673, true\n  %675 = select fast i1 %673, double %672, double 0.000000e+00\n  %676 = load double, double* %\".sroa.6.0334'de\", align 8\n  %677 = fadd fast double %676, %672\n  %678 = select fast i1 %673, double %677, double %676\n  store double %678, double* %\".sroa.6.0334'de\", align 8\n  %679 = select fast i1 %674, double %672, double 0.000000e+00\n  %680 = load double, double* %\".sroa.6.0'de\", align 8\n  %681 = fadd fast double %680, %672\n  %682 = select fast i1 %673, double %680, double %681\n  store double %682, double* %\".sroa.6.0'de\", align 8\n  %683 = load double, double* %\".sroa.0296.0331'de\", align 8\n  store double 0.000000e+00, double* %\".sroa.0296.0331'de\", align 8\n  %684 = select fast i1 %673, double %683, double 0.000000e+00\n  %685 = load double, double* %\".sroa.0296.0332'de\", align 8\n  %686 = fadd fast double %685, %683\n  %687 = select fast i1 %673, double %686, double %685\n  store double %687, double* %\".sroa.0296.0332'de\", align 8\n  %688 = select fast i1 %674, double %683, double 0.000000e+00\n  %689 = load double, double* %\".sroa.0223.0.copyload'de\", align 8\n  %690 = fadd fast double %689, %683\n  %691 = select fast i1 %673, double %689, double %690\n  store double %691, double* %\".sroa.0223.0.copyload'de\", align 8\n  %692 = load double, double* %\".sroa.0223.0'de\", align 8\n  store double 0.000000e+00, double* %\".sroa.0223.0'de\", align 8\n  %693 = select fast i1 %673, double %692, double 0.000000e+00\n  %694 = load double, double* %\".sroa.0223.0.copyload227'de\", align 8\n  %695 = fadd fast double %694, %692\n  %696 = select fast i1 %673, double %695, double %694\n  store double %696, double* %\".sroa.0223.0.copyload227'de\", align 8\n  %697 = select fast i1 %674, double %692, double 0.000000e+00\n  %698 = load double, double* %\".sroa.0223.0.copyload'de\", align 8\n  %699 = fadd fast double %698, %692\n  %700 = select fast i1 %673, double %698, double %699\n  store double %700, double* %\".sroa.0223.0.copyload'de\", align 8\n  %701 = load double, double* %\".sroa.6228.0'de\", align 8\n  store double 0.000000e+00, double* %\".sroa.6228.0'de\", align 8\n  %702 = select fast i1 %673, double %701, double 0.000000e+00\n  %703 = load double, double* %\".sroa.6228.0.copyload233'de\", align 8\n  %704 = fadd fast double %703, %701\n  %705 = select fast i1 %673, double %704, double %703\n  store double %705, double* %\".sroa.6228.0.copyload233'de\", align 8\n  %706 = select fast i1 %674, double %701, double 0.000000e+00\n  %707 = load double, double* %\".sroa.6.0'de\", align 8\n  %708 = fadd fast double %707, %701\n  %709 = select fast i1 %673, double %707, double %708\n  store double %709, double* %\".sroa.6.0'de\", align 8\n  %710 = load i1, i1* %_cache108, align 1, !invariant.group !4937\n  br i1 %710, label %invertL265, label %invertL242\n\ninvertcommon.ret:                                 ; preds = %common.ret\n  store double %differeturn, double* %\"common.ret.op'de\", align 8\n  %711 = load double, double* %\"common.ret.op'de\", align 8\n  store double 0.000000e+00, double* %\"common.ret.op'de\", align 8\n  %_unwrap112 = fsub double %76, %81\n  %_unwrap113 = fadd double %123, %_unwrap112\n  %_unwrap114 = fadd double %85, %78\n  %_unwrap115 = fadd double %_unwrap113, %_unwrap114\n  %_unwrap116 = fmul double %_unwrap115, 0x3FD5555555555555\n  %712 = call double @llvm.fabs.f64(double %_unwrap116) #47, !dbg !4973\n  %_unwrap117 = fcmp uge double %712, 1.000000e-08\n  %_unwrap118 = fadd double %79, %75\n  %_unwrap119 = fadd double %120, %_unwrap118\n  %_unwrap120 = fsub double %77, %83\n  %_unwrap121 = fadd double %_unwrap119, %_unwrap120\n  %_unwrap122 = fmul double %_unwrap121, 0x3FD5555555555555\n  %_unwrap123 = fcmp ule double %_unwrap122, 0.000000e+00\n  %or.cond203_unwrap = select i1 %_unwrap117, i1 true, i1 %_unwrap123\n  %_unwrap124 = fcmp uge double %_unwrap122, 1.000000e+00\n  %or.cond205_unwrap = select i1 %or.cond203_unwrap, i1 true, i1 %_unwrap124\n  %anot1_ = xor i1 %or.cond201, true\n  %andVal0 = and i1 %or.cond205_unwrap, %or.cond201\n  %bnot1_ = xor i1 %or.cond205_unwrap, true\n  %andVal1 = and i1 %bnot1_, %or.cond201\n  %713 = select fast i1 %andVal0, double %711, double 0.000000e+00\n  %714 = load double, double* %\"spec.select210'de\", align 8\n  %715 = fadd fast double %714, %711\n  %716 = select fast i1 %andVal0, double %715, double %714\n  store double %716, double* %\"spec.select210'de\", align 8\n  %717 = select fast i1 %andVal1, double %711, double 0.000000e+00\n  %718 = load double, double* %\"'de110\", align 8\n  %719 = fadd fast double %718, %711\n  %720 = select fast i1 %andVal1, double %719, double %718\n  store double %720, double* %\"'de110\", align 8\n  %721 = select fast i1 %anot1_, double %711, double 0.000000e+00\n  %722 = load double, double* %\"'de103\", align 8\n  %723 = fadd fast double %722, %711\n  %724 = select fast i1 %or.cond201, double %722, double %723\n  store double %724, double* %\"'de103\", align 8\n  br i1 %or.cond201, label %staging, label %invertL266\n\ninvertL327:                                       ; preds = %invertL335, %staging\n  %725 = load double, double* %\"'de110\", align 8, !dbg !4970\n  store double 0.000000e+00, double* %\"'de110\", align 8, !dbg !4970\n  %726 = fmul fast double %725, 0x3FD5555555555555, !dbg !4970\n  %727 = load double, double* %\"'de125\", align 8, !dbg !4970\n  %728 = fadd fast double %727, %726, !dbg !4970\n  store double %728, double* %\"'de125\", align 8, !dbg !4970\n  %729 = load double, double* %\"'de125\", align 8, !dbg !4967\n  store double 0.000000e+00, double* %\"'de125\", align 8, !dbg !4967\n  %730 = load double, double* %\"'de126\", align 8, !dbg !4967\n  %731 = fadd fast double %730, %729, !dbg !4967\n  store double %731, double* %\"'de126\", align 8, !dbg !4967\n  %732 = load double, double* %\"'de127\", align 8, !dbg !4967\n  %733 = fadd fast double %732, %729, !dbg !4967\n  store double %733, double* %\"'de127\", align 8, !dbg !4967\n  %734 = load double, double* %\"'de127\", align 8, !dbg !4972\n  store double 0.000000e+00, double* %\"'de127\", align 8, !dbg !4972\n  %735 = load double, double* %\"'de99\", align 8, !dbg !4972\n  %736 = fadd fast double %735, %734, !dbg !4972\n  store double %736, double* %\"'de99\", align 8, !dbg !4972\n  %737 = fneg fast double %734, !dbg !4972\n  %738 = load double, double* %\"'de100\", align 8, !dbg !4972\n  %739 = fadd fast double %738, %737, !dbg !4972\n  store double %739, double* %\"'de100\", align 8, !dbg !4972\n  %740 = load double, double* %\"'de126\", align 8, !dbg !4967\n  store double 0.000000e+00, double* %\"'de126\", align 8, !dbg !4967\n  %741 = load double, double* %\"'de97\", align 8, !dbg !4967\n  %742 = fadd fast double %741, %740, !dbg !4967\n  store double %742, double* %\"'de97\", align 8, !dbg !4967\n  %743 = load double, double* %\"'de128\", align 8, !dbg !4967\n  %744 = fadd fast double %743, %740, !dbg !4967\n  store double %744, double* %\"'de128\", align 8, !dbg !4967\n  %745 = load double, double* %\"'de128\", align 8, !dbg !4972\n  store double 0.000000e+00, double* %\"'de128\", align 8, !dbg !4972\n  %746 = load double, double* %\"'de102\", align 8, !dbg !4972\n  %747 = fadd fast double %746, %745, !dbg !4972\n  store double %747, double* %\"'de102\", align 8, !dbg !4972\n  %748 = load double, double* %\"'de101\", align 8, !dbg !4972\n  %749 = fadd fast double %748, %745, !dbg !4972\n  store double %749, double* %\"'de101\", align 8, !dbg !4972\n  br label %invertL266\n\ninvertL335:                                       ; preds = %staging\n  %750 = call double @llvm.fabs.f64(double %92) #47, !dbg !4976\n  %_unwrap129 = fcmp uge double %750, 1.000000e-08, !dbg !4977\n  %_unwrap130 = fcmp ule double %91, 0.000000e+00, !dbg !4977\n  %or.cond207_unwrap = select i1 %_unwrap129, i1 true, i1 %_unwrap130, !dbg !4977\n  %_unwrap131 = fcmp uge double %91, 1.000000e+00, !dbg !4977\n  %or.cond209_unwrap = select i1 %or.cond207_unwrap, i1 true, i1 %_unwrap131, !dbg !4977\n  %751 = load double, double* %\"spec.select210'de\", align 8, !dbg !4977\n  %diffe132 = select fast i1 %or.cond209_unwrap, double 0.000000e+00, double %751, !dbg !4977\n  store double 0.000000e+00, double* %\"spec.select210'de\", align 8, !dbg !4977\n  %752 = load double, double* %\"'de93\", align 8, !dbg !4977\n  %753 = fadd fast double %752, %751, !dbg !4977\n  %754 = select fast i1 %or.cond209_unwrap, double %752, double %753, !dbg !4977\n  store double %754, double* %\"'de93\", align 8, !dbg !4977\n  br label %invertL327\n\ninvertoob:                                        ; No predecessors!\n\ninvertidxend:                                     ; preds = %invertL177, %invertL111\n  %755 = load double, double* %\".fca.1.extract245'de\", align 8, !dbg !5044\n  %756 = getelementptr inbounds [2 x double], [2 x double]* %\"'de134\", i32 0, i32 1, !dbg !5044\n  %757 = load double, double* %756, align 8, !dbg !5044\n  %758 = fadd fast double %757, %755, !dbg !5044\n  store double %758, double* %756, align 8, !dbg !5044\n  store double 0.000000e+00, double* %\".fca.1.extract245'de\", align 8, !dbg !5044\n  %759 = load double, double* %\".fca.0.extract244'de\", align 8, !dbg !5044\n  %760 = getelementptr inbounds [2 x double], [2 x double]* %\"'de134\", i32 0, i32 0, !dbg !5044\n  %761 = load double, double* %760, align 8, !dbg !5044\n  %762 = fadd fast double %761, %759, !dbg !5044\n  store double %762, double* %760, align 8, !dbg !5044\n  store double 0.000000e+00, double* %\".fca.0.extract244'de\", align 8, !dbg !5044\n  %763 = load [2 x double], [2 x double]* %\"'de134\", align 8, !dbg !5044\n  store [2 x double] zeroinitializer, [2 x double]* %\"'de134\", align 8, !dbg !5044\n  %764 = fcmp fast ueq double %189, 0.000000e+00, !dbg !5044\n  %765 = fcmp fast ueq double %190, 0.000000e+00, !dbg !5044\n  %766 = and i1 %764, %765, !dbg !5044\n  %re = extractvalue [2 x double] %763, 0, !dbg !5044\n  %im = extractvalue [2 x double] %763, 1, !dbg !5044\n  %767 = fneg fast double %im, !dbg !5044\n  %768 = insertvalue [2 x double] undef, double %re, 0, !dbg !5044\n  %769 = insertvalue [2 x double] %768, double %767, 1, !dbg !5044\n  %770 = call fast fastcc [2 x double] @julia_sqrt_4312_inner.3([2 x double] %.fca.1.insert) #50, !dbg !5044\n  %re2 = extractvalue [2 x double] %770, 0, !dbg !5044\n  %im2 = extractvalue [2 x double] %770, 1, !dbg !5044\n  %771 = fmul fast double 2.000000e+00, %re2, !dbg !5044\n  %772 = fmul fast double 0.000000e+00, %im2, !dbg !5044\n  %773 = fsub fast double %771, %772, !dbg !5044\n  %774 = fmul fast double 2.000000e+00, %im2, !dbg !5044\n  %775 = fmul fast double %re2, 0.000000e+00, !dbg !5044\n  %776 = fadd fast double %774, %775, !dbg !5044\n  %777 = insertvalue [2 x double] undef, double %773, 0, !dbg !5044\n  %778 = insertvalue [2 x double] %777, double %776, 1, !dbg !5044\n  %779 = fmul fast double %re, %773, !dbg !5044\n  %780 = fmul fast double %767, %776, !dbg !5044\n  %781 = fadd fast double %779, %780, !dbg !5044\n  %782 = fmul fast double %773, %773, !dbg !5044\n  %783 = fmul fast double %776, %776, !dbg !5044\n  %784 = fadd fast double %782, %783, !dbg !5044\n  %785 = fdiv fast double %781, %784, !dbg !5044\n  %786 = fmul fast double %773, %767, !dbg !5044\n  %787 = fmul fast double %re, %776, !dbg !5044\n  %788 = fsub fast double %786, %787, !dbg !5044\n  %789 = fdiv fast double %788, %784, !dbg !5044\n  %790 = insertvalue [2 x double] undef, double %785, 0, !dbg !5044\n  %791 = insertvalue [2 x double] %790, double %789, 1, !dbg !5044\n  %792 = fneg fast double %789, !dbg !5044\n  %793 = insertvalue [2 x double] undef, double %785, 0, !dbg !5044\n  %794 = insertvalue [2 x double] %793, double %792, 1, !dbg !5044\n  %795 = select fast i1 %766, [2 x double] zeroinitializer, [2 x double] %794, !dbg !5044\n  %796 = load [2 x double], [2 x double]* %\".fca.1.insert'de\", align 8, !dbg !5044\n  %797 = extractvalue [2 x double] %795, 0, !dbg !5044\n  %798 = getelementptr inbounds [2 x double], [2 x double]* %\".fca.1.insert'de\", i32 0, i32 0, !dbg !5044\n  %799 = load double, double* %798, align 8, !dbg !5044\n  %800 = fadd fast double %799, %797, !dbg !5044\n  store double %800, double* %798, align 8, !dbg !5044\n  %801 = extractvalue [2 x double] %795, 1, !dbg !5044\n  %802 = getelementptr inbounds [2 x double], [2 x double]* %\".fca.1.insert'de\", i32 0, i32 1, !dbg !5044\n  %803 = load double, double* %802, align 8, !dbg !5044\n  %804 = fadd fast double %803, %801, !dbg !5044\n  store double %804, double* %802, align 8, !dbg !5044\n  %805 = load [2 x double], [2 x double]* %\".fca.1.insert'de\", align 8, !dbg !5044\n  %806 = extractvalue [2 x double] %805, 1, !dbg !5044\n  %807 = load double, double* %\"'de135\", align 8, !dbg !5044\n  %808 = fadd fast double %807, %806, !dbg !5044\n  store double %808, double* %\"'de135\", align 8, !dbg !5044\n  %809 = load [2 x double], [2 x double]* %\".fca.1.insert'de\", align 8, !dbg !5044\n  %810 = insertvalue [2 x double] %809, double 0.000000e+00, 1, !dbg !5044\n  %811 = extractvalue [2 x double] %809, 0, !dbg !5044\n  %812 = getelementptr inbounds [2 x double], [2 x double]* %\".fca.0.insert'de\", i32 0, i32 0, !dbg !5044\n  %813 = load double, double* %812, align 8, !dbg !5044\n  %814 = fadd fast double %813, %811, !dbg !5044\n  store double %814, double* %812, align 8, !dbg !5044\n  store [2 x double] zeroinitializer, [2 x double]* %\".fca.1.insert'de\", align 8, !dbg !5044\n  %815 = load [2 x double], [2 x double]* %\".fca.0.insert'de\", align 8, !dbg !5044\n  %816 = extractvalue [2 x double] %815, 0, !dbg !5044\n  %817 = load double, double* %\"'de136\", align 8, !dbg !5044\n  %818 = fadd fast double %817, %816, !dbg !5044\n  store double %818, double* %\"'de136\", align 8, !dbg !5044\n  store [2 x double] zeroinitializer, [2 x double]* %\".fca.0.insert'de\", align 8, !dbg !5044\n  %819 = load double, double* %\"'de135\", align 8, !dbg !5060\n  store double 0.000000e+00, double* %\"'de135\", align 8, !dbg !5060\n  %820 = load double, double* %\"'de137\", align 8, !dbg !5060\n  %821 = fadd fast double %820, %819, !dbg !5060\n  store double %821, double* %\"'de137\", align 8, !dbg !5060\n  %822 = fneg fast double %819, !dbg !5060\n  %823 = load double, double* %\"'de138\", align 8, !dbg !5060\n  %824 = fadd fast double %823, %822, !dbg !5060\n  store double %824, double* %\"'de138\", align 8, !dbg !5060\n  %825 = load double, double* %\"'de136\", align 8, !dbg !5060\n  store double 0.000000e+00, double* %\"'de136\", align 8, !dbg !5060\n  %826 = load double, double* %\"'de139\", align 8, !dbg !5060\n  %827 = fadd fast double %826, %825, !dbg !5060\n  store double %827, double* %\"'de139\", align 8, !dbg !5060\n  %828 = fneg fast double %825, !dbg !5060\n  %829 = load double, double* %\"'de140\", align 8, !dbg !5060\n  %830 = fadd fast double %829, %828, !dbg !5060\n  store double %830, double* %\"'de140\", align 8, !dbg !5060\n  %831 = load double, double* %\"'de138\", align 8, !dbg !5059\n  store double 0.000000e+00, double* %\"'de138\", align 8, !dbg !5059\n  %832 = load double, double* %\"'de141\", align 8, !dbg !5059\n  %833 = fadd fast double %832, %831, !dbg !5059\n  store double %833, double* %\"'de141\", align 8, !dbg !5059\n  %834 = load double, double* %\"'de142\", align 8, !dbg !5059\n  %835 = fadd fast double %834, %831, !dbg !5059\n  store double %835, double* %\"'de142\", align 8, !dbg !5059\n  %836 = load double, double* %\"'de142\", align 8, !dbg !5055\n  store double 0.000000e+00, double* %\"'de142\", align 8, !dbg !5055\n  %837 = fmul fast double %836, %182, !dbg !5055\n  %838 = load double, double* %\"'de143\", align 8, !dbg !5055\n  %839 = fadd fast double %838, %837, !dbg !5055\n  store double %839, double* %\"'de143\", align 8, !dbg !5055\n  %840 = fmul fast double %836, %166, !dbg !5055\n  %841 = load double, double* %\"'de144\", align 8, !dbg !5055\n  %842 = fadd fast double %841, %840, !dbg !5055\n  store double %842, double* %\"'de144\", align 8, !dbg !5055\n  %843 = load double, double* %\"'de141\", align 8, !dbg !5055\n  store double 0.000000e+00, double* %\"'de141\", align 8, !dbg !5055\n  %844 = fmul fast double %843, %179, !dbg !5055\n  %845 = load double, double* %\"'de145\", align 8, !dbg !5055\n  %846 = fadd fast double %845, %844, !dbg !5055\n  store double %846, double* %\"'de145\", align 8, !dbg !5055\n  %847 = fmul fast double %843, %167, !dbg !5055\n  %848 = load double, double* %\"'de146\", align 8, !dbg !5055\n  %849 = fadd fast double %848, %847, !dbg !5055\n  store double %849, double* %\"'de146\", align 8, !dbg !5055\n  %850 = load double, double* %\"'de140\", align 8, !dbg !5058\n  store double 0.000000e+00, double* %\"'de140\", align 8, !dbg !5058\n  %851 = load double, double* %\"'de147\", align 8, !dbg !5058\n  %852 = fadd fast double %851, %850, !dbg !5058\n  store double %852, double* %\"'de147\", align 8, !dbg !5058\n  %853 = fneg fast double %850, !dbg !5058\n  %854 = load double, double* %\"'de148\", align 8, !dbg !5058\n  %855 = fadd fast double %854, %853, !dbg !5058\n  store double %855, double* %\"'de148\", align 8, !dbg !5058\n  %856 = load double, double* %\"'de148\", align 8, !dbg !5055\n  store double 0.000000e+00, double* %\"'de148\", align 8, !dbg !5055\n  %857 = fmul fast double %856, %182, !dbg !5055\n  %858 = load double, double* %\"'de145\", align 8, !dbg !5055\n  %859 = fadd fast double %858, %857, !dbg !5055\n  store double %859, double* %\"'de145\", align 8, !dbg !5055\n  %860 = fmul fast double %856, %167, !dbg !5055\n  %861 = load double, double* %\"'de144\", align 8, !dbg !5055\n  %862 = fadd fast double %861, %860, !dbg !5055\n  store double %862, double* %\"'de144\", align 8, !dbg !5055\n  %863 = load double, double* %\"'de147\", align 8, !dbg !5055\n  store double 0.000000e+00, double* %\"'de147\", align 8, !dbg !5055\n  %864 = fmul fast double %863, %179, !dbg !5055\n  %865 = load double, double* %\"'de143\", align 8, !dbg !5055\n  %866 = fadd fast double %865, %864, !dbg !5055\n  store double %866, double* %\"'de143\", align 8, !dbg !5055\n  %867 = fmul fast double %863, %166, !dbg !5055\n  %868 = load double, double* %\"'de146\", align 8, !dbg !5055\n  %869 = fadd fast double %868, %867, !dbg !5055\n  store double %869, double* %\"'de146\", align 8, !dbg !5055\n  %870 = load double, double* %\"'de144\", align 8, !dbg !5054\n  store double 0.000000e+00, double* %\"'de144\", align 8, !dbg !5054\n  %871 = load double, double* %\"'de149\", align 8, !dbg !5054\n  %872 = fadd fast double %871, %870, !dbg !5054\n  store double %872, double* %\"'de149\", align 8, !dbg !5054\n  %873 = load double, double* %\"'de150\", align 8, !dbg !5054\n  %874 = fadd fast double %873, %870, !dbg !5054\n  store double %874, double* %\"'de150\", align 8, !dbg !5054\n  %875 = load double, double* %\"'de150\", align 8, !dbg !5051\n  store double 0.000000e+00, double* %\"'de150\", align 8, !dbg !5051\n  %876 = fmul fast double %875, %176, !dbg !5051\n  %877 = load double, double* %\"'de143\", align 8, !dbg !5051\n  %878 = fadd fast double %877, %876, !dbg !5051\n  store double %878, double* %\"'de143\", align 8, !dbg !5051\n  %879 = fmul fast double %875, %166, !dbg !5051\n  %880 = load double, double* %\"'de151\", align 8, !dbg !5051\n  %881 = fadd fast double %880, %879, !dbg !5051\n  store double %881, double* %\"'de151\", align 8, !dbg !5051\n  %882 = load double, double* %\"'de149\", align 8, !dbg !5051\n  store double 0.000000e+00, double* %\"'de149\", align 8, !dbg !5051\n  %883 = fmul fast double %882, %175, !dbg !5051\n  %884 = load double, double* %\"'de145\", align 8, !dbg !5051\n  %885 = fadd fast double %884, %883, !dbg !5051\n  store double %885, double* %\"'de145\", align 8, !dbg !5051\n  %886 = fmul fast double %882, %167, !dbg !5051\n  %887 = load double, double* %\"'de152\", align 8, !dbg !5051\n  %888 = fadd fast double %887, %886, !dbg !5051\n  store double %888, double* %\"'de152\", align 8, !dbg !5051\n  %889 = load double, double* %\"'de146\", align 8, !dbg !5053\n  store double 0.000000e+00, double* %\"'de146\", align 8, !dbg !5053\n  %890 = load double, double* %\"'de153\", align 8, !dbg !5053\n  %891 = fadd fast double %890, %889, !dbg !5053\n  store double %891, double* %\"'de153\", align 8, !dbg !5053\n  %892 = fneg fast double %889, !dbg !5053\n  %893 = load double, double* %\"'de154\", align 8, !dbg !5053\n  %894 = fadd fast double %893, %892, !dbg !5053\n  store double %894, double* %\"'de154\", align 8, !dbg !5053\n  %895 = load double, double* %\"'de154\", align 8, !dbg !5051\n  store double 0.000000e+00, double* %\"'de154\", align 8, !dbg !5051\n  %896 = fmul fast double %895, %176, !dbg !5051\n  %897 = load double, double* %\"'de145\", align 8, !dbg !5051\n  %898 = fadd fast double %897, %896, !dbg !5051\n  store double %898, double* %\"'de145\", align 8, !dbg !5051\n  %899 = fmul fast double %895, %167, !dbg !5051\n  %900 = load double, double* %\"'de151\", align 8, !dbg !5051\n  %901 = fadd fast double %900, %899, !dbg !5051\n  store double %901, double* %\"'de151\", align 8, !dbg !5051\n  %902 = load double, double* %\"'de153\", align 8, !dbg !5051\n  store double 0.000000e+00, double* %\"'de153\", align 8, !dbg !5051\n  %903 = fmul fast double %902, %175, !dbg !5051\n  %904 = load double, double* %\"'de143\", align 8, !dbg !5051\n  %905 = fadd fast double %904, %903, !dbg !5051\n  store double %905, double* %\"'de143\", align 8, !dbg !5051\n  %906 = fmul fast double %902, %166, !dbg !5051\n  %907 = load double, double* %\"'de152\", align 8, !dbg !5051\n  %908 = fadd fast double %907, %906, !dbg !5051\n  store double %908, double* %\"'de152\", align 8, !dbg !5051\n  %909 = load double, double* %\"'de151\", align 8, !dbg !5047\n  store double 0.000000e+00, double* %\"'de151\", align 8, !dbg !5047\n  %910 = fmul fast double %909, 4.000000e+00, !dbg !5047\n  %911 = load double, double* %\"'de145\", align 8, !dbg !5047\n  %912 = fadd fast double %911, %910, !dbg !5047\n  store double %912, double* %\"'de145\", align 8, !dbg !5047\n  %913 = load double, double* %\"'de152\", align 8, !dbg !5047\n  store double 0.000000e+00, double* %\"'de152\", align 8, !dbg !5047\n  %914 = fmul fast double %913, 4.000000e+00, !dbg !5047\n  %915 = load double, double* %\"'de143\", align 8, !dbg !5047\n  %916 = fadd fast double %915, %914, !dbg !5047\n  store double %916, double* %\"'de143\", align 8, !dbg !5047\n  %917 = load double, double* %\"'de137\", align 8, !dbg !5046\n  store double 0.000000e+00, double* %\"'de137\", align 8, !dbg !5046\n  %918 = load double, double* %\"'de155\", align 8, !dbg !5046\n  %919 = fadd fast double %918, %917, !dbg !5046\n  store double %919, double* %\"'de155\", align 8, !dbg !5046\n  %920 = load double, double* %\"'de155\", align 8, !dbg !5046\n  %921 = fadd fast double %920, %917, !dbg !5046\n  store double %921, double* %\"'de155\", align 8, !dbg !5046\n  %922 = load double, double* %\"'de155\", align 8, !dbg !5042\n  store double 0.000000e+00, double* %\"'de155\", align 8, !dbg !5042\n  %923 = fmul fast double %922, %163, !dbg !5042\n  %924 = load double, double* %\"'de29\", align 8, !dbg !5042\n  %925 = fadd fast double %924, %923, !dbg !5042\n  store double %925, double* %\"'de29\", align 8, !dbg !5042\n  %926 = fmul fast double %922, %162, !dbg !5042\n  %927 = load double, double* %\"'de28\", align 8, !dbg !5042\n  %928 = fadd fast double %927, %926, !dbg !5042\n  store double %928, double* %\"'de28\", align 8, !dbg !5042\n  %929 = load double, double* %\"'de139\", align 8, !dbg !5045\n  store double 0.000000e+00, double* %\"'de139\", align 8, !dbg !5045\n  %930 = load double, double* %\"'de156\", align 8, !dbg !5045\n  %931 = fadd fast double %930, %929, !dbg !5045\n  store double %931, double* %\"'de156\", align 8, !dbg !5045\n  %932 = fneg fast double %929, !dbg !5045\n  %933 = load double, double* %\"'de157\", align 8, !dbg !5045\n  %934 = fadd fast double %933, %932, !dbg !5045\n  store double %934, double* %\"'de157\", align 8, !dbg !5045\n  %935 = load double, double* %\"'de157\", align 8, !dbg !5042\n  store double 0.000000e+00, double* %\"'de157\", align 8, !dbg !5042\n  %936 = fmul fast double %935, %163, !dbg !5042\n  %937 = load double, double* %\"'de28\", align 8, !dbg !5042\n  %938 = fadd fast double %937, %936, !dbg !5042\n  store double %938, double* %\"'de28\", align 8, !dbg !5042\n  %939 = fmul fast double %935, %163, !dbg !5042\n  %940 = load double, double* %\"'de28\", align 8, !dbg !5042\n  %941 = fadd fast double %940, %939, !dbg !5042\n  store double %941, double* %\"'de28\", align 8, !dbg !5042\n  %942 = load double, double* %\"'de156\", align 8, !dbg !5042\n  store double 0.000000e+00, double* %\"'de156\", align 8, !dbg !5042\n  %943 = fmul fast double %942, %162, !dbg !5042\n  %944 = load double, double* %\"'de29\", align 8, !dbg !5042\n  %945 = fadd fast double %944, %943, !dbg !5042\n  store double %945, double* %\"'de29\", align 8, !dbg !5042\n  %946 = fmul fast double %942, %162, !dbg !5042\n  %947 = load double, double* %\"'de29\", align 8, !dbg !5042\n  %948 = fadd fast double %947, %946, !dbg !5042\n  store double %948, double* %\"'de29\", align 8, !dbg !5042\n  %949 = load double, double* %\"'ipg158\", align 8, !dbg !5036, !tbaa !1201, !alias.scope !5081, !noalias !5082\n  store double 0.000000e+00, double* %\"'ipg158\", align 8, !dbg !5036, !tbaa !1201, !alias.scope !5081, !noalias !5082\n  %950 = load double, double* %\"'de145\", align 8, !dbg !5036\n  %951 = fadd fast double %950, %949, !dbg !5036\n  store double %951, double* %\"'de145\", align 8, !dbg !5036\n  %952 = load double, double* %\"'ipg159\", align 8, !dbg !5036, !tbaa !1201, !alias.scope !5081, !noalias !5082\n  store double 0.000000e+00, double* %\"'ipg159\", align 8, !dbg !5036, !tbaa !1201, !alias.scope !5081, !noalias !5082\n  %953 = load double, double* %\"'de143\", align 8, !dbg !5036\n  %954 = fadd fast double %953, %952, !dbg !5036\n  store double %954, double* %\"'de143\", align 8, !dbg !5036\n  %955 = load double, double* %\"'de145\", align 8, !dbg !5034\n  store double 0.000000e+00, double* %\"'de145\", align 8, !dbg !5034\n  %956 = load double, double* %\"'de160\", align 8, !dbg !5034\n  %957 = fadd fast double %956, %955, !dbg !5034\n  store double %957, double* %\"'de160\", align 8, !dbg !5034\n  %958 = fneg fast double %955, !dbg !5034\n  %959 = load double, double* %\"'de161\", align 8, !dbg !5034\n  %960 = fadd fast double %959, %958, !dbg !5034\n  store double %960, double* %\"'de161\", align 8, !dbg !5034\n  %961 = load double, double* %\"'de143\", align 8, !dbg !5034\n  store double 0.000000e+00, double* %\"'de143\", align 8, !dbg !5034\n  %962 = load double, double* %\"'de162\", align 8, !dbg !5034\n  %963 = fadd fast double %962, %961, !dbg !5034\n  store double %963, double* %\"'de162\", align 8, !dbg !5034\n  %964 = fneg fast double %961, !dbg !5034\n  %965 = load double, double* %\"'de163\", align 8, !dbg !5034\n  %966 = fadd fast double %965, %964, !dbg !5034\n  store double %966, double* %\"'de163\", align 8, !dbg !5034\n  %967 = load double, double* %\"'de161\", align 8, !dbg !5030\n  store double 0.000000e+00, double* %\"'de161\", align 8, !dbg !5030\n  %968 = fmul fast double %967, 3.000000e+00, !dbg !5030\n  %969 = load double, double* %\"'de164\", align 8, !dbg !5030\n  %970 = fadd fast double %969, %968, !dbg !5030\n  store double %970, double* %\"'de164\", align 8, !dbg !5030\n  %971 = load double, double* %\"'de163\", align 8, !dbg !5030\n  store double 0.000000e+00, double* %\"'de163\", align 8, !dbg !5030\n  %972 = fmul fast double %971, 3.000000e+00, !dbg !5030\n  %973 = load double, double* %\"'de165\", align 8, !dbg !5030\n  %974 = fadd fast double %973, %972, !dbg !5030\n  store double %974, double* %\"'de165\", align 8, !dbg !5030\n  %975 = load double, double* %\"'de28\", align 8, !dbg !5028\n  store double 0.000000e+00, double* %\"'de28\", align 8, !dbg !5028\n  %976 = load double, double* %\"'de166\", align 8, !dbg !5028\n  %977 = fadd fast double %976, %975, !dbg !5028\n  store double %977, double* %\"'de166\", align 8, !dbg !5028\n  %978 = load double, double* %\"'de167\", align 8, !dbg !5028\n  %979 = fadd fast double %978, %975, !dbg !5028\n  store double %979, double* %\"'de167\", align 8, !dbg !5028\n  %980 = load double, double* %\"'de29\", align 8, !dbg !5028\n  store double 0.000000e+00, double* %\"'de29\", align 8, !dbg !5028\n  %981 = load double, double* %\"'de168\", align 8, !dbg !5028\n  %982 = fadd fast double %981, %980, !dbg !5028\n  store double %982, double* %\"'de168\", align 8, !dbg !5028\n  %983 = load double, double* %\"'de169\", align 8, !dbg !5028\n  %984 = fadd fast double %983, %980, !dbg !5028\n  store double %984, double* %\"'de169\", align 8, !dbg !5028\n  %985 = load double, double* %\"'de167\", align 8, !dbg !5025\n  store double 0.000000e+00, double* %\"'de167\", align 8, !dbg !5025\n  %986 = fmul fast double %985, 2.700000e+01, !dbg !5025\n  %987 = load double, double* %\"'de170\", align 8, !dbg !5025\n  %988 = fadd fast double %987, %986, !dbg !5025\n  store double %988, double* %\"'de170\", align 8, !dbg !5025\n  %989 = load double, double* %\"'de169\", align 8, !dbg !5025\n  store double 0.000000e+00, double* %\"'de169\", align 8, !dbg !5025\n  %990 = fmul fast double %989, 2.700000e+01, !dbg !5025\n  %991 = load double, double* %\"'de171\", align 8, !dbg !5025\n  %992 = fadd fast double %991, %990, !dbg !5025\n  store double %992, double* %\"'de171\", align 8, !dbg !5025\n  %993 = load double, double* %\"'de166\", align 8, !dbg !5023\n  store double 0.000000e+00, double* %\"'de166\", align 8, !dbg !5023\n  %994 = load double, double* %\"'de172\", align 8, !dbg !5023\n  %995 = fadd fast double %994, %993, !dbg !5023\n  store double %995, double* %\"'de172\", align 8, !dbg !5023\n  %996 = fneg fast double %993, !dbg !5023\n  %997 = load double, double* %\"'de173\", align 8, !dbg !5023\n  %998 = fadd fast double %997, %996, !dbg !5023\n  store double %998, double* %\"'de173\", align 8, !dbg !5023\n  %999 = load double, double* %\"'de168\", align 8, !dbg !5023\n  store double 0.000000e+00, double* %\"'de168\", align 8, !dbg !5023\n  %1000 = load double, double* %\"'de174\", align 8, !dbg !5023\n  %1001 = fadd fast double %1000, %999, !dbg !5023\n  store double %1001, double* %\"'de174\", align 8, !dbg !5023\n  %1002 = fneg fast double %999, !dbg !5023\n  %1003 = load double, double* %\"'de175\", align 8, !dbg !5023\n  %1004 = fadd fast double %1003, %1002, !dbg !5023\n  store double %1004, double* %\"'de175\", align 8, !dbg !5023\n  %1005 = load double, double* %\"'de173\", align 8, !dbg !5022\n  store double 0.000000e+00, double* %\"'de173\", align 8, !dbg !5022\n  %1006 = load double, double* %\"'de176\", align 8, !dbg !5022\n  %1007 = fadd fast double %1006, %1005, !dbg !5022\n  store double %1007, double* %\"'de176\", align 8, !dbg !5022\n  %1008 = load double, double* %\"'de177\", align 8, !dbg !5022\n  %1009 = fadd fast double %1008, %1005, !dbg !5022\n  store double %1009, double* %\"'de177\", align 8, !dbg !5022\n  %1010 = load double, double* %\"'de177\", align 8, !dbg !5019\n  store double 0.000000e+00, double* %\"'de177\", align 8, !dbg !5019\n  %1011 = fmul fast double %1010, %129, !dbg !5019\n  %1012 = load double, double* %\"'de178\", align 8, !dbg !5019\n  %1013 = fadd fast double %1012, %1011, !dbg !5019\n  store double %1013, double* %\"'de178\", align 8, !dbg !5019\n  %1014 = fmul fast double %1010, %151, !dbg !5019\n  %1015 = load double, double* %\"'de165\", align 8, !dbg !5019\n  %1016 = fadd fast double %1015, %1014, !dbg !5019\n  store double %1016, double* %\"'de165\", align 8, !dbg !5019\n  %1017 = load double, double* %\"'de176\", align 8, !dbg !5019\n  store double 0.000000e+00, double* %\"'de176\", align 8, !dbg !5019\n  %1018 = fmul fast double %1017, %126, !dbg !5019\n  %1019 = load double, double* %\"'de179\", align 8, !dbg !5019\n  %1020 = fadd fast double %1019, %1018, !dbg !5019\n  store double %1020, double* %\"'de179\", align 8, !dbg !5019\n  %1021 = fmul fast double %1017, %150, !dbg !5019\n  %1022 = load double, double* %\"'de164\", align 8, !dbg !5019\n  %1023 = fadd fast double %1022, %1021, !dbg !5019\n  store double %1023, double* %\"'de164\", align 8, !dbg !5019\n  %1024 = load double, double* %\"'de175\", align 8, !dbg !5021\n  store double 0.000000e+00, double* %\"'de175\", align 8, !dbg !5021\n  %1025 = load double, double* %\"'de180\", align 8, !dbg !5021\n  %1026 = fadd fast double %1025, %1024, !dbg !5021\n  store double %1026, double* %\"'de180\", align 8, !dbg !5021\n  %1027 = fneg fast double %1024, !dbg !5021\n  %1028 = load double, double* %\"'de181\", align 8, !dbg !5021\n  %1029 = fadd fast double %1028, %1027, !dbg !5021\n  store double %1029, double* %\"'de181\", align 8, !dbg !5021\n  %1030 = load double, double* %\"'de181\", align 8, !dbg !5019\n  store double 0.000000e+00, double* %\"'de181\", align 8, !dbg !5019\n  %1031 = fmul fast double %1030, %126, !dbg !5019\n  %1032 = load double, double* %\"'de178\", align 8, !dbg !5019\n  %1033 = fadd fast double %1032, %1031, !dbg !5019\n  store double %1033, double* %\"'de178\", align 8, !dbg !5019\n  %1034 = fmul fast double %1030, %151, !dbg !5019\n  %1035 = load double, double* %\"'de164\", align 8, !dbg !5019\n  %1036 = fadd fast double %1035, %1034, !dbg !5019\n  store double %1036, double* %\"'de164\", align 8, !dbg !5019\n  %1037 = load double, double* %\"'de180\", align 8, !dbg !5019\n  store double 0.000000e+00, double* %\"'de180\", align 8, !dbg !5019\n  %1038 = fmul fast double %1037, %129, !dbg !5019\n  %1039 = load double, double* %\"'de179\", align 8, !dbg !5019\n  %1040 = fadd fast double %1039, %1038, !dbg !5019\n  store double %1040, double* %\"'de179\", align 8, !dbg !5019\n  %1041 = fmul fast double %1037, %150, !dbg !5019\n  %1042 = load double, double* %\"'de165\", align 8, !dbg !5019\n  %1043 = fadd fast double %1042, %1041, !dbg !5019\n  store double %1043, double* %\"'de165\", align 8, !dbg !5019\n  %1044 = load double, double* %\"'de178\", align 8, !dbg !5014\n  store double 0.000000e+00, double* %\"'de178\", align 8, !dbg !5014\n  %1045 = fmul fast double %1044, 9.000000e+00, !dbg !5014\n  %1046 = load double, double* %\"'de182\", align 8, !dbg !5014\n  %1047 = fadd fast double %1046, %1045, !dbg !5014\n  store double %1047, double* %\"'de182\", align 8, !dbg !5014\n  %1048 = load double, double* %\"'de179\", align 8, !dbg !5014\n  store double 0.000000e+00, double* %\"'de179\", align 8, !dbg !5014\n  %1049 = fmul fast double %1048, 9.000000e+00, !dbg !5014\n  %1050 = load double, double* %\"'de97\", align 8, !dbg !5014\n  %1051 = fadd fast double %1050, %1049, !dbg !5014\n  store double %1051, double* %\"'de97\", align 8, !dbg !5014\n  %1052 = load double, double* %\"'de172\", align 8, !dbg !5022\n  store double 0.000000e+00, double* %\"'de172\", align 8, !dbg !5022\n  %1053 = load double, double* %\"'de183\", align 8, !dbg !5022\n  %1054 = fadd fast double %1053, %1052, !dbg !5022\n  store double %1054, double* %\"'de183\", align 8, !dbg !5022\n  %1055 = load double, double* %\"'de184\", align 8, !dbg !5022\n  %1056 = fadd fast double %1055, %1052, !dbg !5022\n  store double %1056, double* %\"'de184\", align 8, !dbg !5022\n  %1057 = load double, double* %\"'de184\", align 8, !dbg !5019\n  store double 0.000000e+00, double* %\"'de184\", align 8, !dbg !5019\n  %1058 = fmul fast double %1057, %139, !dbg !5019\n  %1059 = load double, double* %\"'de185\", align 8, !dbg !5019\n  %1060 = fadd fast double %1059, %1058, !dbg !5019\n  store double %1060, double* %\"'de185\", align 8, !dbg !5019\n  %1061 = fmul fast double %1057, %143, !dbg !5019\n  %1062 = load double, double* %\"'de162\", align 8, !dbg !5019\n  %1063 = fadd fast double %1062, %1061, !dbg !5019\n  store double %1063, double* %\"'de162\", align 8, !dbg !5019\n  %1064 = load double, double* %\"'de183\", align 8, !dbg !5019\n  store double 0.000000e+00, double* %\"'de183\", align 8, !dbg !5019\n  %1065 = fmul fast double %1064, %141, !dbg !5019\n  %1066 = load double, double* %\"'de186\", align 8, !dbg !5019\n  %1067 = fadd fast double %1066, %1065, !dbg !5019\n  store double %1067, double* %\"'de186\", align 8, !dbg !5019\n  %1068 = fmul fast double %1064, %142, !dbg !5019\n  %1069 = load double, double* %\"'de160\", align 8, !dbg !5019\n  %1070 = fadd fast double %1069, %1068, !dbg !5019\n  store double %1070, double* %\"'de160\", align 8, !dbg !5019\n  %1071 = load double, double* %\"'de174\", align 8, !dbg !5021\n  store double 0.000000e+00, double* %\"'de174\", align 8, !dbg !5021\n  %1072 = load double, double* %\"'de187\", align 8, !dbg !5021\n  %1073 = fadd fast double %1072, %1071, !dbg !5021\n  store double %1073, double* %\"'de187\", align 8, !dbg !5021\n  %1074 = fneg fast double %1071, !dbg !5021\n  %1075 = load double, double* %\"'de188\", align 8, !dbg !5021\n  %1076 = fadd fast double %1075, %1074, !dbg !5021\n  store double %1076, double* %\"'de188\", align 8, !dbg !5021\n  %1077 = load double, double* %\"'de188\", align 8, !dbg !5019\n  store double 0.000000e+00, double* %\"'de188\", align 8, !dbg !5019\n  %1078 = fmul fast double %1077, %141, !dbg !5019\n  %1079 = load double, double* %\"'de185\", align 8, !dbg !5019\n  %1080 = fadd fast double %1079, %1078, !dbg !5019\n  store double %1080, double* %\"'de185\", align 8, !dbg !5019\n  %1081 = fmul fast double %1077, %143, !dbg !5019\n  %1082 = load double, double* %\"'de160\", align 8, !dbg !5019\n  %1083 = fadd fast double %1082, %1081, !dbg !5019\n  store double %1083, double* %\"'de160\", align 8, !dbg !5019\n  %1084 = load double, double* %\"'de187\", align 8, !dbg !5019\n  store double 0.000000e+00, double* %\"'de187\", align 8, !dbg !5019\n  %1085 = fmul fast double %1084, %139, !dbg !5019\n  %1086 = load double, double* %\"'de186\", align 8, !dbg !5019\n  %1087 = fadd fast double %1086, %1085, !dbg !5019\n  store double %1087, double* %\"'de186\", align 8, !dbg !5019\n  %1088 = fmul fast double %1084, %142, !dbg !5019\n  %1089 = load double, double* %\"'de162\", align 8, !dbg !5019\n  %1090 = fadd fast double %1089, %1088, !dbg !5019\n  store double %1090, double* %\"'de162\", align 8, !dbg !5019\n  %1091 = load double, double* %\"'de185\", align 8, !dbg !5014\n  store double 0.000000e+00, double* %\"'de185\", align 8, !dbg !5014\n  %1092 = fmul fast double %1091, 2.000000e+00, !dbg !5014\n  %1093 = load double, double* %\"'de182\", align 8, !dbg !5014\n  %1094 = fadd fast double %1093, %1092, !dbg !5014\n  store double %1094, double* %\"'de182\", align 8, !dbg !5014\n  %1095 = load double, double* %\"'de186\", align 8, !dbg !5014\n  store double 0.000000e+00, double* %\"'de186\", align 8, !dbg !5014\n  %1096 = fmul fast double %1095, 2.000000e+00, !dbg !5014\n  %1097 = load double, double* %\"'de97\", align 8, !dbg !5014\n  %1098 = fadd fast double %1097, %1096, !dbg !5014\n  store double %1098, double* %\"'de97\", align 8, !dbg !5014\n  %1099 = load double, double* %\"'de160\", align 8, !dbg !5013\n  store double 0.000000e+00, double* %\"'de160\", align 8, !dbg !5013\n  %1100 = load double, double* %\"'de189\", align 8, !dbg !5013\n  %1101 = fadd fast double %1100, %1099, !dbg !5013\n  store double %1101, double* %\"'de189\", align 8, !dbg !5013\n  %1102 = load double, double* %\"'de189\", align 8, !dbg !5013\n  %1103 = fadd fast double %1102, %1099, !dbg !5013\n  store double %1103, double* %\"'de189\", align 8, !dbg !5013\n  %1104 = load double, double* %\"'de189\", align 8, !dbg !5009\n  store double 0.000000e+00, double* %\"'de189\", align 8, !dbg !5009\n  %1105 = fmul fast double %1104, %123, !dbg !5009\n  %1106 = load double, double* %\"'de97\", align 8, !dbg !5009\n  %1107 = fadd fast double %1106, %1105, !dbg !5009\n  store double %1107, double* %\"'de97\", align 8, !dbg !5009\n  %1108 = fmul fast double %1104, %120, !dbg !5009\n  %1109 = load double, double* %\"'de182\", align 8, !dbg !5009\n  %1110 = fadd fast double %1109, %1108, !dbg !5009\n  store double %1110, double* %\"'de182\", align 8, !dbg !5009\n  %1111 = load double, double* %\"'de162\", align 8, !dbg !5012\n  store double 0.000000e+00, double* %\"'de162\", align 8, !dbg !5012\n  %1112 = load double, double* %\"'de190\", align 8, !dbg !5012\n  %1113 = fadd fast double %1112, %1111, !dbg !5012\n  store double %1113, double* %\"'de190\", align 8, !dbg !5012\n  %1114 = fneg fast double %1111, !dbg !5012\n  %1115 = load double, double* %\"'de191\", align 8, !dbg !5012\n  %1116 = fadd fast double %1115, %1114, !dbg !5012\n  store double %1116, double* %\"'de191\", align 8, !dbg !5012\n  %1117 = load double, double* %\"'de191\", align 8, !dbg !5009\n  store double 0.000000e+00, double* %\"'de191\", align 8, !dbg !5009\n  %1118 = fmul fast double %1117, %123, !dbg !5009\n  %1119 = load double, double* %\"'de182\", align 8, !dbg !5009\n  %1120 = fadd fast double %1119, %1118, !dbg !5009\n  store double %1120, double* %\"'de182\", align 8, !dbg !5009\n  %1121 = fmul fast double %1117, %123, !dbg !5009\n  %1122 = load double, double* %\"'de182\", align 8, !dbg !5009\n  %1123 = fadd fast double %1122, %1121, !dbg !5009\n  store double %1123, double* %\"'de182\", align 8, !dbg !5009\n  %1124 = load double, double* %\"'de190\", align 8, !dbg !5009\n  store double 0.000000e+00, double* %\"'de190\", align 8, !dbg !5009\n  %1125 = fmul fast double %1124, %120, !dbg !5009\n  %1126 = load double, double* %\"'de97\", align 8, !dbg !5009\n  %1127 = fadd fast double %1126, %1125, !dbg !5009\n  store double %1127, double* %\"'de97\", align 8, !dbg !5009\n  %1128 = fmul fast double %1124, %120, !dbg !5009\n  %1129 = load double, double* %\"'de97\", align 8, !dbg !5009\n  %1130 = fadd fast double %1129, %1128, !dbg !5009\n  store double %1130, double* %\"'de97\", align 8, !dbg !5009\n  %1131 = load double, double* %\"'de170\", align 8, !dbg !5008\n  store double 0.000000e+00, double* %\"'de170\", align 8, !dbg !5008\n  %1132 = load double, double* %\"'de192\", align 8, !dbg !5008\n  %1133 = fadd fast double %1132, %1131, !dbg !5008\n  store double %1133, double* %\"'de192\", align 8, !dbg !5008\n  %1134 = fneg fast double %1131, !dbg !5008\n  %1135 = load double, double* %\"'de193\", align 8, !dbg !5008\n  %1136 = fadd fast double %1135, %1134, !dbg !5008\n  store double %1136, double* %\"'de193\", align 8, !dbg !5008\n  %1137 = load double, double* %\"'de193\", align 8, !dbg !5008\n  store double 0.000000e+00, double* %\"'de193\", align 8, !dbg !5008\n  %1138 = fmul fast double %1137, %arrayref37.sroa.0.0.copyload, !dbg !5008\n  %1139 = load double, double* %\".fca.1.extract251'de\", align 8, !dbg !5008\n  %1140 = fadd fast double %1139, %1138, !dbg !5008\n  store double %1140, double* %\".fca.1.extract251'de\", align 8, !dbg !5008\n  %1141 = fmul fast double %1137, %.fca.1.extract251, !dbg !5008\n  %1142 = load double, double* %\"arrayref37.sroa.0.0.copyload'de\", align 8, !dbg !5008\n  %1143 = fadd fast double %1142, %1141, !dbg !5008\n  store double %1143, double* %\"arrayref37.sroa.0.0.copyload'de\", align 8, !dbg !5008\n  %1144 = load double, double* %\"'de192\", align 8, !dbg !5007\n  store double 0.000000e+00, double* %\"'de192\", align 8, !dbg !5007\n  %1145 = fmul fast double %1144, %130, !dbg !5007\n  %1146 = load double, double* %\".fca.0.extract250'de\", align 8, !dbg !5007\n  %1147 = fadd fast double %1146, %1145, !dbg !5007\n  store double %1147, double* %\".fca.0.extract250'de\", align 8, !dbg !5007\n  %1148 = fmul fast double %1144, %.fca.0.extract250, !dbg !5007\n  %1149 = load double, double* %\"'de194\", align 8, !dbg !5007\n  %1150 = fadd fast double %1149, %1148, !dbg !5007\n  store double %1150, double* %\"'de194\", align 8, !dbg !5007\n  %1151 = load double, double* %\"'de171\", align 8, !dbg !5005\n  store double 0.000000e+00, double* %\"'de171\", align 8, !dbg !5005\n  %1152 = load double, double* %\"'de195\", align 8, !dbg !5005\n  %1153 = fadd fast double %1152, %1151, !dbg !5005\n  store double %1153, double* %\"'de195\", align 8, !dbg !5005\n  %1154 = fneg fast double %1151, !dbg !5005\n  %1155 = load double, double* %\"'de196\", align 8, !dbg !5005\n  %1156 = fadd fast double %1155, %1154, !dbg !5005\n  store double %1156, double* %\"'de196\", align 8, !dbg !5005\n  %1157 = load double, double* %\"'de196\", align 8, !dbg !5005\n  store double 0.000000e+00, double* %\"'de196\", align 8, !dbg !5005\n  %1158 = fmul fast double %1157, %arrayref37.sroa.0.0.copyload, !dbg !5005\n  %1159 = load double, double* %\".fca.0.extract250'de\", align 8, !dbg !5005\n  %1160 = fadd fast double %1159, %1158, !dbg !5005\n  store double %1160, double* %\".fca.0.extract250'de\", align 8, !dbg !5005\n  %1161 = fmul fast double %1157, %.fca.0.extract250, !dbg !5005\n  %1162 = load double, double* %\"arrayref37.sroa.0.0.copyload'de\", align 8, !dbg !5005\n  %1163 = fadd fast double %1162, %1161, !dbg !5005\n  store double %1163, double* %\"arrayref37.sroa.0.0.copyload'de\", align 8, !dbg !5005\n  %1164 = load double, double* %\"'de195\", align 8, !dbg !5005\n  store double 0.000000e+00, double* %\"'de195\", align 8, !dbg !5005\n  %1165 = fmul fast double %1164, %arrayref37.sroa.2.0.copyload, !dbg !5005\n  %1166 = load double, double* %\".fca.1.extract251'de\", align 8, !dbg !5005\n  %1167 = fadd fast double %1166, %1165, !dbg !5005\n  store double %1167, double* %\".fca.1.extract251'de\", align 8, !dbg !5005\n  %1168 = fmul fast double %1164, %.fca.1.extract251, !dbg !5005\n  %1169 = load double, double* %\"arrayref37.sroa.2.0.copyload'de\", align 8, !dbg !5005\n  %1170 = fadd fast double %1169, %1168, !dbg !5005\n  store double %1170, double* %\"arrayref37.sroa.2.0.copyload'de\", align 8, !dbg !5005\n  %1171 = load double, double* %\"'de194\", align 8, !dbg !5003\n  store double 0.000000e+00, double* %\"'de194\", align 8, !dbg !5003\n  %1172 = fneg fast double %1171, !dbg !5003\n  %1173 = load double, double* %\"arrayref37.sroa.2.0.copyload'de\", align 8, !dbg !5003\n  %1174 = fadd fast double %1173, %1172, !dbg !5003\n  store double %1174, double* %\"arrayref37.sroa.2.0.copyload'de\", align 8, !dbg !5003\n  %1175 = load double, double* %\"arrayref37.sroa.2.0.copyload'de\", align 8, !dbg !5001\n  store double 0.000000e+00, double* %\"arrayref37.sroa.2.0.copyload'de\", align 8, !dbg !5001\n  %1176 = icmp ne double addrspace(13)* %arrayref37.sroa.2.0..sroa_idx247, %\"arrayref37.sroa.2.0..sroa_idx247'ipg\", !dbg !5001\n  br i1 %1176, label %invertidxend_active, label %invertidxend_amerge, !dbg !5001\n\ninvertidxend_active:                              ; preds = %invertidxend\n  %1177 = load double, double addrspace(13)* %\"arrayref37.sroa.2.0..sroa_idx247'ipg\", align 1, !dbg !5001, !tbaa !1360, !alias.scope !5083, !noalias !5086\n  %1178 = fadd fast double %1177, %1175, !dbg !5001\n  store double %1178, double addrspace(13)* %\"arrayref37.sroa.2.0..sroa_idx247'ipg\", align 1, !dbg !5001, !tbaa !1360, !alias.scope !5083, !noalias !5086\n  br label %invertidxend_amerge, !dbg !5001\n\ninvertidxend_amerge:                              ; preds = %invertidxend_active, %invertidxend\n  %1179 = load double, double* %\"arrayref37.sroa.0.0.copyload'de\", align 8, !dbg !5001\n  store double 0.000000e+00, double* %\"arrayref37.sroa.0.0.copyload'de\", align 8, !dbg !5001\n  %1180 = icmp ne double addrspace(13)* %arrayref37.sroa.0.0..sroa_idx, %\"arrayref37.sroa.0.0..sroa_idx'ipg\", !dbg !5001\n  br i1 %1180, label %invertidxend_amerge_active, label %invertidxend_amerge_amerge, !dbg !5001\n\ninvertidxend_amerge_active:                       ; preds = %invertidxend_amerge\n  %1181 = load double, double addrspace(13)* %\"arrayref37.sroa.0.0..sroa_idx'ipg\", align 1, !dbg !5001, !tbaa !1360, !alias.scope !5083, !noalias !5086\n  %1182 = fadd fast double %1181, %1179, !dbg !5001\n  store double %1182, double addrspace(13)* %\"arrayref37.sroa.0.0..sroa_idx'ipg\", align 1, !dbg !5001, !tbaa !1360, !alias.scope !5083, !noalias !5086\n  br label %invertidxend_amerge_amerge, !dbg !5001\n\ninvertidxend_amerge_amerge:                       ; preds = %invertidxend_amerge_active, %invertidxend_amerge\n  %1183 = load double, double* %\"'de165\", align 8, !dbg !5000\n  store double 0.000000e+00, double* %\"'de165\", align 8, !dbg !5000\n  %1184 = load double, double* %\"'de197\", align 8, !dbg !5000\n  %1185 = fadd fast double %1184, %1183, !dbg !5000\n  store double %1185, double* %\"'de197\", align 8, !dbg !5000\n  %1186 = fneg fast double %1183, !dbg !5000\n  %1187 = load double, double* %\"'de198\", align 8, !dbg !5000\n  %1188 = fadd fast double %1187, %1186, !dbg !5000\n  store double %1188, double* %\"'de198\", align 8, !dbg !5000\n  %1189 = load double, double* %\"'de198\", align 8, !dbg !4997\n  store double 0.000000e+00, double* %\"'de198\", align 8, !dbg !4997\n  %1190 = fmul fast double %1189, %arrayref24.sroa.3.0.copyload, !dbg !4997\n  %1191 = load double, double* %\".fca.1.extract251'de\", align 8, !dbg !4997\n  %1192 = fadd fast double %1191, %1190, !dbg !4997\n  store double %1192, double* %\".fca.1.extract251'de\", align 8, !dbg !4997\n  %1193 = fmul fast double %1189, %.fca.1.extract251, !dbg !4997\n  %1194 = load double, double* %\"arrayref24.sroa.3.0.copyload'de\", align 8, !dbg !4997\n  %1195 = fadd fast double %1194, %1193, !dbg !4997\n  store double %1195, double* %\"arrayref24.sroa.3.0.copyload'de\", align 8, !dbg !4997\n  %1196 = load double, double* %\"'de197\", align 8, !dbg !4997\n  store double 0.000000e+00, double* %\"'de197\", align 8, !dbg !4997\n  %1197 = fmul fast double %1196, %arrayref24.sroa.0.0.copyload, !dbg !4997\n  %1198 = load double, double* %\".fca.0.extract250'de\", align 8, !dbg !4997\n  %1199 = fadd fast double %1198, %1197, !dbg !4997\n  store double %1199, double* %\".fca.0.extract250'de\", align 8, !dbg !4997\n  %1200 = fmul fast double %1196, %.fca.0.extract250, !dbg !4997\n  %1201 = load double, double* %\"arrayref24.sroa.0.0.copyload'de\", align 8, !dbg !4997\n  %1202 = fadd fast double %1201, %1200, !dbg !4997\n  store double %1202, double* %\"arrayref24.sroa.0.0.copyload'de\", align 8, !dbg !4997\n  %1203 = load double, double* %\"'de164\", align 8, !dbg !4999\n  store double 0.000000e+00, double* %\"'de164\", align 8, !dbg !4999\n  %1204 = load double, double* %\"'de199\", align 8, !dbg !4999\n  %1205 = fadd fast double %1204, %1203, !dbg !4999\n  store double %1205, double* %\"'de199\", align 8, !dbg !4999\n  %1206 = load double, double* %\"'de200\", align 8, !dbg !4999\n  %1207 = fadd fast double %1206, %1203, !dbg !4999\n  store double %1207, double* %\"'de200\", align 8, !dbg !4999\n  %1208 = load double, double* %\"'de200\", align 8, !dbg !4997\n  store double 0.000000e+00, double* %\"'de200\", align 8, !dbg !4997\n  %1209 = fmul fast double %1208, %arrayref24.sroa.3.0.copyload, !dbg !4997\n  %1210 = load double, double* %\".fca.0.extract250'de\", align 8, !dbg !4997\n  %1211 = fadd fast double %1210, %1209, !dbg !4997\n  store double %1211, double* %\".fca.0.extract250'de\", align 8, !dbg !4997\n  %1212 = fmul fast double %1208, %.fca.0.extract250, !dbg !4997\n  %1213 = load double, double* %\"arrayref24.sroa.3.0.copyload'de\", align 8, !dbg !4997\n  %1214 = fadd fast double %1213, %1212, !dbg !4997\n  store double %1214, double* %\"arrayref24.sroa.3.0.copyload'de\", align 8, !dbg !4997\n  %1215 = load double, double* %\"arrayref24.sroa.3.0.copyload'de\", align 8, !dbg !4995\n  store double 0.000000e+00, double* %\"arrayref24.sroa.3.0.copyload'de\", align 8, !dbg !4995\n  %1216 = icmp ne double addrspace(13)* %arrayref24.sroa.3.0..sroa_idx248, %\"arrayref24.sroa.3.0..sroa_idx248'ipg\", !dbg !4995\n  br i1 %1216, label %invertidxend_amerge_amerge_active, label %invertidxend_amerge_amerge_amerge, !dbg !4995\n\ninvertidxend_amerge_amerge_active:                ; preds = %invertidxend_amerge_amerge\n  %1217 = load double, double addrspace(13)* %\"arrayref24.sroa.3.0..sroa_idx248'ipg\", align 1, !dbg !4995, !tbaa !1360, !alias.scope !5083, !noalias !5086\n  %1218 = fadd fast double %1217, %1215, !dbg !4995\n  store double %1218, double addrspace(13)* %\"arrayref24.sroa.3.0..sroa_idx248'ipg\", align 1, !dbg !4995, !tbaa !1360, !alias.scope !5083, !noalias !5086\n  br label %invertidxend_amerge_amerge_amerge, !dbg !4995\n\ninvertidxend_amerge_amerge_amerge:                ; preds = %invertidxend_amerge_amerge_active, %invertidxend_amerge_amerge\n  %1219 = load double, double* %\"'de199\", align 8, !dbg !4997\n  store double 0.000000e+00, double* %\"'de199\", align 8, !dbg !4997\n  %1220 = fmul fast double %1219, %arrayref24.sroa.0.0.copyload, !dbg !4997\n  %1221 = load double, double* %\".fca.1.extract251'de\", align 8, !dbg !4997\n  %1222 = fadd fast double %1221, %1220, !dbg !4997\n  store double %1222, double* %\".fca.1.extract251'de\", align 8, !dbg !4997\n  %1223 = fmul fast double %1219, %.fca.1.extract251, !dbg !4997\n  %1224 = load double, double* %\"arrayref24.sroa.0.0.copyload'de\", align 8, !dbg !4997\n  %1225 = fadd fast double %1224, %1223, !dbg !4997\n  store double %1225, double* %\"arrayref24.sroa.0.0.copyload'de\", align 8, !dbg !4997\n  %1226 = load double, double* %\"arrayref24.sroa.0.0.copyload'de\", align 8, !dbg !4995\n  store double 0.000000e+00, double* %\"arrayref24.sroa.0.0.copyload'de\", align 8, !dbg !4995\n  %1227 = icmp ne double addrspace(13)* %arrayref24.sroa.0.0..sroa_idx, %\"arrayref24.sroa.0.0..sroa_idx'ipg\", !dbg !4995\n  br i1 %1227, label %invertidxend_amerge_amerge_amerge_active, label %invertidxend_amerge_amerge_amerge_amerge, !dbg !4995\n\ninvertidxend_amerge_amerge_amerge_active:         ; preds = %invertidxend_amerge_amerge_amerge\n  %1228 = load double, double addrspace(13)* %\"arrayref24.sroa.0.0..sroa_idx'ipg\", align 1, !dbg !4995, !tbaa !1360, !alias.scope !5083, !noalias !5086\n  %1229 = fadd fast double %1228, %1226, !dbg !4995\n  store double %1229, double addrspace(13)* %\"arrayref24.sroa.0.0..sroa_idx'ipg\", align 1, !dbg !4995, !tbaa !1360, !alias.scope !5083, !noalias !5086\n  br label %invertidxend_amerge_amerge_amerge_amerge, !dbg !4995\n\ninvertidxend_amerge_amerge_amerge_amerge:         ; preds = %invertidxend_amerge_amerge_amerge_active, %invertidxend_amerge_amerge_amerge\n  %1230 = load double, double* %\"'de182\", align 8, !dbg !4994\n  store double 0.000000e+00, double* %\"'de182\", align 8, !dbg !4994\n  %1231 = load double, double* %\"'de201\", align 8, !dbg !4994\n  %1232 = fadd fast double %1231, %1230, !dbg !4994\n  store double %1232, double* %\"'de201\", align 8, !dbg !4994\n  %1233 = fneg fast double %1230, !dbg !4994\n  %1234 = load double, double* %\"'de202\", align 8, !dbg !4994\n  %1235 = fadd fast double %1234, %1233, !dbg !4994\n  store double %1235, double* %\"'de202\", align 8, !dbg !4994\n  %1236 = load double, double* %\"'de202\", align 8, !dbg !4994\n  store double 0.000000e+00, double* %\"'de202\", align 8, !dbg !4994\n  %1237 = fmul fast double %1236, %.fca.1.extract251, !dbg !4994\n  %1238 = load double, double* %\"arrayref13.sroa.0.0.copyload'de\", align 8, !dbg !4994\n  %1239 = fadd fast double %1238, %1237, !dbg !4994\n  store double %1239, double* %\"arrayref13.sroa.0.0.copyload'de\", align 8, !dbg !4994\n  %1240 = fmul fast double %1236, %arrayref13.sroa.0.0.copyload, !dbg !4994\n  %1241 = load double, double* %\".fca.1.extract251'de\", align 8, !dbg !4994\n  %1242 = fadd fast double %1241, %1240, !dbg !4994\n  store double %1242, double* %\".fca.1.extract251'de\", align 8, !dbg !4994\n  %1243 = load double, double* %\"'de201\", align 8, !dbg !4993\n  store double 0.000000e+00, double* %\"'de201\", align 8, !dbg !4993\n  %1244 = fmul fast double %1243, %117, !dbg !4993\n  %1245 = load double, double* %\".fca.0.extract250'de\", align 8, !dbg !4993\n  %1246 = fadd fast double %1245, %1244, !dbg !4993\n  store double %1246, double* %\".fca.0.extract250'de\", align 8, !dbg !4993\n  %1247 = fmul fast double %1243, %.fca.0.extract250, !dbg !4993\n  %1248 = load double, double* %\"'de203\", align 8, !dbg !4993\n  %1249 = fadd fast double %1248, %1247, !dbg !4993\n  store double %1249, double* %\"'de203\", align 8, !dbg !4993\n  %1250 = load double, double* %\"'de97\", align 8, !dbg !4991\n  store double 0.000000e+00, double* %\"'de97\", align 8, !dbg !4991\n  %1251 = load double, double* %\"'de204\", align 8, !dbg !4991\n  %1252 = fadd fast double %1251, %1250, !dbg !4991\n  store double %1252, double* %\"'de204\", align 8, !dbg !4991\n  %1253 = fneg fast double %1250, !dbg !4991\n  %1254 = load double, double* %\"'de205\", align 8, !dbg !4991\n  %1255 = fadd fast double %1254, %1253, !dbg !4991\n  store double %1255, double* %\"'de205\", align 8, !dbg !4991\n  %1256 = load double, double* %\"'de205\", align 8, !dbg !4991\n  store double 0.000000e+00, double* %\"'de205\", align 8, !dbg !4991\n  %1257 = fmul fast double %1256, %.fca.0.extract250, !dbg !4991\n  %1258 = load double, double* %\"arrayref13.sroa.0.0.copyload'de\", align 8, !dbg !4991\n  %1259 = fadd fast double %1258, %1257, !dbg !4991\n  store double %1259, double* %\"arrayref13.sroa.0.0.copyload'de\", align 8, !dbg !4991\n  %1260 = fmul fast double %1256, %arrayref13.sroa.0.0.copyload, !dbg !4991\n  %1261 = load double, double* %\".fca.0.extract250'de\", align 8, !dbg !4991\n  %1262 = fadd fast double %1261, %1260, !dbg !4991\n  store double %1262, double* %\".fca.0.extract250'de\", align 8, !dbg !4991\n  %1263 = load double, double* %\"'de204\", align 8, !dbg !4991\n  store double 0.000000e+00, double* %\"'de204\", align 8, !dbg !4991\n  %1264 = fmul fast double %1263, %arrayref13.sroa.2.0.copyload, !dbg !4991\n  %1265 = load double, double* %\".fca.1.extract251'de\", align 8, !dbg !4991\n  %1266 = fadd fast double %1265, %1264, !dbg !4991\n  store double %1266, double* %\".fca.1.extract251'de\", align 8, !dbg !4991\n  %1267 = fmul fast double %1263, %.fca.1.extract251, !dbg !4991\n  %1268 = load double, double* %\"arrayref13.sroa.2.0.copyload'de\", align 8, !dbg !4991\n  %1269 = fadd fast double %1268, %1267, !dbg !4991\n  store double %1269, double* %\"arrayref13.sroa.2.0.copyload'de\", align 8, !dbg !4991\n  %1270 = load double, double* %\"'de203\", align 8, !dbg !4989\n  store double 0.000000e+00, double* %\"'de203\", align 8, !dbg !4989\n  %1271 = fneg fast double %1270, !dbg !4989\n  %1272 = load double, double* %\"arrayref13.sroa.2.0.copyload'de\", align 8, !dbg !4989\n  %1273 = fadd fast double %1272, %1271, !dbg !4989\n  store double %1273, double* %\"arrayref13.sroa.2.0.copyload'de\", align 8, !dbg !4989\n  %1274 = load double, double* %\"arrayref13.sroa.2.0.copyload'de\", align 8, !dbg !4987\n  store double 0.000000e+00, double* %\"arrayref13.sroa.2.0.copyload'de\", align 8, !dbg !4987\n  %1275 = icmp ne double addrspace(13)* %arrayref13.sroa.2.0..sroa_idx249, %\"arrayref13.sroa.2.0..sroa_idx249'ipg\", !dbg !4987\n  br i1 %1275, label %invertidxend_amerge_amerge_amerge_amerge_active, label %invertidxend_amerge_amerge_amerge_amerge_amerge, !dbg !4987\n\ninvertidxend_amerge_amerge_amerge_amerge_active:  ; preds = %invertidxend_amerge_amerge_amerge_amerge\n  %1276 = load double, double addrspace(13)* %\"arrayref13.sroa.2.0..sroa_idx249'ipg\", align 1, !dbg !4987, !tbaa !1360, !alias.scope !5083, !noalias !5086\n  %1277 = fadd fast double %1276, %1274, !dbg !4987\n  store double %1277, double addrspace(13)* %\"arrayref13.sroa.2.0..sroa_idx249'ipg\", align 1, !dbg !4987, !tbaa !1360, !alias.scope !5083, !noalias !5086\n  br label %invertidxend_amerge_amerge_amerge_amerge_amerge, !dbg !4987\n\ninvertidxend_amerge_amerge_amerge_amerge_amerge:  ; preds = %invertidxend_amerge_amerge_amerge_amerge_active, %invertidxend_amerge_amerge_amerge_amerge\n  %1278 = load double, double* %\"arrayref13.sroa.0.0.copyload'de\", align 8, !dbg !4987\n  store double 0.000000e+00, double* %\"arrayref13.sroa.0.0.copyload'de\", align 8, !dbg !4987\n  %1279 = icmp ne double addrspace(13)* %arrayref13.sroa.0.0..sroa_idx, %\"arrayref13.sroa.0.0..sroa_idx'ipg\", !dbg !4987\n  br i1 %1279, label %invertidxend_amerge_amerge_amerge_amerge_amerge_active, label %invertidxend_amerge_amerge_amerge_amerge_amerge_amerge, !dbg !4987\n\ninvertidxend_amerge_amerge_amerge_amerge_amerge_active: ; preds = %invertidxend_amerge_amerge_amerge_amerge_amerge\n  %1280 = load double, double addrspace(13)* %\"arrayref13.sroa.0.0..sroa_idx'ipg\", align 1, !dbg !4987, !tbaa !1360, !alias.scope !5083, !noalias !5086\n  %1281 = fadd fast double %1280, %1278, !dbg !4987\n  store double %1281, double addrspace(13)* %\"arrayref13.sroa.0.0..sroa_idx'ipg\", align 1, !dbg !4987, !tbaa !1360, !alias.scope !5083, !noalias !5086\n  br label %invertidxend_amerge_amerge_amerge_amerge_amerge_amerge, !dbg !4987\n\ninvertidxend_amerge_amerge_amerge_amerge_amerge_amerge: ; preds = %invertidxend_amerge_amerge_amerge_amerge_amerge_active, %invertidxend_amerge_amerge_amerge_amerge_amerge\n  %1282 = load double, double* %\".fca.1.extract251'de\", align 8, !dbg !4986\n  %1283 = getelementptr inbounds [2 x double], [2 x double]* %\"'de206\", i32 0, i32 1, !dbg !4986\n  %1284 = load double, double* %1283, align 8, !dbg !4986\n  %1285 = fadd fast double %1284, %1282, !dbg !4986\n  store double %1285, double* %1283, align 8, !dbg !4986\n  store double 0.000000e+00, double* %\".fca.1.extract251'de\", align 8, !dbg !4986\n  %1286 = load double, double* %\".fca.0.extract250'de\", align 8, !dbg !4986\n  %1287 = getelementptr inbounds [2 x double], [2 x double]* %\"'de206\", i32 0, i32 0, !dbg !4986\n  %1288 = load double, double* %1287, align 8, !dbg !4986\n  %1289 = fadd fast double %1288, %1286, !dbg !4986\n  store double %1289, double* %1287, align 8, !dbg !4986\n  store double 0.000000e+00, double* %\".fca.0.extract250'de\", align 8, !dbg !4986\n  %1290 = load [2 x double], [2 x double]* %\"'de206\", align 8, !dbg !4986\n  store [2 x double] zeroinitializer, [2 x double]* %\"'de206\", align 8, !dbg !4986\n  %re207 = extractvalue [2 x double] %1290, 0, !dbg !4986\n  %im208 = extractvalue [2 x double] %1290, 1, !dbg !4986\n  %1291 = fneg fast double %im208, !dbg !4986\n  %1292 = insertvalue [2 x double] undef, double %re207, 0, !dbg !4986\n  %1293 = insertvalue [2 x double] %1292, double %1291, 1, !dbg !4986\n  %1294 = fneg fast double %re207, !dbg !4986\n  %1295 = fneg fast double %1291, !dbg !4986\n  %1296 = insertvalue [2 x double] undef, double %1294, 0, !dbg !4986\n  %1297 = insertvalue [2 x double] %1296, double %1295, 1, !dbg !4986\n  %1298 = fmul fast double %arrayref.sroa.0.0.copyload_replacementA, %arrayref.sroa.0.0.copyload_replacementA, !dbg !4986\n  %1299 = fmul fast double %arrayref.sroa.2.0.copyload_replacementA, %arrayref.sroa.2.0.copyload_replacementA, !dbg !4986\n  %1300 = fsub fast double %1298, %1299, !dbg !4986\n  %1301 = fmul fast double %arrayref.sroa.0.0.copyload_replacementA, %arrayref.sroa.2.0.copyload_replacementA, !dbg !4986\n  %1302 = fmul fast double %arrayref.sroa.0.0.copyload_replacementA, %arrayref.sroa.2.0.copyload_replacementA, !dbg !4986\n  %1303 = fadd fast double %1301, %1302, !dbg !4986\n  %1304 = insertvalue [2 x double] undef, double %1300, 0, !dbg !4986\n  %1305 = insertvalue [2 x double] %1304, double %1303, 1, !dbg !4986\n  %1306 = fmul fast double %1294, %1300, !dbg !4986\n  %1307 = fmul fast double %1295, %1303, !dbg !4986\n  %1308 = fadd fast double %1306, %1307, !dbg !4986\n  %1309 = fmul fast double %1300, %1300, !dbg !4986\n  %1310 = fmul fast double %1303, %1303, !dbg !4986\n  %1311 = fadd fast double %1309, %1310, !dbg !4986\n  %1312 = fdiv fast double %1308, %1311, !dbg !4986\n  %1313 = fmul fast double %1300, %1295, !dbg !4986\n  %1314 = fmul fast double %1294, %1303, !dbg !4986\n  %1315 = fsub fast double %1313, %1314, !dbg !4986\n  %1316 = fdiv fast double %1315, %1311, !dbg !4986\n  %1317 = insertvalue [2 x double] undef, double %1312, 0, !dbg !4986\n  %1318 = insertvalue [2 x double] %1317, double %1316, 1, !dbg !4986\n  %1319 = fneg fast double %1316, !dbg !4986\n  %1320 = insertvalue [2 x double] undef, double %1312, 0, !dbg !4986\n  %1321 = insertvalue [2 x double] %1320, double %1319, 1, !dbg !4986\n  %1322 = load [2 x double], [2 x double]* %\".fca.1.insert255'de\", align 8, !dbg !4986\n  %1323 = getelementptr inbounds [2 x double], [2 x double]* %\".fca.1.insert255'de\", i32 0, i32 0, !dbg !4986\n  %1324 = load double, double* %1323, align 8, !dbg !4986\n  %1325 = fadd fast double %1324, %1312, !dbg !4986\n  store double %1325, double* %1323, align 8, !dbg !4986\n  %1326 = getelementptr inbounds [2 x double], [2 x double]* %\".fca.1.insert255'de\", i32 0, i32 1, !dbg !4986\n  %1327 = load double, double* %1326, align 8, !dbg !4986\n  %1328 = fadd fast double %1327, %1319, !dbg !4986\n  store double %1328, double* %1326, align 8, !dbg !4986\n  %1329 = load [2 x double], [2 x double]* %\".fca.1.insert255'de\", align 8, !dbg !4986\n  %1330 = extractvalue [2 x double] %1329, 1, !dbg !4986\n  %1331 = load double, double* %\"arrayref.sroa.2.0.copyload'de\", align 8, !dbg !4986\n  %1332 = fadd fast double %1331, %1330, !dbg !4986\n  store double %1332, double* %\"arrayref.sroa.2.0.copyload'de\", align 8, !dbg !4986\n  %1333 = load [2 x double], [2 x double]* %\".fca.1.insert255'de\", align 8, !dbg !4986\n  %1334 = insertvalue [2 x double] %1333, double 0.000000e+00, 1, !dbg !4986\n  %1335 = extractvalue [2 x double] %1333, 0, !dbg !4986\n  %1336 = getelementptr inbounds [2 x double], [2 x double]* %\".fca.0.insert254'de\", i32 0, i32 0, !dbg !4986\n  %1337 = load double, double* %1336, align 8, !dbg !4986\n  %1338 = fadd fast double %1337, %1335, !dbg !4986\n  store double %1338, double* %1336, align 8, !dbg !4986\n  store [2 x double] zeroinitializer, [2 x double]* %\".fca.1.insert255'de\", align 8, !dbg !4986\n  %1339 = load [2 x double], [2 x double]* %\".fca.0.insert254'de\", align 8, !dbg !4986\n  %1340 = extractvalue [2 x double] %1339, 0, !dbg !4986\n  %1341 = load double, double* %\"arrayref.sroa.0.0.copyload'de\", align 8, !dbg !4986\n  %1342 = fadd fast double %1341, %1340, !dbg !4986\n  store double %1342, double* %\"arrayref.sroa.0.0.copyload'de\", align 8, !dbg !4986\n  store [2 x double] zeroinitializer, [2 x double]* %\".fca.0.insert254'de\", align 8, !dbg !4986\n  %1343 = load double, double* %\"arrayref.sroa.2.0.copyload'de\", align 8, !dbg !4821\n  store double 0.000000e+00, double* %\"arrayref.sroa.2.0.copyload'de\", align 8, !dbg !4821\n  %1344 = icmp ne double addrspace(13)* %arrayref.sroa.2.0..sroa_idx256, %\"arrayref.sroa.2.0..sroa_idx256'ipg\", !dbg !4821\n  br i1 %1344, label %invertidxend_amerge_amerge_amerge_amerge_amerge_amerge_active, label %invertidxend_amerge_amerge_amerge_amerge_amerge_amerge_amerge, !dbg !4821\n\ninvertidxend_amerge_amerge_amerge_amerge_amerge_amerge_active: ; preds = %invertidxend_amerge_amerge_amerge_amerge_amerge_amerge\n  %1345 = load double, double addrspace(13)* %\"arrayref.sroa.2.0..sroa_idx256'ipg\", align 1, !dbg !4821, !tbaa !1360, !alias.scope !5083, !noalias !5086\n  %1346 = fadd fast double %1345, %1343, !dbg !4821\n  store double %1346, double addrspace(13)* %\"arrayref.sroa.2.0..sroa_idx256'ipg\", align 1, !dbg !4821, !tbaa !1360, !alias.scope !5083, !noalias !5086\n  br label %invertidxend_amerge_amerge_amerge_amerge_amerge_amerge_amerge, !dbg !4821\n\ninvertidxend_amerge_amerge_amerge_amerge_amerge_amerge_amerge: ; preds = %invertidxend_amerge_amerge_amerge_amerge_amerge_amerge_active, %invertidxend_amerge_amerge_amerge_amerge_amerge_amerge\n  %1347 = load double, double* %\"arrayref.sroa.0.0.copyload'de\", align 8, !dbg !4821\n  store double 0.000000e+00, double* %\"arrayref.sroa.0.0.copyload'de\", align 8, !dbg !4821\n  %1348 = icmp ne double addrspace(13)* %arrayref.sroa.0.0..sroa_idx, %\"arrayref.sroa.0.0..sroa_idx'ipg\", !dbg !4821\n  br i1 %1348, label %invertidxend_amerge_amerge_amerge_amerge_amerge_amerge_amerge_active, label %invertidxend_amerge_amerge_amerge_amerge_amerge_amerge_amerge_amerge, !dbg !4821\n\ninvertidxend_amerge_amerge_amerge_amerge_amerge_amerge_amerge_active: ; preds = %invertidxend_amerge_amerge_amerge_amerge_amerge_amerge_amerge\n  %1349 = load double, double addrspace(13)* %\"arrayref.sroa.0.0..sroa_idx'ipg\", align 1, !dbg !4821, !tbaa !1360, !alias.scope !5083, !noalias !5086\n  %1350 = fadd fast double %1349, %1347, !dbg !4821\n  store double %1350, double addrspace(13)* %\"arrayref.sroa.0.0..sroa_idx'ipg\", align 1, !dbg !4821, !tbaa !1360, !alias.scope !5083, !noalias !5086\n  br label %invertidxend_amerge_amerge_amerge_amerge_amerge_amerge_amerge_amerge, !dbg !4821\n\ninvertidxend_amerge_amerge_amerge_amerge_amerge_amerge_amerge_amerge: ; preds = %invertidxend_amerge_amerge_amerge_amerge_amerge_amerge_amerge_active, %invertidxend_amerge_amerge_amerge_amerge_amerge_amerge_amerge\n  br label %inverttop\n\nstaging:                                          ; preds = %invertcommon.ret\n  br i1 %or.cond205_unwrap, label %invertL335, label %invertL327\n}\n\nLLVM.LoadInst(%arrayref.sroa.2.0.copyload = load double, double addrspace(13)* %arrayref.sroa.2.0..sroa_idx256, align 1, !dbg !44, !tbaa !213, !alias.scope !214, !noalias !215)\nLLVM.PHIInst(%arrayref.sroa.2.0.copyload_replacementA = phi double , !dbg !36)\n", "; Function Attrs: mustprogress willreturn\ndefine internal fastcc \"enzyme_type\"=\"{[-1]:Float@double}\" double @preprocess_julia_solve_cubic_eq_4262({} 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\"=\"4507947536\" \"enzymejl_parmtype_ref\"=\"2\" %0) unnamed_addr #42 !dbg !3196 {\ntop:\n  %1 = call noalias nonnull dereferenceable(16) dereferenceable_or_null(16) i8* @malloc(i64 16), !enzyme_fromstack !3101\n  %2 = bitcast i8* %1 to [2 x double]*, !enzyme_caststack !35\n  %3 = call noalias nonnull dereferenceable(16) dereferenceable_or_null(16) i8* @malloc(i64 16), !enzyme_fromstack !3101\n  %4 = bitcast i8* %3 to [2 x double]*, !enzyme_caststack !35\n  %5 = call noalias nonnull dereferenceable(16) dereferenceable_or_null(16) i8* @malloc(i64 16), !enzyme_fromstack !3101\n  %6 = bitcast i8* %5 to [2 x double]*, !enzyme_caststack !35\n  %7 = call noalias nonnull dereferenceable(16) dereferenceable_or_null(16) i8* @malloc(i64 16), !enzyme_fromstack !3101\n  %newstruct46 = bitcast i8* %7 to [2 x double]*, !enzyme_caststack !35\n  %8 = call noalias nonnull dereferenceable(16) dereferenceable_or_null(16) i8* @malloc(i64 16), !enzyme_fromstack !3101\n  %newstruct95 = bitcast i8* %8 to [2 x double]*, !enzyme_caststack !35\n  %9 = call noalias nonnull dereferenceable(16) dereferenceable_or_null(16) i8* @malloc(i64 16), !enzyme_fromstack !3101\n  %newstruct40 = bitcast i8* %9 to [2 x double]*, !enzyme_caststack !35\n  %10 = call noalias nonnull dereferenceable(16) dereferenceable_or_null(16) i8* @malloc(i64 16), !enzyme_fromstack !3101\n  %11 = bitcast i8* %10 to [2 x double]*, !enzyme_caststack !35\n  %12 = call {}*** @julia.get_pgcstack() #47\n  %ptls_field263 = getelementptr inbounds {}**, {}*** %12, i64 2\n  %13 = bitcast {}*** %ptls_field263 to i64***\n  %ptls_load264265 = load i64**, i64*** %13, align 8, !tbaa !36\n  %14 = getelementptr inbounds i64*, i64** %ptls_load264265, i64 2\n  %safepoint = load i64*, i64** %14, align 8, !tbaa !40\n  fence syncscope(\"singlethread\") seq_cst\n  call void @julia.safepoint(i64* %safepoint) #47, !dbg !3197\n  fence syncscope(\"singlethread\") seq_cst\n  %15 = addrspacecast {} addrspace(10)* %0 to { i8 addrspace(13)*, i64, i16, i16, i32 } addrspace(11)*, !dbg !3198\n  %arraylen_ptr = getelementptr inbounds { i8 addrspace(13)*, i64, i16, i16, i32 }, { i8 addrspace(13)*, i64, i16, i16, i32 } addrspace(11)* %15, i64 0, i32 1, !dbg !3198\n  %arraylen = load i64, i64 addrspace(11)* %arraylen_ptr, align 8, !dbg !3198, !tbaa !1441, !range !1444, !alias.scope !1445, !noalias !1446\n  %inbounds = icmp ugt i64 %arraylen, 3, !dbg !3198\n  br i1 %inbounds, label %idxend, label %oob, !dbg !3198\n\nL111:                                             ; preds = %idxend\n  %16 = fadd double %160, %.fca.0.extract244, !dbg !3200\n  %17 = fadd double %161, %.fca.1.extract245, !dbg !3200\n  %18 = fmul double %16, 5.000000e-01, !dbg !3203\n  %19 = fmul double %17, 5.000000e-01, !dbg !3203\n  %20 = getelementptr inbounds [2 x double], [2 x double]* %newstruct46, i64 0, i64 0, !dbg !3205\n  store double %18, double* %20, align 8, !dbg !3205, !tbaa !1201, !alias.scope !1203, !noalias !3206\n  %21 = getelementptr inbounds [2 x double], [2 x double]* %newstruct46, i64 0, i64 1, !dbg !3205\n  store double %19, double* %21, align 8, !dbg !3205, !tbaa !1201, !alias.scope !1203, !noalias !3206\n  %22 = addrspacecast [2 x double]* %newstruct46 to [2 x double] addrspace(11)*, !dbg !3202\n  call fastcc void @julia_log_4285([2 x double]* noalias nocapture nofree noundef nonnull writeonly sret([2 x double]) align 8 dereferenceable(16) %4, [2 x double] addrspace(11)* nocapture nofree noundef nonnull readonly align 8 dereferenceable(16) %22) #47, !dbg !3202\n  %23 = getelementptr inbounds [2 x double], [2 x double]* %4, i64 0, i64 0, !dbg !3209\n  %unbox47 = load double, double* %23, align 8, !dbg !3212, !tbaa !1201, !alias.scope !1203, !noalias !1204\n  %24 = fmul double %unbox47, 0x3FD5555555555555, !dbg !3212\n  %25 = getelementptr inbounds [2 x double], [2 x double]* %4, i64 0, i64 1, !dbg !3213\n  %unbox48 = load double, double* %25, align 8, !dbg !3212, !tbaa !1201, !alias.scope !1203, !noalias !1204\n  %26 = fmul double %unbox48, 0x3FD5555555555555, !dbg !3212\n  %27 = fcmp ord double %24, 0.000000e+00, !dbg !3215\n  br i1 %27, label %L134, label %L125, !dbg !3217\n\nL125:                                             ; preds = %L111\n  %28 = fcmp une double %26, 0.000000e+00, !dbg !3218\n  %. = select i1 %28, double %24, double %26, !dbg !3221\n  br label %L242\n\nL134:                                             ; preds = %L111\n  %29 = fsub double %26, %26, !dbg !3222\n  %30 = fcmp ord double %29, 0.000000e+00, !dbg !3225\n  br i1 %30, label %L151, label %L139, !dbg !3224\n\nL139:                                             ; preds = %L134\n  %31 = fcmp une double %24, 0x7FF0000000000000, !dbg !3227\n  br i1 %31, label %L145, label %L242.thread, !dbg !3228\n\nL145:                                             ; preds = %L139\n  %32 = fcmp une double %24, 0xFFF0000000000000, !dbg !3229\n  br i1 %32, label %L242.thread, label %L147, !dbg !3230\n\nL147:                                             ; preds = %L145\n  %33 = call double @llvm.copysign.f64(double noundef 0.000000e+00, double %26) #47, !dbg !3231\n  br label %L242\n\nL151:                                             ; preds = %L134\n  %34 = call fastcc double @julia_exp_4278(double %24) #48, !dbg !3233\n  %35 = fcmp une double %26, 0.000000e+00, !dbg !3234\n  br i1 %35, label %L156, label %L242, !dbg !3236\n\nL156:                                             ; preds = %L151\n  %36 = call [2 x double] @julia_sincos_4270_inner.1(double %26) #49, !dbg !3237\n  %.fca.0.extract217 = extractvalue [2 x double] %36, 0, !dbg !3237\n  %.fca.1.extract218 = extractvalue [2 x double] %36, 1, !dbg !3237\n  %37 = fmul double %34, %.fca.1.extract218, !dbg !3238\n  %38 = fmul double %34, %.fca.0.extract217, !dbg !3238\n  br label %L242\n\nL177:                                             ; preds = %idxend\n  %39 = fsub double %160, %.fca.0.extract244, !dbg !3240\n  %40 = fsub double %161, %.fca.1.extract245, !dbg !3240\n  %41 = fmul double %39, 5.000000e-01, !dbg !3243\n  %42 = fmul double %40, 5.000000e-01, !dbg !3243\n  %43 = getelementptr inbounds [2 x double], [2 x double]* %newstruct95, i64 0, i64 0, !dbg !3245\n  store double %41, double* %43, align 8, !dbg !3245, !tbaa !1201, !alias.scope !1203, !noalias !3206\n  %44 = getelementptr inbounds [2 x double], [2 x double]* %newstruct95, i64 0, i64 1, !dbg !3245\n  store double %42, double* %44, align 8, !dbg !3245, !tbaa !1201, !alias.scope !1203, !noalias !3206\n  %45 = addrspacecast [2 x double]* %newstruct95 to [2 x double] addrspace(11)*, !dbg !3242\n  call fastcc void @julia_log_4285([2 x double]* noalias nocapture nofree noundef nonnull writeonly sret([2 x double]) align 8 dereferenceable(16) %11, [2 x double] addrspace(11)* nocapture nofree noundef nonnull readonly align 8 dereferenceable(16) %45) #47, !dbg !3242\n  %46 = getelementptr inbounds [2 x double], [2 x double]* %11, i64 0, i64 0, !dbg !3246\n  %unbox96 = load double, double* %46, align 8, !dbg !3249, !tbaa !1201, !alias.scope !1203, !noalias !1204\n  %47 = fmul double %unbox96, 0x3FD5555555555555, !dbg !3249\n  %48 = getelementptr inbounds [2 x double], [2 x double]* %11, i64 0, i64 1, !dbg !3250\n  %unbox97 = load double, double* %48, align 8, !dbg !3249, !tbaa !1201, !alias.scope !1203, !noalias !1204\n  %49 = fmul double %unbox97, 0x3FD5555555555555, !dbg !3249\n  %50 = fcmp ord double %47, 0.000000e+00, !dbg !3252\n  br i1 %50, label %L200, label %L191, !dbg !3254\n\nL191:                                             ; preds = %L177\n  %51 = fcmp une double %49, 0.000000e+00, !dbg !3255\n  %.191 = select i1 %51, double %47, double %49, !dbg !3221\n  br label %L242\n\nL200:                                             ; preds = %L177\n  %52 = fsub double %49, %49, !dbg !3258\n  %53 = fcmp ord double %52, 0.000000e+00, !dbg !3261\n  br i1 %53, label %L217, label %L205, !dbg !3260\n\nL205:                                             ; preds = %L200\n  %54 = fcmp une double %47, 0x7FF0000000000000, !dbg !3263\n  br i1 %54, label %L211, label %L242.thread, !dbg !3264\n\nL211:                                             ; preds = %L205\n  %55 = fcmp une double %47, 0xFFF0000000000000, !dbg !3265\n  br i1 %55, label %L242.thread, label %L213, !dbg !3266\n\nL213:                                             ; preds = %L211\n  %56 = call double @llvm.copysign.f64(double noundef 0.000000e+00, double %49) #47, !dbg !3267\n  br label %L242\n\nL217:                                             ; preds = %L200\n  %57 = call fastcc double @julia_exp_4278(double %47) #48, !dbg !3269\n  %58 = fcmp une double %49, 0.000000e+00, !dbg !3270\n  br i1 %58, label %L222, label %L242, !dbg !3272\n\nL222:                                             ; preds = %L217\n  %59 = call [2 x double] @julia_sincos_4270_inner.1(double %49) #49, !dbg !3273\n  %.fca.0.extract = extractvalue [2 x double] %59, 0, !dbg !3273\n  %.fca.1.extract = extractvalue [2 x double] %59, 1, !dbg !3273\n  %60 = fmul double %57, %.fca.1.extract, !dbg !3274\n  %61 = fmul double %57, %.fca.0.extract, !dbg !3274\n  br label %L242\n\nL242.thread:                                      ; preds = %L211, %L205, %L145, %L139\n  %.sroa.0296.0.ph = phi double [ 0x7FF8000000000000, %L211 ], [ 0x7FF8000000000000, %L145 ], [ 0xFFF0000000000000, %L139 ], [ 0xFFF0000000000000, %L205 ]\n  %.sroa.0296.0..sroa_idx298328 = getelementptr inbounds [2 x double], [2 x double]* %2, i64 0, i64 0, !dbg !3276\n  store double %.sroa.0296.0.ph, double* %.sroa.0296.0..sroa_idx298328, align 8, !dbg !3276, !noalias !3277\n  %.sroa.6.0..sroa_idx303329 = getelementptr inbounds [2 x double], [2 x double]* %2, i64 0, i64 1, !dbg !3276\n  store double 0x7FF8000000000000, double* %.sroa.6.0..sroa_idx303329, align 8, !dbg !3276, !noalias !3277\n  br label %L265, !dbg !3276\n\nL242:                                             ; preds = %L222, %L217, %L213, %L191, %L156, %L151, %L147, %L125\n  %.sroa.0223.0.copyload = phi double [ %37, %L156 ], [ -0.000000e+00, %L147 ], [ %24, %L125 ], [ %34, %L151 ], [ %60, %L222 ], [ -0.000000e+00, %L213 ], [ %47, %L191 ], [ %57, %L217 ], !dbg !3197\n  %.sroa.6.0 = phi double [ %38, %L156 ], [ %33, %L147 ], [ %., %L125 ], [ %26, %L151 ], [ %61, %L222 ], [ %56, %L213 ], [ %.191, %L191 ], [ %49, %L217 ], !dbg !3197\n  %.sroa.0296.0..sroa_idx298 = getelementptr inbounds [2 x double], [2 x double]* %2, i64 0, i64 0, !dbg !3276\n  store double %.sroa.0223.0.copyload, double* %.sroa.0296.0..sroa_idx298, align 8, !dbg !3276, !noalias !3277\n  %.sroa.6.0..sroa_idx303 = getelementptr inbounds [2 x double], [2 x double]* %2, i64 0, i64 1, !dbg !3276\n  store double %.sroa.6.0, double* %.sroa.6.0..sroa_idx303, align 8, !dbg !3276, !noalias !3277\n  %62 = fcmp une double %.sroa.6.0, 0.000000e+00, !dbg !3278\n  %63 = fcmp une double %.sroa.0223.0.copyload, 0.000000e+00, !dbg !3281\n  %narrow = select i1 %62, i1 true, i1 %63, !dbg !3281\n  br i1 %narrow, label %L265, label %L266, !dbg !3276\n\nL265:                                             ; preds = %L242, %L242.thread\n  %.sroa.6.0334 = phi double [ 0x7FF8000000000000, %L242.thread ], [ %.sroa.6.0, %L242 ]\n  %.sroa.0296.0332 = phi double [ %.sroa.0296.0.ph, %L242.thread ], [ %.sroa.0223.0.copyload, %L242 ]\n  %64 = addrspacecast [2 x double]* %newstruct40 to [2 x double] addrspace(11)*, !dbg !3282\n  %65 = addrspacecast [2 x double]* %2 to [2 x double] addrspace(11)*, !dbg !3282\n  call fastcc void @julia___4280([2 x double]* noalias nocapture nofree noundef nonnull writeonly sret([2 x double]) align 8 dereferenceable(16) %6, [2 x double] addrspace(11)* nocapture nofree noundef nonnull readonly align 8 dereferenceable(16) %64, [2 x double] addrspace(11)* nocapture nofree noundef nonnull readonly align 8 dereferenceable(16) %65) #47, !dbg !3282\n  %.sroa.0223.0..sroa_idx226 = getelementptr inbounds [2 x double], [2 x double]* %6, i64 0, i64 0, !dbg !3197\n  %.sroa.0223.0.copyload227 = load double, double* %.sroa.0223.0..sroa_idx226, align 8, !dbg !3197, !tbaa !1201, !alias.scope !1203, !noalias !3206\n  %.sroa.6228.0..sroa_idx232 = getelementptr inbounds [2 x double], [2 x double]* %6, i64 0, i64 1, !dbg !3197\n  %.sroa.6228.0.copyload233 = load double, double* %.sroa.6228.0..sroa_idx232, align 8, !dbg !3197, !tbaa !1201, !alias.scope !1203, !noalias !3206\n  br label %L266\n\nL266:                                             ; preds = %L265, %L242\n  %.sroa.6.0333 = phi double [ %.sroa.6.0334, %L265 ], [ %.sroa.6.0, %L242 ]\n  %.sroa.0296.0331 = phi double [ %.sroa.0296.0332, %L265 ], [ %.sroa.0223.0.copyload, %L242 ]\n  %.sroa.0223.0 = phi double [ %.sroa.0223.0.copyload227, %L265 ], [ %.sroa.0223.0.copyload, %L242 ]\n  %.sroa.6228.0 = phi double [ %.sroa.6228.0.copyload233, %L265 ], [ %.sroa.6.0, %L242 ]\n  %66 = fadd double %118, %.sroa.0296.0331, !dbg !3283\n  %67 = fadd double %121, %.sroa.6.0333, !dbg !3283\n  %68 = fadd double %66, %.sroa.0223.0, !dbg !3283\n  %69 = fadd double %67, %.sroa.6228.0, !dbg !3283\n  %70 = fmul double %68, 0x3FD5555555555555, !dbg !3287\n  %71 = fmul double %69, 0x3FD5555555555555, !dbg !3287\n  %72 = fmul double %.sroa.0296.0331, -5.000000e-01, !dbg !3289\n  %73 = fmul double %.sroa.6.0333, -5.000000e-01, !dbg !3289\n  %74 = fmul double %.sroa.0223.0, -5.000000e-01, !dbg !3289\n  %75 = fmul double %.sroa.6228.0, -5.000000e-01, !dbg !3289\n  %76 = fmul double %.sroa.6.0333, 0x3FEBB67AE8584CAA, !dbg !3292\n  %77 = fsub double %72, %76, !dbg !3295\n  %78 = fmul double %.sroa.0296.0331, 0x3FEBB67AE8584CAA, !dbg !3292\n  %79 = fadd double %73, %78, !dbg !3296\n  %80 = fmul double %.sroa.6228.0, 0x3FEBB67AE8584CAA, !dbg !3292\n  %81 = fadd double %74, %80, !dbg !3295\n  %82 = fmul double %.sroa.0223.0, 0x3FEBB67AE8584CAA, !dbg !3292\n  %83 = fsub double %75, %82, !dbg !3296\n  %84 = fadd double %118, %77, !dbg !3297\n  %85 = fadd double %121, %79, !dbg !3297\n  %86 = fadd double %84, %81, !dbg !3297\n  %87 = fadd double %85, %83, !dbg !3297\n  %88 = fmul double %86, 0x3FD5555555555555, !dbg !3300\n  %89 = fmul double %87, 0x3FD5555555555555, !dbg !3300\n  %90 = call double @llvm.fabs.f64(double %71) #47, !dbg !3302\n  %91 = fcmp uge double %90, 1.000000e-08, !dbg !3304\n  %92 = fcmp ule double %70, 0.000000e+00\n  %or.cond = select i1 %91, i1 true, i1 %92, !dbg !3303\n  %93 = fcmp uge double %70, 1.000000e+00\n  %or.cond201 = select i1 %or.cond, i1 true, i1 %93, !dbg !3303\n  br i1 %or.cond201, label %L327, label %common.ret, !dbg !3303\n\ncommon.ret:                                       ; preds = %L335, %L327, %L266\n  %common.ret.op = phi double [ %70, %L266 ], [ %103, %L327 ], [ %spec.select210, %L335 ]\n  ret double %common.ret.op, !dbg !3221\n\nL327:                                             ; preds = %L266\n  %94 = fsub double %73, %78, !dbg !3305\n  %95 = fadd double %121, %94, !dbg !3306\n  %96 = fadd double %82, %75, !dbg !3305\n  %97 = fadd double %95, %96, !dbg !3306\n  %98 = fmul double %97, 0x3FD5555555555555, !dbg !3309\n  %99 = fadd double %76, %72, !dbg !3311\n  %100 = fadd double %118, %99, !dbg !3306\n  %101 = fsub double %74, %80, !dbg !3311\n  %102 = fadd double %100, %101, !dbg !3306\n  %103 = fmul double %102, 0x3FD5555555555555, !dbg !3309\n  %104 = call double @llvm.fabs.f64(double %98) #47, !dbg !3312\n  %105 = fcmp uge double %104, 1.000000e-08, !dbg !3314\n  %106 = fcmp ule double %103, 0.000000e+00\n  %or.cond203 = select i1 %105, i1 true, i1 %106, !dbg !3313\n  %107 = fcmp uge double %103, 1.000000e+00\n  %or.cond205 = select i1 %or.cond203, i1 true, i1 %107, !dbg !3313\n  br i1 %or.cond205, label %L335, label %common.ret, !dbg !3313\n\nL335:                                             ; preds = %L327\n  %108 = call double @llvm.fabs.f64(double %89) #47, !dbg !3315\n  %109 = fcmp uge double %108, 1.000000e-08, !dbg !3317\n  %110 = fcmp ule double %88, 0.000000e+00\n  %or.cond207 = select i1 %109, i1 true, i1 %110, !dbg !3316\n  %111 = fcmp uge double %88, 1.000000e+00\n  %or.cond209 = select i1 %or.cond207, i1 true, i1 %111, !dbg !3316\n  %spec.select210 = select i1 %or.cond209, double 0x7FF8000000000000, double %88, !dbg !3316\n  br label %common.ret, !dbg !3316\n\noob:                                              ; preds = %top\n  %errorbox = alloca i64, align 8, !dbg !3198\n  store i64 4, i64* %errorbox, align 8, !dbg !3198, !noalias !3277\n  %112 = addrspacecast {} addrspace(10)* %0 to {} addrspace(12)*, !dbg !3198\n  call void @ijl_bounds_error_ints({} addrspace(12)* noundef %112, i64* noundef nonnull align 8 %errorbox, i64 noundef 1) #50, !dbg !3198\n  unreachable, !dbg !3198\n\nidxend:                                           ; preds = %top\n  %113 = addrspacecast {} addrspace(10)* %0 to [2 x double] addrspace(13)* addrspace(11)*, !dbg !3198\n  %arrayptr266 = load [2 x double] addrspace(13)*, [2 x double] addrspace(13)* addrspace(11)* %113, align 16, !dbg !3198, !tbaa !1584, !alias.scope !3318, !noalias !1446, !nonnull !35\n  %arrayref.sroa.0.0..sroa_idx = getelementptr inbounds [2 x double], [2 x double] addrspace(13)* %arrayptr266, i64 3, i64 0, !dbg !3198\n  %arrayref.sroa.0.0.copyload = load double, double addrspace(13)* %arrayref.sroa.0.0..sroa_idx, align 1, !dbg !3198, !tbaa !1360, !alias.scope !1587, !noalias !3319\n  %arrayref.sroa.2.0..sroa_idx256 = getelementptr inbounds [2 x double], [2 x double] addrspace(13)* %arrayptr266, i64 3, i64 1, !dbg !3198\n  %arrayref.sroa.2.0.copyload = load double, double addrspace(13)* %arrayref.sroa.2.0..sroa_idx256, align 1, !dbg !3198, !tbaa !1360, !alias.scope !1587, !noalias !3319\n  %.fca.0.insert254 = insertvalue [2 x double] poison, double %arrayref.sroa.0.0.copyload, 0, !dbg !3320\n  %.fca.1.insert255 = insertvalue [2 x double] %.fca.0.insert254, double %arrayref.sroa.2.0.copyload, 1, !dbg !3320\n  %114 = call fastcc [2 x double] @julia_inv_4319_inner.2([2 x double] %.fca.1.insert255) #49, !dbg !3320\n  %.fca.0.extract250 = extractvalue [2 x double] %114, 0, !dbg !3320\n  %.fca.1.extract251 = extractvalue [2 x double] %114, 1, !dbg !3320\n  %arrayref13.sroa.0.0..sroa_idx = getelementptr inbounds [2 x double], [2 x double] addrspace(13)* %arrayptr266, i64 2, i64 0, !dbg !3321\n  %arrayref13.sroa.0.0.copyload = load double, double addrspace(13)* %arrayref13.sroa.0.0..sroa_idx, align 1, !dbg !3321, !tbaa !1360, !alias.scope !1587, !noalias !3319\n  %arrayref13.sroa.2.0..sroa_idx249 = getelementptr inbounds [2 x double], [2 x double] addrspace(13)* %arrayptr266, i64 2, i64 1, !dbg !3321\n  %arrayref13.sroa.2.0.copyload = load double, double addrspace(13)* %arrayref13.sroa.2.0..sroa_idx249, align 1, !dbg !3321, !tbaa !1360, !alias.scope !1587, !noalias !3319\n  %115 = fneg double %arrayref13.sroa.2.0.copyload, !dbg !3323\n  %116 = fmul double %.fca.1.extract251, %arrayref13.sroa.2.0.copyload, !dbg !3325\n  %117 = fmul double %arrayref13.sroa.0.0.copyload, %.fca.0.extract250, !dbg !3325\n  %118 = fsub double %116, %117, !dbg !3325\n  %119 = fmul double %.fca.0.extract250, %115, !dbg !3327\n  %120 = fmul double %arrayref13.sroa.0.0.copyload, %.fca.1.extract251, !dbg !3328\n  %121 = fsub double %119, %120, !dbg !3328\n  %arrayref24.sroa.0.0..sroa_idx = getelementptr inbounds [2 x double], [2 x double] addrspace(13)* %arrayptr266, i64 1, i64 0, !dbg !3329\n  %arrayref24.sroa.0.0.copyload = load double, double addrspace(13)* %arrayref24.sroa.0.0..sroa_idx, align 1, !dbg !3329, !tbaa !1360, !alias.scope !1587, !noalias !3319\n  %122 = fmul double %.fca.1.extract251, %arrayref24.sroa.0.0.copyload, !dbg !3331\n  %arrayref24.sroa.3.0..sroa_idx248 = getelementptr inbounds [2 x double], [2 x double] addrspace(13)* %arrayptr266, i64 1, i64 1, !dbg !3329\n  %arrayref24.sroa.3.0.copyload = load double, double addrspace(13)* %arrayref24.sroa.3.0..sroa_idx248, align 1, !dbg !3329, !tbaa !1360, !alias.scope !1587, !noalias !3319\n  %123 = fmul double %.fca.0.extract250, %arrayref24.sroa.3.0.copyload, !dbg !3331\n  %124 = fadd double %122, %123, !dbg !3333\n  %125 = fmul double %.fca.0.extract250, %arrayref24.sroa.0.0.copyload, !dbg !3331\n  %126 = fmul double %.fca.1.extract251, %arrayref24.sroa.3.0.copyload, !dbg !3331\n  %127 = fsub double %125, %126, !dbg !3334\n  %arrayref37.sroa.0.0..sroa_idx = getelementptr inbounds [2 x double], [2 x double] addrspace(13)* %arrayptr266, i64 0, i64 0, !dbg !3335\n  %arrayref37.sroa.0.0.copyload = load double, double addrspace(13)* %arrayref37.sroa.0.0..sroa_idx, align 1, !dbg !3335, !tbaa !1360, !alias.scope !1587, !noalias !3319\n  %arrayref37.sroa.2.0..sroa_idx247 = getelementptr inbounds [2 x double], [2 x double] addrspace(13)* %arrayptr266, i64 0, i64 1, !dbg !3335\n  %arrayref37.sroa.2.0.copyload = load double, double addrspace(13)* %arrayref37.sroa.2.0..sroa_idx247, align 1, !dbg !3335, !tbaa !1360, !alias.scope !1587, !noalias !3319\n  %128 = fneg double %arrayref37.sroa.2.0.copyload, !dbg !3337\n  %129 = fmul double %.fca.1.extract251, %arrayref37.sroa.2.0.copyload, !dbg !3339\n  %130 = fmul double %.fca.0.extract250, %arrayref37.sroa.0.0.copyload, !dbg !3339\n  %131 = fsub double %129, %130, !dbg !3339\n  %132 = fmul double %.fca.0.extract250, %128, !dbg !3341\n  %133 = fmul double %.fca.1.extract251, %arrayref37.sroa.0.0.copyload, !dbg !3342\n  %134 = fsub double %132, %133, !dbg !3342\n  %135 = fmul double %118, %118, !dbg !3343\n  %136 = fmul double %121, %121, !dbg !3343\n  %137 = fsub double %135, %136, !dbg !3346\n  %138 = fmul double %118, %121, !dbg !3343\n  %139 = fadd double %138, %138, !dbg !3347\n  %140 = fmul double %118, 2.000000e+00, !dbg !3348\n  %141 = fmul double %121, 2.000000e+00, !dbg !3348\n  %142 = fmul double %140, %137, !dbg !3353\n  %143 = fmul double %141, %139, !dbg !3353\n  %144 = fsub double %142, %143, !dbg !3355\n  %145 = fmul double %140, %139, !dbg !3353\n  %146 = fmul double %141, %137, !dbg !3353\n  %147 = fadd double %145, %146, !dbg !3356\n  %148 = fmul double %118, 9.000000e+00, !dbg !3348\n  %149 = fmul double %121, 9.000000e+00, !dbg !3348\n  %150 = fmul double %148, %127, !dbg !3353\n  %151 = fmul double %149, %124, !dbg !3353\n  %152 = fsub double %150, %151, !dbg !3355\n  %153 = fmul double %148, %124, !dbg !3353\n  %154 = fmul double %149, %127, !dbg !3353\n  %155 = fadd double %153, %154, !dbg !3356\n  %156 = fsub double %144, %152, !dbg !3357\n  %157 = fsub double %147, %155, !dbg !3357\n  %158 = fmul double %131, 2.700000e+01, !dbg !3359\n  %159 = fmul double %134, 2.700000e+01, !dbg !3359\n  %160 = fadd double %156, %158, !dbg !3362\n  %161 = fadd double %157, %159, !dbg !3362\n  %162 = fmul double %127, 3.000000e+00, !dbg !3364\n  %163 = fmul double %124, 3.000000e+00, !dbg !3364\n  %164 = fsub double %137, %162, !dbg !3368\n  %165 = fsub double %139, %163, !dbg !3368\n  %166 = getelementptr inbounds [2 x double], [2 x double]* %newstruct40, i64 0, i64 0, !dbg !3370\n  store double %164, double* %166, align 8, !dbg !3370, !tbaa !1201, !alias.scope !1203, !noalias !3206\n  %167 = getelementptr inbounds [2 x double], [2 x double]* %newstruct40, i64 0, i64 1, !dbg !3370\n  store double %165, double* %167, align 8, !dbg !3370, !tbaa !1201, !alias.scope !1203, !noalias !3206\n  %168 = fmul double %160, %160, !dbg !3371\n  %169 = fmul double %161, %161, !dbg !3371\n  %170 = fsub double %168, %169, !dbg !3374\n  %171 = fmul double %160, %161, !dbg !3371\n  %172 = fadd double %171, %171, !dbg !3375\n  %173 = fmul double %164, 4.000000e+00, !dbg !3376\n  %174 = fmul double %165, 4.000000e+00, !dbg !3376\n  %175 = fmul double %164, %173, !dbg !3380\n  %176 = fmul double %165, %174, !dbg !3380\n  %177 = fsub double %175, %176, !dbg !3382\n  %178 = fmul double %165, %173, !dbg !3380\n  %179 = fmul double %164, %174, !dbg !3380\n  %180 = fadd double %178, %179, !dbg !3383\n  %181 = fmul double %164, %177, !dbg !3384\n  %182 = fmul double %165, %180, !dbg !3384\n  %183 = fsub double %181, %182, !dbg !3387\n  %184 = fmul double %165, %177, !dbg !3384\n  %185 = fmul double %164, %180, !dbg !3384\n  %186 = fadd double %184, %185, !dbg !3388\n  %187 = fsub double %170, %183, !dbg !3389\n  %188 = fsub double %172, %186, !dbg !3389\n  %.fca.0.insert = insertvalue [2 x double] poison, double %187, 0, !dbg !3373\n  %.fca.1.insert = insertvalue [2 x double] %.fca.0.insert, double %188, 1, !dbg !3373\n  %189 = call fastcc [2 x double] @julia_sqrt_4312_inner.3([2 x double] %.fca.1.insert) #48, !dbg !3373\n  %.fca.0.extract244 = extractvalue [2 x double] %189, 0, !dbg !3373\n  %.fca.1.extract245 = extractvalue [2 x double] %189, 1, !dbg !3373\n  %190 = fmul double %160, %.fca.0.extract244, !dbg !3391\n  %191 = fmul double %161, %.fca.1.extract245, !dbg !3394\n  %192 = fadd double %190, %191, !dbg !3394\n  %193 = fcmp ult double %192, 0.000000e+00, !dbg !3395\n  br i1 %193, label %L177, label %L111, !dbg !3393\n}\n", Base.StackTraces.StackFrame[getindex at essentials.jl:13, solve_cubic_eq at example_Enzyme2.jl:16])
└ @ Main /Users/miguelborrero/Documents/refinancing/multistep/example_Enzyme2.jl:105
Stacktrace:
 [1] getindex
   @ ./essentials.jl:13
 [2] solve_cubic_eq
   @ ~/Documents/refinancing/multistep/example_Enzyme2.jl:16

Stacktrace:
  [1] julia_error(cstr::Cstring, val::Ptr{…}, errtype::Enzyme.API.ErrorType, data::Ptr{…}, data2::Ptr{…}, B::Ptr{…})
    @ Enzyme.Compiler ~/.julia/packages/Enzyme/3mqec/src/compiler.jl:2057
  [2] EnzymeCreatePrimalAndGradient(logic::Enzyme.Logic, todiff::LLVM.Function, retType::Enzyme.API.CDIFFE_TYPE, constant_args::Vector{…}, TA::Enzyme.TypeAnalysis, returnValue::Bool, dretUsed::Bool, mode::Enzyme.API.CDerivativeMode, width::Int64, additionalArg::Ptr{…}, forceAnonymousTape::Bool, typeInfo::Enzyme.FnTypeInfo, uncacheable_args::Vector{…}, augmented::Ptr{…}, atomicAdd::Bool)
    @ Enzyme.API ~/.julia/packages/Enzyme/3mqec/src/api.jl:156
  [3] enzyme!(job::GPUCompiler.CompilerJob{…}, mod::LLVM.Module, primalf::LLVM.Function, TT::Type, mode::Enzyme.API.CDerivativeMode, width::Int64, parallel::Bool, actualRetType::Type, wrap::Bool, modifiedBetween::Tuple{…}, returnPrimal::Bool, expectedTapeType::Type, loweredArgs::Set{…}, boxedArgs::Set{…})
    @ Enzyme.Compiler ~/.julia/packages/Enzyme/3mqec/src/compiler.jl:3708
  [4] codegen(output::Symbol, job::GPUCompiler.CompilerJob{…}; libraries::Bool, deferred_codegen::Bool, optimize::Bool, toplevel::Bool, strip::Bool, validate::Bool, only_entry::Bool, parent_job::Nothing)
    @ Enzyme.Compiler ~/.julia/packages/Enzyme/3mqec/src/compiler.jl:5845
  [5] codegen
    @ ~/.julia/packages/Enzyme/3mqec/src/compiler.jl:5123 [inlined]
  [6] _thunk(job::GPUCompiler.CompilerJob{Enzyme.Compiler.EnzymeTarget, Enzyme.Compiler.EnzymeCompilerParams}, postopt::Bool) (repeats 2 times)
    @ Enzyme.Compiler ~/.julia/packages/Enzyme/3mqec/src/compiler.jl:6652
  [7] cached_compilation
    @ ~/.julia/packages/Enzyme/3mqec/src/compiler.jl:6690 [inlined]
  [8] (::Enzyme.Compiler.var"#28587#28588"{…})(ctx::LLVM.Context)
    @ Enzyme.Compiler ~/.julia/packages/Enzyme/3mqec/src/compiler.jl:6759
  [9] JuliaContext(f::Enzyme.Compiler.var"#28587#28588"{…}; kwargs::@Kwargs{})
    @ GPUCompiler ~/.julia/packages/GPUCompiler/nWT2N/src/driver.jl:52
 [10] JuliaContext(f::Function)
    @ GPUCompiler ~/.julia/packages/GPUCompiler/nWT2N/src/driver.jl:42
 [11] #s2010#28586
    @ ~/.julia/packages/Enzyme/3mqec/src/compiler.jl:6710 [inlined]
 [12] 
    @ Enzyme.Compiler ./none:0
 [13] (::Core.GeneratedFunctionStub)(::UInt64, ::LineNumberNode, ::Any, ::Vararg{Any})
    @ Core ./boot.jl:602
 [14] autodiff
    @ ~/.julia/packages/Enzyme/3mqec/src/Enzyme.jl:304 [inlined]
 [15] autodiff
    @ ~/.julia/packages/Enzyme/3mqec/src/Enzyme.jl:321 [inlined]
 [16] macro expansion
    @ ./timing.jl:279 [inlined]
 [17] call_autodiff_example()
    @ Main ~/Documents/refinancing/multistep/example_Enzyme2.jl:114
 [18] top-level scope
    @ ~/Documents/refinancing/multistep/example_Enzyme2.jl:122
 [19] include(fname::String)
    @ Base.MainInclude ./client.jl:489
 [20] top-level scope
    @ REPL[2]:1
in expression starting at /Users/miguelborrero/Documents/refinancing/multistep/example_Enzyme2.jl:122


MWE


using Polynomials
using Combinatorics
using Statistics
using LinearAlgebra
using Enzyme
Enzyme.API.runtimeActivity!(true)

using Logging
using LoggingExtras
using IOLogging

# From PolynomialRoots.jl
function solve_cubic_eq(poly::AbstractVector{Complex{T}}) where T
    # Cubic equation solver for complex polynomial (degree=3)
    # http://en.wikipedia.org/wiki/Cubic_function   Lagrange's method
    a1  =  1 / poly[4]
    E1  = -poly[3]*a1
    E2  =  poly[2]*a1
    E3  = -poly[1]*a1
    s0  =  E1
    E12 =  E1*E1
    A   =  2*E1*E12 - 9*E1*E2 + 27*E3 # = s1^3 + s2^3
    B   =  E12 - 3*E2                 # = s1 s2
    # quadratic equation: z^2 - Az + B^3=0  where roots are equal to s1^3 and s2^3
    Δ = sqrt(A*A - 4*B*B*B)
    if real(conj(A)*Δ)>=0 # scalar product to decide the sign yielding bigger magnitude
        s1 = exp(log(0.5 * (A + Δ)) * (1/3))
    else
        s1 = exp(log(0.5 * (A - Δ)) * (1/3))
    end
    if s1 == 0
        s2 = s1
    else
        s2 = B / s1
    end
    zeta1 = complex(-0.5, sqrt(T(3.0))*0.5)
    zeta2 = conj(zeta1)
    # return third*(s0 + s1 + s2), third*(s0 + s1*zeta2 + s2*zeta1), third*(s0 + s1*zeta1 + s2*zeta2)

    sol1 = (1/3) * (s0 + s1 + s2)
    sol2 = (1/3) * (s0 + s1 * zeta2 + s2 * zeta1)
    sol3 = (1/3) * (s0 + s1 * zeta1 + s2 * zeta2)

    if abs(imag(sol1)) < 1e-8 && real(sol1) > 0.0 && real(sol1) < 1.0
        return real(sol1)
    elseif abs(imag(sol2)) < 1e-8 && real(sol2) > 0.0 && real(sol2) < 1.0
        return real(sol2)
    elseif abs(imag(sol3)) < 1e-8 && real(sol3) > 0.0 && real(sol3) < 1.0
        return real(sol3)
    else
        return NaN
    end
end

function bernstein3_inv(p::AbstractArray{TV, 1}, val::Float64; upper::Float64 = 1.0, lower::Float64 = 0.0) where TV
    # Get this in the form ax^3 + bx^2 + cx + d = 0
    a = p[4] + 3 * p[2] - 3 * p[3] - p[1]
    b = 3 * p[1] - 6 * p[2] + 3 * p[3]
    c = 3 * p[2] - 3 * p[1]
    d = p[1] - val
    coeffs = [d, c, b, a]

    if d >= 0.0 # (poly(0.0))
        return lower
    elseif a + b + c + d <= 0.0 # (poly(1.0))
        return upper
    end

    x = solve_cubic_eq(Complex.(coeffs))
    return x * (upper - lower) + lower
end


function get_ll_single(params::AbstractArray{TV, 1}) where TV

    implied_jump_bid_inv(val::Float64) = bernstein3_inv(params, val; upper = 6.0 + 2.0, lower = 0.0 - 2.0)

    u_current = 0.5

    likelihood = 2*implied_jump_bid_inv(u_current)

    return log(likelihood)

end

function call_autodiff_example()

    params = [-1.0, 0.0, 0.0, 0.0]

    dx = zeros(length(params))

    single_ll(x) = get_ll_single(x)

    # Create an in-memory buffer
    logfile = open("log_output.txt", "w")

    # Set up a logger
    logger = SimpleLogger(logfile, Logging.Info)
    with_logger(logger) do
        try
        println(@time autodiff(Reverse, single_ll, Active, Duplicated(params, dx)))
        catch e
            @error "An error occurred: $e"
        finally

            println("Log content from in-memory buffer:")
            close(logfile)

        end
    end

    @time autodiff(Reverse, single_ll, Active, Duplicated(params, dx))
    #cfg1 = ForwardDiff.GradientConfig(single_ll, params, ForwardDiff.Chunk{9}())
    #println(@time ForwardDiff.gradient!(dx, single_ll, params, cfg1))

    println(dx)

end

call_autodiff_example()

Thanks a lot in advance!

miguelborrero5 avatar Jul 01 '24 19:07 miguelborrero5

It appears like the log file, which I am just copying and pasting from a .txt file, is not being copied with line breaks. I am not sure how to fix this for a better format. Is there something I can do to improve the info provided?

miguelborrero5 avatar Jul 01 '24 19:07 miguelborrero5

Is there something I can do to improve the info provided?

gist.github.com is a good place for large logs.

vchuravy avatar Jul 02 '24 17:07 vchuravy

I think the point is that when I copy the content of the log file (see screenshot)

Captura de pantalla 2024-07-02 a la(s) 14 12 23

The content appears without line braks. This also happens in the gist.github.com. So my question to @wsmoses was whether he could read it properly in the format or I could present it some other way more clearly for convenience.

miguelborrero5 avatar Jul 02 '24 17:07 miguelborrero5

Yeah I successfully managed to read it [pasted the error into sublime and find and replaced to add back the newlines].

Unfortunately this is one of the nastier types of errors to debug.

Would you be able tor educe the size and complexity of your code to something more minimal [then we'll be able to work to fix it more quickly]

wsmoses avatar Jul 06 '24 04:07 wsmoses

Glad to hear this and sorry for the inconvenience with the log file. I have reduced the code further (see below). Basically now it boils down to not working because of the function solve_cubic_equation() since if I comment out that line it works. Moreover, I thought it could be because if the AbstractVector{Complex{T}} but it can not only be that since using the same function but deleting the body and returning just the firm element of the first argument poly makes it work. So it must be something within the function. I need this function in my code so it would be great if it worked.

using Polynomials
using Enzyme
Enzyme.API.runtimeActivity!(true)

# From PolynomialRoots.jl
function solve_cubic_eq(poly::AbstractVector{Complex{T}}) where T
    # Cubic equation solver for complex polynomial (degree=3)
    # http://en.wikipedia.org/wiki/Cubic_function   Lagrange's method
    a1  =  1 / poly[4]
    E1  = -poly[3]*a1
    E2  =  poly[2]*a1
    E3  = -poly[1]*a1
    s0  =  E1
    E12 =  E1*E1
    A   =  2*E1*E12 - 9*E1*E2 + 27*E3 # = s1^3 + s2^3
    B   =  E12 - 3*E2                 # = s1 s2
    # quadratic equation: z^2 - Az + B^3=0  where roots are equal to s1^3 and s2^3
    Δ = sqrt(A*A - 4*B*B*B)
    if real(conj(A)*Δ)>=0 # scalar product to decide the sign yielding bigger magnitude
        s1 = exp(log(0.5 * (A + Δ)) * (1/3))
    else
        s1 = exp(log(0.5 * (A - Δ)) * (1/3))
    end
    if s1 == 0
        s2 = s1
    else
        s2 = B / s1
    end
    zeta1 = complex(-0.5, sqrt(T(3.0))*0.5)
    zeta2 = conj(zeta1)
    # return third*(s0 + s1 + s2), third*(s0 + s1*zeta2 + s2*zeta1), third*(s0 + s1*zeta1 + s2*zeta2)

    sol1 = (1/3) * (s0 + s1 + s2)
    sol2 = (1/3) * (s0 + s1 * zeta2 + s2 * zeta1)
    sol3 = (1/3) * (s0 + s1 * zeta1 + s2 * zeta2)

    if abs(imag(sol1)) < 1e-8 && real(sol1) > 0.0 && real(sol1) < 1.0
        return real(sol1)
    elseif abs(imag(sol2)) < 1e-8 && real(sol2) > 0.0 && real(sol2) < 1.0
        return real(sol2)
    elseif abs(imag(sol3)) < 1e-8 && real(sol3) > 0.0 && real(sol3) < 1.0
        return real(sol3)
    else
        return NaN
    end
end

function get_ll_single(params::AbstractArray{TV, 1}) where TV

    likelihood = solve_cubic_eq(Complex.(params))

    return params[1]

end

function call_autodiff_example()

    params = [-1.0, 0.0, 0.0, 0.0]

    dx = zeros(length(params))

    autodiff(Reverse, get_ll_single, Active, Duplicated(params, dx))


end

call_autodiff_example()

Thanks a lot again!

miguelborrero5 avatar Jul 07 '24 00:07 miguelborrero5

(base) wmoses@Williams-MacBook-Pro-3 Enzyme.jl % cat poly.jl 
using Enzyme

Enzyme.API.printall!(true)

function solve_cubic_eq(a, poly::AbstractVector{Complex{T}}) where T
    a1  =  1 / @inbounds poly[1]
    E1  = -a*a1
    E12 =  E1*E1
	s1 = log(E12)
	return nothing
end

autodiff_thunk(ReverseSplitNoPrimal, Const{typeof(solve_cubic_eq)}, Const, Active{Complex{Float64}}, Duplicated{Vector{Complex{Float64}}})

wsmoses avatar Jul 24 '24 20:07 wsmoses

Hi William, thanks a lot for your effort! Two things

  1. whats the purpose/necessity of the new first argument?
  2. I get this error:
ERROR: LoadError: MethodError: no method matching solve_cubic_eq(::ComplexF64, ::Vector{ComplexF64})
The applicable method may be too new: running in world age 31477, while current world is 31483.

Closest candidates are:
  solve_cubic_eq(::Any, ::AbstractArray{Complex{T}, 1}) where T (method too new to be called from this world context.)
   @ Main ~/Documents/refinancing/multistep/example_Enzyme3.jl:7

Stacktrace:
 [1] macro expansion
   @ ~/.julia/packages/Enzyme/3mqec/src/utils.jl:0 [inlined]
 [2] codegen_world_age(ft::Type{typeof(solve_cubic_eq)}, tt::Type{Tuple{ComplexF64, Vector{ComplexF64}}})
   @ Enzyme ~/.julia/packages/Enzyme/3mqec/src/utils.jl:168
 [3] autodiff_thunk(::EnzymeCore.ReverseModeSplit{…}, ::Type{…}, ::Type{…}, ::Type{…}, ::Type{…})
   @ Enzyme ~/.julia/packages/Enzyme/3mqec/src/Enzyme.jl:610
 [4] call_autodiff_example()
   @ Main ~/Documents/refinancing/multistep/example_Enzyme3.jl:64
 [5] top-level scope
   @ ~/Documents/refinancing/multistep/example_Enzyme3.jl:69
 [6] include(fname::String)
   @ Base.MainInclude ./client.jl:489
 [7] top-level scope
   @ REPL[2]:1
in expression starting at /Users/miguelborrero/Documents/refinancing/multistep/example_Enzyme3.jl:69
Some type information was truncated. Use `show(err)` to see complete types.

miguelborrero5 avatar Jul 24 '24 21:07 miguelborrero5

reduced to

using Enzyme

Enzyme.API.printall!(true)
Enzyme.API.instname!(true)

function solve_cubic_eq(poly::AbstractVector{Complex{T}}) where T
    a1  =  1 / @inbounds poly[1]
    E1  = 2*a1
    E12 =  E1*E1
	s1 = log(E12)
	return nothing
end

autodiff_thunk(ReverseSplitNoPrimal, Const{typeof(solve_cubic_eq)}, Const, Duplicated{Vector{Complex{Float64}}})

will be ixed by https://github.com/EnzymeAD/Enzyme/pull/2010

wsmoses avatar Jul 25 '24 00:07 wsmoses

@wsmoses thanks for your comment but my example is not working for me.

miguelborrero5 avatar Jul 26 '24 15:07 miguelborrero5

Can you confirm what version of Enzyme you're on (note you need to be on latest main, not a release)

wsmoses avatar Jul 26 '24 19:07 wsmoses

Okay I did not know that, its working now! Thanks a lot, you're incredible! Grateful!

miguelborrero5 avatar Jul 26 '24 23:07 miguelborrero5