-
Notifications
You must be signed in to change notification settings - Fork 74
Description
Turing MWE
using DynamicPPL, Enzyme, LogDensityProblems, Distributions, ADTypes
@model function f()
x ~ Normal()
end
model = f()
adtype = AutoEnzyme(; mode=set_runtime_activity(Reverse, true))
ldf = LogDensityFunction(model; adtype=adtype)
p = ldf.varinfo[:]
LogDensityProblems.logdensity_and_gradient(ldf, p)
versioninfo / package versions
Julia Version 1.11.4
Commit 8561cc3d68d (2025-03-10 11:36 UTC)
Build Info:
Official https://julialang.org/ release
Platform Info:
OS: macOS (arm64-apple-darwin24.0.0)
CPU: 10 × Apple M1 Pro
WORD_SIZE: 64
LLVM: libLLVM-16.0.6 (ORCJIT, apple-m1)
Threads: 1 default, 0 interactive, 1 GC (on 8 virtual cores)
Status `~/ppl/Project.toml`
[47edcb42] ADTypes v1.14.0
[7d9f7c33] Accessors v0.1.42
[31c24e10] Distributions v0.25.118
[366bfd00] DynamicPPL v0.35.5
[7da242da] Enzyme v0.13.34
[6fdf6af0] LogDensityProblems v2.1.2
Crash log:
; Function Attrs: mustprogress willreturn
define internal fastcc void @preprocess_julia_evaluate_threadsafe___13088({ double, { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* } }* noalias nocapture noundef nonnull writeonly sret({ double, { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* } }) align 8 dereferenceable(80) "enzyme_type"="{[-1]:Pointer, [-1,0]:Float@double, [-1,8]:Pointer, [-1,8,0]:Pointer, [-1,8,0,0]:Integer, [-1,8,0,1]:Integer, [-1,8,0,2]:Integer, [-1,8,0,3]:Integer, [-1,8,0,4]:Integer, [-1,8,0,5]:Integer, [-1,8,0,6]:Integer, [-1,8,0,7]:Integer, [-1,8,0,8]:Pointer, [-1,8,8]:Pointer, [-1,8,8,0]:Integer, [-1,8,8,1]:Integer, [-1,8,8,2]:Integer, [-1,8,8,3]:Integer, [-1,8,8,4]:Integer, [-1,8,8,5]:Integer, [-1,8,8,6]:Integer, [-1,8,8,7]:Integer, [-1,8,8,8]:Pointer, [-1,8,16]:Pointer, [-1,8,16,0]:Integer, [-1,8,16,1]:Integer, [-1,8,16,2]:Integer, [-1,8,16,3]:Integer, [-1,8,16,4]:Integer, [-1,8,16,5]:Integer, [-1,8,16,6]:Integer, [-1,8,16,7]:Integer, [-1,8,16,8]:Pointer, [-1,8,16,8,-1]:Integer, [-1,8,24]:Integer, [-1,8,25]:Integer, [-1,8,26]:Integer, [-1,8,27]:Integer, [-1,8,28]:Integer, [-1,8,29]:Integer, [-1,8,30]:Integer, [-1,8,31]:Integer, [-1,8,32]:Integer, [-1,8,33]:Integer, [-1,8,34]:Integer, [-1,8,35]:Integer, [-1,8,36]:Integer, [-1,8,37]:Integer, [-1,8,38]:Integer, [-1,8,39]:Integer, [-1,8,40]:Integer, [-1,8,41]:Integer, [-1,8,42]:Integer, [-1,8,43]:Integer, [-1,8,44]:Integer, [-1,8,45]:Integer, [-1,8,46]:Integer, [-1,8,47]:Integer, [-1,8,48]:Integer, [-1,8,49]:Integer, [-1,8,50]:Integer, [-1,8,51]:Integer, [-1,8,52]:Integer, [-1,8,53]:Integer, [-1,8,54]:Integer, [-1,8,55]:Integer, [-1,8,56]:Integer, [-1,8,57]:Integer, [-1,8,58]:Integer, [-1,8,59]:Integer, [-1,8,60]:Integer, [-1,8,61]:Integer, [-1,8,62]:Integer, [-1,8,63]:Integer, [-1,16]:Pointer, [-1,16,0]:Pointer, [-1,16,8]:Pointer, [-1,16,8,0]:Integer, [-1,16,8,1]:Integer, [-1,16,8,2]:Integer, [-1,16,8,3]:Integer, [-1,16,8,4]:Integer, [-1,16,8,5]:Integer, [-1,16,8,6]:Integer, [-1,16,8,7]:Integer, [-1,16,8,8]:Pointer, [-1,16,16]:Integer, [-1,16,17]:Integer, [-1,16,18]:Integer, [-1,16,19]:Integer, [-1,16,20]:Integer, [-1,16,21]:Integer, [-1,16,22]:Integer, [-1,16,23]:Integer, [-1,24]:Pointer, [-1,24,0]:Pointer, [-1,24,0,-1]:Integer, [-1,24,8]:Pointer, [-1,24,8,0]:Integer, [-1,24,8,1]:Integer, [-1,24,8,2]:Integer, [-1,24,8,3]:Integer, [-1,24,8,4]:Integer, [-1,24,8,5]:Integer, [-1,24,8,6]:Integer, [-1,24,8,7]:Integer, [-1,24,8,8]:Pointer, [-1,24,8,8,-1]:Integer, [-1,24,16]:Integer, [-1,24,17]:Integer, [-1,24,18]:Integer, [-1,24,19]:Integer, [-1,24,20]:Integer, [-1,24,21]:Integer, [-1,24,22]:Integer, [-1,24,23]:Integer, [-1,32]:Pointer, [-1,32,0]:Pointer, [-1,32,0,-1]:Float@double, [-1,32,8]:Pointer, [-1,32,8,0]:Integer, [-1,32,8,1]:Integer, [-1,32,8,2]:Integer, [-1,32,8,3]:Integer, [-1,32,8,4]:Integer, [-1,32,8,5]:Integer, [-1,32,8,6]:Integer, [-1,32,8,7]:Integer, [-1,32,8,8]:Pointer, [-1,32,8,8,-1]:Float@double, [-1,32,16]:Integer, [-1,32,17]:Integer, [-1,32,18]:Integer, [-1,32,19]:Integer, [-1,32,20]:Integer, [-1,32,21]:Integer, [-1,32,22]:Integer, [-1,32,23]:Integer, [-1,40]:Pointer, [-1,40,0]:Pointer, [-1,40,0,-1]:Float@double, [-1,40,8]:Pointer, [-1,40,8,0]:Integer, [-1,40,8,1]:Integer, [-1,40,8,2]:Integer, [-1,40,8,3]:Integer, [-1,40,8,4]:Integer, [-1,40,8,5]:Integer, [-1,40,8,6]:Integer, [-1,40,8,7]:Integer, [-1,40,8,8]:Pointer, [-1,40,8,8,-1]:Float@double, [-1,40,16]:Integer, [-1,40,17]:Integer, [-1,40,18]:Integer, [-1,40,19]:Integer, [-1,40,20]:Integer, [-1,40,21]:Integer, [-1,40,22]:Integer, [-1,40,23]:Integer, [-1,48]:Pointer, [-1,48,0]:Pointer, [-1,48,0,-1]:Integer, [-1,48,8]:Pointer, [-1,48,8,0]:Integer, [-1,48,8,1]:Integer, [-1,48,8,2]:Integer, [-1,48,8,3]:Integer, [-1,48,8,4]:Integer, [-1,48,8,5]:Integer, [-1,48,8,6]:Integer, [-1,48,8,7]:Integer, [-1,48,8,8]:Pointer, [-1,48,8,8,-1]:Integer, [-1,48,16]:Integer, [-1,48,17]:Integer, [-1,48,18]:Integer, [-1,48,19]:Integer, [-1,48,20]:Integer, [-1,48,21]:Integer, [-1,48,22]:Integer, [-1,48,23]:Integer, [-1,56]:Pointer, [-1,56,0]:Pointer, [-1,56,0,0]:Integer, [-1,56,0,1]:Integer, [-1,56,0,2]:Integer, [-1,56,0,3]:Integer, [-1,56,0,4]:Integer, [-1,56,0,5]:Integer, [-1,56,0,6]:Integer, [-1,56,0,7]:Integer, [-1,56,0,8]:Pointer, [-1,56,8]:Pointer, [-1,56,8,0]:Integer, [-1,56,8,1]:Integer, [-1,56,8,2]:Integer, [-1,56,8,3]:Integer, [-1,56,8,4]:Integer, [-1,56,8,5]:Integer, [-1,56,8,6]:Integer, [-1,56,8,7]:Integer, [-1,56,8,8]:Pointer, [-1,56,8,8,0]:Pointer, [-1,56,16]:Pointer, [-1,56,16,0]:Integer, [-1,56,16,1]:Integer, [-1,56,16,2]:Integer, [-1,56,16,3]:Integer, [-1,56,16,4]:Integer, [-1,56,16,5]:Integer, [-1,56,16,6]:Integer, [-1,56,16,7]:Integer, [-1,56,16,8]:Pointer, [-1,56,16,8,0]:Pointer, [-1,56,16,8,0,0]:Pointer, [-1,56,16,8,0,8]:Integer, [-1,56,16,8,0,9]:Integer, [-1,56,16,8,0,10]:Integer, [-1,56,16,8,0,11]:Integer, [-1,56,16,8,0,12]:Integer, [-1,56,16,8,0,13]:Integer, [-1,56,16,8,0,14]:Integer, [-1,56,16,8,0,15]:Integer, [-1,56,16,8,0,16]:Integer, [-1,56,16,8,0,17]:Integer, [-1,56,16,8,0,18]:Integer, [-1,56,16,8,0,19]:Integer, [-1,56,16,8,0,20]:Integer, [-1,56,16,8,0,21]:Integer, [-1,56,16,8,0,22]:Integer, [-1,56,16,8,0,23]:Integer, [-1,56,24]:Integer, [-1,56,25]:Integer, [-1,56,26]:Integer, [-1,56,27]:Integer, [-1,56,28]:Integer, [-1,56,29]:Integer, [-1,56,30]:Integer, [-1,56,31]:Integer, [-1,56,32]:Integer, [-1,56,33]:Integer, [-1,56,34]:Integer, [-1,56,35]:Integer, [-1,56,36]:Integer, [-1,56,37]:Integer, [-1,56,38]:Integer, [-1,56,39]:Integer, [-1,56,40]:Integer, [-1,56,41]:Integer, [-1,56,42]:Integer, [-1,56,43]:Integer, [-1,56,44]:Integer, [-1,56,45]:Integer, [-1,56,46]:Integer, [-1,56,47]:Integer, [-1,56,48]:Integer, [-1,56,49]:Integer, [-1,56,50]:Integer, [-1,56,51]:Integer, [-1,56,52]:Integer, [-1,56,53]:Integer, [-1,56,54]:Integer, [-1,56,55]:Integer, [-1,56,56]:Integer, [-1,56,57]:Integer, [-1,56,58]:Integer, [-1,56,59]:Integer, [-1,56,60]:Integer, [-1,56,61]:Integer, [-1,56,62]:Integer, [-1,56,63]:Integer, [-1,64]:Pointer, [-1,64,-1]:Float@double, [-1,72]:Pointer, [-1,72,-1]:Integer}" %sret_return, [9 x {} addrspace(10)*]* noalias nocapture noundef nonnull writeonly align 8 dereferenceable(72) "enzyme_inactive" "enzyme_type"="{[-1]:Pointer}" "enzymejl_returnRoots" %return_roots, { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* } addrspace(11)* nocapture nofree noundef nonnull readonly align 8 dereferenceable(72) "enzyme_type"="{[-1]:Pointer, [-1,0]:Pointer, [-1,0,0]:Pointer, [-1,0,0,0]:Integer, [-1,0,0,1]:Integer, [-1,0,0,2]:Integer, [-1,0,0,3]:Integer, [-1,0,0,4]:Integer, [-1,0,0,5]:Integer, [-1,0,0,6]:Integer, [-1,0,0,7]:Integer, [-1,0,0,8]:Pointer, [-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,16]:Pointer, [-1,0,16,0]:Integer, [-1,0,16,1]:Integer, [-1,0,16,2]:Integer, [-1,0,16,3]:Integer, [-1,0,16,4]:Integer, [-1,0,16,5]:Integer, [-1,0,16,6]:Integer, [-1,0,16,7]:Integer, [-1,0,16,8]:Pointer, [-1,0,16,8,-1]: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,0,40]:Integer, [-1,0,41]:Integer, [-1,0,42]:Integer, [-1,0,43]:Integer, [-1,0,44]:Integer, [-1,0,45]:Integer, [-1,0,46]:Integer, [-1,0,47]:Integer, [-1,0,48]:Integer, [-1,0,49]:Integer, [-1,0,50]:Integer, [-1,0,51]:Integer, [-1,0,52]:Integer, [-1,0,53]:Integer, [-1,0,54]:Integer, [-1,0,55]:Integer, [-1,0,56]:Integer, [-1,0,57]:Integer, [-1,0,58]:Integer, [-1,0,59]:Integer, [-1,0,60]:Integer, [-1,0,61]:Integer, [-1,0,62]:Integer, [-1,0,63]:Integer, [-1,8]:Pointer, [-1,8,0]:Pointer, [-1,8,8]:Pointer, [-1,8,8,0]:Integer, [-1,8,8,1]:Integer, [-1,8,8,2]:Integer, [-1,8,8,3]:Integer, [-1,8,8,4]:Integer, [-1,8,8,5]:Integer, [-1,8,8,6]:Integer, [-1,8,8,7]:Integer, [-1,8,8,8]:Pointer, [-1,8,16]:Integer, [-1,8,17]:Integer, [-1,8,18]:Integer, [-1,8,19]:Integer, [-1,8,20]:Integer, [-1,8,21]:Integer, [-1,8,22]:Integer, [-1,8,23]:Integer, [-1,16]:Pointer, [-1,16,0]:Pointer, [-1,16,0,-1]:Integer, [-1,16,8]:Pointer, [-1,16,8,0]:Integer, [-1,16,8,1]:Integer, [-1,16,8,2]:Integer, [-1,16,8,3]:Integer, [-1,16,8,4]:Integer, [-1,16,8,5]:Integer, [-1,16,8,6]:Integer, [-1,16,8,7]:Integer, [-1,16,8,8]:Pointer, [-1,16,8,8,-1]:Integer, [-1,16,16]:Integer, [-1,16,17]:Integer, [-1,16,18]:Integer, [-1,16,19]:Integer, [-1,16,20]:Integer, [-1,16,21]:Integer, [-1,16,22]:Integer, [-1,16,23]:Integer, [-1,24]:Pointer, [-1,24,0]:Pointer, [-1,24,0,-1]:Float@double, [-1,24,8]:Pointer, [-1,24,8,0]:Integer, [-1,24,8,1]:Integer, [-1,24,8,2]:Integer, [-1,24,8,3]:Integer, [-1,24,8,4]:Integer, [-1,24,8,5]:Integer, [-1,24,8,6]:Integer, [-1,24,8,7]:Integer, [-1,24,8,8]:Pointer, [-1,24,8,8,-1]:Float@double, [-1,24,16]:Integer, [-1,24,17]:Integer, [-1,24,18]:Integer, [-1,24,19]:Integer, [-1,24,20]:Integer, [-1,24,21]:Integer, [-1,24,22]:Integer, [-1,24,23]:Integer, [-1,32]:Pointer, [-1,32,0]:Pointer, [-1,32,0,-1]:Float@double, [-1,32,8]:Pointer, [-1,32,8,0]:Integer, [-1,32,8,1]:Integer, [-1,32,8,2]:Integer, [-1,32,8,3]:Integer, [-1,32,8,4]:Integer, [-1,32,8,5]:Integer, [-1,32,8,6]:Integer, [-1,32,8,7]:Integer, [-1,32,8,8]:Pointer, [-1,32,8,8,-1]:Float@double, [-1,32,16]:Integer, [-1,32,17]:Integer, [-1,32,18]:Integer, [-1,32,19]:Integer, [-1,32,20]:Integer, [-1,32,21]:Integer, [-1,32,22]:Integer, [-1,32,23]:Integer, [-1,40]:Pointer, [-1,40,0]:Pointer, [-1,40,0,-1]:Integer, [-1,40,8]:Pointer, [-1,40,8,0]:Integer, [-1,40,8,1]:Integer, [-1,40,8,2]:Integer, [-1,40,8,3]:Integer, [-1,40,8,4]:Integer, [-1,40,8,5]:Integer, [-1,40,8,6]:Integer, [-1,40,8,7]:Integer, [-1,40,8,8]:Pointer, [-1,40,8,8,-1]:Integer, [-1,40,16]:Integer, [-1,40,17]:Integer, [-1,40,18]:Integer, [-1,40,19]:Integer, [-1,40,20]:Integer, [-1,40,21]:Integer, [-1,40,22]:Integer, [-1,40,23]:Integer, [-1,48]:Pointer, [-1,48,0]:Pointer, [-1,48,0,0]:Integer, [-1,48,0,1]:Integer, [-1,48,0,2]:Integer, [-1,48,0,3]:Integer, [-1,48,0,4]:Integer, [-1,48,0,5]:Integer, [-1,48,0,6]:Integer, [-1,48,0,7]:Integer, [-1,48,0,8]:Pointer, [-1,48,8]:Pointer, [-1,48,8,0]:Integer, [-1,48,8,1]:Integer, [-1,48,8,2]:Integer, [-1,48,8,3]:Integer, [-1,48,8,4]:Integer, [-1,48,8,5]:Integer, [-1,48,8,6]:Integer, [-1,48,8,7]:Integer, [-1,48,8,8]:Pointer, [-1,48,8,8,0]:Pointer, [-1,48,16]:Pointer, [-1,48,16,0]:Integer, [-1,48,16,1]:Integer, [-1,48,16,2]:Integer, [-1,48,16,3]:Integer, [-1,48,16,4]:Integer, [-1,48,16,5]:Integer, [-1,48,16,6]:Integer, [-1,48,16,7]:Integer, [-1,48,16,8]:Pointer, [-1,48,16,8,0]:Pointer, [-1,48,16,8,0,0]:Pointer, [-1,48,16,8,0,8]:Integer, [-1,48,16,8,0,9]:Integer, [-1,48,16,8,0,10]:Integer, [-1,48,16,8,0,11]:Integer, [-1,48,16,8,0,12]:Integer, [-1,48,16,8,0,13]:Integer, [-1,48,16,8,0,14]:Integer, [-1,48,16,8,0,15]:Integer, [-1,48,16,8,0,16]:Integer, [-1,48,16,8,0,17]:Integer, [-1,48,16,8,0,18]:Integer, [-1,48,16,8,0,19]:Integer, [-1,48,16,8,0,20]:Integer, [-1,48,16,8,0,21]:Integer, [-1,48,16,8,0,22]:Integer, [-1,48,16,8,0,23]:Integer, [-1,48,24]:Integer, [-1,48,25]:Integer, [-1,48,26]:Integer, [-1,48,27]:Integer, [-1,48,28]:Integer, [-1,48,29]:Integer, [-1,48,30]:Integer, [-1,48,31]:Integer, [-1,48,32]:Integer, [-1,48,33]:Integer, [-1,48,34]:Integer, [-1,48,35]:Integer, [-1,48,36]:Integer, [-1,48,37]:Integer, [-1,48,38]:Integer, [-1,48,39]:Integer, [-1,48,40]:Integer, [-1,48,41]:Integer, [-1,48,42]:Integer, [-1,48,43]:Integer, [-1,48,44]:Integer, [-1,48,45]:Integer, [-1,48,46]:Integer, [-1,48,47]:Integer, [-1,48,48]:Integer, [-1,48,49]:Integer, [-1,48,50]:Integer, [-1,48,51]:Integer, [-1,48,52]:Integer, [-1,48,53]:Integer, [-1,48,54]:Integer, [-1,48,55]:Integer, [-1,48,56]:Integer, [-1,48,57]:Integer, [-1,48,58]:Integer, [-1,48,59]:Integer, [-1,48,60]:Integer, [-1,48,61]:Integer, [-1,48,62]:Integer, [-1,48,63]:Integer, [-1,56]:Pointer, [-1,56,-1]:Float@double, [-1,64]:Pointer, [-1,64,-1]:Integer}" "enzymejl_parmtype"="6225632656" "enzymejl_parmtype_ref"="1" %0) unnamed_addr #52 !dbg !2178 {
top:
%1 = call {}*** @julia.get_pgcstack()
%2 = alloca { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* }, align 8, !enzyme_type !424, !enzymejl_allocart !434, !enzymejl_byref_MUT_REF !0, !enzymejl_source_type_DynamicPPL.ThreadSafeVarInfo\7BTypedVarInfo\7B\40NamedTuple\7Bx\3A\3ADynamicPPL.Metadata\7BDict\7BVarName\7B\3Ax\2C\20typeof\28identity\29\7D\2C\20Int64\7D\2C\20Vector\7BNormal\7BFloat64\7D\7D\2C\20Vector\7BVarName\7B\3Ax\2C\20typeof\28identity\29\7D\7D\2C\20Vector\7BFloat64\7D\7D\7D\2C\20Float64\7D\2C\20Vector\7BBase.RefValue\7BFloat64\7D\7D\7D !0
%3 = alloca [7 x {} addrspace(10)*], align 8
%4 = alloca [2 x double], align 8, !enzyme_type !250, !enzymejl_allocart !344, !enzymejl_byref_MUT_REF !0, !enzymejl_source_type_Tuple\7BFloat64\2C\20Float64\7D !0
%5 = alloca { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, align 8
%6 = bitcast {}*** %1 to {}**
%7 = getelementptr inbounds {}*, {}** %6, i64 -14
%8 = bitcast {}** %7 to {}*
%9 = call noalias nonnull dereferenceable(80) dereferenceable_or_null(80) {} addrspace(10)* @julia.gc_alloc_obj({}* %8, i64 80, {} addrspace(10)* addrspacecast ({}* inttoptr (i64 13040906128 to {}*) to {} addrspace(10)*)), !enzyme_type !424, !enzymejl_allocart !434, !enzyme_fromstack !113
call void @zeroType.26({} addrspace(10)* %9, i8 0, i64 80), !enzyme_zerostack !0
%10 = bitcast {} addrspace(10)* %9 to { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* } addrspace(10)*, !enzyme_caststack !0
%11 = alloca [1 x i64], align 8
%pgcstack = call {}*** @julia.get_pgcstack() #53
%ptls_field61 = getelementptr inbounds {}**, {}*** %pgcstack, i64 2
%12 = bitcast {}*** %ptls_field61 to i64***
%ptls_load6263 = load i64**, i64*** %12, align 8, !tbaa !41
%13 = getelementptr inbounds i64*, i64** %ptls_load6263, i64 2
%safepoint = load i64*, i64** %13, align 8, !tbaa !45
fence syncscope("singlethread") seq_cst
call void @julia.safepoint(i64* %safepoint) #54, !dbg !2179
fence syncscope("singlethread") seq_cst
%14 = getelementptr inbounds { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* } addrspace(11)* %0, i64 0, i32 1, !dbg !2180
%15 = bitcast {} addrspace(10)* addrspace(11)* %14 to double addrspace(10)* addrspace(11)*, !dbg !2180
%16 = load atomic double addrspace(10)*, double addrspace(10)* addrspace(11)* %15 unordered, align 8, !dbg !2180, !tbaa !45, !alias.scope !48, !noalias !51, !nonnull !0, !dereferenceable !113, !align !113, !enzyme_type !250, !enzymejl_byref_MUT_REF !0, !enzymejl_source_type_Base.RefValue\7BFloat64\7D !0
%17 = addrspacecast double addrspace(10)* %16 to double addrspace(11)*, !dbg !2184
store double 0.000000e+00, double addrspace(11)* %17, align 8, !dbg !2184, !tbaa !370, !alias.scope !62, !noalias !2186
%18 = addrspacecast { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* } addrspace(10)* %10 to { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* }*, !dbg !2183
call fastcc void @julia_ThreadSafeVarInfo_13121({ { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* }* noalias nocapture nofree noundef nonnull writeonly sret({ { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* }) align 8 dereferenceable(80) %18, { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* } addrspace(11)* nocapture nofree noundef nonnull readonly align 8 dereferenceable(72) %0) #53, !dbg !2183
%19 = getelementptr { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* }, { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* } addrspace(10)* %10, i64 0, i32 0, !dbg !2189
%20 = getelementptr inbounds { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* }, { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* }* %2, i64 0, i32 0, !dbg !2189
%21 = addrspacecast { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* } addrspace(10)* %19 to { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* } addrspace(11)*, !dbg !2195
%22 = call fastcc i8 @julia_istrans_13068({ [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* } addrspace(11)* nocapture nofree noundef nonnull readonly align 8 dereferenceable(80) %21) #53, !dbg !2195
%23 = and i8 %22, 1, !dbg !2195
%.not.not = icmp eq i8 %23, 0, !dbg !2195
br i1 %.not.not, label %L12, label %L11, !dbg !2196
L11: ; preds = %top
%.fca.0.0.0.gep = getelementptr { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* }, { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* } addrspace(10)* %10, i64 0, i32 0, i32 0, i64 0, i64 0
%24 = getelementptr inbounds { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* }, { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* }* %2, i64 0, i32 0, i32 0, i64 0, i64 0
%.fca.0.0.0.load = load {} addrspace(10)*, {} addrspace(10)* addrspace(10)* %.fca.0.0.0.gep, align 8, !enzyme_inactive !0, !enzyme_type !296, !enzymejl_byref_MUT_REF !0, !enzymejl_source_type_Dict\7BVarName\7B\3Ax\2C\20typeof\28identity\29\7D\2C\20Int64\7D !0
%.fca.0.0.1.gep = getelementptr { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* }, { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* } addrspace(10)* %10, i64 0, i32 0, i32 0, i64 0, i64 1
%25 = getelementptr inbounds { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* }, { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* }* %2, i64 0, i32 0, i32 0, i64 0, i64 1
%.fca.0.0.1.load = load {} addrspace(10)*, {} addrspace(10)* addrspace(10)* %.fca.0.0.1.gep, align 8, !enzyme_inactive !0, !enzyme_type !298, !enzymejl_byref_MUT_REF !0, !enzymejl_source_type_Vector\7BVarName\7B\3Ax\2C\20typeof\28identity\29\7D\7D !0
%.fca.0.0.2.gep = getelementptr { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* }, { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* } addrspace(10)* %10, i64 0, i32 0, i32 0, i64 0, i64 2
%26 = getelementptr inbounds { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* }, { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* }* %2, i64 0, i32 0, i32 0, i64 0, i64 2
%.fca.0.0.2.load = load {} addrspace(10)*, {} addrspace(10)* addrspace(10)* %.fca.0.0.2.gep, align 8, !enzyme_inactive !0, !enzyme_type !129, !enzymejl_byref_MUT_REF !0, !enzymejl_source_type_Vector\7BUnitRange\7BInt64\7D\7D !0
%.fca.0.0.3.gep = getelementptr { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* }, { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* } addrspace(10)* %10, i64 0, i32 0, i32 0, i64 0, i64 3
%27 = getelementptr inbounds { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* }, { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* }* %2, i64 0, i32 0, i32 0, i64 0, i64 3
%.fca.0.0.3.load = load {} addrspace(10)*, {} addrspace(10)* addrspace(10)* %.fca.0.0.3.gep, align 8, !enzyme_type !300, !enzymejl_byref_MUT_REF !0, !enzymejl_source_type_Vector\7BFloat64\7D !0
%.fca.0.0.4.gep = getelementptr { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* }, { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* } addrspace(10)* %10, i64 0, i32 0, i32 0, i64 0, i64 4
%28 = getelementptr inbounds { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* }, { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* }* %2, i64 0, i32 0, i32 0, i64 0, i64 4
%.fca.0.0.4.load = load {} addrspace(10)*, {} addrspace(10)* addrspace(10)* %.fca.0.0.4.gep, align 8, !enzyme_type !300, !enzymejl_byref_MUT_REF !0, !enzymejl_source_type_Vector\7BNormal\7BFloat64\7D\7D !0
%.fca.0.0.5.gep = getelementptr { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* }, { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* } addrspace(10)* %10, i64 0, i32 0, i32 0, i64 0, i64 5
%29 = getelementptr inbounds { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* }, { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* }* %2, i64 0, i32 0, i32 0, i64 0, i64 5
%.fca.0.0.5.load = load {} addrspace(10)*, {} addrspace(10)* addrspace(10)* %.fca.0.0.5.gep, align 8, !enzyme_inactive !0, !enzyme_type !129, !enzymejl_byref_MUT_REF !0, !enzymejl_source_type_Vector\7BInt64\7D !0
%.fca.0.0.6.gep = getelementptr { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* }, { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* } addrspace(10)* %10, i64 0, i32 0, i32 0, i64 0, i64 6
%30 = getelementptr inbounds { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* }, { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* }* %2, i64 0, i32 0, i32 0, i64 0, i64 6
%.fca.0.0.6.load = load {} addrspace(10)*, {} addrspace(10)* addrspace(10)* %.fca.0.0.6.gep, align 8, !enzyme_inactive !0, !enzyme_type !302, !enzymejl_byref_MUT_REF !0, !enzymejl_source_type_Dict\7BString\2C\20BitVector\7D !0
%.fca.1.gep31 = getelementptr { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* }, { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* } addrspace(10)* %10, i64 0, i32 0, i32 1
%31 = getelementptr inbounds { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* }, { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* }* %2, i64 0, i32 0, i32 1
%.fca.2.gep32 = getelementptr inbounds { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* }, { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* }* %2, i64 0, i32 0, i32 2
%.fca.2.load = load {} addrspace(10)*, {} addrspace(10)** %.fca.2.gep32, align 8, !enzyme_inactive !0, !enzyme_type !164, !enzymejl_byref_MUT_REF !0, !enzymejl_source_type_Base.RefValue\7BInt64\7D !0
br label %L15, !dbg !2196
L12: ; preds = %top
%.fca.0.0.0.gep33 = getelementptr inbounds { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* }, { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* }* %2, i64 0, i32 0, i32 0, i64 0, i64 0
%.fca.0.0.0.load34 = load {} addrspace(10)*, {} addrspace(10)** %.fca.0.0.0.gep33, align 8, !enzyme_inactive !0, !enzyme_type !296, !enzymejl_byref_MUT_REF !0, !enzymejl_source_type_Dict\7BVarName\7B\3Ax\2C\20typeof\28identity\29\7D\2C\20Int64\7D !0
%.fca.0.0.1.gep36 = getelementptr inbounds { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* }, { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* }* %2, i64 0, i32 0, i32 0, i64 0, i64 1
%.fca.0.0.1.load37 = load {} addrspace(10)*, {} addrspace(10)** %.fca.0.0.1.gep36, align 8, !enzyme_inactive !0, !enzyme_type !298, !enzymejl_byref_MUT_REF !0, !enzymejl_source_type_Vector\7BVarName\7B\3Ax\2C\20typeof\28identity\29\7D\7D !0
%.fca.0.0.2.gep39 = getelementptr inbounds { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* }, { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* }* %2, i64 0, i32 0, i32 0, i64 0, i64 2
%.fca.0.0.2.load40 = load {} addrspace(10)*, {} addrspace(10)** %.fca.0.0.2.gep39, align 8, !enzyme_inactive !0, !enzyme_type !129, !enzymejl_byref_MUT_REF !0, !enzymejl_source_type_Vector\7BUnitRange\7BInt64\7D\7D !0
%.fca.0.0.3.gep42 = getelementptr inbounds { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* }, { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* }* %2, i64 0, i32 0, i32 0, i64 0, i64 3
%.fca.0.0.3.load43 = load {} addrspace(10)*, {} addrspace(10)** %.fca.0.0.3.gep42, align 8, !enzyme_type !300, !enzymejl_byref_MUT_REF !0, !enzymejl_source_type_Vector\7BFloat64\7D !0
%.fca.0.0.4.gep45 = getelementptr inbounds { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* }, { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* }* %2, i64 0, i32 0, i32 0, i64 0, i64 4
%.fca.0.0.4.load46 = load {} addrspace(10)*, {} addrspace(10)** %.fca.0.0.4.gep45, align 8, !enzyme_type !300, !enzymejl_byref_MUT_REF !0, !enzymejl_source_type_Vector\7BNormal\7BFloat64\7D\7D !0
%.fca.0.0.5.gep48 = getelementptr inbounds { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* }, { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* }* %2, i64 0, i32 0, i32 0, i64 0, i64 5
%.fca.0.0.5.load49 = load {} addrspace(10)*, {} addrspace(10)** %.fca.0.0.5.gep48, align 8, !enzyme_inactive !0, !enzyme_type !129, !enzymejl_byref_MUT_REF !0, !enzymejl_source_type_Vector\7BInt64\7D !0
%.fca.0.0.6.gep51 = getelementptr inbounds { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* }, { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* }* %2, i64 0, i32 0, i32 0, i64 0, i64 6
%.fca.0.0.6.load52 = load {} addrspace(10)*, {} addrspace(10)** %.fca.0.0.6.gep51, align 8, !enzyme_inactive !0, !enzyme_type !302, !enzymejl_byref_MUT_REF !0, !enzymejl_source_type_Dict\7BString\2C\20BitVector\7D !0
%.fca.1.gep54 = getelementptr inbounds { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* }, { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* }* %2, i64 0, i32 0, i32 1
%.fca.2.gep57 = getelementptr inbounds { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* }, { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* }* %2, i64 0, i32 0, i32 2
%.fca.2.load58 = load {} addrspace(10)*, {} addrspace(10)** %.fca.2.gep57, align 8, !enzyme_inactive !0, !enzyme_type !164, !enzymejl_byref_MUT_REF !0, !enzymejl_source_type_Base.RefValue\7BInt64\7D !0
br label %L15, !dbg !2196
L15: ; preds = %L12, %L11
%.fca.0.0.0.load.pn = phi {} addrspace(10)* [ %.fca.0.0.0.load, %L11 ], [ %.fca.0.0.0.load34, %L12 ], !enzyme_inactive !0
%.fca.0.0.1.load.pn = phi {} addrspace(10)* [ %.fca.0.0.1.load, %L11 ], [ %.fca.0.0.1.load37, %L12 ], !enzyme_inactive !0
%.fca.0.0.2.load.pn = phi {} addrspace(10)* [ %.fca.0.0.2.load, %L11 ], [ %.fca.0.0.2.load40, %L12 ], !enzyme_inactive !0
%.fca.0.0.3.load.pn = phi {} addrspace(10)* [ %.fca.0.0.3.load, %L11 ], [ %.fca.0.0.3.load43, %L12 ]
%.fca.0.0.4.load.pn = phi {} addrspace(10)* [ %.fca.0.0.4.load, %L11 ], [ %.fca.0.0.4.load46, %L12 ]
%.fca.0.0.5.load.pn = phi {} addrspace(10)* [ %.fca.0.0.5.load, %L11 ], [ %.fca.0.0.5.load49, %L12 ], !enzyme_inactive !0
%.fca.0.0.6.load.pn = phi {} addrspace(10)* [ %.fca.0.0.6.load, %L11 ], [ %.fca.0.0.6.load52, %L12 ], !enzyme_inactive !0
%.in.in = phi {} addrspace(10)** [ %31, %L11 ], [ %.fca.1.gep54, %L12 ]
%.fca.2.load.pn = phi {} addrspace(10)* [ %.fca.2.load, %L11 ], [ %.fca.2.load58, %L12 ], !enzyme_inactive !0
%.in = bitcast {} addrspace(10)** %.in.in to double addrspace(10)**
%32 = load double addrspace(10)*, double addrspace(10)** %.in, align 8
%33 = getelementptr inbounds { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* }, { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* }* %2, i64 0, i32 1, !dbg !2197
%34 = load atomic {} addrspace(10)*, {} addrspace(10)** %33 unordered, align 8, !dbg !2197, !tbaa !208, !alias.scope !210, !noalias !419, !nonnull !0, !dereferenceable !128, !align !113, !enzyme_type !474, !enzymejl_byref_MUT_REF !0, !enzymejl_source_type_Vector\7BBase.RefValue\7BFloat64\7D\7D !0
%.fca.0.gep = getelementptr inbounds [7 x {} addrspace(10)*], [7 x {} addrspace(10)*]* %3, i64 0, i64 0, !dbg !2203
store {} addrspace(10)* %.fca.0.0.0.load.pn, {} addrspace(10)** %.fca.0.gep, align 8, !dbg !2203, !noalias !2213
%.fca.1.gep = getelementptr inbounds [7 x {} addrspace(10)*], [7 x {} addrspace(10)*]* %3, i64 0, i64 1, !dbg !2203
store {} addrspace(10)* %.fca.0.0.1.load.pn, {} addrspace(10)** %.fca.1.gep, align 8, !dbg !2203, !noalias !2213
%.fca.2.gep = getelementptr inbounds [7 x {} addrspace(10)*], [7 x {} addrspace(10)*]* %3, i64 0, i64 2, !dbg !2203
store {} addrspace(10)* %.fca.0.0.2.load.pn, {} addrspace(10)** %.fca.2.gep, align 8, !dbg !2203, !noalias !2213
%.fca.3.gep = getelementptr inbounds [7 x {} addrspace(10)*], [7 x {} addrspace(10)*]* %3, i64 0, i64 3, !dbg !2203
store {} addrspace(10)* %.fca.0.0.3.load.pn, {} addrspace(10)** %.fca.3.gep, align 8, !dbg !2203, !noalias !2213
%.fca.4.gep = getelementptr inbounds [7 x {} addrspace(10)*], [7 x {} addrspace(10)*]* %3, i64 0, i64 4, !dbg !2203
store {} addrspace(10)* %.fca.0.0.4.load.pn, {} addrspace(10)** %.fca.4.gep, align 8, !dbg !2203, !noalias !2213
%.fca.5.gep = getelementptr inbounds [7 x {} addrspace(10)*], [7 x {} addrspace(10)*]* %3, i64 0, i64 5, !dbg !2203
store {} addrspace(10)* %.fca.0.0.5.load.pn, {} addrspace(10)** %.fca.5.gep, align 8, !dbg !2203, !noalias !2213
%.fca.6.gep = getelementptr inbounds [7 x {} addrspace(10)*], [7 x {} addrspace(10)*]* %3, i64 0, i64 6, !dbg !2203
store {} addrspace(10)* %.fca.0.0.6.load.pn, {} addrspace(10)** %.fca.6.gep, align 8, !dbg !2203, !noalias !2213
%35 = addrspacecast [7 x {} addrspace(10)*]* %3 to [7 x {} addrspace(10)*] addrspace(11)*, !dbg !2203
%36 = call fastcc nonnull {} addrspace(10)* @julia_getindex_internal_13049([7 x {} addrspace(10)*] addrspace(11)* nocapture nofree noundef nonnull readonly align 8 dereferenceable(56) %35) #53, !dbg !2203
%value_phi2.fca.0.0.0.gep = getelementptr inbounds { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }* %5, i64 0, i32 0, i64 0, i64 0, !dbg !2214
store {} addrspace(10)* %.fca.0.0.0.load.pn, {} addrspace(10)** %value_phi2.fca.0.0.0.gep, align 8, !dbg !2214, !noalias !2213
%value_phi2.fca.0.0.1.gep = getelementptr inbounds { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }* %5, i64 0, i32 0, i64 0, i64 1, !dbg !2214
store {} addrspace(10)* %.fca.0.0.1.load.pn, {} addrspace(10)** %value_phi2.fca.0.0.1.gep, align 8, !dbg !2214, !noalias !2213
%value_phi2.fca.0.0.2.gep = getelementptr inbounds { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }* %5, i64 0, i32 0, i64 0, i64 2, !dbg !2214
store {} addrspace(10)* %.fca.0.0.2.load.pn, {} addrspace(10)** %value_phi2.fca.0.0.2.gep, align 8, !dbg !2214, !noalias !2213
%value_phi2.fca.0.0.3.gep = getelementptr inbounds { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }* %5, i64 0, i32 0, i64 0, i64 3, !dbg !2214
store {} addrspace(10)* %.fca.0.0.3.load.pn, {} addrspace(10)** %value_phi2.fca.0.0.3.gep, align 8, !dbg !2214, !noalias !2213
%value_phi2.fca.0.0.4.gep = getelementptr inbounds { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }* %5, i64 0, i32 0, i64 0, i64 4, !dbg !2214
store {} addrspace(10)* %.fca.0.0.4.load.pn, {} addrspace(10)** %value_phi2.fca.0.0.4.gep, align 8, !dbg !2214, !noalias !2213
%value_phi2.fca.0.0.5.gep = getelementptr inbounds { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }* %5, i64 0, i32 0, i64 0, i64 5, !dbg !2214
store {} addrspace(10)* %.fca.0.0.5.load.pn, {} addrspace(10)** %value_phi2.fca.0.0.5.gep, align 8, !dbg !2214, !noalias !2213
%value_phi2.fca.0.0.6.gep = getelementptr inbounds { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }* %5, i64 0, i32 0, i64 0, i64 6, !dbg !2214
store {} addrspace(10)* %.fca.0.0.6.load.pn, {} addrspace(10)** %value_phi2.fca.0.0.6.gep, align 8, !dbg !2214, !noalias !2213
%value_phi2.fca.1.gep = getelementptr inbounds { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }* %5, i64 0, i32 1, !dbg !2214
%37 = bitcast {} addrspace(10)** %value_phi2.fca.1.gep to double addrspace(10)**, !dbg !2214
store double addrspace(10)* %32, double addrspace(10)** %37, align 8, !dbg !2214, !noalias !2213
%value_phi2.fca.2.gep = getelementptr inbounds { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }* %5, i64 0, i32 2, !dbg !2214
store {} addrspace(10)* %.fca.2.load.pn, {} addrspace(10)** %value_phi2.fca.2.gep, align 8, !dbg !2214, !noalias !2213
%38 = addrspacecast { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }* %5 to { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* } addrspace(11)*, !dbg !2214
call fastcc void @julia_invlink_with_logpdf_12904([2 x double]* noalias nocapture noundef nonnull sret([2 x double]) align 8 dereferenceable(16) %4, { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* } addrspace(11)* nocapture noundef nonnull readonly align 8 dereferenceable(72) %38, [2 x double] addrspace(11)* nocapture noundef nonnull readonly align 8 dereferenceable(16) addrspacecast ([2 x double]* @_j_const_2_4 to [2 x double] addrspace(11)*), {} addrspace(10)* noundef nonnull align 8 dereferenceable(24) %36) #53, !dbg !2214
%39 = getelementptr inbounds [2 x double], [2 x double]* %4, i64 0, i64 1, !dbg !2215
%40 = call i64 @julia_threadid_13118() #53, !dbg !2216
%41 = add i64 %40, -1, !dbg !2222
%42 = bitcast {} addrspace(10)* %34 to i8 addrspace(10)*, !dbg !2223
%43 = addrspacecast i8 addrspace(10)* %42 to i8 addrspace(11)*, !dbg !2223
%44 = getelementptr inbounds i8, i8 addrspace(11)* %43, i64 16, !dbg !2223
%45 = bitcast i8 addrspace(11)* %44 to i64 addrspace(11)*, !dbg !2223
%46 = load i64, i64 addrspace(11)* %45, align 8, !dbg !2223, !tbaa !78, !alias.scope !81, !noalias !82, !enzyme_inactive !0, !enzyme_type !56, !enzymejl_source_type_Int64 !0, !enzymejl_byref_BITS_VALUE !0
%.not = icmp ult i64 %41, %46, !dbg !2222
br i1 %.not, label %L39, label %L36, !dbg !2222
L36: ; preds = %L15
%47 = getelementptr inbounds [1 x i64], [1 x i64]* %11, i64 0, i64 0, !dbg !2222
store i64 %40, i64* %47, align 8, !dbg !2222, !tbaa !208, !alias.scope !210, !noalias !2224
%48 = addrspacecast [1 x i64]* %11 to [1 x i64] addrspace(11)*, !dbg !2222
call fastcc void @julia_throw_boundserror_13116({} addrspace(10)* noundef nonnull align 8 dereferenceable(24) %34, [1 x i64] addrspace(11)* nocapture noundef nonnull readonly align 8 dereferenceable(8) %48) #55, !dbg !2222
unreachable, !dbg !2222
L39: ; preds = %L15
%49 = bitcast {} addrspace(10)* %34 to { {} addrspace(10)**, {} addrspace(10)* } addrspace(10)*, !dbg !2225
%50 = addrspacecast { {} addrspace(10)**, {} addrspace(10)* } addrspace(10)* %49 to { {} addrspace(10)**, {} addrspace(10)* } addrspace(11)*, !dbg !2225
%51 = bitcast {} addrspace(10)* %34 to {} addrspace(10)** addrspace(10)*, !dbg !2225
%52 = addrspacecast {} addrspace(10)** addrspace(10)* %51 to {} addrspace(10)** addrspace(11)*, !dbg !2225
%53 = load {} addrspace(10)**, {} addrspace(10)** addrspace(11)* %52, align 8, !dbg !2225, !tbaa !95, !alias.scope !81, !noalias !82, !enzyme_type !512, !enzymejl_byref_BITS_VALUE !0, !enzymejl_source_type_Ptr\7BBase.RefValue\7BFloat64\7D\7D !0, !enzyme_nocache !0
%54 = getelementptr inbounds { {} addrspace(10)**, {} addrspace(10)* }, { {} addrspace(10)**, {} addrspace(10)* } addrspace(11)* %50, i64 0, i32 1, !dbg !2225
%55 = load {} addrspace(10)*, {} addrspace(10)* addrspace(11)* %54, align 8, !dbg !2225, !tbaa !95, !alias.scope !81, !noalias !82, !dereferenceable_or_null !112, !align !113, !enzyme_type !513, !enzymejl_byref_MUT_REF !0, !enzymejl_source_type_Memory\7BBase.RefValue\7BFloat64\7D\7D !0
%56 = call "enzyme_type"="{[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double}" {} addrspace(10)* addrspace(13)* @julia.gc_loaded({} addrspace(10)* %55, {} addrspace(10)** %53) #53, !dbg !2225
%57 = getelementptr inbounds {} addrspace(10)*, {} addrspace(10)* addrspace(13)* %56, i64 %41, !dbg !2225
%58 = load atomic {} addrspace(10)*, {} addrspace(10)* addrspace(13)* %57 unordered, align 8, !dbg !2225, !tbaa !514, !alias.scope !62, !noalias !326, !dereferenceable_or_null !113, !align !113, !enzyme_type !111
%.not64 = icmp eq {} addrspace(10)* %58, null, !dbg !2225
%59 = load {}*, {}** @jl_undefref_exception, align 8, !dbg !2225, !tbaa !45, !alias.scope !48, !noalias !51, !nonnull !0
br i1 %.not64, label %fail, label %pass, !dbg !2225
L81: ; preds = %pass
%60 = load atomic {} addrspace(10)*, {} addrspace(10)* addrspace(13)* %56 unordered, align 8, !dbg !2226, !tbaa !514, !alias.scope !62, !noalias !326, !dereferenceable_or_null !113, !align !113, !enzyme_type !250, !enzymejl_byref_MUT_REF !0, !enzymejl_source_type_Base.RefValue\7BFloat64\7D !0
%.not66 = icmp eq {} addrspace(10)* %60, null, !dbg !2226
br i1 %.not66, label %fail3, label %pass4, !dbg !2226
L87: ; preds = %pass
%61 = icmp sgt i64 %46, 15, !dbg !2237
br i1 %61, label %L155, label %L103, !dbg !2238
L103: ; preds = %L87
%62 = load atomic {} addrspace(10)*, {} addrspace(10)* addrspace(13)* %56 unordered, align 8, !dbg !2239, !tbaa !514, !alias.scope !62, !noalias !326, !dereferenceable_or_null !113, !align !113, !enzyme_type !250, !enzymejl_byref_MUT_REF !0, !enzymejl_source_type_Base.RefValue\7BFloat64\7D !0
%.not85 = icmp eq {} addrspace(10)* %62, null, !dbg !2239
br i1 %.not85, label %fail7, label %pass8, !dbg !2239
L132: ; preds = %pass14, %pass10
%value_phi1294 = phi i64 [ %104, %pass14 ], [ 2, %pass10 ]
%value_phi1193 = phi double [ %108, %pass14 ], [ %102, %pass10 ]
%63 = getelementptr inbounds {} addrspace(10)*, {} addrspace(10)* addrspace(13)* %56, i64 %value_phi1294, !dbg !2241
%64 = load atomic {} addrspace(10)*, {} addrspace(10)* addrspace(13)* %63 unordered, align 8, !dbg !2241, !tbaa !514, !alias.scope !62, !noalias !326, !dereferenceable_or_null !113, !align !113, !enzyme_type !111
%.not88 = icmp eq {} addrspace(10)* %64, null, !dbg !2241
br i1 %.not88, label %fail13, label %pass14, !dbg !2241
L155: ; preds = %L87
%65 = call fastcc double @julia_mapreduce_impl_13108({} addrspace(10)* noundef nonnull align 8 dereferenceable(24) %34, i64 noundef signext 1, i64 signext %46) #53, !dbg !2243
br label %L165, !dbg !2244
L165: ; preds = %pass14, %pass10, %pass4, %L155
%value_phi5 = phi double [ %91, %pass4 ], [ %65, %L155 ], [ %102, %pass10 ], [ %108, %pass14 ]
%66 = getelementptr inbounds [2 x double], [2 x double]* %4, i64 0, i64 0, !dbg !2245
%67 = fadd double %87, %value_phi5, !dbg !2246
store double %67, double addrspace(11)* %86, align 8, !dbg !2247, !tbaa !370, !alias.scope !62, !noalias !2186
%68 = load double, double* %66, align 8, !dbg !2236, !tbaa !208, !alias.scope !210, !noalias !419, !enzyme_type !415, !enzymejl_byref_BITS_VALUE !0, !enzymejl_source_type_Float64 !0
%69 = getelementptr inbounds [9 x {} addrspace(10)*], [9 x {} addrspace(10)*]* %return_roots, i64 0, i64 0, !dbg !2236
store {} addrspace(10)* %.fca.0.0.0.load.pn, {} addrspace(10)** %69, align 8, !dbg !2236, !noalias !2213
%70 = getelementptr inbounds [9 x {} addrspace(10)*], [9 x {} addrspace(10)*]* %return_roots, i64 0, i64 1, !dbg !2236
store {} addrspace(10)* %.fca.0.0.1.load.pn, {} addrspace(10)** %70, align 8, !dbg !2236, !noalias !2213
%71 = getelementptr inbounds [9 x {} addrspace(10)*], [9 x {} addrspace(10)*]* %return_roots, i64 0, i64 2, !dbg !2236
store {} addrspace(10)* %.fca.0.0.2.load.pn, {} addrspace(10)** %71, align 8, !dbg !2236, !noalias !2213
%72 = getelementptr inbounds [9 x {} addrspace(10)*], [9 x {} addrspace(10)*]* %return_roots, i64 0, i64 3, !dbg !2236
store {} addrspace(10)* %.fca.0.0.3.load.pn, {} addrspace(10)** %72, align 8, !dbg !2236, !noalias !2213
%73 = getelementptr inbounds [9 x {} addrspace(10)*], [9 x {} addrspace(10)*]* %return_roots, i64 0, i64 4, !dbg !2236
store {} addrspace(10)* %.fca.0.0.4.load.pn, {} addrspace(10)** %73, align 8, !dbg !2236, !noalias !2213
%74 = getelementptr inbounds [9 x {} addrspace(10)*], [9 x {} addrspace(10)*]* %return_roots, i64 0, i64 5, !dbg !2236
store {} addrspace(10)* %.fca.0.0.5.load.pn, {} addrspace(10)** %74, align 8, !dbg !2236, !noalias !2213
%75 = getelementptr inbounds [9 x {} addrspace(10)*], [9 x {} addrspace(10)*]* %return_roots, i64 0, i64 6, !dbg !2236
store {} addrspace(10)* %.fca.0.0.6.load.pn, {} addrspace(10)** %75, align 8, !dbg !2236, !noalias !2213
%76 = getelementptr inbounds [9 x {} addrspace(10)*], [9 x {} addrspace(10)*]* %return_roots, i64 0, i64 7, !dbg !2236
%77 = bitcast {} addrspace(10)** %76 to double addrspace(10)**, !dbg !2236
store double addrspace(10)* %32, double addrspace(10)** %77, align 8, !dbg !2236, !noalias !2213
%78 = getelementptr inbounds [9 x {} addrspace(10)*], [9 x {} addrspace(10)*]* %return_roots, i64 0, i64 8, !dbg !2236
store {} addrspace(10)* %.fca.2.load.pn, {} addrspace(10)** %78, align 8, !dbg !2236, !noalias !2213
%sret_return.repack = getelementptr inbounds { double, { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* } }, { double, { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* } }* %sret_return, i64 0, i32 0, !dbg !2236
store double %68, double* %sret_return.repack, align 8, !dbg !2236, !noalias !2213
%.repack = getelementptr inbounds { double, { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* } }, { double, { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* } }* %sret_return, i64 0, i32 1, i32 0, i64 0, i64 0, !dbg !2236
store {} addrspace(10)* %.fca.0.0.0.load.pn, {} addrspace(10)** %.repack, align 8, !dbg !2236, !noalias !2213
%.repack73 = getelementptr inbounds { double, { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* } }, { double, { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* } }* %sret_return, i64 0, i32 1, i32 0, i64 0, i64 1, !dbg !2236
store {} addrspace(10)* %.fca.0.0.1.load.pn, {} addrspace(10)** %.repack73, align 8, !dbg !2236, !noalias !2213
%.repack75 = getelementptr inbounds { double, { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* } }, { double, { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* } }* %sret_return, i64 0, i32 1, i32 0, i64 0, i64 2, !dbg !2236
store {} addrspace(10)* %.fca.0.0.2.load.pn, {} addrspace(10)** %.repack75, align 8, !dbg !2236, !noalias !2213
%.repack77 = getelementptr inbounds { double, { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* } }, { double, { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* } }* %sret_return, i64 0, i32 1, i32 0, i64 0, i64 3, !dbg !2236
store {} addrspace(10)* %.fca.0.0.3.load.pn, {} addrspace(10)** %.repack77, align 8, !dbg !2236, !noalias !2213
%.repack79 = getelementptr inbounds { double, { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* } }, { double, { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* } }* %sret_return, i64 0, i32 1, i32 0, i64 0, i64 4, !dbg !2236
store {} addrspace(10)* %.fca.0.0.4.load.pn, {} addrspace(10)** %.repack79, align 8, !dbg !2236, !noalias !2213
%.repack81 = getelementptr inbounds { double, { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* } }, { double, { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* } }* %sret_return, i64 0, i32 1, i32 0, i64 0, i64 5, !dbg !2236
store {} addrspace(10)* %.fca.0.0.5.load.pn, {} addrspace(10)** %.repack81, align 8, !dbg !2236, !noalias !2213
%.repack83 = getelementptr inbounds { double, { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* } }, { double, { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* } }* %sret_return, i64 0, i32 1, i32 0, i64 0, i64 6, !dbg !2236
store {} addrspace(10)* %.fca.0.0.6.load.pn, {} addrspace(10)** %.repack83, align 8, !dbg !2236, !noalias !2213
%sret_return.repack67.repack69 = getelementptr inbounds { double, { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* } }, { double, { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* } }* %sret_return, i64 0, i32 1, i32 1, !dbg !2236
%79 = bitcast {} addrspace(10)** %sret_return.repack67.repack69 to double addrspace(10)**, !dbg !2236
store double addrspace(10)* %32, double addrspace(10)** %79, align 8, !dbg !2236, !noalias !2213
%sret_return.repack67.repack71 = getelementptr inbounds { double, { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* } }, { double, { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* } }* %sret_return, i64 0, i32 1, i32 2, !dbg !2236
store {} addrspace(10)* %.fca.2.load.pn, {} addrspace(10)** %sret_return.repack67.repack71, align 8, !dbg !2236, !noalias !2213
ret void, !dbg !2236
fail: ; preds = %L39
%80 = addrspacecast {}* %59 to {} addrspace(12)*, !dbg !2225
call void @ijl_throw({} addrspace(12)* %80) #53, !dbg !2225
unreachable, !dbg !2225
pass: ; preds = %L39
%81 = bitcast {} addrspace(10)* %58 to double addrspace(10)*, !dbg !2250
%82 = addrspacecast double addrspace(10)* %81 to double addrspace(11)*, !dbg !2250
%83 = load double, double addrspace(11)* %82, align 8, !dbg !2250, !tbaa !370, !alias.scope !62, !noalias !326
%84 = load double, double* %39, align 8, !dbg !2252, !tbaa !208, !alias.scope !210, !noalias !419, !enzyme_type !415, !enzymejl_byref_BITS_VALUE !0, !enzymejl_source_type_Float64 !0
%85 = fadd double %83, %84, !dbg !2252
store double %85, double addrspace(11)* %82, align 8, !dbg !2253, !tbaa !370, !alias.scope !62, !noalias !2186
%86 = addrspacecast double addrspace(10)* %32 to double addrspace(11)*, !dbg !2255
%87 = load double, double addrspace(11)* %86, align 8, !dbg !2255, !tbaa !370, !alias.scope !62, !noalias !326
%.not65 = icmp eq i64 %46, 1, !dbg !2258
br i1 %.not65, label %L81, label %L87, !dbg !2259
fail3: ; preds = %L81
%88 = addrspacecast {}* %59 to {} addrspace(12)*, !dbg !2226
call void @ijl_throw({} addrspace(12)* %88) #53, !dbg !2226
unreachable, !dbg !2226
pass4: ; preds = %L81
%89 = bitcast {} addrspace(10)* %60 to double addrspace(10)*, !dbg !2260
%90 = addrspacecast double addrspace(10)* %89 to double addrspace(11)*, !dbg !2260
%91 = load double, double addrspace(11)* %90, align 8, !dbg !2260, !tbaa !370, !alias.scope !62, !noalias !326, !enzyme_type !415, !enzymejl_byref_BITS_VALUE !0, !enzymejl_source_type_Float64 !0
br label %L165, !dbg !2263
fail7: ; preds = %L103
%92 = addrspacecast {}* %59 to {} addrspace(12)*, !dbg !2239
call void @ijl_throw({} addrspace(12)* %92) #53, !dbg !2239
unreachable, !dbg !2239
pass8: ; preds = %L103
%93 = getelementptr inbounds {} addrspace(10)*, {} addrspace(10)* addrspace(13)* %56, i64 1, !dbg !2264
%94 = load atomic {} addrspace(10)*, {} addrspace(10)* addrspace(13)* %93 unordered, align 8, !dbg !2264, !tbaa !514, !alias.scope !62, !noalias !326, !dereferenceable_or_null !113, !align !113, !enzyme_type !250, !enzymejl_byref_MUT_REF !0, !enzymejl_source_type_Base.RefValue\7BFloat64\7D !0
%.not86 = icmp eq {} addrspace(10)* %94, null, !dbg !2264
br i1 %.not86, label %fail9, label %pass10, !dbg !2264
fail9: ; preds = %pass8
%95 = addrspacecast {}* %59 to {} addrspace(12)*, !dbg !2264
call void @ijl_throw({} addrspace(12)* %95) #53, !dbg !2264
unreachable, !dbg !2264
pass10: ; preds = %pass8
%96 = bitcast {} addrspace(10)* %62 to double addrspace(10)*, !dbg !2266
%97 = addrspacecast double addrspace(10)* %96 to double addrspace(11)*, !dbg !2266
%98 = load double, double addrspace(11)* %97, align 8, !dbg !2266, !tbaa !370, !alias.scope !62, !noalias !326, !enzyme_type !415, !enzymejl_byref_BITS_VALUE !0, !enzymejl_source_type_Float64 !0
%99 = bitcast {} addrspace(10)* %94 to double addrspace(10)*, !dbg !2266
%100 = addrspacecast double addrspace(10)* %99 to double addrspace(11)*, !dbg !2266
%101 = load double, double addrspace(11)* %100, align 8, !dbg !2266, !tbaa !370, !alias.scope !62, !noalias !326, !enzyme_type !415, !enzymejl_byref_BITS_VALUE !0, !enzymejl_source_type_Float64 !0
%102 = fadd double %98, %101, !dbg !2269
%.not8792 = icmp sgt i64 %46, 2, !dbg !2271
br i1 %.not8792, label %L132, label %L165, !dbg !2272
fail13: ; preds = %L132
%103 = addrspacecast {}* %59 to {} addrspace(12)*, !dbg !2241
call void @ijl_throw({} addrspace(12)* %103) #53, !dbg !2241
unreachable, !dbg !2241
pass14: ; preds = %L132
%104 = add nuw nsw i64 %value_phi1294, 1, !dbg !2273
%105 = bitcast {} addrspace(10)* %64 to double addrspace(10)*, !dbg !2274
%106 = addrspacecast double addrspace(10)* %105 to double addrspace(11)*, !dbg !2274
%107 = load double, double addrspace(11)* %106, align 8, !dbg !2274, !tbaa !370, !alias.scope !62, !noalias !326
%108 = fadd double %value_phi1193, %107, !dbg !2277
%exitcond.not = icmp eq i64 %104, %46, !dbg !2271
br i1 %exitcond.not, label %L165, label %L132, !dbg !2272
}
rep: %.fca.1.gep31 = getelementptr { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* }, { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* } addrspace(10)* %10, i64 0, i32 0, i32 1 prev: %31 = getelementptr inbounds { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* }, { { [1 x [7 x {} addrspace(10)*]], {} addrspace(10)*, {} addrspace(10)* }, {} addrspace(10)* }* %2, i64 0, i32 0, i32 1 inst: %.in.in = phi {} addrspace(10)** [ %31, %L11 ], [ %.fca.1.gep54, %L12 ]
Illegal address space propagation
UNREACHABLE executed at /workspace/srcdir/Enzyme/enzyme/Enzyme/FunctionUtils.cpp:449!
[12007] signal 6: Abort trap: 6
in expression starting at REPL[7]:1
__pthread_kill at /usr/lib/system/libsystem_kernel.dylib (unknown line)
Allocations: 65296378 (Pool: 65294890; Big: 1488); GC: 38
Abort trap: 6
Models with more than one parameter don't error. I dug into it and it seems to be due to Julia compiler optimisations (if the model is complicated, then it gets rid of some offending code).
I've managed to minimise it into something that has no dependencies apart from standard lib. It's still quite ugly, and maybe there are more simplifications to be found, but I haven't been able to find any.
using Enzyme
struct Foo end
struct Bar end
struct MyMD{A<:Dict,B<:AbstractVector}
a::A
b::B
d::Bool
end
struct MyVI{T}
metadata::T
logp::Base.RefValue{Float64}
end
vi = MyVI(MyMD(
Dict(),
[],
false,
), Ref(0.0))
struct Wrapper{V}
varinfo::V
logps::Vector{Base.RefValue{Float64}}
end
returns1 = Returns(1)
Wrapper(vi::MyVI) = Wrapper(vi, [Ref(vi.logp[]) for _ in 1:returns1()])
f(::Any, vi::MyVI) = vi
function h3(x::AbstractVector, vi::MyVI)
return if returns1() > 1
t = vi.metadata.d ? Foo() : Bar()
wrapper = Wrapper(vi)
wrapper = Wrapper(f(t, wrapper.varinfo), wrapper.logps)
wrapper.varinfo.logp[] = 0.5
wrapper.varinfo
else
x[1] - x[2]
end
end
h3([0.5, 0.2], vi)
Enzyme.gradient(set_runtime_activity(Reverse), h3, [0.5, 0.2], Const(vi))
Given our discussion of type stability the last time 😄 I was a bit concerned about the if/else in h3
returning completely different things, but it doesn't seem that the error is related to that because you could remove any of the lines immediately above wrapper.varinfo
and Enzyme differentiates it perfectly fine. I've also done a bunch of @inferred
on the relevant parts of DynamicPPL (namely evaluate_threadsafe!!
) and it's all come up fine.