-
Notifications
You must be signed in to change notification settings - Fork 76
Open
Description
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
Metadata
Metadata
Assignees
Labels
No labels