Enzyme.jl
Enzyme.jl copied to clipboard
Error when differentiating `LinearAlgebra.copy_similar`
Does this need a rule or is it a bug that Enzyme can't differentiate this call? copyto! and similar separately seem to work.
julia> using Enzyme, LinearAlgebra
julia> A = Symmetric(rand(3, 3))
julia> let dA = make_zero(A)
autodiff(Reverse, A -> sum(LinearAlgebra.copy_similar(A, Float64)), Duplicated(A, dA))
return dA
end
ERROR: Enzyme execution failed.
Enzyme cannot deduce type
Current scope:
; Function Attrs: mustprogress willreturn
define internal fastcc nonnull {} addrspace(10)* @preprocess_julia_copy_similar_8619({ {} addrspace(10)*, i32 } addrspace(11)* nocapture nofree noundef nonnull readonly align 8 dereferenceable(16) "enzymejl_parmtype"="5691831440" "enzymejl_parmtype_ref"="1" %0) unnamed_addr #25 !dbg !968 {
top:
%1 = call {}*** @julia.get_pgcstack()
%2 = call {}*** @julia.get_pgcstack()
%3 = call {}*** @julia.get_pgcstack()
%4 = bitcast {}*** %2 to {}**
%5 = getelementptr inbounds {}*, {}** %4, i64 -14
%6 = getelementptr inbounds {}*, {}** %5, i64 16
%7 = bitcast {}** %6 to i8**
%8 = load i8*, i8** %7, align 8
%9 = call noalias nonnull dereferenceable(8) dereferenceable_or_null(8) {} addrspace(10)* @julia.gc_alloc_obj({}** %5, i64 8, {} addrspace(10)* addrspacecast ({}* inttoptr (i64 4522330320 to {}*) to {} addrspace(10)*)), !enzyme_fromstack !969
call void @zeroType.10({} addrspace(10)* %9, i8 0, i64 8), !enzyme_zerostack !16
%10 = bitcast {} addrspace(10)* %9 to [1 x {} addrspace(10)*] addrspace(10)*, !enzyme_caststack !16
%11 = bitcast {}*** %3 to {}**
%12 = getelementptr inbounds {}*, {}** %11, i64 -14
%13 = getelementptr inbounds {}*, {}** %12, i64 16
%14 = bitcast {}** %13 to i8**
%15 = load i8*, i8** %14, align 8
%16 = call noalias nonnull dereferenceable(16) dereferenceable_or_null(16) {} addrspace(10)* @julia.gc_alloc_obj({}** %12, i64 16, {} addrspace(10)* addrspacecast ({}* inttoptr (i64 5696596560 to {}*) to {} addrspace(10)*)), !enzyme_fromstack !969
call void @zeroType.9({} addrspace(10)* %16, i8 0, i64 16), !enzyme_zerostack !16
%17 = bitcast {} addrspace(10)* %16 to { {} addrspace(10)*, i32 } addrspace(10)*, !enzyme_caststack !16
%18 = bitcast {}*** %1 to {}**
%19 = getelementptr inbounds {}*, {}** %18, i64 -14
%20 = getelementptr inbounds {}*, {}** %19, i64 16
%21 = bitcast {}** %20 to i8**
%22 = load i8*, i8** %21, align 8
%23 = call noalias nonnull dereferenceable(16) dereferenceable_or_null(16) {} addrspace(10)* @julia.gc_alloc_obj({}** %19, i64 16, {} addrspace(10)* addrspacecast ({}* inttoptr (i64 5696596560 to {}*) to {} addrspace(10)*)), !enzyme_fromstack !969
call void @zeroType.11({} addrspace(10)* %23, i8 0, i64 16), !enzyme_zerostack !16
%24 = bitcast {} addrspace(10)* %23 to { {} addrspace(10)*, i32 } addrspace(10)*, !enzyme_caststack !16
%25 = call {}*** @julia.get_pgcstack() #31
%ptls_field23 = getelementptr inbounds {}**, {}*** %25, i64 2
%26 = bitcast {}*** %ptls_field23 to i64***
%ptls_load2425 = load i64**, i64*** %26, align 8, !tbaa !17
%27 = getelementptr inbounds i64*, i64** %ptls_load2425, i64 2
%safepoint = load i64*, i64** %27, align 8, !tbaa !21, !invariant.load !16
fence syncscope("singlethread") seq_cst
call void @julia.safepoint(i64* %safepoint) #31, !dbg !970
fence syncscope("singlethread") seq_cst
%getfield_addr = getelementptr inbounds { {} addrspace(10)*, i32 }, { {} addrspace(10)*, i32 } addrspace(11)* %0, i64 0, i32 0, !dbg !971
%getfield = load atomic {} addrspace(10)*, {} addrspace(10)* addrspace(11)* %getfield_addr unordered, align 8, !dbg !971, !tbaa !21, !invariant.load !16, !alias.scope !30, !noalias !33, !nonnull !16
%28 = addrspacecast {} addrspace(10)* %getfield to {} addrspace(10)* addrspace(11)*, !dbg !973
%arraysize_ptr = getelementptr inbounds {} addrspace(10)*, {} addrspace(10)* addrspace(11)* %28, i64 3, !dbg !973
%29 = bitcast {} addrspace(10)* addrspace(11)* %arraysize_ptr to i64 addrspace(11)*, !dbg !973
%arraysize = load i64, i64 addrspace(11)* %29, align 8, !dbg !973, !tbaa !21, !range !80, !invariant.load !16, !alias.scope !30, !noalias !33
%arraysize_ptr2 = getelementptr inbounds {} addrspace(10)*, {} addrspace(10)* addrspace(11)* %28, i64 4, !dbg !973
%30 = bitcast {} addrspace(10)* addrspace(11)* %arraysize_ptr2 to i64 addrspace(11)*, !dbg !973
%arraysize3 = load i64, i64 addrspace(11)* %30, align 8, !dbg !973, !tbaa !21, !range !80, !invariant.load !16, !alias.scope !30, !noalias !33
%31 = call noalias nonnull {} addrspace(10)* @ijl_alloc_array_2d({} addrspace(10)* noundef addrspacecast ({}* inttoptr (i64 4530665488 to {}*) to {} addrspace(10)*), i64 %arraysize, i64 %arraysize3) #32, !dbg !974
%32 = mul i64 %arraysize3, %arraysize, !dbg !978
%.not = icmp eq i64 %32, 0, !dbg !983
br i1 %.not, label %L25, label %L12, !dbg !982
L12: ; preds = %top
%33 = addrspacecast {} addrspace(10)* %31 to {} addrspace(11)*, !dbg !984
%34 = call nonnull {}* @julia.pointer_from_objref({} addrspace(11)* %33) #33, !dbg !984
%35 = bitcast {}* %34 to i8**, !dbg !984
%arrayptr = load i8*, i8** %35, align 8, !dbg !984, !tbaa !21, !invariant.load !16, !alias.scope !30, !noalias !33, !nonnull !16
%36 = ptrtoint i8* %arrayptr to i64, !dbg !984
%37 = bitcast { {} addrspace(10)*, i32 } addrspace(11)* %0 to i8 addrspace(11)*, !dbg !990
%object_id = call i64 @ijl_object_id_({} addrspace(10)* noundef addrspacecast ({}* inttoptr (i64 5691831440 to {}*) to {} addrspace(10)*), i8 addrspace(11)* nofree noundef nonnull align 8 dereferenceable(16) %37) #31, !dbg !990
%.not26 = icmp eq i64 %object_id, %36, !dbg !993
br i1 %.not26, label %L19, label %L21, !dbg !988
L19: ; preds = %L12
%38 = addrspacecast { {} addrspace(10)*, i32 } addrspace(10)* %17 to { {} addrspace(10)*, i32 }*, !dbg !988
%39 = addrspacecast [1 x {} addrspace(10)*] addrspace(10)* %10 to [1 x {} addrspace(10)*]*, !dbg !988
call fastcc void @julia_unaliascopy_8634({ {} addrspace(10)*, i32 }* noalias nocapture nofree noundef nonnull writeonly sret({ {} addrspace(10)*, i32 }) align 8 dereferenceable(16) %38, [1 x {} addrspace(10)*]* noalias nocapture nofree noundef nonnull writeonly align 8 dereferenceable(8) "enzymejl_returnRoots" %39, { {} addrspace(10)*, i32 } addrspace(11)* nocapture nofree noundef nonnull readonly align 8 dereferenceable(16) %0) #31, !dbg !988
%unbox.fca.0.gep = getelementptr { {} addrspace(10)*, i32 }, { {} addrspace(10)*, i32 } addrspace(10)* %17, i64 0, i32 0
%unbox.fca.0.load = load {} addrspace(10)*, {} addrspace(10)* addrspace(10)* %unbox.fca.0.gep, align 8
%unbox.fca.0.insert = insertvalue { {} addrspace(10)*, i32 } poison, {} addrspace(10)* %unbox.fca.0.load, 0
%unbox.fca.1.gep = getelementptr { {} addrspace(10)*, i32 }, { {} addrspace(10)*, i32 } addrspace(10)* %17, i64 0, i32 1
%unbox.fca.1.load = load i32, i32 addrspace(10)* %unbox.fca.1.gep, align 8
%unbox.fca.1.insert = insertvalue { {} addrspace(10)*, i32 } %unbox.fca.0.insert, i32 %unbox.fca.1.load, 1
br label %L22, !dbg !988
L21: ; preds = %L12
%unbox19 = load { {} addrspace(10)*, i32 }, { {} addrspace(10)*, i32 } addrspace(11)* %0, align 8
br label %L22, !dbg !988
L22: ; preds = %L21, %L19
%value_phi10 = phi { {} addrspace(10)*, i32 } [ %unbox.fca.1.insert, %L19 ], [ %unbox19, %L21 ]
%value_phi10.fca.0.extract = extractvalue { {} addrspace(10)*, i32 } %value_phi10, 0, !dbg !996
%value_phi10.fca.0.gep = getelementptr { {} addrspace(10)*, i32 }, { {} addrspace(10)*, i32 } addrspace(10)* %24, i64 0, i32 0, !dbg !996
store {} addrspace(10)* %value_phi10.fca.0.extract, {} addrspace(10)* addrspace(10)* %value_phi10.fca.0.gep, align 8, !dbg !996, !noalias !997
call void ({} addrspace(10)*, ...) @julia.write_barrier({} addrspace(10)* %23, {} addrspace(10)* %value_phi10.fca.0.extract), !dbg !996
%value_phi10.fca.1.extract = extractvalue { {} addrspace(10)*, i32 } %value_phi10, 1, !dbg !996
%value_phi10.fca.1.gep = getelementptr { {} addrspace(10)*, i32 }, { {} addrspace(10)*, i32 } addrspace(10)* %24, i64 0, i32 1, !dbg !996
store i32 %value_phi10.fca.1.extract, i32 addrspace(10)* %value_phi10.fca.1.gep, align 8, !dbg !996, !noalias !997
%40 = addrspacecast { {} addrspace(10)*, i32 } addrspace(10)* %24 to { {} addrspace(10)*, i32 } addrspace(11)*, !dbg !996
call fastcc void @julia_copyto_unaliased__8623({} addrspace(10)* noundef nonnull align 16 dereferenceable(40) %31, { {} addrspace(10)*, i32 } addrspace(11)* nocapture noundef nonnull readonly align 8 dereferenceable(16) %40) #31, !dbg !996
br label %L25, !dbg !996
L25: ; preds = %L22, %top
ret {} addrspace(10)* %31, !dbg !970
}
Type analysis state:
<analysis>
i64 16: {[-1]:Integer}, intvals: {16,}
{} addrspace(10)* addrspacecast ({}* inttoptr (i64 4530665488 to {}*) to {} addrspace(10)*): {[-1]:Anything}, intvals: {}
i64 8: {[-1]:Integer}, intvals: {8,}
{}* inttoptr (i64 4530665488 to {}*): {[-1]:Anything}, intvals: {}
i32 0: {[-1]:Anything}, intvals: {0,}
%unbox.fca.0.gep = getelementptr { {} addrspace(10)*, i32 }, { {} addrspace(10)*, i32 } addrspace(10)* %17, i64 0, i32 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}, intvals: {}
%unbox.fca.1.gep = getelementptr { {} addrspace(10)*, i32 }, { {} addrspace(10)*, i32 } addrspace(10)* %17, i64 0, i32 1: {[-1]:Pointer, [-1,0]:Integer, [-1,1]:Integer, [-1,2]:Integer, [-1,3]:Integer}, intvals: {}
%6 = getelementptr inbounds {}*, {}** %5, i64 16: {[-1]:Pointer}, intvals: {}
%7 = bitcast {}** %6 to i8**: {[-1]:Pointer}, intvals: {}
i64 5691831440: {[-1]:Anything}, intvals: {5691831440,}
{}* inttoptr (i64 5691831440 to {}*): {[-1]:Anything}, intvals: {}
{} addrspace(10)* addrspacecast ({}* inttoptr (i64 5691831440 to {}*) to {} addrspace(10)*): {[-1]:Anything}, intvals: {}
i64 0: {[-1]:Anything}, intvals: {0,}
%object_id = call i64 @ijl_object_id_({} addrspace(10)* noundef addrspacecast ({}* inttoptr (i64 5691831440 to {}*) to {} addrspace(10)*), i8 addrspace(11)* nofree noundef nonnull align 8 dereferenceable(16) %37) #31, !dbg !79: {[-1]:Pointer}, intvals: {}
%.not26 = icmp eq i64 %object_id, %36, !dbg !85: {[-1]:Integer}, intvals: {}
%unbox19 = load { {} addrspace(10)*, i32 }, { {} addrspace(10)*, i32 } addrspace(11)* %0, align 8: {[0]:Pointer, [0,0]:Pointer, [0,0,-1]:Float@double, [0,8]:Integer, [0,9]:Integer, [0,10]:Integer, [0,11]:Integer, [0,12]:Integer, [0,13]:Integer, [0,14]:Integer, [0,15]:Integer, [0,16]:Integer, [0,17]:Integer, [0,18]:Integer, [0,19]:Integer, [0,20]:Integer, [0,21]:Integer, [0,22]:Integer, [0,23]:Integer, [0,24]:Integer, [0,25]:Integer, [0,26]:Integer, [0,27]:Integer, [0,28]:Integer, [0,29]:Integer, [0,30]:Integer, [0,31]:Integer, [0,32]:Integer, [0,33]:Integer, [0,34]:Integer, [0,35]:Integer, [0,36]:Integer, [0,37]:Integer, [0,38]:Integer, [0,39]:Integer, [8]:Integer, [9]:Integer, [10]:Integer, [11]:Integer}, intvals: {}
%value_phi10.fca.0.extract = extractvalue { {} addrspace(10)*, i32 } %value_phi10, 0, !dbg !91: {[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer}, intvals: {}
%5 = getelementptr inbounds {}*, {}** %4, i64 -14: {[-1]:Pointer}, intvals: {}
%unbox.fca.1.insert = insertvalue { {} addrspace(10)*, i32 } %unbox.fca.0.insert, i32 %unbox.fca.1.load, 1: {[0]:Pointer, [0,0]:Pointer, [0,0,-1]:Float@double, [0,8]:Integer, [0,9]:Integer, [0,10]:Integer, [0,11]:Integer, [0,12]:Integer, [0,13]:Integer, [0,14]:Integer, [0,15]:Integer, [0,16]:Integer, [0,17]:Integer, [0,18]:Integer, [0,19]:Integer, [0,20]:Integer, [0,21]:Integer, [0,22]:Integer, [0,23]:Integer, [0,24]:Integer, [0,25]:Integer, [0,26]:Integer, [0,27]:Integer, [0,28]:Integer, [0,29]:Integer, [0,30]:Integer, [0,31]:Integer, [0,32]:Integer, [0,33]:Integer, [0,34]:Integer, [0,35]:Integer, [0,36]:Integer, [0,37]:Integer, [0,38]:Integer, [0,39]:Integer, [8]:Integer, [9]:Integer, [10]:Integer, [11]:Integer, [12]:Integer, [13]:Integer, [14]:Integer, [15]:Integer}, intvals: {}
{ {} addrspace(10)*, i32 } poison: {[-1]:Anything}, intvals: {}
call void @zeroType.9({} addrspace(10)* %16, i8 0, i64 16), !enzyme_zerostack !16: {}, intvals: {}
%17 = bitcast {} addrspace(10)* %16 to { {} addrspace(10)*, i32 } addrspace(10)*, !enzyme_caststack !16: {[-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}, intvals: {}
%38 = addrspacecast { {} addrspace(10)*, i32 } addrspace(10)* %17 to { {} addrspace(10)*, i32 }*, !dbg !76: {[-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}, intvals: {}
i32 1: {[-1]:Integer}, intvals: {1,}
%value_phi10.fca.1.extract = extractvalue { {} addrspace(10)*, i32 } %value_phi10, 1, !dbg !91: {[-1]:Integer}, intvals: {}
%ptls_field23 = getelementptr inbounds {}**, {}*** %25, i64 2: {[-1]:Pointer, [-1,0]:Pointer}, intvals: {}
%26 = bitcast {}*** %ptls_field23 to i64***: {[-1]:Pointer, [-1,0]:Pointer}, intvals: {}
%27 = getelementptr inbounds i64*, i64** %ptls_load2425, i64 2: {[-1]:Pointer}, intvals: {}
%safepoint = load i64*, i64** %27, align 8, !tbaa !22, !invariant.load !16: {}, intvals: {}
%33 = addrspacecast {} addrspace(10)* %31 to {} addrspace(11)*, !dbg !67: {[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer}, intvals: {}
%35 = bitcast {}* %34 to i8**, !dbg !67: {[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer}, intvals: {}
%arrayptr = load i8*, i8** %35, align 8, !dbg !67, !tbaa !22, !invariant.load !16, !alias.scope !31, !noalias !34, !nonnull !16: {[-1]:Pointer, [-1,-1]:Float@double}, intvals: {}
call fastcc void @julia_copyto_unaliased__8623({} addrspace(10)* noundef nonnull align 16 dereferenceable(40) %31, { {} addrspace(10)*, i32 } addrspace(11)* nocapture noundef nonnull readonly align 8 dereferenceable(16) %40) #31, !dbg !91: {}, intvals: {}
{ {} addrspace(10)*, i32 } 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}, intvals: {}
%32 = mul i64 %arraysize3, %arraysize, !dbg !51: {[-1]:Integer}, intvals: {}
%.not = icmp eq i64 %32, 0, !dbg !64: {[-1]:Integer}, intvals: {}
%value_phi10 = phi { {} addrspace(10)*, i32 } [ %unbox.fca.1.insert, %L19 ], [ %unbox19, %L21 ]: {[0]:Pointer, [0,0]:Pointer, [0,0,-1]:Float@double, [0,8]:Integer, [0,9]:Integer, [0,10]:Integer, [0,11]:Integer, [0,12]:Integer, [0,13]:Integer, [0,14]:Integer, [0,15]:Integer, [0,16]:Integer, [0,17]:Integer, [0,18]:Integer, [0,19]:Integer, [0,20]:Integer, [0,21]:Integer, [0,22]:Integer, [0,23]:Integer, [0,24]:Integer, [0,25]:Integer, [0,26]:Integer, [0,27]:Integer, [0,28]:Integer, [0,29]:Integer, [0,30]:Integer, [0,31]:Integer, [0,32]:Integer, [0,33]:Integer, [0,34]:Integer, [0,35]:Integer, [0,36]:Integer, [0,37]:Integer, [0,38]:Integer, [0,39]:Integer, [8]:Integer, [9]:Integer, [10]:Integer, [11]:Integer}, intvals: {}
%getfield = load atomic {} addrspace(10)*, {} addrspace(10)* addrspace(11)* %getfield_addr unordered, align 8, !dbg !25, !tbaa !22, !invariant.load !16, !alias.scope !31, !noalias !34, !nonnull !16: {[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer}, intvals: {}
call void @zeroType.11({} addrspace(10)* %23, i8 0, i64 16), !enzyme_zerostack !16: {}, intvals: {}
%24 = bitcast {} addrspace(10)* %23 to { {} addrspace(10)*, i32 } addrspace(10)*, !enzyme_caststack !16: {[-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}, intvals: {}
%value_phi10.fca.0.gep = getelementptr { {} addrspace(10)*, i32 }, { {} addrspace(10)*, i32 } addrspace(10)* %24, i64 0, i32 0, !dbg !91: {[-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}, intvals: {}
%value_phi10.fca.1.gep = getelementptr { {} addrspace(10)*, i32 }, { {} addrspace(10)*, i32 } addrspace(10)* %24, i64 0, i32 1, !dbg !91: {[-1]:Pointer, [-1,0]:Integer, [-1,1]:Integer, [-1,2]:Integer, [-1,3]:Integer}, intvals: {}
{} addrspace(10)* addrspacecast ({}* inttoptr (i64 5696596560 to {}*) to {} addrspace(10)*): {[-1]:Anything}, intvals: {}
{}* inttoptr (i64 4522330320 to {}*): {[-1]:Anything}, intvals: {}
{} addrspace(10)* addrspacecast ({}* inttoptr (i64 4522330320 to {}*) to {} addrspace(10)*): {[-1]:Anything}, intvals: {}
%2 = call {}*** @julia.get_pgcstack(): {[-1]:Pointer}, intvals: {}
%getfield_addr = getelementptr inbounds { {} addrspace(10)*, i32 }, { {} addrspace(10)*, i32 } addrspace(11)* %0, i64 0, i32 0, !dbg !25: {[-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}, intvals: {}
%40 = addrspacecast { {} addrspace(10)*, i32 } addrspace(10)* %24 to { {} addrspace(10)*, i32 } addrspace(11)*, !dbg !91: {[-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}, intvals: {}
%4 = bitcast {}*** %2 to {}**: {[-1]:Pointer}, intvals: {}
%37 = bitcast { {} addrspace(10)*, i32 } addrspace(11)* %0 to i8 addrspace(11)*, !dbg !79: {[-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}, intvals: {}
%36 = ptrtoint i8* %arrayptr to i64, !dbg !67: {[-1]:Pointer, [-1,-1]:Float@double}, intvals: {}
call fastcc void @julia_unaliascopy_8634({ {} addrspace(10)*, i32 }* noalias nocapture nofree noundef nonnull writeonly sret({ {} addrspace(10)*, i32 }) align 8 dereferenceable(16) %38, [1 x {} addrspace(10)*]* noalias nocapture nofree noundef nonnull writeonly align 8 dereferenceable(8) "enzymejl_returnRoots" %39, { {} addrspace(10)*, i32 } addrspace(11)* nocapture nofree noundef nonnull readonly align 8 dereferenceable(16) %0) #31, !dbg !76: {}, intvals: {}
%arraysize_ptr = getelementptr inbounds {} addrspace(10)*, {} addrspace(10)* addrspace(11)* %28, i64 3, !dbg !39: {[-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]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer}, intvals: {}
%3 = call {}*** @julia.get_pgcstack(): {[-1]:Pointer}, intvals: {}
%11 = bitcast {}*** %3 to {}**: {[-1]:Pointer}, intvals: {}
%12 = getelementptr inbounds {}*, {}** %11, i64 -14: {[-1]:Pointer}, intvals: {}
%1 = call {}*** @julia.get_pgcstack(): {[-1]:Pointer}, intvals: {}
%28 = addrspacecast {} addrspace(10)* %getfield to {} addrspace(10)* addrspace(11)*, !dbg !39: {[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer}, intvals: {}
%29 = bitcast {} addrspace(10)* addrspace(11)* %arraysize_ptr to i64 addrspace(11)*, !dbg !39: {[-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]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer}, intvals: {}
%unbox.fca.0.load = load {} addrspace(10)*, {} addrspace(10)* addrspace(10)* %unbox.fca.0.gep, align 8: {[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer}, intvals: {}
%unbox.fca.0.insert = insertvalue { {} addrspace(10)*, i32 } poison, {} addrspace(10)* %unbox.fca.0.load, 0: {[0]:Pointer, [0,0]:Pointer, [0,0,-1]:Float@double, [0,8]:Integer, [0,9]:Integer, [0,10]:Integer, [0,11]:Integer, [0,12]:Integer, [0,13]:Integer, [0,14]:Integer, [0,15]:Integer, [0,16]:Integer, [0,17]:Integer, [0,18]:Integer, [0,19]:Integer, [0,20]:Integer, [0,21]:Integer, [0,22]:Integer, [0,23]:Integer, [0,24]:Integer, [0,25]:Integer, [0,26]:Integer, [0,27]:Integer, [0,28]:Integer, [0,29]:Integer, [0,30]:Integer, [0,31]:Integer, [0,32]:Integer, [0,33]:Integer, [0,34]:Integer, [0,35]:Integer, [0,36]:Integer, [0,37]:Integer, [0,38]:Integer, [0,39]:Integer, [8]:Anything, [9]:Anything, [10]:Anything, [11]:Anything, [12]:Anything, [13]:Anything, [14]:Anything, [15]:Anything}, intvals: {}
%unbox.fca.1.load = load i32, i32 addrspace(10)* %unbox.fca.1.gep, align 8: {[-1]:Integer}, intvals: {}
%16 = call noalias nonnull dereferenceable(16) dereferenceable_or_null(16) {} addrspace(10)* @julia.gc_alloc_obj({}** %12, i64 16, {} addrspace(10)* addrspacecast ({}* inttoptr (i64 5696596560 to {}*) to {} addrspace(10)*)), !enzyme_fromstack !17: {[-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}, intvals: {}
%13 = getelementptr inbounds {}*, {}** %12, i64 16: {[-1]:Pointer}, intvals: {}
%14 = bitcast {}** %13 to i8**: {[-1]:Pointer}, intvals: {}
%15 = load i8*, i8** %14, align 8: {}, intvals: {}
{}* inttoptr (i64 5696596560 to {}*): {[-1]:Anything}, intvals: {}
%arraysize3 = load i64, i64 addrspace(11)* %30, align 8, !dbg !39, !tbaa !22, !range !42, !invariant.load !16, !alias.scope !31, !noalias !34: {[-1]:Integer}, intvals: {}
%34 = call nonnull {}* @julia.pointer_from_objref({} addrspace(11)* %33) #33, !dbg !67: {[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer}, intvals: {}
%25 = call {}*** @julia.get_pgcstack() #31: {[-1]:Pointer, [-1,16]:Pointer}, intvals: {}
%ptls_load2425 = load i64**, i64*** %26, align 8, !tbaa !18: {[-1]:Pointer}, intvals: {}
%8 = load i8*, i8** %7, align 8: {}, intvals: {}
%9 = call noalias nonnull dereferenceable(8) dereferenceable_or_null(8) {} addrspace(10)* @julia.gc_alloc_obj({}** %5, i64 8, {} addrspace(10)* addrspacecast ({}* inttoptr (i64 4522330320 to {}*) to {} addrspace(10)*)), !enzyme_fromstack !17: {[-1]:Pointer, [-1,-1]:Pointer}, intvals: {}
%31 = call noalias nonnull {} addrspace(10)* @ijl_alloc_array_2d({} addrspace(10)* noundef addrspacecast ({}* inttoptr (i64 4530665488 to {}*) to {} addrspace(10)*), i64 %arraysize, i64 %arraysize3) #32, !dbg !43: {[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer}, intvals: {}
%arraysize = load i64, i64 addrspace(11)* %29, align 8, !dbg !39, !tbaa !22, !range !42, !invariant.load !16, !alias.scope !31, !noalias !34: {[-1]:Integer}, intvals: {}
%arraysize_ptr2 = getelementptr inbounds {} addrspace(10)*, {} addrspace(10)* addrspace(11)* %28, i64 4, !dbg !39: {[-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: {}
%20 = getelementptr inbounds {}*, {}** %19, i64 16: {[-1]:Pointer}, intvals: {}
%22 = load i8*, i8** %21, align 8: {}, intvals: {}
%23 = call noalias nonnull dereferenceable(16) dereferenceable_or_null(16) {} addrspace(10)* @julia.gc_alloc_obj({}** %19, i64 16, {} addrspace(10)* addrspacecast ({}* inttoptr (i64 5696596560 to {}*) to {} addrspace(10)*)), !enzyme_fromstack !17: {[-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}, intvals: {}
call void @zeroType.10({} addrspace(10)* %9, i8 0, i64 8), !enzyme_zerostack !16: {}, intvals: {}
%10 = bitcast {} addrspace(10)* %9 to [1 x {} addrspace(10)*] addrspace(10)*, !enzyme_caststack !16: {[-1]:Pointer, [-1,-1]:Pointer}, intvals: {}
%39 = addrspacecast [1 x {} addrspace(10)*] addrspace(10)* %10 to [1 x {} addrspace(10)*]*, !dbg !76: {[-1]:Pointer, [-1,-1]:Pointer}, intvals: {}
%18 = bitcast {}*** %1 to {}**: {[-1]:Pointer}, intvals: {}
%19 = getelementptr inbounds {}*, {}** %18, i64 -14: {[-1]:Pointer}, intvals: {}
%21 = bitcast {}** %20 to i8**: {[-1]:Pointer}, intvals: {}
%30 = bitcast {} addrspace(10)* addrspace(11)* %arraysize_ptr2 to i64 addrspace(11)*, !dbg !39: {[-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: {}
</analysis>
Cannot deduce type of phi %value_phi10 = phi { {} addrspace(10)*, i32 } [ %unbox.fca.1.insert, %L19 ], [ %unbox19, %L21 ]{[0]:Pointer, [0,0]:Pointer, [0,0,-1]:Float@double, [0,8]:Integer, [0,9]:Integer, [0,10]:Integer, [0,11]:Integer, [0,12]:Integer, [0,13]:Integer, [0,14]:Integer, [0,15]:Integer, [0,16]:Integer, [0,17]:Integer, [0,18]:Integer, [0,19]:Integer, [0,20]:Integer, [0,21]:Integer, [0,22]:Integer, [0,23]:Integer, [0,24]:Integer, [0,25]:Integer, [0,26]:Integer, [0,27]:Integer, [0,28]:Integer, [0,29]:Integer, [0,30]:Integer, [0,31]:Integer, [0,32]:Integer, [0,33]:Integer, [0,34]:Integer, [0,35]:Integer, [0,36]:Integer, [0,37]:Integer, [0,38]:Integer, [0,39]:Integer, [8]:Integer, [9]:Integer, [10]:Integer, [11]:Integer} sz: 16
Caused by:
Stacktrace:
[1] copyto!
@ ./abstractarray.jl:1068
[2] copy_similar
@ ./REPL[77]:1
Stacktrace:
[1] throwerr(cstr::Cstring)
@ Enzyme.Compiler ~/.julia/dev/Enzyme/src/compiler.jl:1288
[2] copyto!
@ ./abstractarray.jl:1068 [inlined]
[3] copy_similar
@ ./REPL[77]:1
[4] #31
@ ./REPL[78]:2 [inlined]
[5] diffejulia__31_8607_inner_1wrap
@ ./REPL[78]:0
[6] macro expansion
@ ~/.julia/dev/Enzyme/src/compiler.jl:5437 [inlined]
[7] enzyme_call(::Val{…}, ::Ptr{…}, ::Type{…}, ::Type{…}, ::Val{…}, ::Type{…}, ::Type{…}, ::Const{…}, ::Type{…}, ::Duplicated{…}, ::Float64)
@ Enzyme.Compiler ~/.julia/dev/Enzyme/src/compiler.jl:5115
[8] (::Enzyme.Compiler.CombinedAdjointThunk{…})(::Const{…}, ::Duplicated{…}, ::Vararg{…})
@ Enzyme.Compiler ~/.julia/dev/Enzyme/src/compiler.jl:4997
[9] autodiff
@ ~/.julia/dev/Enzyme/src/Enzyme.jl:275 [inlined]
[10] autodiff
@ ~/.julia/dev/Enzyme/src/Enzyme.jl:300 [inlined]
[11] autodiff(mode::ReverseMode{false, FFIABI, false}, f::var"#31#32", args::Duplicated{Symmetric{Float64, Matrix{Float64}}})
@ Enzyme ~/.julia/dev/Enzyme/src/Enzyme.jl:284
[12] top-level scope
@ REPL[78]:2
Some type information was truncated. Use `show(err)` to see complete types.
Narrowing it down a bit more, Enzyme does not seem to like the ::Type{T} annotation in the method. Without it it is fine:
julia> using Enzyme, LinearAlgebra
julia> A = Symmetric(rand(3, 3))
julia> mycopy_similar(A, T) = copyto!(similar(A, T, size(A)), A);
julia> mycopy_similar2(A, ::Type{T}) where {T} = copyto!(similar(A, T, size(A)), A);
julia> let dA = make_zero(A)
autodiff(Reverse, A -> sum(mycopy_similar(A, Float64)), Duplicated(A, dA))
return dA
end
3×3 Symmetric{Float64, Matrix{Float64}}:
1.0 2.0 2.0
2.0 1.0 2.0
2.0 2.0 1.0
julia> let dA = make_zero(A)
autodiff(Reverse, A -> sum(mycopy_similar2(A, Float64)), Duplicated(A, dA))
return dA
end
ERROR: Enzyme execution failed.
Enzyme cannot deduce type
Current scope:
; Function Attrs: mustprogress willreturn
define internal fastcc nonnull {} addrspace(10)* @preprocess_julia_mycopy_similar2_5446({ {} addrspace(10)*, i32 } addrspace(11)* nocapture nofree noundef nonnull readonly align 8 dereferenceable(16) "enzymejl_parmtype"="125311452544208" "enzymejl_parmtype_ref"="1" %0) unnamed_addr #25 !dbg !939 {
top:
...
Is this the specialization thing perhaps?
Requires a jll bump but should be fixed by: https://github.com/EnzymeAD/Enzyme/pull/1864
Now jll bump has landed