Skip to content

Illegal type analysis / conversion of boxed Any errors with broadcast/getproperty combination #2408

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

Open
penelopeysm opened this issue May 23, 2025 · 1 comment

Comments

@penelopeysm
Copy link

penelopeysm commented May 23, 2025

I found a very weird interaction between DynamicPPL / MLDatasets / Enzyme:

Original DynamicPPL / MLDatasets code

using ADTypes: AutoEnzyme
using DynamicPPL: @model
using DynamicPPL.TestUtils.AD: run_ad
import Enzyme: set_runtime_activity, Reverse
using Distributions: InverseGamma, MvNormal, product_distribution
using LinearAlgebra: Diagonal

@model function demo_assume_multivariate_observe(x = [1.5, 2.0])
    s ~ product_distribution([InverseGamma(2, 3), InverseGamma(2, 3)])
    x ~ MvNormal([0.0, 0.0], Diagonal(s))
end

# This import is what causes problems --- otherwise Enzyme happily differentiates the model above
using MLDatasets

model = demo_assume_multivariate_observe()
adtype = AutoEnzyme(; mode=set_runtime_activity(Reverse, true))
run_ad(model, adtype; test=false, benchmark=false)

MWE (Base only)

import Enzyme: Enzyme, Reverse, Const, set_runtime_activity

Enzyme.Compiler.VERBOSE_ERRORS[] = true

# This block of three structs corresponds to the `using MLDatasets`
struct PStruct end
Base.getproperty(::Type{PStruct}, s::Symbol) = getfield(PStruct, s)
struct QStruct end
Base.getproperty(::Type{QStruct}, s::Symbol) = getfield(QStruct, s)
struct RStruct end
Base.getproperty(::Type{RStruct}, s::Symbol) = getfield(RStruct, s)

# The rest corresponds to the DynamicPPL bits
function g(xs)
    return broadcast(x -> (exp(x), x), xs)
end

function f(x::AbstractVector)
    logp = Ref(0.0)
    ts = broadcast(g, x)
    logp[] += ts[1][1]
    return logp[]
end

x = [0.5, 1.0]
f(x)

Enzyme.gradient(Reverse, f, x)

Stack trace

ERROR: LoadError: Enzyme compilation failed due to illegal type analysis.
 This usually indicates the use of a Union type, which is not fully supported with Enzyme.API.strictAliasing set to true [the default].
 Ideally, remove the union (which will also make your code faster), or try setting Enzyme.API.strictAliasing!(false) before any autodiff call.
 To toggle more information for debugging (needed for bug reports), set Enzyme.Compiler.VERBOSE_ERRORS[] = true (default false)
Current scope: 
; Function Attrs: mustprogress willreturn
define internal fastcc nonnull "enzyme_type"="{}" {} addrspace(10)* @preprocess_julia_broadcast_16544({} addrspace(10)* noundef nonnull align 8 dereferenceable(24) "enzyme_type"="{[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Pointer, [-1,8,0]:Integer, [-1,8,1]:Integer, [-1,8,2]:Integer, [-1,8,3]:Integer, [-1,8,4]:Integer, [-1,8,5]:Integer, [-1,8,6]:Integer, [-1,8,7]:Integer, [-1,8,8]:Pointer, [-1,8,8,-1]:Float@double, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer}" "enzymejl_parmtype"="4673230800" "enzymejl_parmtype_ref"="2" %0) unnamed_addr #36 !dbg !770 {
top:
  %1 = call noalias nonnull dereferenceable(8) dereferenceable_or_null(8) i8* @malloc(i64 8), !enzyme_fromstack !347
  %2 = bitcast i8* %1 to [1 x i64]*, !enzyme_caststack !0
  %pgcstack = call {}*** @julia.get_pgcstack() #37
  %current_task133 = getelementptr inbounds {}**, {}*** %pgcstack, i64 -14
  %3 = bitcast {}*** %current_task133 to {}*
  %ptls_field34 = getelementptr inbounds {}**, {}*** %pgcstack, i64 2
  %4 = bitcast {}*** %ptls_field34 to i64***
  %ptls_load3536 = load i64**, i64*** %4, align 8, !tbaa !22
  %5 = getelementptr inbounds i64*, i64** %ptls_load3536, i64 2
  %safepoint = load i64*, i64** %5, align 8, !tbaa !26
  fence syncscope("singlethread") seq_cst
  call void @julia.safepoint(i64* %safepoint) #38, !dbg !771
  fence syncscope("singlethread") seq_cst
  %6 = call fastcc nonnull {} addrspace(10)* @julia_typejoin_union_tuple_16592() #37, !dbg !772
  %7 = call noalias nonnull align 8 dereferenceable(8) "enzyme_type"="{[-1]:Pointer, [-1,-1]:Pointer, [-1,-1,0]:Pointer, [-1,-1,0,-1]:Float@double, [-1,-1,8]:Pointer, [-1,-1,8,0]:Integer, [-1,-1,8,1]:Integer, [-1,-1,8,2]:Integer, [-1,-1,8,3]:Integer, [-1,-1,8,4]:Integer, [-1,-1,8,5]:Integer, [-1,-1,8,6]:Integer, [-1,-1,8,7]:Integer, [-1,-1,8,8]:Pointer, [-1,-1,8,8,-1]:Float@double, [-1,-1,16]:Integer, [-1,-1,17]:Integer, [-1,-1,18]:Integer, [-1,-1,19]:Integer, [-1,-1,20]:Integer, [-1,-1,21]:Integer, [-1,-1,22]:Integer, [-1,-1,23]:Integer}" {} addrspace(10)* @julia.gc_alloc_obj({}* nonnull %3, i64 noundef 8, {} addrspace(10)* noundef addrspacecast ({}* inttoptr (i64 12940236240 to {}*) to {} addrspace(10)*)) #39, !dbg !775
  %8 = bitcast {} addrspace(10)* %7 to { [1 x {} addrspace(10)*] } addrspace(10)*, !dbg !775
  %9 = getelementptr { [1 x {} addrspace(10)*] }, { [1 x {} addrspace(10)*] } addrspace(10)* %8, i64 0, i32 0, i64 0, !dbg !775
  store {} addrspace(10)* %0, {} addrspace(10)* addrspace(10)* %9, align 8, !dbg !775, !tbaa !39, !alias.scope !43, !noalias !776
  %10 = 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 4676130048 to {}*) to {} addrspace(10)*), {} addrspace(10)* nofree nonnull %7, {} addrspace(10)* nonnull %6) #40, !dbg !775
  %11 = bitcast {} addrspace(10)* %0 to i8 addrspace(10)*, !dbg !779
  %12 = addrspacecast i8 addrspace(10)* %11 to i8 addrspace(11)*, !dbg !779
  %13 = getelementptr inbounds i8, i8 addrspace(11)* %12, i64 16, !dbg !779
  %14 = bitcast i8 addrspace(11)* %13 to i64 addrspace(11)*, !dbg !779
  %15 = load i64, i64 addrspace(11)* %14, align 8, !dbg !779, !enzyme_inactive !0, !enzyme_type !37, !enzymejl_source_type_Int64 !0, !enzymejl_byref_BITS_VALUE !0
  %value_phi = call i64 @llvm.smax.i64(i64 %15, i64 noundef 0) #37, !dbg !788
  %.not = icmp slt i64 %15, 1, !dbg !791
  br i1 %.not, label %L116, label %L26.lr.ph, !dbg !792

L26.lr.ph:                                        ; preds = %top
  %16 = bitcast {} addrspace(10)* %0 to { i8*, {} addrspace(10)* } addrspace(10)*
  %17 = addrspacecast { i8*, {} addrspace(10)* } addrspace(10)* %16 to { i8*, {} addrspace(10)* } addrspace(11)*
  %18 = bitcast {} addrspace(10)* %0 to {} addrspace(10)** addrspace(10)*
  %19 = addrspacecast {} addrspace(10)** addrspace(10)* %18 to {} addrspace(10)** addrspace(11)*
  %20 = getelementptr inbounds { i8*, {} addrspace(10)* }, { i8*, {} addrspace(10)* } addrspace(11)* %17, i64 0, i32 1
  %21 = bitcast {} addrspace(10)* %10 to { {} addrspace(10)**, {} addrspace(10)* } addrspace(10)*
  %22 = addrspacecast { {} addrspace(10)**, {} addrspace(10)* } addrspace(10)* %21 to { {} addrspace(10)**, {} addrspace(10)* } addrspace(11)*
  %23 = bitcast {} addrspace(10)* %10 to {} addrspace(10)** addrspace(10)*
  %24 = addrspacecast {} addrspace(10)** addrspace(10)* %23 to {} addrspace(10)** addrspace(11)*
  %25 = getelementptr inbounds { {} addrspace(10)**, {} addrspace(10)* }, { {} addrspace(10)**, {} addrspace(10)* } addrspace(11)* %22, i64 0, i32 1
  br label %L26, !dbg !793

L26:                                              ; preds = %L112, %L26.lr.ph
  %iv = phi i64 [ %iv.next, %L112 ], [ 0, %L26.lr.ph ]
  %iv.next = add nuw nsw i64 %iv, 1, !dbg !794
  %26 = load i64, i64 addrspace(11)* %14, align 8, !dbg !797, !tbaa !264, !alias.scope !262, !noalias !278, !enzyme_inactive !0, !enzyme_type !37, !enzymejl_source_type_Int64 !0, !enzymejl_byref_BITS_VALUE !0
  %.not38 = icmp ult i64 %iv, %26, !dbg !798
  br i1 %.not38, label %L61, label %L58, !dbg !798

L58:                                              ; preds = %L26
  %27 = getelementptr inbounds [1 x i64], [1 x i64]* %2, i64 0, i64 0, !dbg !798
  store i64 %iv.next, i64* %27, align 8, !dbg !798, !tbaa !271, !alias.scope !273, !noalias !804
  %28 = addrspacecast [1 x i64]* %2 to [1 x i64] addrspace(11)*, !dbg !798
  call fastcc void @julia_throw_boundserror_16569({} addrspace(10)* nofree noundef nonnull align 8 dereferenceable(24) %0, [1 x i64] addrspace(11)* nocapture nofree noundef nonnull readonly align 8 dereferenceable(8) %28) #41, !dbg !798
  unreachable, !dbg !798

L61:                                              ; preds = %L26
  %29 = load {} addrspace(10)**, {} addrspace(10)** addrspace(11)* %19, align 8, !dbg !805, !tbaa !259, !alias.scope !262, !noalias !278, !enzyme_type !620, !enzymejl_byref_BITS_VALUE !0, !enzymejl_source_type_Ptr\7BFloat64\7D !0, !enzyme_nocache !0
  %30 = load {} addrspace(10)*, {} addrspace(10)* addrspace(11)* %20, align 8, !dbg !805, !tbaa !259, !alias.scope !262, !noalias !278, !dereferenceable_or_null !346, !align !347, !enzyme_type !622, !enzymejl_byref_MUT_REF !0, !enzymejl_source_type_Memory\7BFloat64\7D !0
  %31 = call "enzyme_type"="{[-1]:Pointer, [-1,-1]:Float@double}" {} addrspace(10)* addrspace(13)* @julia.gc_loaded({} addrspace(10)* noundef %30, {} addrspace(10)** noundef %29) #37, !dbg !805
  %32 = getelementptr inbounds {} addrspace(10)*, {} addrspace(10)* addrspace(13)* %31, i64 %iv, !dbg !805
  %33 = bitcast {} addrspace(10)* addrspace(13)* %32 to double addrspace(13)*, !dbg !805
  %34 = load double, double addrspace(13)* %33, align 8, !dbg !805, !tbaa !530, !alias.scope !43, !noalias !63
  %35 = call double @julia_exp_16573(double %34) #37, !dbg !806
  %36 = call "enzyme_type"="{[-1]:Pointer}" {} addrspace(10)* @julia.typeof({} addrspace(10)* nonnull %10) #42, !dbg !810
  %37 = addrspacecast {} addrspace(10)* %36 to {} addrspace(11)*, !dbg !810
  %38 = call nonnull {}* @julia.pointer_from_objref({} addrspace(11)* %37) #43, !dbg !810
  %magicptr = ptrtoint {}* %38 to i64, !dbg !810
  switch i64 %magicptr, label %L110 [
    i64 4671911040, label %guard_exit
    i64 4727107936, label %guard_exit8
  ], !dbg !810

L110:                                             ; preds = %L61
  %39 = call noalias nonnull align 8 dereferenceable(16) "enzyme_type"="{[-1]:Pointer, [-1,-1]:Float@double}" {} addrspace(10)* @julia.gc_alloc_obj({}* nonnull %3, i64 noundef 16, {} addrspace(10)* noundef addrspacecast ({}* inttoptr (i64 4674564704 to {}*) to {} addrspace(10)*)) #39, !dbg !810
  %40 = bitcast {} addrspace(10)* %39 to i8 addrspace(10)*, !dbg !810
  %.sroa.0.0..sroa_cast22 = bitcast {} addrspace(10)* %39 to double addrspace(10)*, !dbg !810
  store double %35, double addrspace(10)* %.sroa.0.0..sroa_cast22, align 8, !dbg !810, !tbaa !237, !alias.scope !446, !noalias !811
  %.sroa.4.0..sroa_idx27 = getelementptr inbounds i8, i8 addrspace(10)* %40, i64 8, !dbg !810
  %.sroa.4.0..sroa_cast28 = bitcast i8 addrspace(10)* %.sroa.4.0..sroa_idx27 to double addrspace(10)*, !dbg !810
  store double %34, double addrspace(10)* %.sroa.4.0..sroa_cast28, align 8, !dbg !810, !tbaa !237, !alias.scope !446, !noalias !811
  %41 = call noalias nonnull align 8 dereferenceable(8) "enzyme_inactive" "enzyme_type"="{[-1]:Pointer, [-1,-1]:Integer}" {} addrspace(10)* @ijl_box_int64(i64 signext %iv.next) #44, !dbg !810
  %42 = 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 4672249776 to {}*) to {} addrspace(10)*), {} addrspace(10)* nonnull %10, {} addrspace(10)* nofree nonnull %39, {} addrspace(10)* nonnull %41) #40, !dbg !810
  br label %L112, !dbg !810

L112:                                             ; preds = %guard_exit10, %L110
  %exitcond.not = icmp eq i64 %iv.next, %value_phi, !dbg !812
  br i1 %exitcond.not, label %L116.loopexit, label %L26, !dbg !793, !llvm.loop !813

L116.loopexit:                                    ; preds = %L112
  br label %L116, !dbg !814

L116:                                             ; preds = %L116.loopexit, %top
  ret {} addrspace(10)* %10, !dbg !814

guard_exit:                                       ; preds = %L61
  %43 = load {}*, {}** bitcast (i8* getelementptr (i8, i8* @jl_small_typeof, i64 192) to {}**), align 8, !dbg !815, !tbaa !26, !alias.scope !29, !noalias !32, !nonnull !0, !dereferenceable !413, !align !346
  %44 = addrspacecast {}* %43 to {} addrspace(10)*, !dbg !815
  %45 = call noalias nonnull align 8 dereferenceable(16) "enzyme_type"="{[-1]:Pointer, [-1,-1]:Float@double}" {} addrspace(10)* @julia.gc_alloc_obj({}* nonnull %3, i64 noundef 16, {} addrspace(10)* noundef addrspacecast ({}* inttoptr (i64 4674564704 to {}*) to {} addrspace(10)*)) #39, !dbg !815
  %46 = bitcast {} addrspace(10)* %45 to i8 addrspace(10)*, !dbg !815
  %.sroa.0.0..sroa_cast = bitcast {} addrspace(10)* %45 to double addrspace(10)*, !dbg !815
  store double %35, double addrspace(10)* %.sroa.0.0..sroa_cast, align 8, !dbg !815, !tbaa !237, !alias.scope !446, !noalias !811
  %.sroa.4.0..sroa_idx = getelementptr inbounds i8, i8 addrspace(10)* %46, i64 8, !dbg !815
  %.sroa.4.0..sroa_cast = bitcast i8 addrspace(10)* %.sroa.4.0..sroa_idx to double addrspace(10)*, !dbg !815
  store double %34, double addrspace(10)* %.sroa.4.0..sroa_cast, align 8, !dbg !815, !tbaa !237, !alias.scope !446, !noalias !811
  %47 = 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 4673068336 to {}*) to {} addrspace(10)*), {} addrspace(10)* %44, {} addrspace(10)* nofree nonnull %45) #40, !dbg !815
  unreachable, !dbg !815

guard_exit8:                                      ; preds = %L61
  %48 = load {} addrspace(10)**, {} addrspace(10)** addrspace(11)* %24, align 8, !dbg !816, !tbaa !259, !alias.scope !262, !noalias !278, !enzyme_nocache !0
  %49 = load {} addrspace(10)*, {} addrspace(10)* addrspace(11)* %25, align 8, !dbg !816, !tbaa !259, !alias.scope !262, !noalias !278, !dereferenceable_or_null !346, !align !347, !enzyme_type !87
  %50 = call {} addrspace(10)* addrspace(13)* @julia.gc_loaded({} addrspace(10)* noundef %49, {} addrspace(10)** noundef %48) #37, !dbg !816
  %51 = getelementptr inbounds {} addrspace(10)*, {} addrspace(10)* addrspace(13)* %50, i64 %iv, !dbg !816
  %52 = bitcast {} addrspace(10)* %49 to { i64, {} addrspace(10)** } addrspace(10)*, !dbg !816
  %53 = addrspacecast { i64, {} addrspace(10)** } addrspace(10)* %52 to { i64, {} addrspace(10)** } addrspace(11)*, !dbg !816
  %54 = getelementptr inbounds { i64, {} addrspace(10)** }, { i64, {} addrspace(10)** } addrspace(11)* %53, i64 0, i32 1, !dbg !816
  %55 = load {} addrspace(10)**, {} addrspace(10)** addrspace(11)* %54, align 8, !dbg !816, !tbaa !276, !alias.scope !262, !noalias !278, !nonnull !0
  %56 = bitcast {} addrspace(10)* %49 to {} addrspace(10)* addrspace(10)*, !dbg !816
  %57 = addrspacecast {} addrspace(10)* addrspace(10)* %56 to {} addrspace(10)* addrspace(11)*, !dbg !816
  %58 = getelementptr inbounds {} addrspace(10)*, {} addrspace(10)* addrspace(11)* %57, i64 2, !dbg !816
  %59 = addrspacecast {} addrspace(10)** %55 to {} addrspace(10)* addrspace(11)*, !dbg !816
  %.not41 = icmp eq {} addrspace(10)* addrspace(11)* %58, %59, !dbg !816
  br i1 %.not41, label %guard_exit10, label %guard_pass9, !dbg !816

guard_pass9:                                      ; preds = %guard_exit8
  %60 = getelementptr inbounds { i64, {} addrspace(10)** }, { i64, {} addrspace(10)** } addrspace(11)* %53, i64 1, !dbg !816
  %61 = bitcast { i64, {} addrspace(10)** } addrspace(11)* %60 to {} addrspace(10)* addrspace(11)*, !dbg !816
  %62 = load {} addrspace(10)*, {} addrspace(10)* addrspace(11)* %61, align 8, !dbg !816, !tbaa !26, !alias.scope !29, !noalias !32, !enzyme_type !87
  %63 = icmp eq {} addrspace(10)* %62, null, !dbg !816
  %64 = select i1 %63, {} addrspace(10)* %49, {} addrspace(10)* %62, !dbg !816
  br label %guard_exit10, !dbg !816

guard_exit10:                                     ; preds = %guard_pass9, %guard_exit8
  %65 = phi {} addrspace(10)* [ %49, %guard_exit8 ], [ %64, %guard_pass9 ], !dbg !816
  %66 = call noalias nonnull align 8 dereferenceable(16) "enzyme_type"="{[-1]:Pointer, [-1,-1]:Float@double}" {} addrspace(10)* @julia.gc_alloc_obj({}* nonnull %3, i64 noundef 16, {} addrspace(10)* noundef addrspacecast ({}* inttoptr (i64 4674564704 to {}*) to {} addrspace(10)*)) #39, !dbg !816
  %67 = bitcast {} addrspace(10)* %66 to i8 addrspace(10)*, !dbg !816
  %.sroa.0.0..sroa_cast20 = bitcast {} addrspace(10)* %66 to double addrspace(10)*, !dbg !816
  store double %35, double addrspace(10)* %.sroa.0.0..sroa_cast20, align 8, !dbg !816, !tbaa !237, !alias.scope !446, !noalias !811
  %.sroa.4.0..sroa_idx24 = getelementptr inbounds i8, i8 addrspace(10)* %67, i64 8, !dbg !816
  %.sroa.4.0..sroa_cast25 = bitcast i8 addrspace(10)* %.sroa.4.0..sroa_idx24 to double addrspace(10)*, !dbg !816
  store double %34, double addrspace(10)* %.sroa.4.0..sroa_cast25, align 8, !dbg !816, !tbaa !237, !alias.scope !446, !noalias !811
  store atomic {} addrspace(10)* %66, {} addrspace(10)* addrspace(13)* %51 release, align 8, !dbg !816, !tbaa !388, !alias.scope !43, !noalias !776
  call void ({} addrspace(10)*, ...) @julia.write_barrier({} addrspace(10)* %65, {} addrspace(10)* nofree nonnull %66) #42, !dbg !816
  br label %L112, !dbg !810
}

 Type analysis state: 
<analysis>
  %42 = 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 4672249776 to {}*) to {} addrspace(10)*), {} addrspace(10)* nonnull %10, {} addrspace(10)* nofree nonnull %39, {} addrspace(10)* nonnull %41) #40, !dbg !138: {[-1]:Pointer}, intvals: {}
  %pgcstack = call {}*** @julia.get_pgcstack() #37: {}, intvals: {}
  %6 = call fastcc nonnull {} addrspace(10)* @julia_typejoin_union_tuple_16592() #37, !dbg !30: {[-1]:Pointer}, intvals: {}
  %.not = icmp slt i64 %15, 1, !dbg !82: {[-1]:Integer}, intvals: {}
  %39 = call noalias nonnull align 8 dereferenceable(16) "enzyme_type"="{[-1]:Pointer, [-1,-1]:Float@double}" {} addrspace(10)* @julia.gc_alloc_obj({}* nonnull %3, i64 noundef 16, {} addrspace(10)* noundef addrspacecast ({}* inttoptr (i64 4674564704 to {}*) to {} addrspace(10)*)) #39, !dbg !138: {[-1]:Pointer, [-1,-1]:Float@double}, intvals: {}
  %7 = call noalias nonnull align 8 dereferenceable(8) "enzyme_type"="{[-1]:Pointer, [-1,-1]:Pointer, [-1,-1,0]:Pointer, [-1,-1,0,-1]:Float@double, [-1,-1,8]:Pointer, [-1,-1,8,0]:Integer, [-1,-1,8,1]:Integer, [-1,-1,8,2]:Integer, [-1,-1,8,3]:Integer, [-1,-1,8,4]:Integer, [-1,-1,8,5]:Integer, [-1,-1,8,6]:Integer, [-1,-1,8,7]:Integer, [-1,-1,8,8]:Pointer, [-1,-1,8,8,-1]:Float@double, [-1,-1,16]:Integer, [-1,-1,17]:Integer, [-1,-1,18]:Integer, [-1,-1,19]:Integer, [-1,-1,20]:Integer, [-1,-1,21]:Integer, [-1,-1,22]:Integer, [-1,-1,23]:Integer}" {} addrspace(10)* @julia.gc_alloc_obj({}* nonnull %3, i64 noundef 8, {} addrspace(10)* noundef addrspacecast ({}* inttoptr (i64 12940236240 to {}*) to {} addrspace(10)*)) #39, !dbg !38: {[-1]:Pointer, [-1,-1]:Pointer, [-1,-1,0]:Pointer, [-1,-1,0,-1]:Float@double, [-1,-1,8]:Pointer, [-1,-1,8,0]:Integer, [-1,-1,8,1]:Integer, [-1,-1,8,2]:Integer, [-1,-1,8,3]:Integer, [-1,-1,8,4]:Integer, [-1,-1,8,5]:Integer, [-1,-1,8,6]:Integer, [-1,-1,8,7]:Integer, [-1,-1,8,8]:Pointer, [-1,-1,8,8,-1]:Float@double, [-1,-1,16]:Integer, [-1,-1,17]:Integer, [-1,-1,18]:Integer, [-1,-1,19]:Integer, [-1,-1,20]:Integer, [-1,-1,21]:Integer, [-1,-1,22]:Integer, [-1,-1,23]:Integer}, intvals: {}
  %9 = getelementptr { [1 x {} addrspace(10)*] }, { [1 x {} addrspace(10)*] } addrspace(10)* %8, i64 0, i32 0, i64 0, !dbg !38: {[-1]:Pointer, [-1,-1]:Pointer, [-1,-1,0]:Pointer, [-1,-1,0,-1]:Float@double, [-1,-1,8]:Pointer, [-1,-1,8,0]:Integer, [-1,-1,8,1]:Integer, [-1,-1,8,2]:Integer, [-1,-1,8,3]:Integer, [-1,-1,8,4]:Integer, [-1,-1,8,5]:Integer, [-1,-1,8,6]:Integer, [-1,-1,8,7]:Integer, [-1,-1,8,8]:Pointer, [-1,-1,8,8,-1]:Float@double, [-1,-1,16]:Integer, [-1,-1,17]:Integer, [-1,-1,18]:Integer, [-1,-1,19]:Integer, [-1,-1,20]:Integer, [-1,-1,21]:Integer, [-1,-1,22]:Integer, [-1,-1,23]:Integer}, intvals: {}
  %45 = call noalias nonnull align 8 dereferenceable(16) "enzyme_type"="{[-1]:Pointer, [-1,-1]:Float@double}" {} addrspace(10)* @julia.gc_alloc_obj({}* nonnull %3, i64 noundef 16, {} addrspace(10)* noundef addrspacecast ({}* inttoptr (i64 4674564704 to {}*) to {} addrspace(10)*)) #39, !dbg !145: {[-1]:Pointer, [-1,-1]:Float@double}, intvals: {}
  %66 = call noalias nonnull align 8 dereferenceable(16) "enzyme_type"="{[-1]:Pointer, [-1,-1]:Float@double}" {} addrspace(10)* @julia.gc_alloc_obj({}* nonnull %3, i64 noundef 16, {} addrspace(10)* noundef addrspacecast ({}* inttoptr (i64 4674564704 to {}*) to {} addrspace(10)*)) #39, !dbg !151: {[-1]:Pointer, [-1,-1]:Float@double}, intvals: {}
  %35 = call double @julia_exp_16573(double %34) #37, !dbg !129: {[-1]:Float@double}, intvals: {}
  %36 = call "enzyme_type"="{[-1]:Pointer}" {} addrspace(10)* @julia.typeof({} addrspace(10)* nonnull %10) #42, !dbg !138: {[-1]:Pointer}, intvals: {}
  %current_task133 = getelementptr inbounds {}**, {}*** %pgcstack, i64 -14: {}, intvals: {}
  %1 = call noalias nonnull dereferenceable(8) dereferenceable_or_null(8) i8* @malloc(i64 8), !enzyme_fromstack !22: {[-1]:Pointer}, intvals: {}
  %ptls_field34 = getelementptr inbounds {}**, {}*** %pgcstack, i64 2: {}, intvals: {}
  %13 = getelementptr inbounds i8, i8 addrspace(11)* %12, i64 16, !dbg !53: {[-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: {}
  %41 = call noalias nonnull align 8 dereferenceable(8) "enzyme_inactive" "enzyme_type"="{[-1]:Pointer, [-1,-1]:Integer}" {} addrspace(10)* @ijl_box_int64(i64 signext %iv.next) #44, !dbg !138: {[-1]:Pointer, [-1,-1]:Integer}, intvals: {}
  %5 = getelementptr inbounds i64*, i64** %ptls_load3536, i64 2: {[-1]:Pointer}, intvals: {}
  %31 = call "enzyme_type"="{[-1]:Pointer, [-1,-1]:Float@double}" {} addrspace(10)* addrspace(13)* @julia.gc_loaded({} addrspace(10)* noundef %30, {} addrspace(10)** noundef %29) #37, !dbg !117: {[-1]:Pointer, [-1,-1]:Float@double}, intvals: {}
  %20 = getelementptr inbounds { i8*, {} addrspace(10)* }, { i8*, {} addrspace(10)* } addrspace(11)* %17, i64 0, i32 1: {[-1]:Pointer, [-1,0]:Pointer, [-1,0,0]:Integer, [-1,0,1]:Integer, [-1,0,2]:Integer, [-1,0,3]:Integer, [-1,0,4]:Integer, [-1,0,5]:Integer, [-1,0,6]:Integer, [-1,0,7]:Integer, [-1,0,8]:Pointer, [-1,0,8,-1]:Float@double}, intvals: {}
  %value_phi = call i64 @llvm.smax.i64(i64 %15, i64 noundef 0) #37, !dbg !75: {[-1]:Integer}, intvals: {}
  %25 = getelementptr inbounds { {} addrspace(10)**, {} addrspace(10)* }, { {} addrspace(10)**, {} addrspace(10)* } addrspace(11)* %22, i64 0, i32 1: {[-1]:Pointer, [-1,0]:Pointer}, intvals: {}
i32 0: {[-1]:Anything}, intvals: {0,}
{} addrspace(10)* %0: {[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Pointer, [-1,8,0]:Integer, [-1,8,1]:Integer, [-1,8,2]:Integer, [-1,8,3]:Integer, [-1,8,4]:Integer, [-1,8,5]:Integer, [-1,8,6]:Integer, [-1,8,7]:Integer, [-1,8,8]:Pointer, [-1,8,8,-1]:Float@double, [-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: {}
i64 1: {[-1]:Integer}, intvals: {1,}
i64 0: {[-1]:Anything}, intvals: {0,}
  %3 = bitcast {}*** %current_task133 to {}*: {}, intvals: {}
  %4 = bitcast {}*** %ptls_field34 to i64***: {[-1]:Pointer}, intvals: {}
  %ptls_load3536 = load i64**, i64*** %4, align 8, !tbaa !23: {}, intvals: {}
  %safepoint = load i64*, i64** %5, align 8, !tbaa !27: {}, intvals: {}
  %8 = bitcast {} addrspace(10)* %7 to { [1 x {} addrspace(10)*] } addrspace(10)*, !dbg !38: {[-1]:Pointer, [-1,-1]:Pointer, [-1,-1,0]:Pointer, [-1,-1,0,-1]:Float@double, [-1,-1,8]:Pointer, [-1,-1,8,0]:Integer, [-1,-1,8,1]:Integer, [-1,-1,8,2]:Integer, [-1,-1,8,3]:Integer, [-1,-1,8,4]:Integer, [-1,-1,8,5]:Integer, [-1,-1,8,6]:Integer, [-1,-1,8,7]:Integer, [-1,-1,8,8]:Pointer, [-1,-1,8,8,-1]:Float@double, [-1,-1,16]:Integer, [-1,-1,17]:Integer, [-1,-1,18]:Integer, [-1,-1,19]:Integer, [-1,-1,20]:Integer, [-1,-1,21]:Integer, [-1,-1,22]:Integer, [-1,-1,23]:Integer}, intvals: {}
  %11 = bitcast {} addrspace(10)* %0 to i8 addrspace(10)*, !dbg !53: {[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Pointer, [-1,8,0]:Integer, [-1,8,1]:Integer, [-1,8,2]:Integer, [-1,8,3]:Integer, [-1,8,4]:Integer, [-1,8,5]:Integer, [-1,8,6]:Integer, [-1,8,7]:Integer, [-1,8,8]:Pointer, [-1,8,8,-1]:Float@double, [-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: {}
  %12 = addrspacecast i8 addrspace(10)* %11 to i8 addrspace(11)*, !dbg !53: {[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Pointer, [-1,8,0]:Integer, [-1,8,1]:Integer, [-1,8,2]:Integer, [-1,8,3]:Integer, [-1,8,4]:Integer, [-1,8,5]:Integer, [-1,8,6]:Integer, [-1,8,7]:Integer, [-1,8,8]:Pointer, [-1,8,8,-1]:Float@double, [-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: {}
  %14 = bitcast i8 addrspace(11)* %13 to i64 addrspace(11)*, !dbg !53: {[-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: {}
  %15 = load i64, i64 addrspace(11)* %14, align 8, !dbg !53, !enzyme_inactive !0, !enzyme_type !73, !enzymejl_source_type_Int64 !0, !enzymejl_byref_BITS_VALUE !0: {[-1]:Integer}, intvals: {}
  %16 = bitcast {} addrspace(10)* %0 to { i8*, {} addrspace(10)* } addrspace(10)*: {[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Pointer, [-1,8,0]:Integer, [-1,8,1]:Integer, [-1,8,2]:Integer, [-1,8,3]:Integer, [-1,8,4]:Integer, [-1,8,5]:Integer, [-1,8,6]:Integer, [-1,8,7]:Integer, [-1,8,8]:Pointer, [-1,8,8,-1]:Float@double, [-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: {}
  %17 = addrspacecast { i8*, {} addrspace(10)* } addrspace(10)* %16 to { i8*, {} addrspace(10)* } addrspace(11)*: {[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Pointer, [-1,8,0]:Integer, [-1,8,1]:Integer, [-1,8,2]:Integer, [-1,8,3]:Integer, [-1,8,4]:Integer, [-1,8,5]:Integer, [-1,8,6]:Integer, [-1,8,7]:Integer, [-1,8,8]:Pointer, [-1,8,8,-1]:Float@double, [-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: {}
  %18 = bitcast {} addrspace(10)* %0 to {} addrspace(10)** addrspace(10)*: {[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Pointer, [-1,8,0]:Integer, [-1,8,1]:Integer, [-1,8,2]:Integer, [-1,8,3]:Integer, [-1,8,4]:Integer, [-1,8,5]:Integer, [-1,8,6]:Integer, [-1,8,7]:Integer, [-1,8,8]:Pointer, [-1,8,8,-1]:Float@double, [-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: {}
  %19 = addrspacecast {} addrspace(10)** addrspace(10)* %18 to {} addrspace(10)** addrspace(11)*: {[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Pointer, [-1,8,0]:Integer, [-1,8,1]:Integer, [-1,8,2]:Integer, [-1,8,3]:Integer, [-1,8,4]:Integer, [-1,8,5]:Integer, [-1,8,6]:Integer, [-1,8,7]:Integer, [-1,8,8]:Pointer, [-1,8,8,-1]:Float@double, [-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: {}
  %21 = bitcast {} addrspace(10)* %10 to { {} addrspace(10)**, {} addrspace(10)* } addrspace(10)*: {[-1]:Pointer, [-1,0]:Pointer, [-1,0,0]:Pointer, [-1,0,0,-1]:Integer, [-1,0,8]:Pointer, [-1,0,8,0]:Integer, [-1,0,8,1]:Integer, [-1,0,8,2]:Integer, [-1,0,8,3]:Integer, [-1,0,8,4]:Integer, [-1,0,8,5]:Integer, [-1,0,8,6]:Integer, [-1,0,8,7]:Integer, [-1,0,8,8]:Pointer, [-1,0,8,8,-1]: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,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: {}
  %22 = addrspacecast { {} addrspace(10)**, {} addrspace(10)* } addrspace(10)* %21 to { {} addrspace(10)**, {} addrspace(10)* } addrspace(11)*: {[-1]:Pointer, [-1,0]:Pointer, [-1,0,0]:Pointer, [-1,0,0,-1]:Integer, [-1,0,8]:Pointer, [-1,0,8,0]:Integer, [-1,0,8,1]:Integer, [-1,0,8,2]:Integer, [-1,0,8,3]:Integer, [-1,0,8,4]:Integer, [-1,0,8,5]:Integer, [-1,0,8,6]:Integer, [-1,0,8,7]:Integer, [-1,0,8,8]:Pointer, [-1,0,8,8,-1]: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,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: {}
  %23 = bitcast {} addrspace(10)* %10 to {} addrspace(10)** addrspace(10)*: {[-1]:Pointer, [-1,0]:Pointer, [-1,0,0]:Pointer, [-1,0,0,-1]:Integer, [-1,0,8]:Pointer, [-1,0,8,0]:Integer, [-1,0,8,1]:Integer, [-1,0,8,2]:Integer, [-1,0,8,3]:Integer, [-1,0,8,4]:Integer, [-1,0,8,5]:Integer, [-1,0,8,6]:Integer, [-1,0,8,7]:Integer, [-1,0,8,8]:Pointer, [-1,0,8,8,-1]: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,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: {}
  %24 = addrspacecast {} addrspace(10)** addrspace(10)* %23 to {} addrspace(10)** addrspace(11)*: {[-1]:Pointer, [-1,0]:Pointer, [-1,0,0]:Pointer, [-1,0,0,-1]:Integer, [-1,0,8]:Pointer, [-1,0,8,0]:Integer, [-1,0,8,1]:Integer, [-1,0,8,2]:Integer, [-1,0,8,3]:Integer, [-1,0,8,4]:Integer, [-1,0,8,5]:Integer, [-1,0,8,6]:Integer, [-1,0,8,7]:Integer, [-1,0,8,8]:Pointer, [-1,0,8,8,-1]: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,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: {}
  %26 = load i64, i64 addrspace(11)* %14, align 8, !dbg !92, !tbaa !108, !alias.scope !111, !noalias !112, !enzyme_inactive !0, !enzyme_type !73, !enzymejl_source_type_Int64 !0, !enzymejl_byref_BITS_VALUE !0: {[-1]:Integer}, intvals: {}
  %28 = addrspacecast [1 x i64]* %2 to [1 x i64] addrspace(11)*, !dbg !95: {[-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: {}
  %29 = load {} addrspace(10)**, {} addrspace(10)** addrspace(11)* %19, align 8, !dbg !117, !tbaa !118, !alias.scope !111, !noalias !112, !enzyme_type !120, !enzymejl_byref_BITS_VALUE !0, !enzymejl_source_type_Ptr\7BFloat64\7D !0, !enzyme_nocache !0: {[-1]:Pointer, [-1,-1]:Float@double}, intvals: {}
  %30 = load {} addrspace(10)*, {} addrspace(10)* addrspace(11)* %20, align 8, !dbg !117, !tbaa !118, !alias.scope !111, !noalias !112, !dereferenceable_or_null !123, !align !22, !enzyme_type !124, !enzymejl_byref_MUT_REF !0, !enzymejl_source_type_Memory\7BFloat64\7D !0: {[-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, [-1,8]:Pointer, [-1,8,-1]:Float@double}, intvals: {}
  %34 = load double, double addrspace(13)* %33, align 8, !dbg !117, !tbaa !126, !alias.scope !43, !noalias !128: {[-1]:Float@double}, intvals: {}
  %48 = load {} addrspace(10)**, {} addrspace(10)** addrspace(11)* %24, align 8, !dbg !151, !tbaa !118, !alias.scope !111, !noalias !112, !enzyme_nocache !0: {[-1]:Pointer}, intvals: {}
  %49 = load {} addrspace(10)*, {} addrspace(10)* addrspace(11)* %25, align 8, !dbg !151, !tbaa !118, !alias.scope !111, !noalias !112, !dereferenceable_or_null !123, !align !22, !enzyme_type !153: {[-1]:Pointer}, intvals: {}
  %62 = load {} addrspace(10)*, {} addrspace(10)* addrspace(11)* %61, align 8, !dbg !151, !tbaa !27, !alias.scope !148, !noalias !149, !enzyme_type !153: {[-1]:Pointer}, intvals: {}
  %2 = bitcast i8* %1 to [1 x i64]*, !enzyme_caststack !0: {[-1]:Pointer}, intvals: {}
  %10 = 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 4676130048 to {}*) to {} addrspace(10)*), {} addrspace(10)* nofree nonnull %7, {} addrspace(10)* nonnull %6) #40, !dbg !38: {[-1]:Pointer, [-1,0]:Pointer, [-1,0,0]:Pointer, [-1,0,0,-1]:Integer, [-1,0,8]:Pointer, [-1,0,8,0]:Integer, [-1,0,8,1]:Integer, [-1,0,8,2]:Integer, [-1,0,8,3]:Integer, [-1,0,8,4]:Integer, [-1,0,8,5]:Integer, [-1,0,8,6]:Integer, [-1,0,8,7]:Integer, [-1,0,8,8]:Pointer, [-1,0,8,8,-1]: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,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: {}
  %47 = 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 4673068336 to {}*) to {} addrspace(10)*), {} addrspace(10)* %44, {} addrspace(10)* nofree nonnull %45) #40, !dbg !145: {[-1]:Pointer}, intvals: {}
</analysis>

Illegal updateAnalysis prev:{[-1]:Pointer, [-1,0]:Pointer} new: {[-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}
val:   %25 = getelementptr inbounds { {} addrspace(10)**, {} addrspace(10)* }, { {} addrspace(10)**, {} addrspace(10)* } addrspace(11)* %22, i64 0, i32 1 origin=  %25 = getelementptr inbounds { {} addrspace(10)**, {} addrspace(10)* }, { {} addrspace(10)**, {} addrspace(10)* } addrspace(11)* %22, i64 0, i32 1
MethodInstance for broadcast(::typeof(Main.MWE.g), ::Vector{Float64})


Caused by:
Stacktrace:
 [1] macro expansion
   @ ./simdloop.jl:75
 [2] override_bc_materialize
   @ ~/.julia/packages/Enzyme/3VNOP/src/compiler/interpreter.jl:849
 [3] broadcast
   @ ./broadcast.jl:810

Stacktrace:
  [1] julia_error(msg::String, val::Ptr{LLVM.API.LLVMOpaqueValue}, errtype::Enzyme.API.ErrorType, data::Ptr{Nothing}, data2::Ptr{LLVM.API.LLVMOpaqueValue}, B::Ptr{LLVM.API.LLVMOpaqueBuilder})
    @ Enzyme.Compiler ~/.julia/packages/Enzyme/3VNOP/src/errors.jl:358
  [2] julia_error(cstr::Cstring, val::Ptr{LLVM.API.LLVMOpaqueValue}, errtype::Enzyme.API.ErrorType, data::Ptr{Nothing}, data2::Ptr{LLVM.API.LLVMOpaqueValue}, B::Ptr{LLVM.API.LLVMOpaqueBuilder})
    @ Enzyme.Compiler ~/.julia/packages/Enzyme/3VNOP/src/errors.jl:249
  [3] EnzymeCreatePrimalAndGradient(logic::Enzyme.Logic, todiff::LLVM.Function, retType::Enzyme.API.CDIFFE_TYPE, constant_args::Vector{Enzyme.API.CDIFFE_TYPE}, TA::Enzyme.TypeAnalysis, returnValue::Bool, dretUsed::Bool, mode::Enzyme.API.CDerivativeMode, runtimeActivity::Bool, width::Int64, additionalArg::Ptr{Nothing}, forceAnonymousTape::Bool, typeInfo::Enzyme.FnTypeInfo, uncacheable_args::Vector{Bool}, augmented::Ptr{Nothing}, atomicAdd::Bool)
    @ Enzyme.API ~/.julia/packages/Enzyme/3VNOP/src/api.jl:269
  [4] enzyme!(job::GPUCompiler.CompilerJob{Enzyme.Compiler.EnzymeTarget, Enzyme.Compiler.EnzymeCompilerParams}, mod::LLVM.Module, primalf::LLVM.Function, TT::Type, mode::Enzyme.API.CDerivativeMode, width::Int64, parallel::Bool, actualRetType::Type, wrap::Bool, modifiedBetween::NTuple{N, Bool} where N, returnPrimal::Bool, expectedTapeType::Type, loweredArgs::Set{Int64}, boxedArgs::Set{Int64})
    @ Enzyme.Compiler ~/.julia/packages/Enzyme/3VNOP/src/compiler.jl:1754
  [5] codegen(output::Symbol, job::GPUCompiler.CompilerJob{Enzyme.Compiler.EnzymeTarget, Enzyme.Compiler.EnzymeCompilerParams}; libraries::Bool, deferred_codegen::Bool, optimize::Bool, toplevel::Bool, strip::Bool, validate::Bool, only_entry::Bool, parent_job::Nothing)
    @ Enzyme.Compiler ~/.julia/packages/Enzyme/3VNOP/src/compiler.jl:4664
  [6] codegen
    @ ~/.julia/packages/Enzyme/3VNOP/src/compiler.jl:3450 [inlined]
  [7] _thunk(job::GPUCompiler.CompilerJob{Enzyme.Compiler.EnzymeTarget, Enzyme.Compiler.EnzymeCompilerParams}, postopt::Bool)
    @ Enzyme.Compiler ~/.julia/packages/Enzyme/3VNOP/src/compiler.jl:5528
  [8] _thunk
    @ ~/.julia/packages/Enzyme/3VNOP/src/compiler.jl:5528 [inlined]
  [9] cached_compilation
    @ ~/.julia/packages/Enzyme/3VNOP/src/compiler.jl:5580 [inlined]
 [10] thunkbase(mi::Core.MethodInstance, World::UInt64, FA::Type{<:EnzymeCore.Annotation}, A::Type{<:EnzymeCore.Annotation}, TT::Type, Mode::Enzyme.API.CDerivativeMode, width::Int64, ModifiedBetween::NTuple{N, Bool} where N, ReturnPrimal::Bool, ShadowInit::Bool, ABI::Type, ErrIfFuncWritten::Bool, RuntimeActivity::Bool, edges::Vector{Any})
    @ Enzyme.Compiler ~/.julia/packages/Enzyme/3VNOP/src/compiler.jl:5691
 [11] thunk_generator(world::UInt64, source::LineNumberNode, FA::Type, A::Type, TT::Type, Mode::Enzyme.API.CDerivativeMode, Width::Int64, ModifiedBetween::NTuple{N, Bool} where N, ReturnPrimal::Bool, ShadowInit::Bool, ABI::Type, ErrIfFuncWritten::Bool, RuntimeActivity::Bool, self::Any, fakeworld::Any, fa::Type, a::Type, tt::Type, mode::Type, width::Type, modifiedbetween::Type, returnprimal::Type, shadowinit::Type, abi::Type, erriffuncwritten::Type, runtimeactivity::Type)
    @ Enzyme.Compiler ~/.julia/packages/Enzyme/3VNOP/src/compiler.jl:5876
 [12] autodiff
    @ ~/.julia/packages/Enzyme/3VNOP/src/Enzyme.jl:485 [inlined]
 [13] autodiff
    @ ~/.julia/packages/Enzyme/3VNOP/src/Enzyme.jl:524 [inlined]
 [14] macro expansion
    @ ~/.julia/packages/Enzyme/3VNOP/src/sugar.jl:324 [inlined]
 [15] gradient(::EnzymeCore.ReverseMode{false, false, EnzymeCore.FFIABI, false, false}, ::typeof(Main.MWE.f), ::Vector{Float64})
    @ Enzyme ~/.julia/packages/Enzyme/3VNOP/src/sugar.jl:262
 [16] top-level scope
    @ ~/ppl/adtests/main.jl:33
in expression starting at /Users/pyong/ppl/adtests/main.jl:1

Without the Ref

In the minimised example, if I remove the Ref and just write

function f(x::AbstractVector)
    ts = broadcast(g, x)
    return (ts[1][1] + ts[2][1])
end

this gives a different error (Conversion of boxed type Any is not allowed):

ERROR: LoadError: Conversion of boxed type Any is not allowed
Stacktrace:
  [1] error(s::String)
    @ Base ./error.jl:35
  [2] convert(::Type{LLVM.LLVMType}, typ::Type; allow_boxed::Bool)
    @ LLVM.Interop ~/.julia/packages/LLVM/xTJfF/src/interop/base.jl:77
  [3] convert
    @ ~/.julia/packages/LLVM/xTJfF/src/interop/base.jl:71 [inlined]
  [4] lower_convention(functy::Type, mod::LLVM.Module, entry_f::LLVM.Function, actualRetType::Type, RetActivity::Type, TT::Union{Nothing, Type}, run_enzyme::Bool)
    @ Enzyme.Compiler ~/.julia/packages/Enzyme/3VNOP/src/compiler.jl:2720
  [5] codegen(output::Symbol, job::GPUCompiler.CompilerJob{Enzyme.Compiler.EnzymeTarget, Enzyme.Compiler.EnzymeCompilerParams}; libraries::Bool, deferred_codegen::Bool, optimize::Bool, toplevel::Bool, strip::Bool, validate::Bool, only_entry::Bool, parent_job::Nothing)
    @ Enzyme.Compiler ~/.julia/packages/Enzyme/3VNOP/src/compiler.jl:4286
  [6] codegen
    @ ~/.julia/packages/Enzyme/3VNOP/src/compiler.jl:3450 [inlined]
  [7] _thunk(job::GPUCompiler.CompilerJob{Enzyme.Compiler.EnzymeTarget, Enzyme.Compiler.EnzymeCompilerParams}, postopt::Bool)
    @ Enzyme.Compiler ~/.julia/packages/Enzyme/3VNOP/src/compiler.jl:5528
  [8] _thunk
    @ ~/.julia/packages/Enzyme/3VNOP/src/compiler.jl:5528 [inlined]
  [9] cached_compilation
    @ ~/.julia/packages/Enzyme/3VNOP/src/compiler.jl:5580 [inlined]
 [10] thunkbase(mi::Core.MethodInstance, World::UInt64, FA::Type{<:EnzymeCore.Annotation}, A::Type{<:EnzymeCore.Annotation}, TT::Type, Mode::Enzyme.API.CDerivativeMode, width::Int64, ModifiedBetween::NTuple{N, Bool} where N, ReturnPrimal::Bool, ShadowInit::Bool, ABI::Type, ErrIfFuncWritten::Bool, RuntimeActivity::Bool, edges::Vector{Any})
    @ Enzyme.Compiler ~/.julia/packages/Enzyme/3VNOP/src/compiler.jl:5691
 [11] thunk_generator(world::UInt64, source::LineNumberNode, FA::Type, A::Type, TT::Type, Mode::Enzyme.API.CDerivativeMode, Width::Int64, ModifiedBetween::NTuple{N, Bool} where N, ReturnPrimal::Bool, ShadowInit::Bool, ABI::Type, ErrIfFuncWritten::Bool, RuntimeActivity::Bool, self::Any, fakeworld::Any, fa::Type, a::Type, tt::Type, mode::Type, width::Type, modifiedbetween::Type, returnprimal::Type, shadowinit::Type, abi::Type, erriffuncwritten::Type, runtimeactivity::Type)
    @ Enzyme.Compiler ~/.julia/packages/Enzyme/3VNOP/src/compiler.jl:5876
 [12] autodiff
    @ ~/.julia/packages/Enzyme/3VNOP/src/Enzyme.jl:485 [inlined]
 [13] autodiff
    @ ~/.julia/packages/Enzyme/3VNOP/src/Enzyme.jl:524 [inlined]
 [14] macro expansion
    @ ~/.julia/packages/Enzyme/3VNOP/src/sugar.jl:324 [inlined]
 [15] gradient(::EnzymeCore.ReverseMode{false, false, EnzymeCore.FFIABI, false, false}, ::typeof(Main.MWE.f), ::Vector{Float64})
    @ Enzyme ~/.julia/packages/Enzyme/3VNOP/src/sugar.jl:262
 [16] top-level scope
    @ ~/ppl/adtests/main.jl:33
in expression starting at /Users/pyong/ppl/adtests/main.jl:1
@penelopeysm
Copy link
Author

penelopeysm commented May 23, 2025

(If this info is of any use: the using MLDatasets causes a lot of models that were previously perfectly fine to error. This table https://turinglang.org/ADTests/pr/ is built from TuringLang/ADTests#23, where I added a model that used MLDatasets. The error messages are quite varied -- many of them segfault (example) and some of them do the illegal type analysis error (example) -- but I am pretty sure that they are all traceable to the MLDatasets import, so hopefully they all have the same underlying cause!)

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

No branches or pull requests

1 participant