Skip to content

Turing models with only one parameter assertion error on reverse-mode #2337

@penelopeysm

Description

@penelopeysm

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions