Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

Enzyme doesn't work for AdvancedVI Part IV: Bijectors + mapreduce with initial condition #1561

Closed
Red-Portal opened this issue Jun 24, 2024 · 6 comments · Fixed by #1567
Closed

Comments

@Red-Portal
Copy link

Red-Portal commented Jun 24, 2024

For this one, I could not quite distill it further, which I apologize in advance. Let me know if more digging into Bijectors would be necessary:

using Enzyme, Distributions, LinearAlgebra, SimpleUnPack, Bijectors, Optimisers, Random, ADTypes, Bijectors, Functors

struct MvLocationScale{
    S, D <: ContinuousDistribution, L, E
} <: ContinuousMultivariateDistribution
    location ::L
    scale    ::S
    dist     ::D
    scale_eps::E
end

Base.length(q::MvLocationScale) = length(q.location)

@functor MvLocationScale (location, scale)

function Distributions.rand(
    rng::AbstractRNG, q::MvLocationScale{S, D, L}, num_samples::Int
)  where {S, D, L}
    (; location, scale, dist) = q
    n_dims = length(location)
    scale*rand(rng, dist, n_dims, num_samples) .+ location
end

function catsamples_and_acc(
    state_curr::Tuple{<:AbstractArray,  <:Real},
    state_new ::Tuple{<:AbstractVector, <:Real}
)
    x  = hcat(first(state_curr), first(state_new))
    ∑y = last(state_curr) + last(state_new)
    return (x, ∑y)
end

function reparam_with_entropy(
    rng      ::Random.AbstractRNG,
    q        ::Bijectors.TransformedDistribution,
)
    q_unconst      = q.dist
    transform      = q.transform
    
    unconstr_samples = rand(rng, q_unconst, 33)

    # Apply bijector to samples while estimating its jacobian
    unconstr_iter = eachcol(unconstr_samples)
    unconstr_init = first(unconstr_iter)
    samples_init, logjac_init = with_logabsdet_jacobian(transform, unconstr_init)
    samples_and_logjac = mapreduce(
        catsamples_and_acc,
        Iterators.drop(unconstr_iter, 1);
        init=(reshape(samples_init, (:,1)), logjac_init),
    ) do sample
        with_logabsdet_jacobian(transform, unconstr_init)
    end
    samples = first(samples_and_logjac)
    logjac  = last(samples_and_logjac)
    samples, logjac
end

function f(params, aux)
	(; rng, restructure) = aux
    q = restructure(params)
    samples, ent = reparam_with_entropy(rng, q)
	sum(samples)
end

function main()
	d = 10
	m = zeros(d)
	C = LowerTriangular(Matrix(I, d, d))
	q = MvLocationScale(m, C, Normal(), 1e-5)
	
	b = Bijectors.Stacked([bijector(LogNormal(0,1)), identity], [1:1, 2:10])
    binv = inverse(b)
	q = Bijectors.TransformedDistribution(q, binv)
	
	params, re = Optimisers.destructure(q)
	
	aux = (
		rng         = Random.default_rng(),
		restructure = re,
	)
	
	display(f(params, aux))

	x = ones(length(params))
	∇x = zeros(length(params))
	Enzyme.API.runtimeActivity!(true)
	Enzyme.autodiff(Enzyme.ReverseWithPrimal, f, Enzyme.Active, Enzyme.Duplicated(x, ∇x), Enzyme.Const(aux))
	∇x
end

This yields:

ERROR: Enzyme compilation failed due to illegal type analysis.
Current scope: 
; Function Attrs: mustprogress willreturn
define internal fastcc nonnull "enzyme_type"="{[-1]:Pointer, [-1,-1]:Pointer}" {} addrspace(10)* @preprocess_julia__foldl_impl_11499({ { { {} addrspace(10)*, { [1 x [1 x i64]], i64 }, i64, i64 }, { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64, i64 } } } addrspace(11)* nocapture nofree noundef nonnull readonly align 8 dereferenceable(80) "enzyme_type"="{[-1]:Pointer, [-1,0]:Pointer, [-1,0,0]:Pointer, [-1,0,0,-1]:Float@double, [-1,0,8]:Integer, [-1,0,9]:Integer, [-1,0,10]:Integer, [-1,0,11]:Integer, [-1,0,12]:Integer, [-1,0,13]:Integer, [-1,0,14]:Integer, [-1,0,15]:Integer, [-1,0,16]:Integer, [-1,0,17]:Integer, [-1,0,18]:Integer, [-1,0,19]:Integer, [-1,0,20]:Integer, [-1,0,21]:Integer, [-1,0,22]:Integer, [-1,0,23]:Integer, [-1,0,24]:Integer, [-1,0,25]:Integer, [-1,0,26]:Integer, [-1,0,27]:Integer, [-1,0,28]:Integer, [-1,0,29]:Integer, [-1,0,30]:Integer, [-1,0,31]:Integer, [-1,0,32]:Integer, [-1,0,33]:Integer, [-1,0,34]:Integer, [-1,0,35]:Integer, [-1,0,36]:Integer, [-1,0,37]:Integer, [-1,0,38]:Integer, [-1,0,39]: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, [-1,40]:Pointer, [-1,40,0]:Pointer, [-1,40,0,0]:Pointer, [-1,40,8]:Integer, [-1,40,9]:Integer, [-1,40,10]:Integer, [-1,40,11]:Integer, [-1,40,12]:Integer, [-1,40,13]:Integer, [-1,40,14]:Integer, [-1,40,15]:Integer, [-1,40,16]:Integer, [-1,40,17]:Integer, [-1,40,18]:Integer, [-1,40,19]:Integer, [-1,40,20]:Integer, [-1,40,21]:Integer, [-1,40,22]:Integer, [-1,40,23]:Integer, [-1,40,24]:Integer, [-1,40,25]:Integer, [-1,40,26]:Integer, [-1,40,27]:Integer, [-1,40,28]:Integer, [-1,40,29]:Integer, [-1,40,30]:Integer, [-1,40,31]:Integer, [-1,40,32]:Integer, [-1,40,33]:Integer, [-1,40,34]:Integer, [-1,40,35]:Integer, [-1,40,36]:Integer, [-1,40,37]:Integer, [-1,40,38]:Integer, [-1,40,39]:Integer, [-1,48]:Pointer, [-1,48,0]:Pointer, [-1,48,0,-1]:Integer, [-1,48,8]:Integer, [-1,48,9]:Integer, [-1,48,10]:Integer, [-1,48,11]:Integer, [-1,48,12]:Integer, [-1,48,13]:Integer, [-1,48,14]:Integer, [-1,48,15]:Integer, [-1,48,16]:Integer, [-1,48,17]:Integer, [-1,48,18]:Integer, [-1,48,19]:Integer, [-1,48,20]:Integer, [-1,48,21]:Integer, [-1,48,22]:Integer, [-1,48,23]:Integer, [-1,48,24]:Integer, [-1,48,25]:Integer, [-1,48,26]:Integer, [-1,48,27]:Integer, [-1,48,28]:Integer, [-1,48,29]:Integer, [-1,48,30]:Integer, [-1,48,31]:Integer, [-1,48,32]:Integer, [-1,48,33]:Integer, [-1,48,34]:Integer, [-1,48,35]:Integer, [-1,48,36]:Integer, [-1,48,37]:Integer, [-1,48,38]:Integer, [-1,48,39]:Integer, [-1,56]:Pointer, [-1,56,0]:Pointer, [-1,56,0,-1]:Integer, [-1,56,8]:Integer, [-1,56,9]:Integer, [-1,56,10]:Integer, [-1,56,11]:Integer, [-1,56,12]:Integer, [-1,56,13]:Integer, [-1,56,14]:Integer, [-1,56,15]:Integer, [-1,56,16]:Integer, [-1,56,17]:Integer, [-1,56,18]:Integer, [-1,56,19]:Integer, [-1,56,20]:Integer, [-1,56,21]:Integer, [-1,56,22]:Integer, [-1,56,23]:Integer, [-1,56,24]:Integer, [-1,56,25]:Integer, [-1,56,26]:Integer, [-1,56,27]:Integer, [-1,56,28]:Integer, [-1,56,29]:Integer, [-1,56,30]:Integer, [-1,56,31]:Integer, [-1,56,32]:Integer, [-1,56,33]:Integer, [-1,56,34]:Integer, [-1,56,35]:Integer, [-1,56,36]:Integer, [-1,56,37]:Integer, [-1,56,38]:Integer, [-1,56,39]:Integer, [-1,64]:Integer, [-1,65]:Integer, [-1,66]:Integer, [-1,67]:Integer, [-1,68]:Integer, [-1,69]:Integer, [-1,70]:Integer, [-1,71]:Integer, [-1,72]:Integer, [-1,73]:Integer, [-1,74]:Integer, [-1,75]:Integer, [-1,76]:Integer, [-1,77]:Integer, [-1,78]:Integer, [-1,79]:Integer}" "enzymejl_parmtype"="139840057972816" "enzymejl_parmtype_ref"="1" %0, { {} addrspace(10)*, double } addrspace(11)* nocapture nofree noundef nonnull readonly align 8 dereferenceable(16) "enzyme_type"="{[-1]:Pointer, [-1,0]:Pointer, [-1,0,0]:Pointer, [-1,0,0,-1]:Float@double, [-1,0,8]:Integer, [-1,0,9]:Integer, [-1,0,10]:Integer, [-1,0,11]:Integer, [-1,0,12]:Integer, [-1,0,13]:Integer, [-1,0,14]:Integer, [-1,0,15]:Integer, [-1,0,16]:Integer, [-1,0,17]:Integer, [-1,0,18]:Integer, [-1,0,19]:Integer, [-1,0,20]:Integer, [-1,0,21]:Integer, [-1,0,22]:Integer, [-1,0,23]:Integer, [-1,0,24]:Integer, [-1,0,25]:Integer, [-1,0,26]:Integer, [-1,0,27]:Integer, [-1,0,28]:Integer, [-1,0,29]:Integer, [-1,0,30]:Integer, [-1,0,31]:Integer, [-1,0,32]:Integer, [-1,0,33]:Integer, [-1,0,34]:Integer, [-1,0,35]:Integer, [-1,0,36]:Integer, [-1,0,37]:Integer, [-1,0,38]:Integer, [-1,0,39]:Integer, [-1,8]:Float@double}" "enzymejl_parmtype"="139840099827408" "enzymejl_parmtype_ref"="1" %1, { { {} addrspace(10)*, { i64 }, [1 x [1 x i64]] }, i64 } addrspace(11)* nocapture nofree noundef nonnull readonly align 8 dereferenceable(32) "enzyme_type"="{[-1]:Pointer, [-1,0]:Pointer, [-1,0,0]:Pointer, [-1,0,0,-1]:Float@double, [-1,0,8]:Integer, [-1,0,9]:Integer, [-1,0,10]:Integer, [-1,0,11]:Integer, [-1,0,12]:Integer, [-1,0,13]:Integer, [-1,0,14]:Integer, [-1,0,15]:Integer, [-1,0,16]:Integer, [-1,0,17]:Integer, [-1,0,18]:Integer, [-1,0,19]:Integer, [-1,0,20]:Integer, [-1,0,21]:Integer, [-1,0,22]:Integer, [-1,0,23]:Integer, [-1,0,24]:Integer, [-1,0,25]:Integer, [-1,0,26]:Integer, [-1,0,27]:Integer, [-1,0,28]:Integer, [-1,0,29]:Integer, [-1,0,30]:Integer, [-1,0,31]:Integer, [-1,0,32]:Integer, [-1,0,33]:Integer, [-1,0,34]:Integer, [-1,0,35]:Integer, [-1,0,36]:Integer, [-1,0,37]:Integer, [-1,0,38]:Integer, [-1,0,39]: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}" "enzymejl_parmtype"="139840182626000" "enzymejl_parmtype_ref"="1" %2) unnamed_addr #26 !dbg !399 {
top:
  %3 = call noalias nonnull dereferenceable(8) dereferenceable_or_null(8) i8* @malloc(i64 8), !enzyme_fromstack !372
  %newstruct = bitcast i8* %3 to [1 x i64]*, !enzyme_caststack !15
  %4 = call noalias nonnull dereferenceable(8) dereferenceable_or_null(8) i8* @malloc(i64 8), !enzyme_fromstack !372
  %newstruct12 = bitcast i8* %4 to [1 x i64]*, !enzyme_caststack !15
  %5 = call {}*** @julia.get_pgcstack() #27
  %current_task155 = getelementptr inbounds {}**, {}*** %5, i64 -14
  %current_task1 = bitcast {}*** %current_task155 to {}**
  %ptls_field56 = getelementptr inbounds {}**, {}*** %5, i64 2
  %6 = bitcast {}*** %ptls_field56 to i64***
  %ptls_load5758 = load i64**, i64*** %6, align 8, !tbaa !16
  %7 = getelementptr inbounds i64*, i64** %ptls_load5758, i64 2
  %safepoint = load i64*, i64** %7, align 8, !tbaa !20
  fence syncscope("singlethread") seq_cst
  call void @julia.safepoint(i64* %safepoint) #27, !dbg !400
  fence syncscope("singlethread") seq_cst
  %8 = call fastcc nonnull {} addrspace(10)* @julia_iterate_11520({ { {} addrspace(10)*, { i64 }, [1 x [1 x i64]] }, i64 } addrspace(11)* nocapture nofree noundef nonnull readonly align 8 dereferenceable(32) %2) #27, !dbg !401
  %9 = addrspacecast {} addrspace(10)* %8 to {} addrspace(11)*, !dbg !402
  %.not = icmp eq {} addrspace(11)* %9, addrspacecast ({}* inttoptr (i64 139842539216904 to {}*) to {} addrspace(11)*), !dbg !402
  br i1 %.not, label %L4, label %L5, !dbg !402

L10.common.ret.loopexit_crit_edge:                ; preds = %guard_exit48
  store i64 %23, i64* %36, align 8, !dbg !403, !tbaa !37, !alias.scope !39, !noalias !408
  br label %common.ret, !dbg !411

common.ret:                                       ; preds = %guard_exit39, %L4, %L10.common.ret.loopexit_crit_edge
  %common.ret.op = phi {} addrspace(10)* [ %box, %L4 ], [ %41, %L10.common.ret.loopexit_crit_edge ], [ %17, %guard_exit39 ]
  ret {} addrspace(10)* %common.ret.op, !dbg !412

L4:                                               ; preds = %top
  %box = call noalias nonnull dereferenceable(16) "enzyme_type"="{[-1]:Pointer, [-1,0]:Pointer, [-1,0,0]:Pointer, [-1,0,0,-1]:Float@double, [-1,0,8]:Integer, [-1,0,9]:Integer, [-1,0,10]:Integer, [-1,0,11]:Integer, [-1,0,12]:Integer, [-1,0,13]:Integer, [-1,0,14]:Integer, [-1,0,15]:Integer, [-1,0,16]:Integer, [-1,0,17]:Integer, [-1,0,18]:Integer, [-1,0,19]:Integer, [-1,0,20]:Integer, [-1,0,21]:Integer, [-1,0,22]:Integer, [-1,0,23]:Integer, [-1,0,24]:Integer, [-1,0,25]:Integer, [-1,0,26]:Integer, [-1,0,27]:Integer, [-1,0,28]:Integer, [-1,0,29]:Integer, [-1,0,30]:Integer, [-1,0,31]:Integer, [-1,0,32]:Integer, [-1,0,33]:Integer, [-1,0,34]:Integer, [-1,0,35]:Integer, [-1,0,36]:Integer, [-1,0,37]:Integer, [-1,0,38]:Integer, [-1,0,39]:Integer, [-1,8]:Float@double}" {} addrspace(10)* @julia.gc_alloc_obj({}** nonnull %current_task1, i64 noundef 16, {} addrspace(10)* noundef addrspacecast ({}* inttoptr (i64 139840099827408 to {}*) to {} addrspace(10)*)) #28, !dbg !402
  %10 = bitcast {} addrspace(10)* %box to i8 addrspace(10)*, !dbg !402
  %11 = bitcast { {} addrspace(10)*, double } addrspace(11)* %1 to i8 addrspace(11)*, !dbg !402
  call void @llvm.memcpy.p10i8.p11i8.i64(i8 addrspace(10)* nocapture nofree noundef nonnull align 8 dereferenceable(16) %10, i8 addrspace(11)* nocapture nofree noundef nonnull readonly align 8 dereferenceable(16) %11, i64 noundef 16, i1 noundef false) #27, !dbg !402, !tbaa !51, !alias.scope !52, !noalias !413
  br label %common.ret

L5:                                               ; preds = %top
  %12 = getelementptr inbounds { { { {} addrspace(10)*, { [1 x [1 x i64]], i64 }, i64, i64 }, { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64, i64 } } }, { { { {} addrspace(10)*, { [1 x [1 x i64]], i64 }, i64, i64 }, { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64, i64 } } } addrspace(11)* %0, i64 0, i32 0, i32 1, !dbg !414
  %13 = getelementptr inbounds { { { {} addrspace(10)*, { [1 x [1 x i64]], i64 }, i64, i64 }, { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64, i64 } } }, { { { {} addrspace(10)*, { [1 x [1 x i64]], i64 }, i64, i64 }, { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64, i64 } } } addrspace(11)* %0, i64 0, i32 0, i32 0, !dbg !414
  %14 = call fastcc nonnull {} addrspace(10)* @julia_with_logabsdet_jacobian_11509({ {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64, i64 } addrspace(11)* nocapture nofree noundef nonnull readonly align 8 dereferenceable(40) %12, { {} addrspace(10)*, { [1 x [1 x i64]], i64 }, i64, i64 } addrspace(11)* nocapture nofree noundef nonnull readonly align 8 dereferenceable(80) %13) #27, !dbg !414
  %box4 = call noalias nonnull dereferenceable(16) "enzyme_type"="{[-1]:Pointer, [-1,0]:Pointer, [-1,0,0]:Pointer, [-1,0,0,-1]:Float@double, [-1,0,8]:Integer, [-1,0,9]:Integer, [-1,0,10]:Integer, [-1,0,11]:Integer, [-1,0,12]:Integer, [-1,0,13]:Integer, [-1,0,14]:Integer, [-1,0,15]:Integer, [-1,0,16]:Integer, [-1,0,17]:Integer, [-1,0,18]:Integer, [-1,0,19]:Integer, [-1,0,20]:Integer, [-1,0,21]:Integer, [-1,0,22]:Integer, [-1,0,23]:Integer, [-1,0,24]:Integer, [-1,0,25]:Integer, [-1,0,26]:Integer, [-1,0,27]:Integer, [-1,0,28]:Integer, [-1,0,29]:Integer, [-1,0,30]:Integer, [-1,0,31]:Integer, [-1,0,32]:Integer, [-1,0,33]:Integer, [-1,0,34]:Integer, [-1,0,35]:Integer, [-1,0,36]:Integer, [-1,0,37]:Integer, [-1,0,38]:Integer, [-1,0,39]:Integer, [-1,8]:Float@double}" {} addrspace(10)* @julia.gc_alloc_obj({}** nonnull %current_task1, i64 noundef 16, {} addrspace(10)* noundef addrspacecast ({}* inttoptr (i64 139840099827408 to {}*) to {} addrspace(10)*)) #28, !dbg !417
  %15 = bitcast {} addrspace(10)* %box4 to i8 addrspace(10)*, !dbg !417
  %16 = bitcast { {} addrspace(10)*, double } addrspace(11)* %1 to i8 addrspace(11)*, !dbg !417
  call void @llvm.memcpy.p10i8.p11i8.i64(i8 addrspace(10)* nocapture nofree noundef nonnull align 8 dereferenceable(16) %15, i8 addrspace(11)* nofree noundef nonnull align 8 dereferenceable(16) %16, i64 noundef 16, i1 noundef false) #27, !dbg !417, !tbaa !51, !alias.scope !52, !noalias !413
  %17 = call nonnull "enzyme_type"="{[-1]:Pointer}" {} addrspace(10)* ({} addrspace(10)* ({} addrspace(10)*, {} addrspace(10)**, i32)*, {} addrspace(10)*, ...) @julia.call({} addrspace(10)* ({} addrspace(10)*, {} addrspace(10)**, i32)* noundef nonnull @ijl_apply_generic, {} addrspace(10)* noundef addrspacecast ({}* inttoptr (i64 139840593410080 to {}*) to {} addrspace(10)*), {} addrspace(10)* nofree nonnull %box4, {} addrspace(10)* nonnull %14) #29, !dbg !417
  %18 = call "enzyme_type"="{[-1]:Pointer}" {} addrspace(10)* @julia.typeof({} addrspace(10)* nonnull %8) #30, !dbg !400
  %19 = addrspacecast {} addrspace(10)* %18 to {} addrspace(11)*
  %20 = call nonnull {}* @julia.pointer_from_objref({} addrspace(11)* %19) #30, !dbg !400
  %exactly_isa = icmp eq {}* %20, inttoptr (i64 139840183838672 to {}*)
  br i1 %exactly_isa, label %guard_pass38, label %guard_exit39

L29:                                              ; preds = %guard_exit48, %L29.lr.ph
  %iv = phi i64 [ %iv.next, %guard_exit48 ], [ 0, %L29.lr.ph ]
  %21 = phi { [1 x i64], i64 } [ %guard_res41.extract.1, %L29.lr.ph ], [ %unbox49.unpack6278, %guard_exit48 ]
  %value_phi118 = phi {} addrspace(10)* [ %17, %L29.lr.ph ], [ %41, %guard_exit48 ]
  %22 = add i64 %.fca.1.extract116, %iv, !dbg !418
  %iv.next = add nuw nsw i64 %iv, 1, !dbg !418
  %23 = add i64 %22, 1, !dbg !418
  %bitcast = load i64, i64 addrspace(11)* %37, align 8, !dbg !420, !tbaa !20, !alias.scope !75, !noalias !76
  %.not80 = icmp ult i64 %22, %bitcast, !dbg !425
  br i1 %.not80, label %L42, label %L39, !dbg !424

L39:                                              ; preds = %L29
  store i64 %23, i64* %36, align 8, !dbg !403, !tbaa !37, !alias.scope !39, !noalias !408
  %24 = getelementptr inbounds { { {} addrspace(10)*, { i64 }, [1 x [1 x i64]] }, i64 }, { { {} addrspace(10)*, { i64 }, [1 x [1 x i64]] }, i64 } addrspace(11)* %2, i64 0, i32 0, !dbg !426
  %25 = addrspacecast [1 x i64]* %newstruct to [1 x i64] addrspace(11)*, !dbg !424
  call fastcc void @julia_throw_boundserror_11505({ {} addrspace(10)*, { i64 }, [1 x [1 x i64]] } addrspace(11)* nocapture nofree noundef nonnull readonly align 8 dereferenceable(32) %24, [1 x i64] addrspace(11)* nocapture nofree noundef nonnull readonly align 8 dereferenceable(8) %25) #31, !dbg !424
  unreachable, !dbg !424

L42:                                              ; preds = %L29
  store i64 %23, i64* %38, align 8, !dbg !427, !tbaa !37, !alias.scope !39, !noalias !408
  %unbox13 = load i64, i64 addrspace(11)* %39, align 8, !dbg !429, !tbaa !20, !alias.scope !75, !noalias !76
  %boundscheck = icmp eq i64 %unbox13, 1, !dbg !429
  br i1 %boundscheck, label %guard_exit48, label %fail, !dbg !429

fail:                                             ; preds = %L42
  %26 = addrspacecast [1 x i64]* %newstruct12 to i8 addrspace(11)*, !dbg !429
  call void @ijl_bounds_error_unboxed_int(i8 addrspace(11)* noundef %26, {}* noundef nonnull inttoptr (i64 139842365093776 to {}*), i64 %unbox13) #31, !dbg !429
  unreachable, !dbg !429

guard_pass38:                                     ; preds = %L5
  %27 = bitcast {} addrspace(10)* %8 to { { {} addrspace(10)*, { [1 x [1 x i64]], i64 }, i64, i64 }, { [1 x i64], i64 } } addrspace(10)*
  %unbox40.elt = bitcast {} addrspace(10)* %8 to { {} addrspace(10)*, { [1 x [1 x i64]], i64 }, i64, i64 } addrspace(10)*
  %unbox40.unpack.elt = bitcast {} addrspace(10)* %8 to {} addrspace(10)* addrspace(10)*
  %unbox40.unpack.unpack = load {} addrspace(10)*, {} addrspace(10)* addrspace(10)* %unbox40.unpack.elt, align 8, !tbaa !94, !alias.scope !97, !noalias !98
  %28 = insertvalue { {} addrspace(10)*, { [1 x [1 x i64]], i64 }, i64, i64 } undef, {} addrspace(10)* %unbox40.unpack.unpack, 0
  %29 = getelementptr inbounds { {} addrspace(10)*, { [1 x [1 x i64]], i64 }, i64, i64 }, { {} addrspace(10)*, { [1 x [1 x i64]], i64 }, i64, i64 } addrspace(10)* %unbox40.elt, i64 0, i32 1, i32 0, i64 0, i64 0
  %unbox40.unpack.unpack97.unpack.unpack.unpack = load i64, i64 addrspace(10)* %29, align 8, !tbaa !94, !alias.scope !97, !noalias !98
  %unbox40.unpack.unpack97.unpack.unpack107 = insertvalue [1 x i64] undef, i64 %unbox40.unpack.unpack97.unpack.unpack.unpack, 0
  %unbox40.unpack.unpack97.unpack106 = insertvalue [1 x [1 x i64]] undef, [1 x i64] %unbox40.unpack.unpack97.unpack.unpack107, 0
  %30 = insertvalue { [1 x [1 x i64]], i64 } undef, [1 x [1 x i64]] %unbox40.unpack.unpack97.unpack106, 0
  %unbox40.unpack.unpack97.elt103 = getelementptr inbounds { {} addrspace(10)*, { [1 x [1 x i64]], i64 }, i64, i64 }, { {} addrspace(10)*, { [1 x [1 x i64]], i64 }, i64, i64 } addrspace(10)* %unbox40.elt, i64 0, i32 1, i32 1
  %unbox40.unpack.unpack97.unpack104 = load i64, i64 addrspace(10)* %unbox40.unpack.unpack97.elt103, align 8, !tbaa !94, !alias.scope !97, !noalias !98
  %unbox40.unpack.unpack97105 = insertvalue { [1 x [1 x i64]], i64 } %30, i64 %unbox40.unpack.unpack97.unpack104, 1
  %31 = insertvalue { {} addrspace(10)*, { [1 x [1 x i64]], i64 }, i64, i64 } %28, { [1 x [1 x i64]], i64 } %unbox40.unpack.unpack97105, 1
  %unbox40.unpack.elt98 = getelementptr inbounds { {} addrspace(10)*, { [1 x [1 x i64]], i64 }, i64, i64 }, { {} addrspace(10)*, { [1 x [1 x i64]], i64 }, i64, i64 } addrspace(10)* %unbox40.elt, i64 0, i32 2
  %unbox40.unpack.unpack99 = load i64, i64 addrspace(10)* %unbox40.unpack.elt98, align 8, !tbaa !94, !alias.scope !97, !noalias !98
  %32 = insertvalue { {} addrspace(10)*, { [1 x [1 x i64]], i64 }, i64, i64 } %31, i64 %unbox40.unpack.unpack99, 2
  %unbox40.unpack.elt100 = getelementptr inbounds { {} addrspace(10)*, { [1 x [1 x i64]], i64 }, i64, i64 }, { {} addrspace(10)*, { [1 x [1 x i64]], i64 }, i64, i64 } addrspace(10)* %unbox40.elt, i64 0, i32 3
  %unbox40.unpack.unpack101 = load i64, i64 addrspace(10)* %unbox40.unpack.elt100, align 8, !tbaa !94, !alias.scope !97, !noalias !98
  %unbox40.unpack102 = insertvalue { {} addrspace(10)*, { [1 x [1 x i64]], i64 }, i64, i64 } %32, i64 %unbox40.unpack.unpack101, 3
  %33 = insertvalue { { {} addrspace(10)*, { [1 x [1 x i64]], i64 }, i64, i64 }, { [1 x i64], i64 } } undef, { {} addrspace(10)*, { [1 x [1 x i64]], i64 }, i64, i64 } %unbox40.unpack102, 0
  %34 = getelementptr inbounds { { {} addrspace(10)*, { [1 x [1 x i64]], i64 }, i64, i64 }, { [1 x i64], i64 } }, { { {} addrspace(10)*, { [1 x [1 x i64]], i64 }, i64, i64 }, { [1 x i64], i64 } } addrspace(10)* %27, i64 0, i32 1, i32 0, i64 0
  %unbox40.unpack94.unpack.unpack = load i64, i64 addrspace(10)* %34, align 8, !tbaa !94, !alias.scope !97, !noalias !98
  %unbox40.unpack94.unpack111 = insertvalue [1 x i64] undef, i64 %unbox40.unpack94.unpack.unpack, 0
  %35 = insertvalue { [1 x i64], i64 } undef, [1 x i64] %unbox40.unpack94.unpack111, 0
  %unbox40.unpack94.elt108 = getelementptr inbounds { { {} addrspace(10)*, { [1 x [1 x i64]], i64 }, i64, i64 }, { [1 x i64], i64 } }, { { {} addrspace(10)*, { [1 x [1 x i64]], i64 }, i64, i64 }, { [1 x i64], i64 } } addrspace(10)* %27, i64 0, i32 1, i32 1
  %unbox40.unpack94.unpack109 = load i64, i64 addrspace(10)* %unbox40.unpack94.elt108, align 8, !tbaa !94, !alias.scope !97, !noalias !98
  %unbox40.unpack94110 = insertvalue { [1 x i64], i64 } %35, i64 %unbox40.unpack94.unpack109, 1
  %unbox4095 = insertvalue { { {} addrspace(10)*, { [1 x [1 x i64]], i64 }, i64, i64 }, { [1 x i64], i64 } } %33, { [1 x i64], i64 } %unbox40.unpack94110, 1
  br label %guard_exit39

guard_exit39:                                     ; preds = %guard_pass38, %L5
  %guard_res41.extract.0.extract.0 = phi {} addrspace(10)* [ null, %L5 ], [ %unbox40.unpack.unpack, %guard_pass38 ]
  %guard_res41.extract.0.extract.1.extract.0 = phi [1 x [1 x i64]] [ zeroinitializer, %L5 ], [ %unbox40.unpack.unpack97.unpack106, %guard_pass38 ]
  %guard_res41.extract.0.extract.1.extract.1 = phi i64 [ 0, %L5 ], [ %unbox40.unpack.unpack97.unpack104, %guard_pass38 ]
  %guard_res41.extract.0.extract.2 = phi i64 [ 0, %L5 ], [ %unbox40.unpack.unpack99, %guard_pass38 ]
  %guard_res41.extract.0.extract.3 = phi i64 [ 0, %L5 ], [ %unbox40.unpack.unpack101, %guard_pass38 ]
  %guard_res41.extract.1 = phi { [1 x i64], i64 } [ zeroinitializer, %L5 ], [ %unbox40.unpack94110, %guard_pass38 ]
  %.fca.0.0.extract115 = extractvalue { [1 x i64], i64 } %guard_res41.extract.1, 0, 0, !dbg !433
  %.fca.1.extract116 = extractvalue { [1 x i64], i64 } %guard_res41.extract.1, 1, !dbg !433
  %.not59.not117 = icmp eq i64 %.fca.1.extract116, %.fca.0.0.extract115, !dbg !434
  br i1 %.not59.not117, label %common.ret, label %L29.lr.ph, !dbg !411

L29.lr.ph:                                        ; preds = %guard_exit39
  %36 = getelementptr inbounds [1 x i64], [1 x i64]* %newstruct, i64 0, i64 0
  %37 = getelementptr inbounds { { {} addrspace(10)*, { i64 }, [1 x [1 x i64]] }, i64 }, { { {} addrspace(10)*, { i64 }, [1 x [1 x i64]] }, i64 } addrspace(11)* %2, i64 0, i32 0, i32 2, i64 0, i64 0
  %38 = getelementptr inbounds [1 x i64], [1 x i64]* %newstruct12, i64 0, i64 0
  %39 = getelementptr inbounds { { {} addrspace(10)*, { i64 }, [1 x [1 x i64]] }, i64 }, { { {} addrspace(10)*, { i64 }, [1 x [1 x i64]] }, i64 } addrspace(11)* %2, i64 0, i32 0, i32 1, i32 0
  br label %L29, !dbg !411

guard_exit48:                                     ; preds = %L42
  %40 = call fastcc nonnull {} addrspace(10)* @julia_with_logabsdet_jacobian_11509({ {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64, i64 } addrspace(11)* nocapture nofree noundef nonnull readonly align 8 dereferenceable(40) %12, { {} addrspace(10)*, { [1 x [1 x i64]], i64 }, i64, i64 } addrspace(11)* nocapture nofree noundef nonnull readonly align 8 dereferenceable(80) %13) #27, !dbg !435
  %41 = call nonnull "enzyme_type"="{[-1]:Pointer}" {} addrspace(10)* ({} addrspace(10)* ({} addrspace(10)*, {} addrspace(10)**, i32)*, {} addrspace(10)*, ...) @julia.call({} addrspace(10)* ({} addrspace(10)*, {} addrspace(10)**, i32)* noundef nonnull @ijl_apply_generic, {} addrspace(10)* noundef addrspacecast ({}* inttoptr (i64 139840593410080 to {}*) to {} addrspace(10)*), {} addrspace(10)* nonnull %value_phi118, {} addrspace(10)* nonnull %40) #29, !dbg !438
  %unbox49.unpack6278 = insertvalue { [1 x i64], i64 } %21, i64 %23, 1
  %.fca.0.0.extract = extractvalue { [1 x i64], i64 } %21, 0, 0, !dbg !433
  %.not59.not = icmp eq i64 %23, %.fca.0.0.extract, !dbg !434
  br i1 %.not59.not, label %L10.common.ret.loopexit_crit_edge, label %L29, !dbg !411
}

 Type analysis state: 
<analysis>
{}* inttoptr (i64 139842539216904 to {}*): {[-1]:Anything}, intvals: {}
{} addrspace(11)* addrspacecast ({}* inttoptr (i64 139842539216904 to {}*) to {} addrspace(11)*): {[-1]:Anything}, intvals: {}
{ { { {} addrspace(10)*, { [1 x [1 x i64]], i64 }, i64, i64 }, { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64, i64 } } } addrspace(11)* %0: {[-1]:Pointer, [-1,0]:Pointer, [-1,0,0]:Pointer, [-1,0,0,-1]:Float@double, [-1,0,8]:Integer, [-1,0,9]:Integer, [-1,0,10]:Integer, [-1,0,11]:Integer, [-1,0,12]:Integer, [-1,0,13]:Integer, [-1,0,14]:Integer, [-1,0,15]:Integer, [-1,0,16]:Integer, [-1,0,17]:Integer, [-1,0,18]:Integer, [-1,0,19]:Integer, [-1,0,20]:Integer, [-1,0,21]:Integer, [-1,0,22]:Integer, [-1,0,23]:Integer, [-1,0,24]:Integer, [-1,0,25]:Integer, [-1,0,26]:Integer, [-1,0,27]:Integer, [-1,0,28]:Integer, [-1,0,29]:Integer, [-1,0,30]:Integer, [-1,0,31]:Integer, [-1,0,32]:Integer, [-1,0,33]:Integer, [-1,0,34]:Integer, [-1,0,35]:Integer, [-1,0,36]:Integer, [-1,0,37]:Integer, [-1,0,38]:Integer, [-1,0,39]: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, [-1,40]:Pointer, [-1,40,0]:Pointer, [-1,40,0,0]:Pointer, [-1,40,8]:Integer, [-1,40,9]:Integer, [-1,40,10]:Integer, [-1,40,11]:Integer, [-1,40,12]:Integer, [-1,40,13]:Integer, [-1,40,14]:Integer, [-1,40,15]:Integer, [-1,40,16]:Integer, [-1,40,17]:Integer, [-1,40,18]:Integer, [-1,40,19]:Integer, [-1,40,20]:Integer, [-1,40,21]:Integer, [-1,40,22]:Integer, [-1,40,23]:Integer, [-1,40,24]:Integer, [-1,40,25]:Integer, [-1,40,26]:Integer, [-1,40,27]:Integer, [-1,40,28]:Integer, [-1,40,29]:Integer, [-1,40,30]:Integer, [-1,40,31]:Integer, [-1,40,32]:Integer, [-1,40,33]:Integer, [-1,40,34]:Integer, [-1,40,35]:Integer, [-1,40,36]:Integer, [-1,40,37]:Integer, [-1,40,38]:Integer, [-1,40,39]:Integer, [-1,48]:Pointer, [-1,48,0]:Pointer, [-1,48,0,-1]:Integer, [-1,48,8]:Integer, [-1,48,9]:Integer, [-1,48,10]:Integer, [-1,48,11]:Integer, [-1,48,12]:Integer, [-1,48,13]:Integer, [-1,48,14]:Integer, [-1,48,15]:Integer, [-1,48,16]:Integer, [-1,48,17]:Integer, [-1,48,18]:Integer, [-1,48,19]:Integer, [-1,48,20]:Integer, [-1,48,21]:Integer, [-1,48,22]:Integer, [-1,48,23]:Integer, [-1,48,24]:Integer, [-1,48,25]:Integer, [-1,48,26]:Integer, [-1,48,27]:Integer, [-1,48,28]:Integer, [-1,48,29]:Integer, [-1,48,30]:Integer, [-1,48,31]:Integer, [-1,48,32]:Integer, [-1,48,33]:Integer, [-1,48,34]:Integer, [-1,48,35]:Integer, [-1,48,36]:Integer, [-1,48,37]:Integer, [-1,48,38]:Integer, [-1,48,39]:Integer, [-1,56]:Pointer, [-1,56,0]:Pointer, [-1,56,0,-1]:Integer, [-1,56,8]:Integer, [-1,56,9]:Integer, [-1,56,10]:Integer, [-1,56,11]:Integer, [-1,56,12]:Integer, [-1,56,13]:Integer, [-1,56,14]:Integer, [-1,56,15]:Integer, [-1,56,16]:Integer, [-1,56,17]:Integer, [-1,56,18]:Integer, [-1,56,19]:Integer, [-1,56,20]:Integer, [-1,56,21]:Integer, [-1,56,22]:Integer, [-1,56,23]:Integer, [-1,56,24]:Integer, [-1,56,25]:Integer, [-1,56,26]:Integer, [-1,56,27]:Integer, [-1,56,28]:Integer, [-1,56,29]:Integer, [-1,56,30]:Integer, [-1,56,31]:Integer, [-1,56,32]:Integer, [-1,56,33]:Integer, [-1,56,34]:Integer, [-1,56,35]:Integer, [-1,56,36]:Integer, [-1,56,37]:Integer, [-1,56,38]:Integer, [-1,56,39]:Integer, [-1,64]:Integer, [-1,65]:Integer, [-1,66]:Integer, [-1,67]:Integer, [-1,68]:Integer, [-1,69]:Integer, [-1,70]:Integer, [-1,71]:Integer, [-1,72]:Integer, [-1,73]:Integer, [-1,74]:Integer, [-1,75]:Integer, [-1,76]:Integer, [-1,77]:Integer, [-1,78]:Integer, [-1,79]:Integer}, intvals: {}
{ {} addrspace(10)*, double } addrspace(11)* %1: {[-1]:Pointer, [-1,0]:Pointer, [-1,0,0]:Pointer, [-1,0,0,-1]:Float@double, [-1,0,8]:Integer, [-1,0,9]:Integer, [-1,0,10]:Integer, [-1,0,11]:Integer, [-1,0,12]:Integer, [-1,0,13]:Integer, [-1,0,14]:Integer, [-1,0,15]:Integer, [-1,0,16]:Integer, [-1,0,17]:Integer, [-1,0,18]:Integer, [-1,0,19]:Integer, [-1,0,20]:Integer, [-1,0,21]:Integer, [-1,0,22]:Integer, [-1,0,23]:Integer, [-1,0,24]:Integer, [-1,0,25]:Integer, [-1,0,26]:Integer, [-1,0,27]:Integer, [-1,0,28]:Integer, [-1,0,29]:Integer, [-1,0,30]:Integer, [-1,0,31]:Integer, [-1,0,32]:Integer, [-1,0,33]:Integer, [-1,0,34]:Integer, [-1,0,35]:Integer, [-1,0,36]:Integer, [-1,0,37]:Integer, [-1,0,38]:Integer, [-1,0,39]:Integer, [-1,8]:Float@double}, intvals: {}
{ { {} addrspace(10)*, { i64 }, [1 x [1 x i64]] }, i64 } addrspace(11)* %2: {[-1]:Pointer, [-1,0]:Pointer, [-1,0,0]:Pointer, [-1,0,0,-1]:Float@double, [-1,0,8]:Integer, [-1,0,9]:Integer, [-1,0,10]:Integer, [-1,0,11]:Integer, [-1,0,12]:Integer, [-1,0,13]:Integer, [-1,0,14]:Integer, [-1,0,15]:Integer, [-1,0,16]:Integer, [-1,0,17]:Integer, [-1,0,18]:Integer, [-1,0,19]:Integer, [-1,0,20]:Integer, [-1,0,21]:Integer, [-1,0,22]:Integer, [-1,0,23]:Integer, [-1,0,24]:Integer, [-1,0,25]:Integer, [-1,0,26]:Integer, [-1,0,27]:Integer, [-1,0,28]:Integer, [-1,0,29]:Integer, [-1,0,30]:Integer, [-1,0,31]:Integer, [-1,0,32]:Integer, [-1,0,33]:Integer, [-1,0,34]:Integer, [-1,0,35]:Integer, [-1,0,36]:Integer, [-1,0,37]:Integer, [-1,0,38]:Integer, [-1,0,39]: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}, intvals: {}
  %current_task155 = getelementptr inbounds {}**, {}*** %5, i64 -14: {}, intvals: {}
  %newstruct12 = bitcast i8* %4 to [1 x i64]*, !enzyme_caststack !15: {[-1]:Pointer}, intvals: {}
  %17 = call nonnull "enzyme_type"="{[-1]:Pointer}" {} addrspace(10)* ({} addrspace(10)* ({} addrspace(10)*, {} addrspace(10)**, i32)*, {} addrspace(10)*, ...) @julia.call({} addrspace(10)* ({} addrspace(10)*, {} addrspace(10)**, i32)* noundef nonnull @ijl_apply_generic, {} addrspace(10)* noundef addrspacecast ({}* inttoptr (i64 139840593410080 to {}*) to {} addrspace(10)*), {} addrspace(10)* nofree nonnull %box4, {} addrspace(10)* nonnull %14) #29, !dbg !61: {[-1]:Pointer}, intvals: {}
  %5 = call {}*** @julia.get_pgcstack() #27: {}, intvals: {}
  %box4 = call noalias nonnull dereferenceable(16) "enzyme_type"="{[-1]:Pointer, [-1,0]:Pointer, [-1,0,0]:Pointer, [-1,0,0,-1]:Float@double, [-1,0,8]:Integer, [-1,0,9]:Integer, [-1,0,10]:Integer, [-1,0,11]:Integer, [-1,0,12]:Integer, [-1,0,13]:Integer, [-1,0,14]:Integer, [-1,0,15]:Integer, [-1,0,16]:Integer, [-1,0,17]:Integer, [-1,0,18]:Integer, [-1,0,19]:Integer, [-1,0,20]:Integer, [-1,0,21]:Integer, [-1,0,22]:Integer, [-1,0,23]:Integer, [-1,0,24]:Integer, [-1,0,25]:Integer, [-1,0,26]:Integer, [-1,0,27]:Integer, [-1,0,28]:Integer, [-1,0,29]:Integer, [-1,0,30]:Integer, [-1,0,31]:Integer, [-1,0,32]:Integer, [-1,0,33]:Integer, [-1,0,34]:Integer, [-1,0,35]:Integer, [-1,0,36]:Integer, [-1,0,37]:Integer, [-1,0,38]:Integer, [-1,0,39]:Integer, [-1,8]:Float@double}" {} addrspace(10)* @julia.gc_alloc_obj({}** nonnull %current_task1, i64 noundef 16, {} addrspace(10)* noundef addrspacecast ({}* inttoptr (i64 139840099827408 to {}*) to {} addrspace(10)*)) #28, !dbg !61: {[-1]:Pointer, [-1,0]:Pointer, [-1,0,0]:Pointer, [-1,0,0,-1]:Float@double, [-1,0,8]:Integer, [-1,0,9]:Integer, [-1,0,10]:Integer, [-1,0,11]:Integer, [-1,0,12]:Integer, [-1,0,13]:Integer, [-1,0,14]:Integer, [-1,0,15]:Integer, [-1,0,16]:Integer, [-1,0,17]:Integer, [-1,0,18]:Integer, [-1,0,19]:Integer, [-1,0,20]:Integer, [-1,0,21]:Integer, [-1,0,22]:Integer, [-1,0,23]:Integer, [-1,0,24]:Integer, [-1,0,25]:Integer, [-1,0,26]:Integer, [-1,0,27]:Integer, [-1,0,28]:Integer, [-1,0,29]:Integer, [-1,0,30]:Integer, [-1,0,31]:Integer, [-1,0,32]:Integer, [-1,0,33]:Integer, [-1,0,34]:Integer, [-1,0,35]:Integer, [-1,0,36]:Integer, [-1,0,37]:Integer, [-1,0,38]:Integer, [-1,0,39]:Integer, [-1,8]:Float@double}, intvals: {}
  %13 = getelementptr inbounds { { { {} addrspace(10)*, { [1 x [1 x i64]], i64 }, i64, i64 }, { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64, i64 } } }, { { { {} addrspace(10)*, { [1 x [1 x i64]], i64 }, i64, i64 }, { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64, i64 } } } addrspace(11)* %0, i64 0, i32 0, i32 0, !dbg !55: {[-1]:Pointer, [-1,0]:Pointer, [-1,0,0]:Pointer, [-1,0,0,-1]:Float@double, [-1,0,8]:Integer, [-1,0,9]:Integer, [-1,0,10]:Integer, [-1,0,11]:Integer, [-1,0,12]:Integer, [-1,0,13]:Integer, [-1,0,14]:Integer, [-1,0,15]:Integer, [-1,0,16]:Integer, [-1,0,17]:Integer, [-1,0,18]:Integer, [-1,0,19]:Integer, [-1,0,20]:Integer, [-1,0,21]:Integer, [-1,0,22]:Integer, [-1,0,23]:Integer, [-1,0,24]:Integer, [-1,0,25]:Integer, [-1,0,26]:Integer, [-1,0,27]:Integer, [-1,0,28]:Integer, [-1,0,29]:Integer, [-1,0,30]:Integer, [-1,0,31]:Integer, [-1,0,32]:Integer, [-1,0,33]:Integer, [-1,0,34]:Integer, [-1,0,35]:Integer, [-1,0,36]:Integer, [-1,0,37]:Integer, [-1,0,38]:Integer, [-1,0,39]: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}, intvals: {}
  %12 = getelementptr inbounds { { { {} addrspace(10)*, { [1 x [1 x i64]], i64 }, i64, i64 }, { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64, i64 } } }, { { { {} addrspace(10)*, { [1 x [1 x i64]], i64 }, i64, i64 }, { {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64, i64 } } } addrspace(11)* %0, i64 0, i32 0, i32 1, !dbg !55: {[-1]:Pointer, [-1,0]:Pointer, [-1,0,0]:Pointer, [-1,0,0,0]:Pointer, [-1,0,8]:Integer, [-1,0,9]:Integer, [-1,0,10]:Integer, [-1,0,11]:Integer, [-1,0,12]:Integer, [-1,0,13]:Integer, [-1,0,14]:Integer, [-1,0,15]:Integer, [-1,0,16]:Integer, [-1,0,17]:Integer, [-1,0,18]:Integer, [-1,0,19]:Integer, [-1,0,20]:Integer, [-1,0,21]:Integer, [-1,0,22]:Integer, [-1,0,23]:Integer, [-1,0,24]:Integer, [-1,0,25]:Integer, [-1,0,26]:Integer, [-1,0,27]:Integer, [-1,0,28]:Integer, [-1,0,29]:Integer, [-1,0,30]:Integer, [-1,0,31]:Integer, [-1,0,32]:Integer, [-1,0,33]:Integer, [-1,0,34]:Integer, [-1,0,35]:Integer, [-1,0,36]:Integer, [-1,0,37]:Integer, [-1,0,38]:Integer, [-1,0,39]:Integer, [-1,8]:Pointer, [-1,8,0]:Pointer, [-1,8,0,-1]:Integer, [-1,8,8]:Integer, [-1,8,9]:Integer, [-1,8,10]:Integer, [-1,8,11]:Integer, [-1,8,12]:Integer, [-1,8,13]:Integer, [-1,8,14]:Integer, [-1,8,15]:Integer, [-1,8,16]:Integer, [-1,8,17]:Integer, [-1,8,18]:Integer, [-1,8,19]:Integer, [-1,8,20]:Integer, [-1,8,21]:Integer, [-1,8,22]:Integer, [-1,8,23]:Integer, [-1,8,24]:Integer, [-1,8,25]:Integer, [-1,8,26]:Integer, [-1,8,27]:Integer, [-1,8,28]:Integer, [-1,8,29]:Integer, [-1,8,30]:Integer, [-1,8,31]:Integer, [-1,8,32]:Integer, [-1,8,33]:Integer, [-1,8,34]:Integer, [-1,8,35]:Integer, [-1,8,36]:Integer, [-1,8,37]:Integer, [-1,8,38]:Integer, [-1,8,39]:Integer, [-1,16]:Pointer, [-1,16,0]:Pointer, [-1,16,0,-1]:Integer, [-1,16,8]:Integer, [-1,16,9]:Integer, [-1,16,10]:Integer, [-1,16,11]:Integer, [-1,16,12]:Integer, [-1,16,13]:Integer, [-1,16,14]:Integer, [-1,16,15]:Integer, [-1,16,16]:Integer, [-1,16,17]:Integer, [-1,16,18]:Integer, [-1,16,19]:Integer, [-1,16,20]:Integer, [-1,16,21]:Integer, [-1,16,22]:Integer, [-1,16,23]:Integer, [-1,16,24]:Integer, [-1,16,25]:Integer, [-1,16,26]:Integer, [-1,16,27]:Integer, [-1,16,28]:Integer, [-1,16,29]:Integer, [-1,16,30]:Integer, [-1,16,31]:Integer, [-1,16,32]:Integer, [-1,16,33]:Integer, [-1,16,34]:Integer, [-1,16,35]:Integer, [-1,16,36]:Integer, [-1,16,37]:Integer, [-1,16,38]:Integer, [-1,16,39]: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}, intvals: {}
  %box = call noalias nonnull dereferenceable(16) "enzyme_type"="{[-1]:Pointer, [-1,0]:Pointer, [-1,0,0]:Pointer, [-1,0,0,-1]:Float@double, [-1,0,8]:Integer, [-1,0,9]:Integer, [-1,0,10]:Integer, [-1,0,11]:Integer, [-1,0,12]:Integer, [-1,0,13]:Integer, [-1,0,14]:Integer, [-1,0,15]:Integer, [-1,0,16]:Integer, [-1,0,17]:Integer, [-1,0,18]:Integer, [-1,0,19]:Integer, [-1,0,20]:Integer, [-1,0,21]:Integer, [-1,0,22]:Integer, [-1,0,23]:Integer, [-1,0,24]:Integer, [-1,0,25]:Integer, [-1,0,26]:Integer, [-1,0,27]:Integer, [-1,0,28]:Integer, [-1,0,29]:Integer, [-1,0,30]:Integer, [-1,0,31]:Integer, [-1,0,32]:Integer, [-1,0,33]:Integer, [-1,0,34]:Integer, [-1,0,35]:Integer, [-1,0,36]:Integer, [-1,0,37]:Integer, [-1,0,38]:Integer, [-1,0,39]:Integer, [-1,8]:Float@double}" {} addrspace(10)* @julia.gc_alloc_obj({}** nonnull %current_task1, i64 noundef 16, {} addrspace(10)* noundef addrspacecast ({}* inttoptr (i64 139840099827408 to {}*) to {} addrspace(10)*)) #28, !dbg !25: {[-1]:Pointer, [-1,0,0]:Pointer, [-1,0,0,-1]:Float@double, [-1,0,8]:Integer, [-1,0,9]:Integer, [-1,0,10]:Integer, [-1,0,11]:Integer, [-1,0,12]:Integer, [-1,0,13]:Integer, [-1,0,14]:Integer, [-1,0,15]:Integer, [-1,0,16]:Integer, [-1,0,17]:Integer, [-1,0,18]:Integer, [-1,0,19]:Integer, [-1,0,20]:Integer, [-1,0,21]:Integer, [-1,0,22]:Integer, [-1,0,23]:Integer, [-1,0,24]:Integer, [-1,0,25]:Integer, [-1,0,26]:Integer, [-1,0,27]:Integer, [-1,0,28]:Integer, [-1,0,29]:Integer, [-1,0,30]:Integer, [-1,0,31]:Integer, [-1,0,32]:Integer, [-1,0,33]:Integer, [-1,0,34]:Integer, [-1,0,35]:Integer, [-1,0,36]:Integer, [-1,0,37]:Integer, [-1,0,38]:Integer, [-1,0,39]:Integer, [-1,8]:Float@double}, intvals: {}
  %14 = call fastcc nonnull {} addrspace(10)* @julia_with_logabsdet_jacobian_11509({ {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64, i64 } addrspace(11)* nocapture nofree noundef nonnull readonly align 8 dereferenceable(40) %12, { {} addrspace(10)*, { [1 x [1 x i64]], i64 }, i64, i64 } addrspace(11)* nocapture nofree noundef nonnull readonly align 8 dereferenceable(80) %13) #27, !dbg !55: {[-1]:Pointer, [-1,-1]:Pointer}, intvals: {}
  %36 = getelementptr inbounds [1 x i64], [1 x i64]* %newstruct, i64 0, i64 0: {[-1]:Pointer}, intvals: {}
  %40 = call fastcc nonnull {} addrspace(10)* @julia_with_logabsdet_jacobian_11509({ {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, i64, i64 } addrspace(11)* nocapture nofree noundef nonnull readonly align 8 dereferenceable(40) %12, { {} addrspace(10)*, { [1 x [1 x i64]], i64 }, i64, i64 } addrspace(11)* nocapture nofree noundef nonnull readonly align 8 dereferenceable(80) %13) #27, !dbg !104: {[-1]:Pointer, [-1,-1]:Pointer}, intvals: {}
  %41 = call nonnull "enzyme_type"="{[-1]:Pointer}" {} addrspace(10)* ({} addrspace(10)* ({} addrspace(10)*, {} addrspace(10)**, i32)*, {} addrspace(10)*, ...) @julia.call({} addrspace(10)* ({} addrspace(10)*, {} addrspace(10)**, i32)* noundef nonnull @ijl_apply_generic, {} addrspace(10)* noundef addrspacecast ({}* inttoptr (i64 139840593410080 to {}*) to {} addrspace(10)*), {} addrspace(10)* nonnull %value_phi118, {} addrspace(10)* nonnull %40) #29, !dbg !107: {[-1]:Pointer}, intvals: {}
  %current_task1 = bitcast {}*** %current_task155 to {}**: {}, intvals: {}
  %ptls_field56 = getelementptr inbounds {}**, {}*** %5, i64 2: {}, intvals: {}
  %6 = bitcast {}*** %ptls_field56 to i64***: {[-1]:Pointer}, intvals: {}
  %ptls_load5758 = load i64**, i64*** %6, align 8, !tbaa !17: {}, intvals: {}
  %7 = getelementptr inbounds i64*, i64** %ptls_load5758, i64 2: {[-1]:Pointer}, intvals: {}
  %safepoint = load i64*, i64** %7, align 8, !tbaa !21: {}, intvals: {}
  %8 = call fastcc nonnull {} addrspace(10)* @julia_iterate_11520({ { {} addrspace(10)*, { i64 }, [1 x [1 x i64]] }, i64 } addrspace(11)* nocapture nofree noundef nonnull readonly align 8 dereferenceable(32) %2) #27, !dbg !24: {}, intvals: {}
  %9 = addrspacecast {} addrspace(10)* %8 to {} addrspace(11)*, !dbg !25: {}, intvals: {}
  %.not = icmp eq {} addrspace(11)* %9, addrspacecast ({}* inttoptr (i64 139842539216904 to {}*) to {} addrspace(11)*), !dbg !25: {[-1]:Integer}, intvals: {}
  %common.ret.op = phi {} addrspace(10)* [ %box, %L4 ], [ %41, %L10.common.ret.loopexit_crit_edge ], [ %17, %guard_exit39 ]: {[-1]:Pointer, [-1,-1]:Pointer}, intvals: {}
  %18 = call "enzyme_type"="{[-1]:Pointer}" {} addrspace(10)* @julia.typeof({} addrspace(10)* nonnull %8) #30, !dbg !23: {[-1]:Pointer}, intvals: {}
  %23 = add i64 %22, 1, !dbg !63: {}, intvals: {}
  %24 = getelementptr inbounds { { {} addrspace(10)*, { i64 }, [1 x [1 x i64]] }, i64 }, { { {} addrspace(10)*, { i64 }, [1 x [1 x i64]] }, i64 } addrspace(11)* %2, i64 0, i32 0, !dbg !81: {[-1]:Pointer, [-1,0]:Pointer, [-1,0,0]:Pointer, [-1,0,0,-1]:Float@double, [-1,0,8]:Integer, [-1,0,9]:Integer, [-1,0,10]:Integer, [-1,0,11]:Integer, [-1,0,12]:Integer, [-1,0,13]:Integer, [-1,0,14]:Integer, [-1,0,15]:Integer, [-1,0,16]:Integer, [-1,0,17]:Integer, [-1,0,18]:Integer, [-1,0,19]:Integer, [-1,0,20]:Integer, [-1,0,21]:Integer, [-1,0,22]:Integer, [-1,0,23]:Integer, [-1,0,24]:Integer, [-1,0,25]:Integer, [-1,0,26]:Integer, [-1,0,27]:Integer, [-1,0,28]:Integer, [-1,0,29]:Integer, [-1,0,30]:Integer, [-1,0,31]:Integer, [-1,0,32]:Integer, [-1,0,33]:Integer, [-1,0,34]:Integer, [-1,0,35]:Integer, [-1,0,36]:Integer, [-1,0,37]:Integer, [-1,0,38]:Integer, [-1,0,39]: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}, intvals: {}
  %25 = addrspacecast [1 x i64]* %newstruct to [1 x i64] addrspace(11)*, !dbg !75: {[-1]:Pointer, [-1,0]:Integer, [-1,1]:Integer, [-1,2]:Integer, [-1,3]:Integer, [-1,4]:Integer, [-1,5]:Integer, [-1,6]:Integer, [-1,7]:Integer}, intvals: {}
  %3 = call noalias nonnull dereferenceable(8) dereferenceable_or_null(8) i8* @malloc(i64 8), !enzyme_fromstack !16: {[-1]:Pointer}, intvals: {}
  %newstruct = bitcast i8* %3 to [1 x i64]*, !enzyme_caststack !15: {[-1]:Pointer}, intvals: {}
  %4 = call noalias nonnull dereferenceable(8) dereferenceable_or_null(8) i8* @malloc(i64 8), !enzyme_fromstack !16: {[-1]:Pointer}, intvals: {}
</analysis>

Illegal updateAnalysis prev:{[-1]:Pointer, [-1,0]:Pointer, [-1,0,0]:Pointer, [-1,0,0,-1]:Float@double, [-1,0,8]:Integer, [-1,0,9]:Integer, [-1,0,10]:Integer, [-1,0,11]:Integer, [-1,0,12]:Integer, [-1,0,13]:Integer, [-1,0,14]:Integer, [-1,0,15]:Integer, [-1,0,16]:Integer, [-1,0,17]:Integer, [-1,0,18]:Integer, [-1,0,19]:Integer, [-1,0,20]:Integer, [-1,0,21]:Integer, [-1,0,22]:Integer, [-1,0,23]:Integer, [-1,0,24]:Integer, [-1,0,25]:Integer, [-1,0,26]:Integer, [-1,0,27]:Integer, [-1,0,28]:Integer, [-1,0,29]:Integer, [-1,0,30]:Integer, [-1,0,31]:Integer, [-1,0,32]:Integer, [-1,0,33]:Integer, [-1,0,34]:Integer, [-1,0,35]:Integer, [-1,0,36]:Integer, [-1,0,37]:Integer, [-1,0,38]:Integer, [-1,0,39]:Integer, [-1,8]:Float@double} new: {[-1]:Pointer, [-1,-1]:Pointer}
val:   %box = call noalias nonnull dereferenceable(16) "enzyme_type"="{[-1]:Pointer, [-1,0]:Pointer, [-1,0,0]:Pointer, [-1,0,0,-1]:Float@double, [-1,0,8]:Integer, [-1,0,9]:Integer, [-1,0,10]:Integer, [-1,0,11]:Integer, [-1,0,12]:Integer, [-1,0,13]:Integer, [-1,0,14]:Integer, [-1,0,15]:Integer, [-1,0,16]:Integer, [-1,0,17]:Integer, [-1,0,18]:Integer, [-1,0,19]:Integer, [-1,0,20]:Integer, [-1,0,21]:Integer, [-1,0,22]:Integer, [-1,0,23]:Integer, [-1,0,24]:Integer, [-1,0,25]:Integer, [-1,0,26]:Integer, [-1,0,27]:Integer, [-1,0,28]:Integer, [-1,0,29]:Integer, [-1,0,30]:Integer, [-1,0,31]:Integer, [-1,0,32]:Integer, [-1,0,33]:Integer, [-1,0,34]:Integer, [-1,0,35]:Integer, [-1,0,36]:Integer, [-1,0,37]:Integer, [-1,0,38]:Integer, [-1,0,39]:Integer, [-1,8]:Float@double}" {} addrspace(10)* @julia.gc_alloc_obj({}** nonnull %current_task1, i64 noundef 16, {} addrspace(10)* noundef addrspacecast ({}* inttoptr (i64 139840099827408 to {}*) to {} addrspace(10)*)) #28, !dbg !25 origin=  %common.ret.op = phi {} addrspace(10)* [ %box, %L4 ], [ %41, %L10.common.ret.loopexit_crit_edge ], [ %17, %guard_exit39 ]
MethodInstance for Base._foldl_impl(::Base.MappingRF{var"#21#22"{SubArray{Float64, 1, Matrix{Float64}, Tuple{Base.Slice{Base.OneTo{Int64}}, Int64}, true}, Stacked{Vector{Function}, Vector{UnitRange{Int64}}}}, Base.BottomRF{typeof(catsamples_and_acc)}}, ::Tuple{Matrix{Float64}, Float64}, ::Base.Iterators.Drop{ColumnSlices{Matrix{Float64}, Tuple{Base.OneTo{Int64}}, SubArray{Float64, 1, Matrix{Float64}, Tuple{Base.Slice{Base.OneTo{Int64}}, Int64}, true}}})


Caused by:
Stacktrace:
 [1] _foldl_impl
   @ ./reduce.jl:57

Stacktrace:
  [1] julia_error(cstr::Cstring, val::Ptr{…}, errtype::Enzyme.API.ErrorType, data::Ptr{…}, data2::Ptr{…}, B::Ptr{…})
    @ Enzyme.Compiler ~/.julia/packages/Enzyme/aioBJ/src/compiler.jl:1985
  [2] EnzymeCreateAugmentedPrimal(logic::Enzyme.Logic, todiff::LLVM.Function, retType::Enzyme.API.CDIFFE_TYPE, constant_args::Vector{…}, TA::Enzyme.TypeAnalysis, returnUsed::Bool, shadowReturnUsed::Bool, typeInfo::Enzyme.FnTypeInfo, uncacheable_args::Vector{…}, forceAnonymousTape::Bool, width::Int64, atomicAdd::Bool)
    @ Enzyme.API ~/.julia/packages/Enzyme/aioBJ/src/api.jl:192
  [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::NTuple{…}, returnPrimal::Bool, expectedTapeType::Type, loweredArgs::Set{…}, boxedArgs::Set{…})
    @ Enzyme.Compiler ~/.julia/packages/Enzyme/aioBJ/src/compiler.jl:3657
  [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/aioBJ/src/compiler.jl:5832
  [5] codegen
    @ ~/.julia/packages/Enzyme/aioBJ/src/compiler.jl:5110 [inlined]
  [6] _thunk(job::GPUCompiler.CompilerJob{Enzyme.Compiler.EnzymeTarget, Enzyme.Compiler.EnzymeCompilerParams}, postopt::Bool)
    @ Enzyme.Compiler ~/.julia/packages/Enzyme/aioBJ/src/compiler.jl:6639
  [7] _thunk
    @ ~/.julia/packages/Enzyme/aioBJ/src/compiler.jl:6639 [inlined]
  [8] cached_compilation
    @ ~/.julia/packages/Enzyme/aioBJ/src/compiler.jl:6677 [inlined]
  [9] (::Enzyme.Compiler.var"#28587#28588"{…})(ctx::LLVM.Context)
    @ Enzyme.Compiler ~/.julia/packages/Enzyme/aioBJ/src/compiler.jl:6746
 [10] JuliaContext(f::Enzyme.Compiler.var"#28587#28588"{…}; kwargs::@Kwargs{})
    @ GPUCompiler ~/.julia/packages/GPUCompiler/nWT2N/src/driver.jl:52
 [11] JuliaContext(f::Function)
    @ GPUCompiler ~/.julia/packages/GPUCompiler/nWT2N/src/driver.jl:42
 [12] #s2003#28586
    @ ~/.julia/packages/Enzyme/aioBJ/src/compiler.jl:6697 [inlined]
 [13] 
    @ Enzyme.Compiler ./none:0
 [14] (::Core.GeneratedFunctionStub)(::UInt64, ::LineNumberNode, ::Any, ::Vararg{Any})
    @ Core ./boot.jl:602
 [15] runtime_generic_augfwd(activity::Type{…}, width::Val{…}, ModifiedBetween::Val{…}, RT::Val{…}, f::typeof(Core.kwcall), df::Nothing, primal_1::@NamedTuple{…}, shadow_1_1::Base.RefValue{…}, primal_2::typeof(mapreduce), shadow_2_1::Nothing, primal_3::var"#21#22"{…}, shadow_3_1::var"#21#22"{…}, primal_4::typeof(catsamples_and_acc), shadow_4_1::Nothing, primal_5::Base.Iterators.Drop{…}, shadow_5_1::Base.Iterators.Drop{…})
    @ Enzyme.Compiler ~/.julia/packages/Enzyme/aioBJ/src/rules/jitrules.jl:307
 [16] reparam_with_entropy
    @ ./REPL[82]:14 [inlined]
 [17] augmented_julia_reparam_with_entropy_11186wrap
    @ ./REPL[82]:0
 [18] macro expansion
    @ ~/.julia/packages/Enzyme/aioBJ/src/compiler.jl:6587 [inlined]
 [19] enzyme_call
    @ ~/.julia/packages/Enzyme/aioBJ/src/compiler.jl:6188 [inlined]
 [20] AugmentedForwardThunk
    @ ~/.julia/packages/Enzyme/aioBJ/src/compiler.jl:6076 [inlined]
 [21] runtime_generic_augfwd(activity::Type{…}, width::Val{…}, ModifiedBetween::Val{…}, RT::Val{…}, f::typeof(reparam_with_entropy), df::Nothing, primal_1::TaskLocalRNG, shadow_1_1::Nothing, primal_2::MultivariateTransformed{…}, shadow_2_1::Base.RefValue{…})
    @ Enzyme.Compiler ~/.julia/packages/Enzyme/aioBJ/src/rules/jitrules.jl:311
 [22] f
    @ ./REPL[83]:4 [inlined]
 [23] f
    @ ./REPL[83]:0 [inlined]
 [24] augmented_julia_f_11084_inner_1wrap
    @ ./REPL[83]:0
 [25] macro expansion
    @ ~/.julia/packages/Enzyme/aioBJ/src/compiler.jl:6587 [inlined]
 [26] enzyme_call
    @ ~/.julia/packages/Enzyme/aioBJ/src/compiler.jl:6188 [inlined]
 [27] AugmentedForwardThunk
    @ ~/.julia/packages/Enzyme/aioBJ/src/compiler.jl:6076 [inlined]
 [28] autodiff(::ReverseMode{…}, ::Const{…}, ::Type{…}, ::Duplicated{…}, ::Const{…})
    @ Enzyme ~/.julia/packages/Enzyme/aioBJ/src/Enzyme.jl:253
 [29] autodiff
    @ ~/.julia/packages/Enzyme/aioBJ/src/Enzyme.jl:321 [inlined]
 [30] main()
    @ Main ./REPL[84]:23
 [31] top-level scope
    @ REPL[85]:1
Some type information was truncated. Use `show(err)` to see complete types.
@Red-Portal
Copy link
Author

Sorry, the MWE has some issues. Let me sort this out first.

@Red-Portal
Copy link
Author

Fixed now.

@wsmoses
Copy link
Member

wsmoses commented Jun 24, 2024

Yeah minimizing this as much as possible would be quite helpful here.

@wsmoses
Copy link
Member

wsmoses commented Jun 24, 2024

Specifically differentiating this function finds a strage type state:

MethodInstance for Base._foldl_impl(::Base.MappingRF{var"#21#22"{SubArray{Float64, 1, Matrix{Float64}, Tuple{Base.Slice{Base.OneTo{Int64}}, Int64}, true}, Stacked{Vector{Function}, Vector{UnitRange{Int64}}}}, Base.BottomRF{typeof(catsamples_and_acc)}}, ::Tuple{Matrix{Float64}, Float64}, ::Base.Iterators.Drop{ColumnSlices{Matrix{Float64}, Tuple{Base.OneTo{Int64}}, SubArray{Float64, 1, Matrix{Float64}, Tuple{Base.Slice{Base.OneTo{Int64}}, Int64}, true}}})

@wsmoses
Copy link
Member

wsmoses commented Jun 25, 2024

Resolved in linked PR, no minimization required.

@Red-Portal
Copy link
Author

Thanks for the fix! It seems part of #1560 is due to an upstream type instability. I'll ask upstream to fix it (this issue) and then see if the issues persist.

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

Successfully merging a pull request may close this issue.

2 participants