EnzymeAD / Enzyme.jl

Julia bindings for the Enzyme automatic differentiator
https://enzyme.mit.edu
MIT License
437 stars 62 forks source link

Does not work with Polyester.jl #392

Open ranocha opened 2 years ago

ranocha commented 2 years ago

Using Julia v1.7.3 with 2 threads, I get

julia> using Pkg; Pkg.activate(temp=true); Pkg.add(["Enzyme", "Polyester"]); using Enzyme, Polyester
  Activating new project at `/tmp/jl_FSJlI0`
    Updating registry at `~/.julia/registries/General.toml`
   Resolving package versions...
    Updating `/tmp/jl_FSJlI0/Project.toml`
  [7da242da] + Enzyme v0.10.4
  [f517fe37] + Polyester v0.6.14
    Updating `/tmp/jl_FSJlI0/Manifest.toml`
  [79e6a3ab] + Adapt v3.3.3
  [4fba245c] + ArrayInterface v6.0.21
  [30b0a656] + ArrayInterfaceCore v0.1.15
  [015c0d05] + ArrayInterfaceOffsetArrays v0.1.6
  [b0d46f97] + ArrayInterfaceStaticArrays v0.1.4
  [dd5226c6] + ArrayInterfaceStaticArraysCore v0.1.0
  [62783981] + BitTwiddlingConvenienceFunctions v0.1.4
  [fa961155] + CEnum v0.4.2
  [2a0fbf3d] + CPUSummary v0.1.25
  [fb6a15b2] + CloseOpenIntervals v0.1.10
  [34da2185] + Compat v4.1.0
  [adafc99b] + CpuId v0.3.1
  [7da242da] + Enzyme v0.10.4
  [e2ba6199] + ExprTools v0.1.8
  [61eb1bfa] + GPUCompiler v0.16.2
  [615f187c] + IfElse v0.1.1
  [692b3bcd] + JLLWrappers v1.4.1
  [929cbde3] + LLVM v4.14.0
  [10f19ff3] + LayoutPointers v0.1.10
  [d125e4d3] + ManualMemory v0.1.8
  [d8793406] + ObjectFile v0.3.7
  [6fe1bfb0] + OffsetArrays v1.12.7
  [f517fe37] + Polyester v0.6.14
  [1d0040c9] + PolyesterWeave v0.1.7
  [21216c6a] + Preferences v1.3.0
  [189a3867] + Reexport v1.2.2
  [ae029012] + Requires v1.3.0
  [94e857df] + SIMDTypes v0.1.0
  [aedffcd0] + Static v0.7.6
  [90137ffa] + StaticArrays v1.5.2
  [1e83bf80] + StaticArraysCore v1.0.1
  [7792a7ef] + StrideArraysCore v0.3.15
  [53d494c1] + StructIO v0.3.0
  [8290d209] + ThreadingUtilities v0.5.0
  [a759f4b9] + TimerOutputs v0.5.20
  [7cc45869] + Enzyme_jll v0.0.33+0
  [dad2f222] + LLVMExtra_jll v0.0.16+0
  [0dad84c5] + ArgTools
  [56f22d72] + Artifacts
  [2a0f44e3] + Base64
  [ade2ca70] + Dates
  [f43a241f] + Downloads
  [7b1f6079] + FileWatching
  [b77e0a4c] + InteractiveUtils
  [4af54fe1] + LazyArtifacts
  [b27032c2] + LibCURL
  [76f85450] + LibGit2
  [8f399da3] + Libdl
  [37e2e46d] + LinearAlgebra
  [56ddb016] + Logging
  [d6f4376e] + Markdown
  [ca575930] + NetworkOptions
  [44cfe95a] + Pkg
  [de0858da] + Printf
  [3fa0cd96] + REPL
  [9a3f8284] + Random
  [ea8e919c] + SHA
  [9e88b42a] + Serialization
  [6462fe0b] + Sockets
  [2f01184e] + SparseArrays
  [10745b16] + Statistics
  [4607b0f0] + SuiteSparse
  [fa267f1f] + TOML
  [a4e569a6] + Tar
  [8dfed614] + Test
  [cf7118a7] + UUIDs
  [4ec0a83e] + Unicode
  [e66e0078] + CompilerSupportLibraries_jll
  [deac9b47] + LibCURL_jll
  [29816b5a] + LibSSH2_jll
  [c8ffd9c3] + MbedTLS_jll
  [14a3606d] + MozillaCACerts_jll
  [4536629a] + OpenBLAS_jll
  [83775a58] + Zlib_jll
  [8e850b90] + libblastrampoline_jll
  [8e850ede] + nghttp2_jll
  [3f19e933] + p7zip_jll

julia> function f(x)
           y = similar(x)
           @batch for i in eachindex(x, y)
               y[i] = x[i]^2
           end
           return y
       end
f (generic function with 1 method)

julia> jacobian(Forward, f, [2.0, 3.0])
not handling more than 6 pointer lookups deep dt:{[]:Pointer, [0]:Pointer, [0,0]:Pointer, [0,0,0]:Pointer, [0,0,0,0]:Pointer, [0,0,0,8]:Pointer, [0,0,0,8,0]:Pointer, [0,0,8]:Pointer, [0,0,8,0]:Pointer, [0,0,8,0,0]:Pointer, [0,0,8,0,8]:Pointer, [0,0,8,0,8,0]:Pointer, [0,0,8,8]:Pointer, [0,0,8,8,0]:Pointer, [0,8]:Pointer, [0,8,0]:Pointer, [0,8,0,0]:Pointer, [0,8,0,8]:Pointer, [0,8,0,8,0]:Pointer, [0,8,8]:Pointer, [0,8,8,0]:Pointer} only(-1): {[]:Pointer, [0]:Pointer, [0,0]:Pointer, [0,0,0]:Pointer, [0,0,0,0]:Pointer, [0,0,0,8]:Pointer, [0,0,0,8,0]:Pointer, [0,0,8]:Pointer, [0,0,8,0]:Pointer, [0,0,8,0,0]:Pointer, [0,0,8,0,8]:Pointer, [0,0,8,0,8,0]:Pointer, [0,0,8,8]:Pointer, [0,0,8,8,0]:Pointer, [0,8]:Pointer, [0,8,0]:Pointer, [0,8,0,0]:Pointer, [0,8,0,8]:Pointer, [0,8,0,8,0]:Pointer, [0,8,8]:Pointer, [0,8,8,0]:Pointer}
...
not handling more than 6 pointer lookups deep dt:{[]:Pointer, [0]:Pointer, [0,0]:Pointer, [0,0,0]:Pointer, [0,0,0,0]:Pointer, [0,0,0,0,0]:Pointer, [0,0,0,0,0,0]:Pointer, [0,0,0,0,0,8]:Pointer, [0,0,0,0,8]:Pointer, [0,0,0,0,8,0]:Pointer, [0,0,0,0,8,8]:Pointer, [0,0,0,8]:Pointer, [0,0,0,8,0]:Pointer, [0,0,0,8,0,0]:Pointer, [0,0,0,8,0,8]:Pointer, [0,0,0,8,8]:Pointer, [0,0,0,8,8,0]:Pointer, [0,0,0,8,8,8]:Pointer, [0,0,8]:Pointer, [0,0,8,0]:Pointer, [0,0,8,0,0]:Pointer, [0,0,8,0,0,0]:Pointer, [0,0,8,0,0,8]:Pointer, [0,0,8,0,8]:Pointer, [0,0,8,0,8,0]:Pointer, [0,0,8,0,8,8]:Pointer, [0,0,8,8]:Pointer, [0,0,8,8,0]:Pointer, [0,0,8,8,0,0]:Pointer, [0,0,8,8,0,8]:Pointer, [0,0,8,8,8]:Pointer, [0,0,8,8,8,0]:Pointer, [0,0,8,8,8,8]:Pointer, [0,8]:Pointer, [0,8,0]:Pointer, [0,8,0,0]:Pointer, [0,8,0,0,0]:Pointer, [0,8,0,0,0,0]:Pointer, [0,8,0,0,0,8]:Pointer, [0,8,0,0,8]:Pointer, [0,8,0,0,8,0]:Pointer, [0,8,0,0,8,8]:Pointer, [0,8,0,8]:Pointer, [0,8,0,8,0]:Pointer, [0,8,0,8,0,0]:Pointer, [0,8,0,8,0,8]:Pointer, [0,8,0,8,8]:Pointer, [0,8,0,8,8,0]:Pointer, [0,8,0,8,8,8]:Pointer, [0,8,8]:Pointer, [0,8,8,0]:Pointer, [0,8,8,0,0]:Pointer, [0,8,8,0,0,0]:Pointer, [0,8,8,0,0,8]:Pointer, [0,8,8,0,8]:Pointer, [0,8,8,0,8,0]:Pointer, [0,8,8,0,8,8]:Pointer, [0,8,8,8]:Pointer, [0,8,8,8,0]:Pointer, [0,8,8,8,0,0]:Pointer, [0,8,8,8,0,8]:Pointer, [0,8,8,8,8]:Pointer, [0,8,8,8,8,0]:Pointer, [0,8,8,8,8,8]:Pointer} only(-1): {[]:Pointer, [0]:Pointer, [0,0]:Pointer, [0,0,0]:Pointer, [0,0,0,0]:Pointer, [0,0,0,0,0]:Pointer, [0,0,0,0,0,0]:Pointer, [0,0,0,0,0,8]:Pointer, [0,0,0,0,8]:Pointer, [0,0,0,0,8,0]:Pointer, [0,0,0,0,8,8]:Pointer, [0,0,0,8]:Pointer, [0,0,0,8,0]:Pointer, [0,0,0,8,0,0]:Pointer, [0,0,0,8,0,8]:Pointer, [0,0,0,8,8]:Pointer, [0,0,0,8,8,0]:Pointer, [0,0,0,8,8,8]:Pointer, [0,0,8]:Pointer, [0,0,8,0]:Pointer, [0,0,8,0,0]:Pointer, [0,0,8,0,0,0]:Pointer, [0,0,8,0,0,8]:Pointer, [0,0,8,0,8]:Pointer, [0,0,8,0,8,0]:Pointer, [0,0,8,0,8,8]:Pointer, [0,0,8,8]:Pointer, [0,0,8,8,0]:Pointer, [0,0,8,8,0,0]:Pointer, [0,0,8,8,0,8]:Pointer, [0,0,8,8,8]:Pointer, [0,0,8,8,8,0]:Pointer, [0,0,8,8,8,8]:Pointer, [0,8]:Pointer, [0,8,0]:Pointer, [0,8,0,0]:Pointer, [0,8,0,0,0]:Pointer, [0,8,0,0,0,0]:Pointer, [0,8,0,0,0,8]:Pointer, [0,8,0,0,8]:Pointer, [0,8,0,0,8,0]:Pointer, [0,8,0,0,8,8]:Pointer, [0,8,0,8]:Pointer, [0,8,0,8,0]:Pointer, [0,8,0,8,0,0]:Pointer, [0,8,0,8,0,8]:Pointer, [0,8,0,8,8]:Pointer, [0,8,0,8,8,0]:Pointer, [0,8,0,8,8,8]:Pointer, [0,8,8]:Pointer, [0,8,8,0]:Pointer, [0,8,8,0,0]:Pointer, [0,8,8,0,0,0]:Pointer, [0,8,8,0,0,8]:Pointer, [0,8,8,0,8]:Pointer, [0,8,8,0,8,0]:Pointer, [0,8,8,0,8,8]:Pointer, [0,8,8,8]:Pointer, [0,8,8,8,0]:Pointer, [0,8,8,8,0,0]:Pointer, [0,8,8,8,0,8]:Pointer, [0,8,8,8,8]:Pointer, [0,8,8,8,8,0]:Pointer, [0,8,8,8,8,8]:Pointer}
2×2 Matrix{Float64}:
 6.90631e-310  6.90631e-310
 0.0           6.0
tgymnich commented 2 years ago

This is what I get:

julia> using Enzyme, Polyester

julia> function f(x)
                  y = similar(x)
                  @batch for i in eachindex(x, y)
                      y[i] = x[i]^2
                  end
                  return y
              end
f (generic function with 1 method)

julia> Threads.nthreads()
2

julia> jacobian(Forward, f, [2.0, 3.0])
2×2 Matrix{Float64}:
 4.0  0.0
 0.0  6.0

julia version 1.7.3 enzyme version 0.10.4 macOS arm

wsmoses commented 1 year ago

@ranocha can you retry on latest release and see if this reproduces still?

sloede commented 1 year ago

For me, the error did not occur for the latest releases of Enzyme (v0.10.12) and Polyester (v0.6.16) on both Linux x86_64 and macOS ARM, with Julia v1.7 and v1.8, single-threaded. However, when switching to using julia -t 2, both Julia v1.7 and v1.8, on both Linux and macOS, die a fiery death with a core dump (here's the one from Julia v1.8.2 on Linux):

julia> using Pkg; Pkg.activate(temp=true); Pkg.add(["Enzyme", "Polyester"]); using Enzyme, Polyester

julia> function f(x)
           y = similar(x)
           @batch for i in eachindex(x, y)
               y[i] = x[i]^2
           end
           return y
       end
f (generic function with 1 method)

julia> jacobian(Forward, f, [2.0, 3.0])
<analysis>
{}* inttoptr (i64 139737793205024 to {}*): {[-1]:Anything}, intvals: {}
i64 1: {[-1]:Integer}, intvals: {1,}
i64 0: {[-1]:Anything}, intvals: {0,}
i32 1: {[-1]:Integer}, intvals: {1,}
i64 8: {[-1]:Integer}, intvals: {8,}
i64 2: {[-1]:Integer}, intvals: {2,}
<snip>
unknown function (ip: 0x401098)
Allocations: 60806253 (Pool: 60758024; Big: 48229); GC: 44
Aborted (core dumped)
Full message ``` julia> using Pkg; Pkg.activate(temp=true); Pkg.add(["Enzyme", "Polyester"]); using Enzyme, Polyester julia> function f(x) y = similar(x) @batch for i in eachindex(x, y) y[i] = x[i]^2 end return y end f (generic function with 1 method) julia> jacobian(Forward, f, [2.0, 3.0]) {}* inttoptr (i64 139737793205024 to {}*): {[-1]:Anything}, intvals: {} i64 1: {[-1]:Integer}, intvals: {1,} i64 0: {[-1]:Anything}, intvals: {0,} i32 1: {[-1]:Integer}, intvals: {1,} i64 8: {[-1]:Integer}, intvals: {8,} i64 2: {[-1]:Integer}, intvals: {2,} i64 3: {[-1]:Integer}, intvals: {3,} i64 24: {[-1]:Integer}, intvals: {24,} i64 16: {[-1]:Integer}, intvals: {16,} i32 0: {[-1]:Anything}, intvals: {0,} i64 32: {[-1]:Integer}, intvals: {32,} i64 -1: {[-1]:Anything}, intvals: {-1,} i64 -8: {[-1]:Integer}, intvals: {-8,} i32 -1: {[-1]:Anything}, intvals: {-1,} i32 9: {[-1]:Integer}, intvals: {9,} {} addrspace(10)* addrspacecast ({}* inttoptr (i64 139756563700560 to {}*) to {} addrspace(10)*): {[-1]:Anything}, intvals: {} i32 64: {[-1]:Integer}, intvals: {64,} {}* inttoptr (i64 139738054862944 to {}*): {[-1]:Anything}, intvals: {} {} addrspace(10)* addrspacecast ({}* inttoptr (i64 139738054862944 to {}*) to {} addrspace(10)*): {[-1]:Anything}, intvals: {} i32 63: {[-1]:Integer}, intvals: {63,} %89 = getelementptr i8, i8* %88, i64 8, !dbg !311: {[-1]:Pointer, [-1,0]:Pointer, [-1,8]:Pointer, [-1,8,0]:Pointer, [-1,8,0,0]:Float@double, [-1,8,8]:Integer, [-1,8,9]:Integer, [-1,8,10]:Integer, [-1,8,11]:Integer, [-1,8,12]:Integer, [-1,8,13]:Integer, [-1,8,14]:Integer, [-1,8,15]:Integer, [-1,8,16]:Pointer, [-1,8,16,0]:Float@double, [-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,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer}, intvals: {} %40 = and i64 %v.i.i, %39, !dbg !174: {}, intvals: {} {}* inttoptr (i64 139756563700560 to {}*): {[-1]:Anything}, intvals: {} i64 139737736831744: {[-1]:Anything}, intvals: {139737736831744,} define internal void @jlcapi_BatchClosure_2131(i64 %0) #4 { top: %1 = call {}*** @julia.get_pgcstack() %world_age3 = getelementptr inbounds {}**, {}*** %1, i64 1 %world_age = bitcast {}*** %world_age3 to i64* %2 = alloca i64, align 8 %.not = icmp eq {}*** %1, null %3 = select i1 %.not, i64* %2, i64* %world_age %4 = load i64, i64* %3, align 8, !tbaa !34 %5 = load atomic i64, i64* @jl_world_counter acquire, align 8 store i64 %5, i64* %3, align 8 %current_task14 = getelementptr inbounds {}**, {}*** %1, i64 -12 %current_task1 = bitcast {}*** %current_task14 to {}** %6 = call noalias nonnull {} addrspace(10)* @julia.gc_alloc_obj({}** nonnull %current_task1, i64 noundef 8, {} addrspace(10)* noundef addrspacecast ({}* inttoptr (i64 139756562736816 to {}*) to {} addrspace(10)*)) #40 %7 = bitcast {} addrspace(10)* %6 to i64 addrspace(10)* store i64 %0, i64 addrspace(10)* %7, align 8, !tbaa !38 %8 = call cc37 nonnull {} addrspace(10)* bitcast ({} addrspace(10)* ({} addrspace(10)*, {} addrspace(10)**, i32)* @ijl_apply_generic to {} addrspace(10)* ({} addrspace(10)*, {} addrspace(10)*)*)({} addrspace(10)* addrspacecast ({}* inttoptr (i64 139738228159576 to {}*) to {} addrspace(10)*), {} addrspace(10)* nonnull %6) %9 = call {} addrspace(10)* @julia.typeof({} addrspace(10)* nonnull %8) #41 %10 = icmp eq {} addrspace(10)* %9, addrspacecast ({}* inttoptr (i64 139756560896144 to {}*) to {} addrspace(10)*) br i1 %10, label %pass, label %fail fail: ; preds = %top %11 = addrspacecast {} addrspace(10)* %8 to {} addrspace(12)* call void @ijl_type_error(i8* noundef getelementptr inbounds ([10 x i8], [10 x i8]* @_j_str1, i64 0, i64 0), {} addrspace(10)* noundef addrspacecast ({}* inttoptr (i64 139756560896144 to {}*) to {} addrspace(10)*), {} addrspace(12)* %11) #7 unreachable pass: ; preds = %top store i64 %4, i64* %3, align 8 ret void } : {[-1]:Pointer}, intvals: {} i64* inttoptr (i64 139737736831744 to i64*): {[-1]:Anything}, intvals: {} %96 = bitcast i8* %95 to i64*, !dbg !347: {[-1]:Pointer, [-1,0]:Integer, [-1,1]:Integer, [-1,2]:Integer, [-1,3]:Integer, [-1,4]:Integer, [-1,5]:Integer, [-1,6]:Integer, [-1,7]:Integer}, intvals: {} {} addrspace(10)* addrspacecast ({}* inttoptr (i64 139756564347200 to {}*) to {} addrspace(10)*): {[-1]:Anything}, intvals: {} {}* inttoptr (i64 139756564347200 to {}*): {[-1]:Anything}, intvals: {} i32 65537: {[-1]:Anything}, intvals: {65537,} {} addrspace(10)* ({} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*)* bitcast ({} addrspace(10)* ({} addrspace(10)*, {} addrspace(10)**, i32, {} addrspace(10)*)* @ijl_invoke to {} addrspace(10)* ({} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*)*): {[-1]:Pointer}, intvals: {} %value_phi9.i = phi i64 [ %34, %L83.i ], [ %v.i.i, %L47.i ]: {}, intvals: {} %41 = icmp sgt i32 %value_phi8.i, 0, !dbg !180: {[-1]:Integer}, intvals: {} ; Function Attrs: nofree declare nonnull {} addrspace(10)* @ijl_invoke({} addrspace(10)*, {} addrspace(10)** nocapture readonly, i32, {} addrspace(10)*) local_unnamed_addr #10 : {[-1]:Pointer}, intvals: {} {}* inttoptr (i64 139756633165472 to {}*): {[-1]:Anything}, intvals: {} {} addrspace(10)* addrspacecast ({}* inttoptr (i64 139756633165472 to {}*) to {} addrspace(10)*): {[-1]:Anything}, intvals: {} {} addrspace(10)* addrspacecast ({}* inttoptr (i64 139756569993904 to {}*) to {} addrspace(10)*): {[-1]:Anything}, intvals: {} %88 = getelementptr i8, i8* %87, i64 %86, !dbg !310: {[-1]:Pointer, [-1,8]:Pointer, [-1,16]:Pointer, [-1,16,0]:Pointer, [-1,16,0,0]:Float@double, [-1,16,8]:Integer, [-1,16,9]:Integer, [-1,16,10]:Integer, [-1,16,11]:Integer, [-1,16,12]:Integer, [-1,16,13]:Integer, [-1,16,14]:Integer, [-1,16,15]:Integer, [-1,16,16]:Pointer, [-1,16,16,0]:Float@double, [-1,16,24]:Integer, [-1,16,25]:Integer, [-1,16,26]:Integer, [-1,16,27]:Integer, [-1,16,28]:Integer, [-1,16,29]:Integer, [-1,16,30]:Integer, [-1,16,31]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer}, intvals: {} %4 = addrspacecast { i8 addrspace(13)*, i64, i16, i16, i32 } addrspace(10)* %3 to { i8 addrspace(13)*, i64, i16, i16, i32 } addrspace(11)*, !dbg !36: {[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer, [-1,40]:Integer}, intvals: {} %.not51 = icmp eq i32 %v.i38.i, 0, !dbg !435: {[-1]:Integer}, intvals: {} %iv.next10 = add nuw nsw i64 %iv9, 1: {[-1]:Integer}, intvals: {1,} %.not = icmp eq i64 %6, %11, !dbg !69: {[-1]:Integer}, intvals: {} %97 = add i64 %phi.bo, %iv5, !dbg !371: {[-1]:Anything}, intvals: {} %128 = fmul double %127, %127, !dbg !459: {[-1]:Float@double}, intvals: {} %79 = add i32 %78, %value_phi12.i63, !dbg !283: {[-1]:Integer}, intvals: {} %value_phi25.i60 = phi i32 [ %114, %L291.i ], [ 0, %L261.i.preheader ]: {[-1]:Integer}, intvals: {0,} %120 = trunc i64 %iv9 to i32: {[-1]:Integer}, intvals: {0,} %18 = select i1 %17, i64 %6, i64 2, !dbg !91: {[-1]:Integer}, intvals: {} %118 = inttoptr i64 %115 to i8*, !dbg !429: {[-1]:Pointer}, intvals: {} %iv.next = add nuw nsw i64 %iv, 1, !dbg !152: {[-1]:Integer}, intvals: {1,} %19 = trunc i64 %18 to i32, !dbg !99: {[-1]:Integer}, intvals: {} %37 = trunc i64 %36 to i32, !dbg !166: {[-1]:Integer}, intvals: {} %117 = zext i32 %116 to i64, !dbg !424: {[-1]:Integer}, intvals: {} i64 ptrtoint (void (i64)* @jlcapi_BatchClosure_2131 to i64): {[-1]:Pointer}, intvals: {} %iv.next4 = add nuw nsw i64 %iv3, 1, !dbg !263: {[-1]:Integer}, intvals: {1,} %123 = call fastcc i8 @julia_checktask_2140(i32 zeroext %114) #39, !dbg !445: {[-1]:Integer}, intvals: {} %p.i39.i = bitcast i8* %88 to i32*, !dbg !351: {[-1]:Pointer, [-1,8]:Pointer, [-1,16]:Pointer, [-1,16,0]:Pointer, [-1,16,0,0]:Float@double, [-1,16,8]:Integer, [-1,16,9]:Integer, [-1,16,10]:Integer, [-1,16,11]:Integer, [-1,16,12]:Integer, [-1,16,13]:Integer, [-1,16,14]:Integer, [-1,16,15]:Integer, [-1,16,16]:Pointer, [-1,16,16,0]:Float@double, [-1,16,24]:Integer, [-1,16,25]:Integer, [-1,16,26]:Integer, [-1,16,27]:Integer, [-1,16,28]:Integer, [-1,16,29]:Integer, [-1,16,30]:Integer, [-1,16,31]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer}, intvals: {} %20 = add nsw i32 %19, -1, !dbg !99: {[-1]:Integer}, intvals: {} %13 = bitcast {} addrspace(10)* %12 to i64 addrspace(10)*, !dbg !75: {}, intvals: {} %102 = load double, double* %101, align 1, !dbg !380, !tbaa !326: {[-1]:Float@double}, intvals: {} %17 = icmp ult i64 %6, 2, !dbg !91: {[-1]:Integer}, intvals: {} %9 = addrspacecast { i8 addrspace(13)*, i64, i16, i16, i32 } addrspace(10)* %8 to { i8 addrspace(13)*, i64, i16, i16, i32 } addrspace(11)*, !dbg !51: {[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer, [-1,40]:Integer}, intvals: {} %10 = getelementptr inbounds { i8 addrspace(13)*, i64, i16, i16, i32 }, { i8 addrspace(13)*, i64, i16, i16, i32 } addrspace(11)* %9, i64 0, i32 1, !dbg !51: {[-1]:Pointer, [-1,0]:Integer, [-1,1]:Integer, [-1,2]:Integer, [-1,3]:Integer, [-1,4]:Integer, [-1,5]:Integer, [-1,6]:Integer, [-1,7]:Integer}, intvals: {} %current_task32.i54 = getelementptr inbounds {}**, {}*** %2, i64 -12, !dbg !75: {}, intvals: {} %53 = addrspacecast {} addrspace(10)* %7 to {} addrspace(11)*, !dbg !227: {[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer, [-1,40]:Integer}, intvals: {} %.not37.not = icmp eq i64 %iv.next2, %6, !dbg !463: {[-1]:Integer}, intvals: {} %84 = load i64, i64* inttoptr (i64 139737736831744 to i64*), align 256, !dbg !288, !tbaa !259: {[-1]:Pointer}, intvals: {} %99 = add i64 %98, -8, !dbg !371: {[-1]:Anything}, intvals: {} %121 = add i32 %120, 1, !dbg !441: {[-1]:Integer}, intvals: {1,} %54 = call nonnull {}* @julia.pointer_from_objref({} addrspace(11)* %53) #42, !dbg !227: {[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer, [-1,40]:Integer}, intvals: {} %100 = getelementptr i8, i8* %62, i64 %99, !dbg !379: {[-1]:Pointer, [-1,-1]:Float@double}, intvals: {} %v.i38.i56 = load atomic i32, i32* %p.i37.i acquire, align 16, !dbg !430: {}, intvals: {} %value_phi26.i61 = phi i64 [ %113, %L291.i ], [ %value_phi9.i, %L261.i.preheader ]: {}, intvals: {} %93 = getelementptr i8, i8* %88, i64 24, !dbg !335: {[-1]:Pointer, [-1,0]:Integer, [-1,1]:Integer, [-1,2]:Integer, [-1,3]:Integer, [-1,4]:Integer, [-1,5]:Integer, [-1,6]:Integer, [-1,7]:Integer, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer}, intvals: {} %92 = bitcast i8* %91 to i64*, !dbg !331: {[-1]:Pointer, [-1,0]:Pointer, [-1,0,0]:Pointer, [-1,0,0,0]:Float@double, [-1,0,8]:Integer, [-1,0,9]:Integer, [-1,0,10]:Integer, [-1,0,11]:Integer, [-1,0,12]:Integer, [-1,0,13]:Integer, [-1,0,14]:Integer, [-1,0,15]:Integer, [-1,0,16]:Pointer, [-1,0,16,0]:Float@double, [-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,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer}, intvals: {} %119 = getelementptr i8, i8* %118, i64 %117, !dbg !429: {[-1]:Pointer}, intvals: {} %27 = call i64 @llvm.ctlz.i64(i64 %v.i.i, i1 noundef false) #40, !dbg !139, !range !127: {[-1]:Integer}, intvals: {} %value_phi29.i = phi i32 [ %25, %L61.i ], [ %38, %L64.i ]: {[-1]:Integer}, intvals: {} {} addrspace(10)* %0: {[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer, [-1,40]:Integer}, intvals: {} %iv.next6 = add nuw nsw i64 %iv5, 1, !dbg !371: {[-1]:Integer}, intvals: {1,} {} addrspace(11)* addrspacecast ({}* inttoptr (i64 139737793205024 to {}*) to {} addrspace(11)*): {[-1]:Anything}, intvals: {} %107 = call i64 @llvm.cttz.i64(i64 %value_phi26.i61, i1 noundef true) #40, !dbg !411, !range !127: {[-1]:Integer}, intvals: {} %21 = call nonnull {}* @julia.pointer_from_objref({} addrspace(11)* noundef addrspacecast ({}* inttoptr (i64 139737793205024 to {}*) to {} addrspace(11)*)) #42, !dbg !106: {[-1]:Anything}, intvals: {} %v.i38.i = load atomic i32, i32* %p.i37.i acquire, align 16, !dbg !430: {}, intvals: {} %v.i40.i = atomicrmw xchg i32* %p.i39.i, i32 0 acq_rel, align 4, !dbg !351: {[-1]:Integer}, intvals: {} %60 = call nonnull {}* @julia.pointer_from_objref({} addrspace(11)* %59) #42, !dbg !227: {[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer, [-1,40]:Integer}, intvals: {} %value_phi28.i = phi i32 [ %28, %L61.i ], [ %29, %L64.i ]: {[-1]:Integer}, intvals: {} %v.i35.i = atomicrmw or i64* %p.i34.i, i64 %value_phi9.i acq_rel, align 8, !dbg !446: {}, intvals: {} %current_task32.i = bitcast {}*** %current_task32.i54 to {}**, !dbg !75: {}, intvals: {} %105 = bitcast i8* %104 to double*, !dbg !396: {[-1]:Pointer, [-1,-1]:Float@double}, intvals: {} %103 = fmul double %102, %102, !dbg !387: {[-1]:Float@double}, intvals: {} %65 = getelementptr inbounds { { { i64 }, [1 x i64] }, { { i64 }, [1 x i64] } }, { { { i64 }, [1 x i64] }, { { i64 }, [1 x i64] } }* %1, i64 0, i32 0, i32 0, i32 0, !dbg !256: {[-1]:Pointer, [-1,0]:Pointer, [-1,0,0]:Float@double}, intvals: {} {}* inttoptr (i64 139756569993904 to {}*): {[-1]:Anything}, intvals: {} %value_phi8.i = phi i32 [ %20, %L83.i ], [ %24, %L47.i ]: {[-1]:Integer}, intvals: {} %108 = trunc i64 %107 to i32, !dbg !413: {[-1]:Integer}, intvals: {} %77 = add i64 %76, %75, !dbg !280: {[-1]:Anything}, intvals: {} %.not50 = icmp eq i64 %113, 0, !dbg !403: {[-1]:Integer}, intvals: {} %55 = bitcast {}* %54 to i8**, !dbg !227: {[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer, [-1,40]:Integer}, intvals: {} %56 = load i8*, i8** %55, align 8, !dbg !227, !tbaa !183, !nonnull !4: {[-1]:Pointer, [-1,-1]:Float@double}, intvals: {} %6 = load i64, i64 addrspace(11)* %5, align 8, !dbg !36, !tbaa !43, !range !48: {[-1]:Integer}, intvals: {} %45 = bitcast {} addrspace(10)* %7 to double addrspace(13)* addrspace(10)*: {[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer, [-1,40]:Integer}, intvals: {} %47 = load double addrspace(13)*, double addrspace(13)* addrspace(11)* %46, align 8, !tbaa !183, !nonnull !4: {[-1]:Pointer, [-1,-1]:Float@double}, intvals: {} %114 = add i32 %109, %value_phi25.i60, !dbg !418: {[-1]:Integer}, intvals: {} %33 = select i1 %32, i64 -1, i64 %.op, !dbg !155: {[-1]:Anything}, intvals: {} %value_phi12.i63 = phi i32 [ 0, %L137.i.lr.ph ], [ %79, %L196.i ]: {[-1]:Integer}, intvals: {0,} %48 = zext i32 %value_phi8.i to i64, !dbg !186: {[-1]:Integer}, intvals: {} %iv9 = phi i64 [ %iv.next10, %L289.i ], [ 0, %L282.i.preheader ]: {[-1]:Integer}, intvals: {0,} %67 = getelementptr inbounds { { { i64 }, [1 x i64] }, { { i64 }, [1 x i64] } }, { { { i64 }, [1 x i64] }, { { i64 }, [1 x i64] } }* %1, i64 0, i32 1, i32 0, i32 0, !dbg !256: {[-1]:Pointer, [-1,0]:Pointer, [-1,0,0]:Float@double}, intvals: {} %86 = zext i32 %85 to i64, !dbg !302: {[-1]:Integer}, intvals: {} %35 = xor i64 %34, %value_phi30.i, !dbg !162: {}, intvals: {} %43 = addrspacecast double addrspace(13)* addrspace(10)* %42 to double addrspace(13)* addrspace(11)*: {[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer, [-1,40]:Integer}, intvals: {} %83 = select i1 %82, i64 0, i64 %81, !dbg !285: {}, intvals: {} %.not53 = icmp eq i32 %38, 0, !dbg !168: {[-1]:Integer}, intvals: {} %.not49.not = icmp eq i64 %97, %6, !dbg !401: {[-1]:Integer}, intvals: {} %8 = bitcast {} addrspace(10)* %7 to { i8 addrspace(13)*, i64, i16, i16, i32 } addrspace(10)*, !dbg !51: {[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer, [-1,40]:Integer}, intvals: {} %127 = load double, double addrspace(13)* %126, align 8, !dbg !453, !tbaa !457: {[-1]:Float@double}, intvals: {} %78 = add nuw nsw i32 %73, 1, !dbg !281: {[-1]:Integer}, intvals: {} %42 = bitcast {} addrspace(10)* %0 to double addrspace(13)* addrspace(10)*: {[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer, [-1,40]:Integer}, intvals: {} %58 = load i64, i64 addrspace(11)* %10, align 8, !dbg !246, !tbaa !43, !range !48: {[-1]:Integer}, intvals: {} %80 = zext i32 %78 to i64, !dbg !285: {[-1]:Integer}, intvals: {} %82 = icmp eq i32 %73, 63, !dbg !285: {[-1]:Integer}, intvals: {} %106 = add i64 %97, 1, !dbg !143: {[-1]:Integer}, intvals: {} %p.i.i = bitcast {}* %21 to i64*, !dbg !118: {[-1]:Anything}, intvals: {} %73 = trunc i64 %72 to i32, !dbg !273: {[-1]:Integer}, intvals: {} %30 = sub i32 64, %29, !dbg !155: {[-1]:Integer}, intvals: {} %phi.bo = add i64 %77, 1, !dbg !262: {[-1]:Anything}, intvals: {} %61 = bitcast {}* %60 to i8**, !dbg !227: {[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer, [-1,40]:Integer}, intvals: {} %.not5059 = icmp eq i64 %value_phi9.i, 0, !dbg !403: {[-1]:Integer}, intvals: {} %.not46 = icmp sgt i64 %52, -1: {[-1]:Integer}, intvals: {} %39 = xor i64 %34, -1, !dbg !171: {}, intvals: {} %129 = getelementptr inbounds double, double addrspace(13)* %47, i64 %125, !dbg !461: {[-1]:Pointer, [-1,-1]:Float@double}, intvals: {} %23 = call i64 @llvm.ctpop.i64(i64 %v.i.i) #40, !dbg !124, !range !127: {[-1]:Integer}, intvals: {} %.not36 = icmp eq i64 %6, 0, !dbg !76: {[-1]:Integer}, intvals: {} %51 = mul i64 %50, %49, !dbg !223: {[-1]:Integer}, intvals: {} %34 = and i64 %33, %value_phi30.i, !dbg !159: {}, intvals: {} %64 = load i64, i64 addrspace(11)* %5, align 8, !dbg !246, !tbaa !43, !range !48: {[-1]:Integer}, intvals: {} %71 = icmp ne i64 %value_phi15.i66, 0, !dbg !263: {[-1]:Integer}, intvals: {} %59 = addrspacecast {} addrspace(10)* %0 to {} addrspace(11)*, !dbg !227: {[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer, [-1,40]:Integer}, intvals: {} %50 = udiv i64 %6, %49, !dbg !222: {[-1]:Integer}, intvals: {} %110 = zext i32 %109 to i64, !dbg !416: {[-1]:Integer}, intvals: {} %81 = lshr i64 %value_phi15.i66, %80, !dbg !285: {}, intvals: {} %113 = select i1 %112, i64 0, i64 %111, !dbg !416: {}, intvals: {} %iv.next2 = add nuw nsw i64 %iv1, 1, !dbg !453: {[-1]:Integer}, intvals: {1,} %111 = lshr i64 %value_phi26.i61, %110, !dbg !416: {}, intvals: {} %not. = and i1 %.not46, %74, !dbg !279: {[-1]:Anything}, intvals: {} %28 = trunc i64 %27 to i32, !dbg !142: {[-1]:Integer}, intvals: {} %130 = add i64 %iv.next2, 1, !dbg !177: {[-1]:Integer}, intvals: {2,} %iv = phi i64 [ %iv.next, %L64.i ], [ 0, %L61.i ]: {[-1]:Integer}, intvals: {0,} %iv1 = phi i64 [ %iv.next2, %L320.i ], [ 0, %L320.i.preheader ]: {[-1]:Integer}, intvals: {0,} %85 = shl i32 %79, 9, !dbg !301: {[-1]:Integer}, intvals: {} %.not52 = icmp eq i8 %124, 0, !dbg !445: {[-1]:Integer}, intvals: {} %109 = add nuw nsw i32 %108, 1, !dbg !414: {[-1]:Integer}, intvals: {} %notmask = shl nsw i64 -1, %31, !dbg !155: {[-1]:Anything}, intvals: {} %116 = shl i32 %114, 9, !dbg !423: {[-1]:Integer}, intvals: {} %104 = getelementptr i8, i8* %56, i64 %99, !dbg !393: {[-1]:Pointer, [-1,-1]:Float@double}, intvals: {} %value_phi13.i64 = phi i64 [ 0, %L137.i.lr.ph ], [ %77, %L196.i ]: {[-1]:Anything}, intvals: {0,} %32 = icmp ugt i32 %30, 63, !dbg !157: {[-1]:Integer}, intvals: {} %101 = bitcast i8* %100 to double*, !dbg !380: {[-1]:Pointer, [-1,-1]:Float@double}, intvals: {} %115 = load i64, i64* inttoptr (i64 139737736831744 to i64*), align 256, !dbg !420, !tbaa !259: {[-1]:Pointer}, intvals: {} %125 = add i64 %iv.next2, -1, !dbg !453: {[-1]:Integer}, intvals: {0,} %87 = inttoptr i64 %84 to i8*, !dbg !310: {[-1]:Pointer}, intvals: {} %70 = ptrtoint { { { i64 }, [1 x i64] }, { { i64 }, [1 x i64] } }* %1 to i64: {[-1]:Pointer, [-1,0]:Pointer, [-1,0,0]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Pointer, [-1,16,0]:Float@double, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer}, intvals: {} %iv3 = phi i64 [ %iv.next4, %L196.i ], [ 0, %L137.i.lr.ph ]: {[-1]:Integer}, intvals: {0,} %25 = sub nsw i32 %20, %24, !dbg !129: {[-1]:Integer}, intvals: {} %74 = icmp ugt i64 %52, %iv3, !dbg !274: {[-1]:Integer}, intvals: {} %95 = getelementptr i8, i8* %88, i64 32, !dbg !343: {[-1]:Pointer, [-1,0]:Integer, [-1,1]:Integer, [-1,2]:Integer, [-1,3]:Integer, [-1,4]:Integer, [-1,5]:Integer, [-1,6]:Integer, [-1,7]:Integer}, intvals: {} %p.i34.i = bitcast {}* %21 to i64*, !dbg !446: {[-1]:Anything}, intvals: {} %69 = call token (...) @llvm.julia.gc_preserve_begin({} addrspace(10)* nonnull %7, {} addrspace(10)* nonnull %0) #40, !dbg !261: {}, intvals: {} %.not44 = icmp eq i64 %iv.next4, %48, !dbg !358: {[-1]:Integer}, intvals: {} %value_phi30.i = phi i64 [ %v.i.i, %L61.i ], [ %34, %L64.i ]: {}, intvals: {} %iv7 = phi i64 [ %iv.next8, %L291.i ], [ 0, %L261.i.preheader ]: {[-1]:Integer}, intvals: {0,} %124 = and i8 %123, 1, !dbg !445: {[-1]:Integer}, intvals: {} %98 = shl i64 %97, 3, !dbg !371: {[-1]:Anything}, intvals: {} %68 = getelementptr inbounds { { { i64 }, [1 x i64] }, { { i64 }, [1 x i64] } }, { { { i64 }, [1 x i64] }, { { i64 }, [1 x i64] } }* %1, i64 0, i32 1, i32 1, i64 0, !dbg !256: {[-1]:Pointer, [-1,0]:Integer, [-1,1]:Integer, [-1,2]:Integer, [-1,3]:Integer, [-1,4]:Integer, [-1,5]:Integer, [-1,6]:Integer, [-1,7]:Integer}, intvals: {} %52 = sub i64 %6, %51, !dbg !226: {[-1]:Integer}, intvals: {} %v.i.i = atomicrmw xchg i64* %p.i.i, i64 0 acq_rel, align 8, !dbg !118: {}, intvals: {} %2 = call {}*** @julia.get_pgcstack() #40: {}, intvals: {} %38 = add i32 %value_phi29.i, %37, !dbg !167: {[-1]:Integer}, intvals: {} %75 = zext i1 %not. to i64, !dbg !279: {[-1]:Anything}, intvals: {} %.op = xor i64 %notmask, -1, !dbg !155: {[-1]:Anything}, intvals: {} %29 = sub i32 %value_phi28.i, %value_phi29.i, !dbg !152: {[-1]:Integer}, intvals: {} %26 = icmp slt i32 %25, 0, !dbg !132: {[-1]:Integer}, intvals: {} %36 = call i64 @llvm.ctpop.i64(i64 %35) #40, !dbg !164, !range !127: {[-1]:Integer}, intvals: {} %76 = add i64 %value_phi13.i64, %50, !dbg !279: {[-1]:Anything}, intvals: {} %49 = add nuw nsw i64 %48, 1, !dbg !220: {[-1]:Integer}, intvals: {} %14 = call noalias nonnull {} addrspace(10)* @julia.gc_alloc_obj({}** nonnull %current_task32.i, i64 noundef 8, {} addrspace(10)* noundef addrspacecast ({}* inttoptr (i64 139756564347200 to {}*) to {} addrspace(10)*)) #41, !dbg !75: {[-1,0]:Integer, [-1,1]:Integer, [-1,2]:Integer, [-1,3]:Integer, [-1,4]:Integer, [-1,5]:Integer, [-1,6]:Integer, [-1,7]:Integer}, intvals: {} %112 = icmp eq i32 %108, 63, !dbg !416: {[-1]:Integer}, intvals: {} %iv.next8 = add nuw nsw i64 %iv7, 1, !dbg !411: {[-1]:Integer}, intvals: {1,} %value_phi15.i66 = phi i64 [ %value_phi9.i, %L137.i.lr.ph ], [ %83, %L196.i ]: {}, intvals: {} %7 = call noalias nonnull {} addrspace(10)* @ijl_alloc_array_1d({} addrspace(10)* noundef addrspacecast ({}* inttoptr (i64 139756563700560 to {}*) to {} addrspace(10)*), i64 %6) #40, !dbg !49: {[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer, [-1,40]:Integer}, intvals: {} %5 = getelementptr inbounds { i8 addrspace(13)*, i64, i16, i16, i32 }, { i8 addrspace(13)*, i64, i16, i16, i32 } addrspace(11)* %4, i64 0, i32 1, !dbg !36: {[-1]:Pointer, [-1,0]:Integer, [-1,1]:Integer, [-1,2]:Integer, [-1,3]:Integer, [-1,4]:Integer, [-1,5]:Integer, [-1,6]:Integer, [-1,7]:Integer}, intvals: {} %72 = call i64 @llvm.cttz.i64(i64 %value_phi15.i66, i1 noundef true) #40, !dbg !270, !range !127: {[-1]:Integer}, intvals: {} %91 = getelementptr i8, i8* %88, i64 16, !dbg !327: {[-1]:Pointer, [-1,0]:Pointer, [-1,0,0]:Pointer, [-1,0,0,0]:Float@double, [-1,0,8]:Integer, [-1,0,9]:Integer, [-1,0,10]:Integer, [-1,0,11]:Integer, [-1,0,12]:Integer, [-1,0,13]:Integer, [-1,0,14]:Integer, [-1,0,15]:Integer, [-1,0,16]:Pointer, [-1,0,16,0]:Float@double, [-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,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer}, intvals: {} %31 = zext i32 %30 to i64, !dbg !157: {[-1]:Integer}, intvals: {} %iv5 = phi i64 [ %iv.next6, %L221.i ], [ 0, %L221.i.preheader ]: {[-1]:Integer}, intvals: {0,} %90 = bitcast i8* %89 to i64*, !dbg !321: {[-1]:Pointer, [-1,0]:Pointer, [-1,8]:Pointer, [-1,8,0]:Pointer, [-1,8,0,0]:Float@double, [-1,8,8]:Integer, [-1,8,9]:Integer, [-1,8,10]:Integer, [-1,8,11]:Integer, [-1,8,12]:Integer, [-1,8,13]:Integer, [-1,8,14]:Integer, [-1,8,15]:Integer, [-1,8,16]:Pointer, [-1,8,16,0]:Float@double, [-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,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer}, intvals: {} %p.i37.i = bitcast i8* %119 to i32*, !dbg !430: {[-1]:Pointer}, intvals: {} %46 = addrspacecast double addrspace(13)* addrspace(10)* %45 to double addrspace(13)* addrspace(11)*: {[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer, [-1,40]:Integer}, intvals: {} %126 = getelementptr inbounds double, double addrspace(13)* %44, i64 %125, !dbg !453: {[-1]:Pointer, [-1,-1]:Float@double}, intvals: {} %3 = bitcast {} addrspace(10)* %0 to { i8 addrspace(13)*, i64, i16, i16, i32 } addrspace(10)*, !dbg !36: {[-1]:Pointer, [-1,0]:Pointer, [-1,0,-1]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer, [-1,40]:Integer}, intvals: {} %.sub = bitcast { { { i64 }, [1 x i64] }, { { i64 }, [1 x i64] } }* %1 to i8*: {[-1]:Pointer, [-1,0]:Pointer, [-1,0,0]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Pointer, [-1,16,0]:Float@double, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer}, intvals: {} %62 = load i8*, i8** %61, align 8, !dbg !227, !tbaa !183, !nonnull !4: {[-1]:Pointer, [-1,-1]:Float@double}, intvals: {} %1 = alloca { { { i64 }, [1 x i64] }, { { i64 }, [1 x i64] } }, align 16: {[-1]:Pointer, [-1,0]:Pointer, [-1,0,0]:Float@double, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Pointer, [-1,16,0]:Float@double, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer}, intvals: {} %44 = load double addrspace(13)*, double addrspace(13)* addrspace(11)* %43, align 16, !tbaa !183, !nonnull !4: {[-1]:Pointer, [-1,-1]:Float@double}, intvals: {} %15 = bitcast {} addrspace(10)* %14 to i64 addrspace(10)*, !dbg !75: {}, intvals: {} %94 = bitcast i8* %93 to i64*, !dbg !339: {[-1]:Pointer, [-1,0]:Integer, [-1,1]:Integer, [-1,2]:Integer, [-1,3]:Integer, [-1,4]:Integer, [-1,5]:Integer, [-1,6]:Integer, [-1,7]:Integer, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer}, intvals: {} %16 = call cc38 nonnull {} addrspace(10)* bitcast ({} addrspace(10)* ({} addrspace(10)*, {} addrspace(10)**, i32, {} addrspace(10)*)* @ijl_invoke to {} addrspace(10)* ({} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*)*)({} addrspace(10)* addrspacecast ({}* inttoptr (i64 139738054862944 to {}*) to {} addrspace(10)*), {} addrspace(10)* addrspacecast ({}* inttoptr (i64 139756633165472 to {}*) to {} addrspace(10)*), {} addrspace(10)* addrspacecast ({}* inttoptr (i64 139756569993904 to {}*) to {} addrspace(10)*), {} addrspace(10)* nonnull %12, {} addrspace(10)* nonnull %14) #40, !dbg !75: {}, intvals: {} %.not5157 = icmp eq i32 %v.i38.i56, 0, !dbg !435: {[-1]:Integer}, intvals: {} call fastcc void @julia_wake_thread__2221(i32 zeroext %79) #39, !dbg !357: {}, intvals: {} %66 = getelementptr inbounds { { { i64 }, [1 x i64] }, { { i64 }, [1 x i64] } }, { { { i64 }, [1 x i64] }, { { i64 }, [1 x i64] } }* %1, i64 0, i32 0, i32 1, i64 0, !dbg !256: {[-1]:Pointer, [-1,0]:Integer, [-1,1]:Integer, [-1,2]:Integer, [-1,3]:Integer, [-1,4]:Integer, [-1,5]:Integer, [-1,6]:Integer, [-1,7]:Integer}, intvals: {} %22 = icmp sgt i32 %19, 1, !dbg !111: {[-1]:Integer}, intvals: {} %63 = ptrtoint i8* %62 to i64, !dbg !227: {[-1]:Pointer, [-1,-1]:Float@double}, intvals: {} %57 = ptrtoint i8* %56 to i64, !dbg !227: {[-1]:Pointer, [-1,-1]:Float@double}, intvals: {} %24 = trunc i64 %23 to i32, !dbg !128: {[-1]:Integer}, intvals: {} %.not47 = icmp eq i32 %v.i40.i, 1, !dbg !354: {[-1]:Integer}, intvals: {} %.not48 = icmp slt i64 %6, %phi.bo, !dbg !361: {[-1]:Integer}, intvals: {} %122 = icmp ult i32 %121, 65537, !dbg !443: {[-1]:Integer}, intvals: {} %12 = call noalias nonnull {} addrspace(10)* @julia.gc_alloc_obj({}** nonnull %current_task32.i, i64 noundef 8, {} addrspace(10)* noundef addrspacecast ({}* inttoptr (i64 139756564347200 to {}*) to {} addrspace(10)*)) #41, !dbg !75: {[-1,0]:Integer, [-1,1]:Integer, [-1,2]:Integer, [-1,3]:Integer, [-1,4]:Integer, [-1,5]:Integer, [-1,6]:Integer, [-1,7]:Integer}, intvals: {} %11 = load i64, i64 addrspace(11)* %10, align 8, !dbg !51, !tbaa !43, !range !48: {[-1]:Integer}, intvals: {} oldFunc: ; Function Attrs: mustprogress willreturn define internal nonnull [2 x {} addrspace(10)*] @fwddiffe2julia_f_2129_inner.1({} addrspace(10)* nonnull align 16 dereferenceable(40) %0, [2 x {} addrspace(10)*] %"'") local_unnamed_addr #39 !dbg !1305 { entry: %1 = alloca { { { i64 }, [1 x i64] }, { { i64 }, [1 x i64] } }, align 16 %.sub_replacementA = phi i8* %2 = call {}*** @julia.get_pgcstack() #40 %3 = bitcast {} addrspace(10)* %0 to { i8 addrspace(13)*, i64, i16, i16, i32 } addrspace(10)*, !dbg !1306 %4 = addrspacecast { i8 addrspace(13)*, i64, i16, i16, i32 } addrspace(10)* %3 to { i8 addrspace(13)*, i64, i16, i16, i32 } addrspace(11)*, !dbg !1306 %5 = getelementptr inbounds { i8 addrspace(13)*, i64, i16, i16, i32 }, { i8 addrspace(13)*, i64, i16, i16, i32 } addrspace(11)* %4, i64 0, i32 1, !dbg !1306 %6 = load i64, i64 addrspace(11)* %5, align 8, !dbg !1306, !tbaa !258, !range !261 %7 = call noalias nonnull {} addrspace(10)* @ijl_alloc_array_1d({} addrspace(10)* noundef addrspacecast ({}* inttoptr (i64 139756563700560 to {}*) to {} addrspace(10)*), i64 %6) #40, !dbg !1310 %8 = call noalias nonnull {} addrspace(10)* @ijl_alloc_array_1d({} addrspace(10)* noundef addrspacecast ({}* inttoptr (i64 139756563700560 to {}*) to {} addrspace(10)*), i64 %6) #40, !dbg !1310 %9 = insertvalue [2 x {} addrspace(10)*] undef, {} addrspace(10)* %8, 0, !dbg !1311 %10 = call noalias nonnull {} addrspace(10)* @ijl_alloc_array_1d({} addrspace(10)* noundef addrspacecast ({}* inttoptr (i64 139756563700560 to {}*) to {} addrspace(10)*), i64 %6) #40, !dbg !1310 %11 = insertvalue [2 x {} addrspace(10)*] %9, {} addrspace(10)* %10, 1, !dbg !1311 %12 = bitcast {} addrspace(10)* %7 to { i8 addrspace(13)*, i64, i16, i16, i32 } addrspace(10)*, !dbg !1311 %13 = addrspacecast { i8 addrspace(13)*, i64, i16, i16, i32 } addrspace(10)* %12 to { i8 addrspace(13)*, i64, i16, i16, i32 } addrspace(11)*, !dbg !1311 %14 = getelementptr inbounds { i8 addrspace(13)*, i64, i16, i16, i32 }, { i8 addrspace(13)*, i64, i16, i16, i32 } addrspace(11)* %13, i64 0, i32 1, !dbg !1311 %15 = load i64, i64 addrspace(11)* %14, align 8, !dbg !1311, !tbaa !258, !range !261 %.not = icmp eq i64 %6, %15, !dbg !1321 br i1 %.not, label %L14.i, label %L15.i, !dbg !1323 L14.i: ; preds = %entry %.not36 = icmp eq i64 %6, 0, !dbg !1324 br i1 %.not36, label %julia_f_2129_inner.exit, label %L37.i, !dbg !1328 L15.i: ; preds = %entry %current_task32.i54 = getelementptr inbounds {}**, {}*** %2, i64 -12, !dbg !1323 %current_task32.i = bitcast {}*** %current_task32.i54 to {}**, !dbg !1323 %16 = call noalias nonnull {} addrspace(10)* @julia.gc_alloc_obj({}** nonnull %current_task32.i, i64 noundef 8, {} addrspace(10)* noundef addrspacecast ({}* inttoptr (i64 139756564347200 to {}*) to {} addrspace(10)*)) #41, !dbg !1323 %17 = bitcast {} addrspace(10)* %16 to i64 addrspace(10)*, !dbg !1323 store i64 %6, i64 addrspace(10)* %17, align 8, !dbg !1323, !tbaa !38 %18 = call noalias nonnull {} addrspace(10)* @julia.gc_alloc_obj({}** nonnull %current_task32.i, i64 noundef 8, {} addrspace(10)* noundef addrspacecast ({}* inttoptr (i64 139756564347200 to {}*) to {} addrspace(10)*)) #41, !dbg !1323 %19 = bitcast {} addrspace(10)* %18 to i64 addrspace(10)*, !dbg !1323 store i64 %15, i64 addrspace(10)* %19, align 8, !dbg !1323, !tbaa !38 %20 = call cc38 nonnull {} addrspace(10)* bitcast ({} addrspace(10)* ({} addrspace(10)*, {} addrspace(10)**, i32, {} addrspace(10)*)* @ijl_invoke to {} addrspace(10)* ({} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*, {} addrspace(10)*)*)({} addrspace(10)* addrspacecast ({}* inttoptr (i64 139738054862944 to {}*) to {} addrspace(10)*), {} addrspace(10)* addrspacecast ({}* inttoptr (i64 139756633165472 to {}*) to {} addrspace(10)*), {} addrspace(10)* addrspacecast ({}* inttoptr (i64 139756569993904 to {}*) to {} addrspace(10)*), {} addrspace(10)* nonnull %16, {} addrspace(10)* nonnull %18) #40, !dbg !1323 unreachable L37.i: ; preds = %L14.i %21 = icmp ult i64 %6, 2, !dbg !1329 %22 = select i1 %21, i64 %6, i64 2, !dbg !1329 %23 = trunc i64 %22 to i32, !dbg !1332 %24 = add nsw i32 %23, -1, !dbg !1332 %25 = call nonnull {}* @julia.pointer_from_objref({} addrspace(11)* noundef addrspacecast ({}* inttoptr (i64 139737793205024 to {}*) to {} addrspace(11)*)) #42, !dbg !1336 %26 = icmp sgt i32 %23, 1, !dbg !1338 br i1 %26, label %L47.i, label %L320.i.preheader, !dbg !1341 L47.i: ; preds = %L37.i %p.i.i = bitcast {}* %25 to i64*, !dbg !1342 %v.i.i = atomicrmw xchg i64* %p.i.i, i64 0 acq_rel, align 8, !dbg !1342 %"v.i.i'dual_phi" = phi [2 x i64] , !dbg !1345 %27 = call i64 @llvm.ctpop.i64(i64 %v.i.i) #40, !dbg !1345, !range !697 %28 = trunc i64 %27 to i32, !dbg !1347 %29 = sub nsw i32 %24, %28, !dbg !1348 %30 = icmp slt i32 %29, 0, !dbg !1350 br i1 %30, label %L61.i, label %L91.i, !dbg !1354 L61.i: ; preds = %L47.i %31 = call i64 @llvm.ctlz.i64(i64 %v.i.i, i1 noundef false) #40, !dbg !1355, !range !697 %32 = trunc i64 %31 to i32, !dbg !1357 br label %L64.i, !dbg !1358 L64.i: ; preds = %L64.i, %L61.i %iv = phi i64 [ %iv.next, %L64.i ], [ 0, %L61.i ] %value_phi28.i = phi i32 [ %32, %L61.i ], [ %33, %L64.i ] %value_phi29.i = phi i32 [ %29, %L61.i ], [ %42, %L64.i ] %value_phi30.i = phi i64 [ %v.i.i, %L61.i ], [ %38, %L64.i ] %"value_phi30.i'dual_phi" = phi [2 x i64] , !dbg !1363 %iv.next = add nuw nsw i64 %iv, 1, !dbg !1363 %33 = sub i32 %value_phi28.i, %value_phi29.i, !dbg !1363 %34 = sub i32 64, %33, !dbg !1365 %35 = zext i32 %34 to i64, !dbg !1367 %36 = icmp ugt i32 %34, 63, !dbg !1367 %notmask = shl nsw i64 -1, %35, !dbg !1365 %.op = xor i64 %notmask, -1, !dbg !1365 %37 = select i1 %36, i64 -1, i64 %.op, !dbg !1365 %38 = and i64 %37, %value_phi30.i, !dbg !1368 %"'dual_phi7" = phi [2 x i64] , !dbg !1370 %39 = xor i64 %38, %value_phi30.i, !dbg !1370 %"'dual_phi8" = phi [2 x i64] , !dbg !1371 %40 = call i64 @llvm.ctpop.i64(i64 %39) #40, !dbg !1371, !range !697 %41 = trunc i64 %40 to i32, !dbg !1373 %42 = add i32 %value_phi29.i, %41, !dbg !1374 %.not53 = icmp eq i32 %42, 0, !dbg !1375 br i1 %.not53, label %L83.i, label %L64.i, !dbg !1377 L83.i: ; preds = %L64.i %43 = phi i64 [ %iv, %L64.i ], !dbg !1378 %44 = xor i64 %38, -1, !dbg !1378 %"'dual_phi9" = phi [2 x i64] , !dbg !1380 %45 = and i64 %v.i.i, %44, !dbg !1380 %"'dual_phi10" = phi [2 x i64] , !dbg !1381 store atomic i64 %45, i64* %p.i.i release, align 16, !dbg !1381 store i64 %43, i64* %loopLimit_cache, align 8, !dbg !1382, !invariant.group !1385 br label %L91.i, !dbg !1382 L91.i: ; preds = %L83.i, %L47.i %value_phi8.i = phi i32 [ %24, %L83.i ], [ %28, %L47.i ] %value_phi9.i = phi i64 [ %38, %L83.i ], [ %v.i.i, %L47.i ] %"value_phi9.i'dual_phi" = phi [2 x i64] , !dbg !1386 %46 = icmp sgt i32 %value_phi8.i, 0, !dbg !1386 br i1 %46, label %L137.i.lr.ph, label %L320.i.preheader, !dbg !1388 L320.i.preheader: ; preds = %L91.i, %L37.i %47 = bitcast {} addrspace(10)* %0 to double addrspace(13)* addrspace(10)* %"'dual_phi11" = phi [2 x double addrspace(13)* addrspace(10)*] %48 = addrspacecast double addrspace(13)* addrspace(10)* %47 to double addrspace(13)* addrspace(11)* %"'dual_phi12" = phi [2 x double addrspace(13)* addrspace(11)*] %49 = load double addrspace(13)*, double addrspace(13)* addrspace(11)* %48, align 16, !tbaa !273, !nonnull !4 %"'dual_phi13" = phi [2 x double addrspace(13)*] %50 = bitcast {} addrspace(10)* %7 to double addrspace(13)* addrspace(10)* %"'dual_phi14" = phi [2 x double addrspace(13)* addrspace(10)*] %51 = addrspacecast double addrspace(13)* addrspace(10)* %50 to double addrspace(13)* addrspace(11)* %"'dual_phi15" = phi [2 x double addrspace(13)* addrspace(11)*] %52 = load double addrspace(13)*, double addrspace(13)* addrspace(11)* %51, align 8, !tbaa !273, !nonnull !4 %"'dual_phi16" = phi [2 x double addrspace(13)*] , !dbg !1389 %53 = add nsw i64 %6, -1, !dbg !1389 br label %L320.i, !dbg !1389 L137.i.lr.ph: ; preds = %L91.i %54 = zext i32 %value_phi8.i to i64, !dbg !1390 %55 = add nuw nsw i64 %54, 1, !dbg !1407 %56 = udiv i64 %6, %55, !dbg !1409 %57 = mul i64 %56, %55, !dbg !1410 %58 = sub i64 %6, %57, !dbg !1412 %59 = addrspacecast {} addrspace(10)* %7 to {} addrspace(11)*, !dbg !1413 %"'dual_phi17" = phi [2 x {} addrspace(11)*] , !dbg !1413 %60 = call nonnull {}* @julia.pointer_from_objref({} addrspace(11)* %59) #42, !dbg !1413 %"'dual_phi18" = phi [2 x {}*] , !dbg !1413 %61 = bitcast {}* %60 to i8**, !dbg !1413 %"'dual_phi19" = phi [2 x i8**] , !dbg !1413 %62 = load i8*, i8** %61, align 8, !dbg !1413, !tbaa !273, !nonnull !4 %"'dual_phi20" = phi [2 x i8*] , !dbg !1413 %63 = ptrtoint i8* %62 to i64, !dbg !1413 %"'dual_phi21" = phi [2 x i64] , !dbg !1422 %64 = load i64, i64 addrspace(11)* %14, align 8, !dbg !1422, !tbaa !258, !range !261 %65 = addrspacecast {} addrspace(10)* %0 to {} addrspace(11)*, !dbg !1413 %"'dual_phi22" = phi [2 x {} addrspace(11)*] , !dbg !1413 %66 = call nonnull {}* @julia.pointer_from_objref({} addrspace(11)* %65) #42, !dbg !1413 %"'dual_phi23" = phi [2 x {}*] , !dbg !1413 %67 = bitcast {}* %66 to i8**, !dbg !1413 %"'dual_phi24" = phi [2 x i8**] , !dbg !1413 %68 = load i8*, i8** %67, align 8, !dbg !1413, !tbaa !273, !nonnull !4 %"'dual_phi25" = phi [2 x i8*] , !dbg !1413 %69 = ptrtoint i8* %68 to i64, !dbg !1413 %"'dual_phi26" = phi [2 x i64] , !dbg !1422 %70 = load i64, i64 addrspace(11)* %5, align 8, !dbg !1422, !tbaa !258, !range !261 call void @llvm.lifetime.start.p0i8(i64 noundef 32, i8* noundef nonnull %.sub_replacementA) #40 %71 = getelementptr inbounds { { { i64 }, [1 x i64] }, { { i64 }, [1 x i64] } }, { { { i64 }, [1 x i64] }, { { i64 }, [1 x i64] } }* %1, i64 0, i32 0, i32 0, i32 0, !dbg !1427 store i64 %63, i64* %71, align 16, !dbg !1427, !tbaa !76 %72 = getelementptr inbounds { { { i64 }, [1 x i64] }, { { i64 }, [1 x i64] } }, { { { i64 }, [1 x i64] }, { { i64 }, [1 x i64] } }* %1, i64 0, i32 0, i32 1, i64 0, !dbg !1427 store i64 %64, i64* %72, align 8, !dbg !1427, !tbaa !76 %73 = getelementptr inbounds { { { i64 }, [1 x i64] }, { { i64 }, [1 x i64] } }, { { { i64 }, [1 x i64] }, { { i64 }, [1 x i64] } }* %1, i64 0, i32 1, i32 0, i32 0, !dbg !1427 store i64 %69, i64* %73, align 16, !dbg !1427, !tbaa !76 %74 = getelementptr inbounds { { { i64 }, [1 x i64] }, { { i64 }, [1 x i64] } }, { { { i64 }, [1 x i64] }, { { i64 }, [1 x i64] } }* %1, i64 0, i32 1, i32 1, i64 0, !dbg !1427 store i64 %70, i64* %74, align 8, !dbg !1427, !tbaa !76 %75 = call token (...) @llvm.julia.gc_preserve_begin({} addrspace(10)* nonnull %7, {} addrspace(10)* nonnull %0) #40, !dbg !1428 %.not46 = icmp sgt i64 %58, -1 %76 = ptrtoint { { { i64 }, [1 x i64] }, { { i64 }, [1 x i64] } }* %1 to i64 %"'dual_phi27" = phi [2 x i64] , !dbg !1429 %77 = add nsw i64 %54, -1, !dbg !1429 br label %L137.i, !dbg !1429 L137.i: ; preds = %L196.i, %L137.i.lr.ph %iv3 = phi i64 [ %iv.next4, %L196.i ], [ 0, %L137.i.lr.ph ] %value_phi15.i66 = phi i64 [ %value_phi9.i, %L137.i.lr.ph ], [ %90, %L196.i ] %"value_phi15.i66'dual_phi" = phi [2 x i64] %value_phi13.i64 = phi i64 [ 0, %L137.i.lr.ph ], [ %84, %L196.i ] %value_phi12.i63 = phi i32 [ 0, %L137.i.lr.ph ], [ %86, %L196.i ] %iv.next4 = add nuw nsw i64 %iv3, 1, !dbg !1430 %78 = icmp ne i64 %value_phi15.i66, 0, !dbg !1430 call void @llvm.assume(i1 noundef %78) #40, !dbg !1433 %79 = call i64 @llvm.cttz.i64(i64 %value_phi15.i66, i1 noundef true) #40, !dbg !1434, !range !697 %80 = trunc i64 %79 to i32, !dbg !1436 %81 = icmp ugt i64 %58, %iv3, !dbg !1437 %not. = and i1 %.not46, %81, !dbg !1441 %82 = zext i1 %not. to i64, !dbg !1441 %83 = add i64 %value_phi13.i64, %56, !dbg !1441 %84 = add i64 %83, %82, !dbg !1442 %85 = add nuw nsw i32 %80, 1, !dbg !1443 %86 = add i32 %85, %value_phi12.i63, !dbg !1445 %87 = zext i32 %85 to i64, !dbg !1447 %88 = lshr i64 %value_phi15.i66, %87, !dbg !1447 %"'dual_phi28" = phi [2 x i64] , !dbg !1447 %89 = icmp eq i32 %80, 63, !dbg !1447 %90 = select i1 %89, i64 0, i64 %88, !dbg !1447 %"'dual_phi29" = phi [2 x i64] , !dbg !1449 %91 = load i64, i64* inttoptr (i64 139737736831744 to i64*), align 256, !dbg !1449, !tbaa !76 %92 = shl i32 %86, 9, !dbg !1455 %93 = zext i32 %92 to i64, !dbg !1456 %94 = inttoptr i64 %91 to i8*, !dbg !1461 %95 = getelementptr i8, i8* %94, i64 %93, !dbg !1461 %96 = getelementptr i8, i8* %95, i64 8, !dbg !1462 %97 = bitcast i8* %96 to i64*, !dbg !1468 store i64 ptrtoint (void (i64)* @jlcapi_BatchClosure_2131 to i64), i64* %97, align 1, !dbg !1468, !tbaa !106 %98 = getelementptr i8, i8* %95, i64 16, !dbg !1472 %99 = bitcast i8* %98 to i64*, !dbg !1476 store i64 %76, i64* %99, align 1, !dbg !1476, !tbaa !106 %100 = getelementptr i8, i8* %95, i64 24, !dbg !1480 %101 = bitcast i8* %100 to i64*, !dbg !1484 store i64 %value_phi13.i64, i64* %101, align 1, !dbg !1484, !tbaa !106 %102 = getelementptr i8, i8* %95, i64 32, !dbg !1488 %103 = bitcast i8* %102 to i64*, !dbg !1492 store i64 %84, i64* %103, align 1, !dbg !1492, !tbaa !106 %p.i39.i = bitcast i8* %95 to i32*, !dbg !1496 %v.i40.i = atomicrmw xchg i32* %p.i39.i, i32 0 acq_rel, align 4, !dbg !1496 %.not47 = icmp eq i32 %v.i40.i, 1, !dbg !1499 br i1 %.not47, label %L195.i, label %L196.i, !dbg !1501 L195.i: ; preds = %L137.i call fastcc void @julia_wake_thread__2221(i32 zeroext %86) #39, !dbg !1501 br label %L196.i, !dbg !1501 L196.i: ; preds = %L195.i, %L137.i %.not44 = icmp eq i64 %iv.next4, %54, !dbg !1502 br i1 %.not44, label %L200.i, label %L137.i, !dbg !1429 L200.i: ; preds = %L196.i %not..lcssa = phi i1 [ %not., %L196.i ], !dbg !1441 %value_phi13.i64.lcssa = phi i64 [ %value_phi13.i64, %L196.i ] %phi.bo = add i64 %84, 1, !dbg !1429 %.not48 = icmp slt i64 %6, %phi.bo, !dbg !1505 br i1 %.not48, label %L252.i, label %L221.i.preheader, !dbg !1510 L221.i.preheader: ; preds = %L200.i %104 = add i64 %6, -1, !dbg !1511 %105 = sub i64 %104, %56, !dbg !1511 %106 = sub i64 %105, %value_phi13.i64.lcssa, !dbg !1511 %107 = zext i1 %not..lcssa to i64, !dbg !1511 %108 = sub i64 %106, %107, !dbg !1511 br label %L221.i, !dbg !1511 L221.i: ; preds = %L221.i, %L221.i.preheader %iv5 = phi i64 [ %iv.next6, %L221.i ], [ 0, %L221.i.preheader ] %iv.next6 = add nuw nsw i64 %iv5, 1, !dbg !1512 %109 = add i64 %phi.bo, %iv5, !dbg !1512 %110 = shl i64 %109, 3, !dbg !1512 %111 = add i64 %110, -8, !dbg !1512 %112 = getelementptr i8, i8* %68, i64 %111, !dbg !1517 %"'dual_phi30" = phi [2 x i8*] , !dbg !1518 %113 = bitcast i8* %112 to double*, !dbg !1518 %"'dual_phi31" = phi [2 x double*] , !dbg !1518 %114 = load double, double* %113, align 1, !dbg !1518, !tbaa !106 %"'dual_phi32" = phi fast [2 x double] , !dbg !1522 %115 = fmul double %114, %114, !dbg !1522 %"'dual_phi33" = phi fast [2 x double] , !dbg !1524 %116 = getelementptr i8, i8* %62, i64 %111, !dbg !1524 %"'dual_phi34" = phi [2 x i8*] , !dbg !1526 %117 = bitcast i8* %116 to double*, !dbg !1526 %"'dual_phi35" = phi [2 x double*] , !dbg !1526 store double %115, double* %117, align 1, !dbg !1526, !tbaa !106 %.not49.not = icmp eq i64 %109, %6, !dbg !1530 %118 = add i64 %109, 1, !dbg !1358 br i1 %.not49.not, label %L252.i.loopexit, label %L221.i, !dbg !1511 L252.i.loopexit: ; preds = %L221.i br label %L252.i, !dbg !1532 L252.i: ; preds = %L252.i.loopexit, %L200.i %.not5059 = icmp eq i64 %value_phi9.i, 0, !dbg !1532 br i1 %.not5059, label %L293.i, label %L261.i.preheader, !dbg !1535 L261.i.preheader: ; preds = %L252.i br label %L261.i, !dbg !1536 L261.i: ; preds = %L291.i, %L261.i.preheader %iv7 = phi i64 [ %iv.next8, %L291.i ], [ 0, %L261.i.preheader ] %value_phi26.i61 = phi i64 [ %125, %L291.i ], [ %value_phi9.i, %L261.i.preheader ] %"value_phi26.i61'dual_phi" = phi [2 x i64] %value_phi25.i60 = phi i32 [ %126, %L291.i ], [ 0, %L261.i.preheader ] %iv.next8 = add nuw nsw i64 %iv7, 1, !dbg !1539 %119 = call i64 @llvm.cttz.i64(i64 %value_phi26.i61, i1 noundef true) #40, !dbg !1539, !range !697 %120 = trunc i64 %119 to i32, !dbg !1541 %121 = add nuw nsw i32 %120, 1, !dbg !1542 %122 = zext i32 %121 to i64, !dbg !1544 %123 = lshr i64 %value_phi26.i61, %122, !dbg !1544 %"'dual_phi36" = phi [2 x i64] , !dbg !1544 %124 = icmp eq i32 %120, 63, !dbg !1544 %125 = select i1 %124, i64 0, i64 %123, !dbg !1544 %"'dual_phi37" = phi [2 x i64] , !dbg !1546 %126 = add i32 %121, %value_phi25.i60, !dbg !1546 %127 = load i64, i64* inttoptr (i64 139737736831744 to i64*), align 256, !dbg !1548, !tbaa !76 %128 = shl i32 %126, 9, !dbg !1551 %129 = zext i32 %128 to i64, !dbg !1552 %130 = inttoptr i64 %127 to i8*, !dbg !1557 %131 = getelementptr i8, i8* %130, i64 %129, !dbg !1557 %p.i37.i = bitcast i8* %131 to i32*, !dbg !1558 %v.i38.i56 = load atomic i32, i32* %p.i37.i acquire, align 16, !dbg !1558 %.not5157 = icmp eq i32 %v.i38.i56, 0, !dbg !1561 br i1 %.not5157, label %L282.i.preheader, label %L291.i, !dbg !1536 L282.i.preheader: ; preds = %L261.i br label %L282.i, !dbg !1562 L282.i: ; preds = %L289.i, %L282.i.preheader %iv9 = phi i64 [ %iv.next10, %L289.i ], [ 0, %L282.i.preheader ] %iv.next10 = add nuw nsw i64 %iv9, 1 %132 = trunc i64 %iv9 to i32 call void @llvm.lifetime.end.p0i8(i64 noundef 32, i8* noundef nonnull %.sub_replacementA) #40 call void asm sideeffect "pause", "~{memory}"() #43, !dbg !1563 %133 = add i32 %132, 1, !dbg !1565 %134 = icmp ult i32 %133, 65537, !dbg !1567 br i1 %134, label %L289.i, label %L286.i, !dbg !1562 L286.i: ; preds = %L282.i %135 = call fastcc i8 @julia_checktask_2140(i32 zeroext %126) #39, !dbg !1569 %136 = and i8 %135, 1, !dbg !1569 %.not52 = icmp eq i8 %136, 0, !dbg !1569 br i1 %.not52, label %L289.i, label %L291.i.loopexit, !dbg !1569 L289.i: ; preds = %L286.i, %L282.i %v.i38.i = load atomic i32, i32* %p.i37.i acquire, align 16, !dbg !1558 %.not51 = icmp eq i32 %v.i38.i, 0, !dbg !1561 br i1 %.not51, label %L282.i, label %L291.i.loopexit, !dbg !1536 L291.i.loopexit: ; preds = %L289.i, %L286.i br label %L291.i, !dbg !1532 L291.i: ; preds = %L291.i.loopexit, %L261.i %.not50 = icmp eq i64 %125, 0, !dbg !1532 br i1 %.not50, label %L293.i.loopexit, label %L261.i, !dbg !1535 L293.i.loopexit: ; preds = %L291.i br label %L293.i, !dbg !1570 L293.i: ; preds = %L293.i.loopexit, %L252.i %p.i34.i = bitcast {}* %25 to i64*, !dbg !1570 %v.i35.i = atomicrmw or i64* %p.i34.i, i64 %value_phi9.i acq_rel, align 8, !dbg !1570 call void @llvm.julia.gc_preserve_end(token %75) #40, !dbg !1573 br label %julia_f_2129_inner.exit, !dbg !1574 L320.i: ; preds = %L320.i, %L320.i.preheader %iv1 = phi i64 [ %iv.next2, %L320.i ], [ 0, %L320.i.preheader ] %iv.next2 = add nuw nsw i64 %iv1, 1, !dbg !1575 %137 = add i64 %iv.next2, -1, !dbg !1575 %138 = getelementptr inbounds double, double addrspace(13)* %49, i64 %137, !dbg !1575 %"'dual_phi38" = phi [2 x double addrspace(13)*] , !dbg !1575 %139 = load double, double addrspace(13)* %138, align 8, !dbg !1575, !tbaa !275 %"'dual_phi39" = phi fast [2 x double] , !dbg !1578 %140 = fmul double %139, %139, !dbg !1578 %"'dual_phi40" = phi fast [2 x double] , !dbg !1580 %141 = getelementptr inbounds double, double addrspace(13)* %52, i64 %137, !dbg !1580 %"'dual_phi41" = phi [2 x double addrspace(13)*] , !dbg !1580 store double %140, double addrspace(13)* %141, align 8, !dbg !1580, !tbaa !275 %.not37.not = icmp eq i64 %iv.next2, %6, !dbg !1581 %142 = add i64 %iv.next2, 1, !dbg !1382 br i1 %.not37.not, label %julia_f_2129_inner.exit.loopexit, label %L320.i, !dbg !1389 julia_f_2129_inner.exit.loopexit: ; preds = %L320.i br label %julia_f_2129_inner.exit julia_f_2129_inner.exit: ; preds = %julia_f_2129_inner.exit.loopexit, %L293.i, %L14.i call void @llvm.lifetime.end.p0i8(i64 noundef 32, i8* noundef nonnull %.sub_replacementA) #40 ret {} addrspace(10)* %7, !dbg !1583 allocsForInversion: ; No predecessors! %"iv'ac" = alloca i64, align 8 %loopLimit_cache = alloca i64, align 8 store i64 0, i64* %loopLimit_cache, align 8 %"iv3'ac" = alloca i64, align 8 %"iv5'ac" = alloca i64, align 8 %"iv7'ac" = alloca i64, align 8 %"iv9'ac" = alloca i64, align 8 %"iv1'ac" = alloca i64, align 8 } I: %v.i.i = atomicrmw xchg i64* %p.i.i, i64 0 acq_rel, align 8, !dbg !118 Active atomic inst not yet handled UNREACHABLE executed at /workspace/srcdir/Enzyme/enzyme/Enzyme/AdjointGenerator.h:1041! signal (6): Aborted in expression starting at REPL[3]:1 gsignal at /lib/x86_64-linux-gnu/libc.so.6 (unknown line) abort at /lib/x86_64-linux-gnu/libc.so.6 (unknown line) _ZN4llvm25llvm_unreachable_internalEPKcS1_j at /mnt/hd1/opt/julia/1.8.2/bin/../lib/julia/libLLVM-13jl.so (unknown line) visitAtomicRMWInst at /workspace/srcdir/Enzyme/enzyme/Enzyme/AdjointGenerator.h:1041 visitAtomicRMW at /opt/x86_64-linux-gnu/x86_64-linux-gnu/sys-root/usr/local/include/llvm/IR/Instruction.def:177 [inlined] visit at /opt/x86_64-linux-gnu/x86_64-linux-gnu/sys-root/usr/local/include/llvm/IR/Instruction.def:177 visit at /opt/x86_64-linux-gnu/x86_64-linux-gnu/sys-root/usr/local/include/llvm/IR/InstVisitor.h:112 [inlined] CreateForwardDiff at /workspace/srcdir/Enzyme/enzyme/Enzyme/EnzymeLogic.cpp:4496 EnzymeCreateForwardDiff at /workspace/srcdir/Enzyme/enzyme/Enzyme/CApi.cpp:449 EnzymeCreateForwardDiff at /home/mschlott/.julia/packages/Enzyme/7ekWs/src/api.jl:137 enzyme! at /home/mschlott/.julia/packages/Enzyme/7ekWs/src/compiler.jl:4774 unknown function (ip: 0x7f175636e894) _jl_invoke at /cache/build/default-amdci4-6/julialang/julia-release-1-dot-8/src/gf.c:2367 [inlined] ijl_apply_generic at /cache/build/default-amdci4-6/julialang/julia-release-1-dot-8/src/gf.c:2549 #codegen#136 at /home/mschlott/.julia/packages/Enzyme/7ekWs/src/compiler.jl:5854 codegen##kw at /home/mschlott/.julia/packages/Enzyme/7ekWs/src/compiler.jl:5524 [inlined] _thunk at /home/mschlott/.julia/packages/Enzyme/7ekWs/src/compiler.jl:6321 [inlined] _thunk at /home/mschlott/.julia/packages/Enzyme/7ekWs/src/compiler.jl:6315 unknown function (ip: 0x7f1b981ad7dd) _jl_invoke at /cache/build/default-amdci4-6/julialang/julia-release-1-dot-8/src/gf.c:2367 [inlined] ijl_apply_generic at /cache/build/default-amdci4-6/julialang/julia-release-1-dot-8/src/gf.c:2549 cached_compilation at /home/mschlott/.julia/packages/Enzyme/7ekWs/src/compiler.jl:6359 unknown function (ip: 0x7f1b9818ab63) _jl_invoke at /cache/build/default-amdci4-6/julialang/julia-release-1-dot-8/src/gf.c:2367 [inlined] ijl_apply_generic at /cache/build/default-amdci4-6/julialang/julia-release-1-dot-8/src/gf.c:2549 #s836#163 at /home/mschlott/.julia/packages/Enzyme/7ekWs/src/compiler.jl:6419 [inlined] #s836#163 at ./none:0 _jl_invoke at /cache/build/default-amdci4-6/julialang/julia-release-1-dot-8/src/gf.c:2367 [inlined] ijl_apply_generic at /cache/build/default-amdci4-6/julialang/julia-release-1-dot-8/src/gf.c:2549 GeneratedFunctionStub at ./boot.jl:582 _jl_invoke at /cache/build/default-amdci4-6/julialang/julia-release-1-dot-8/src/gf.c:2367 [inlined] ijl_apply_generic at /cache/build/default-amdci4-6/julialang/julia-release-1-dot-8/src/gf.c:2549 jl_apply at /cache/build/default-amdci4-6/julialang/julia-release-1-dot-8/src/julia.h:1839 [inlined] jl_call_staged at /cache/build/default-amdci4-6/julialang/julia-release-1-dot-8/src/method.c:520 ijl_code_for_staged at /cache/build/default-amdci4-6/julialang/julia-release-1-dot-8/src/method.c:571 get_staged at ./compiler/utilities.jl:114 retrieve_code_info at ./compiler/utilities.jl:126 [inlined] InferenceState at ./compiler/inferencestate.jl:284 typeinf_edge at ./compiler/typeinfer.jl:868 abstract_call_method at ./compiler/abstractinterpretation.jl:647 abstract_call_gf_by_type at ./compiler/abstractinterpretation.jl:139 abstract_call_known at ./compiler/abstractinterpretation.jl:1716 abstract_call at ./compiler/abstractinterpretation.jl:1786 abstract_call at ./compiler/abstractinterpretation.jl:1753 abstract_eval_statement at ./compiler/abstractinterpretation.jl:1910 typeinf_local at ./compiler/abstractinterpretation.jl:2386 typeinf_nocycle at ./compiler/abstractinterpretation.jl:2482 _typeinf at ./compiler/typeinfer.jl:230 typeinf at ./compiler/typeinfer.jl:213 typeinf_edge at ./compiler/typeinfer.jl:877 abstract_call_method at ./compiler/abstractinterpretation.jl:647 abstract_call_gf_by_type at ./compiler/abstractinterpretation.jl:139 abstract_call_known at ./compiler/abstractinterpretation.jl:1716 abstract_call at ./compiler/abstractinterpretation.jl:1786 abstract_call at ./compiler/abstractinterpretation.jl:1753 abstract_eval_statement at ./compiler/abstractinterpretation.jl:1910 typeinf_local at ./compiler/abstractinterpretation.jl:2360 typeinf_nocycle at ./compiler/abstractinterpretation.jl:2482 _typeinf at ./compiler/typeinfer.jl:230 typeinf at ./compiler/typeinfer.jl:213 typeinf_ext at ./compiler/typeinfer.jl:967 typeinf_ext_toplevel at ./compiler/typeinfer.jl:1000 typeinf_ext_toplevel at ./compiler/typeinfer.jl:996 jfptr_typeinf_ext_toplevel_13386.clone_1 at /mnt/hd1/opt/julia/1.8.2/lib/julia/sys.so (unknown line) _jl_invoke at /cache/build/default-amdci4-6/julialang/julia-release-1-dot-8/src/gf.c:2367 [inlined] ijl_apply_generic at /cache/build/default-amdci4-6/julialang/julia-release-1-dot-8/src/gf.c:2549 jl_apply at /cache/build/default-amdci4-6/julialang/julia-release-1-dot-8/src/julia.h:1839 [inlined] jl_type_infer at /cache/build/default-amdci4-6/julialang/julia-release-1-dot-8/src/gf.c:319 jl_generate_fptr_impl at /cache/build/default-amdci4-6/julialang/julia-release-1-dot-8/src/jitlayers.cpp:319 jl_compile_method_internal at /cache/build/default-amdci4-6/julialang/julia-release-1-dot-8/src/gf.c:2081 [inlined] jl_compile_method_internal at /cache/build/default-amdci4-6/julialang/julia-release-1-dot-8/src/gf.c:2025 _jl_invoke at /cache/build/default-amdci4-6/julialang/julia-release-1-dot-8/src/gf.c:2359 [inlined] ijl_apply_generic at /cache/build/default-amdci4-6/julialang/julia-release-1-dot-8/src/gf.c:2549 #gradient#30 at /home/mschlott/.julia/packages/Enzyme/7ekWs/src/Enzyme.jl:582 unknown function (ip: 0x7f1b981629d8) _jl_invoke at /cache/build/default-amdci4-6/julialang/julia-release-1-dot-8/src/gf.c:2367 [inlined] ijl_apply_generic at /cache/build/default-amdci4-6/julialang/julia-release-1-dot-8/src/gf.c:2549 gradient at /home/mschlott/.julia/packages/Enzyme/7ekWs/src/Enzyme.jl:578 #jacobian#39 at /home/mschlott/.julia/packages/Enzyme/7ekWs/src/Enzyme.jl:656 [inlined] jacobian at /home/mschlott/.julia/packages/Enzyme/7ekWs/src/Enzyme.jl:655 _jl_invoke at /cache/build/default-amdci4-6/julialang/julia-release-1-dot-8/src/gf.c:2367 [inlined] ijl_apply_generic at /cache/build/default-amdci4-6/julialang/julia-release-1-dot-8/src/gf.c:2549 jl_apply at /cache/build/default-amdci4-6/julialang/julia-release-1-dot-8/src/julia.h:1839 [inlined] do_call at /cache/build/default-amdci4-6/julialang/julia-release-1-dot-8/src/interpreter.c:126 eval_value at /cache/build/default-amdci4-6/julialang/julia-release-1-dot-8/src/interpreter.c:215 eval_stmt_value at /cache/build/default-amdci4-6/julialang/julia-release-1-dot-8/src/interpreter.c:166 [inlined] eval_body at /cache/build/default-amdci4-6/julialang/julia-release-1-dot-8/src/interpreter.c:612 jl_interpret_toplevel_thunk at /cache/build/default-amdci4-6/julialang/julia-release-1-dot-8/src/interpreter.c:750 jl_toplevel_eval_flex at /cache/build/default-amdci4-6/julialang/julia-release-1-dot-8/src/toplevel.c:906 jl_toplevel_eval_flex at /cache/build/default-amdci4-6/julialang/julia-release-1-dot-8/src/toplevel.c:850 ijl_toplevel_eval_in at /cache/build/default-amdci4-6/julialang/julia-release-1-dot-8/src/toplevel.c:965 eval at ./boot.jl:368 [inlined] eval_user_input at /cache/build/default-amdci4-6/julialang/julia-release-1-dot-8/usr/share/julia/stdlib/v1.8/REPL/src/REPL.jl:151 repl_backend_loop at /cache/build/default-amdci4-6/julialang/julia-release-1-dot-8/usr/share/julia/stdlib/v1.8/REPL/src/REPL.jl:247 start_repl_backend at /cache/build/default-amdci4-6/julialang/julia-release-1-dot-8/usr/share/julia/stdlib/v1.8/REPL/src/REPL.jl:232 #run_repl#47 at /cache/build/default-amdci4-6/julialang/julia-release-1-dot-8/usr/share/julia/stdlib/v1.8/REPL/src/REPL.jl:369 run_repl at /cache/build/default-amdci4-6/julialang/julia-release-1-dot-8/usr/share/julia/stdlib/v1.8/REPL/src/REPL.jl:355 jfptr_run_repl_64841.clone_1 at /mnt/hd1/opt/julia/1.8.2/lib/julia/sys.so (unknown line) _jl_invoke at /cache/build/default-amdci4-6/julialang/julia-release-1-dot-8/src/gf.c:2367 [inlined] ijl_apply_generic at /cache/build/default-amdci4-6/julialang/julia-release-1-dot-8/src/gf.c:2549 #967 at ./client.jl:419 jfptr_YY.967_30403.clone_1 at /mnt/hd1/opt/julia/1.8.2/lib/julia/sys.so (unknown line) _jl_invoke at /cache/build/default-amdci4-6/julialang/julia-release-1-dot-8/src/gf.c:2367 [inlined] ijl_apply_generic at /cache/build/default-amdci4-6/julialang/julia-release-1-dot-8/src/gf.c:2549 jl_apply at /cache/build/default-amdci4-6/julialang/julia-release-1-dot-8/src/julia.h:1839 [inlined] jl_f__call_latest at /cache/build/default-amdci4-6/julialang/julia-release-1-dot-8/src/builtins.c:774 #invokelatest#2 at ./essentials.jl:729 [inlined] invokelatest at ./essentials.jl:726 [inlined] run_main_repl at ./client.jl:404 exec_options at ./client.jl:318 _start at ./client.jl:522 jfptr__start_56736.clone_1 at /mnt/hd1/opt/julia/1.8.2/lib/julia/sys.so (unknown line) _jl_invoke at /cache/build/default-amdci4-6/julialang/julia-release-1-dot-8/src/gf.c:2367 [inlined] ijl_apply_generic at /cache/build/default-amdci4-6/julialang/julia-release-1-dot-8/src/gf.c:2549 jl_apply at /cache/build/default-amdci4-6/julialang/julia-release-1-dot-8/src/julia.h:1839 [inlined] true_main at /cache/build/default-amdci4-6/julialang/julia-release-1-dot-8/src/jlapi.c:575 jl_repl_entrypoint at /cache/build/default-amdci4-6/julialang/julia-release-1-dot-8/src/jlapi.c:719 main at julia-1.8 (unknown line) __libc_start_main at /lib/x86_64-linux-gnu/libc.so.6 (unknown line) unknown function (ip: 0x401098) Allocations: 60806253 (Pool: 60758024; Big: 48229); GC: 44 Aborted (core dumped) ```
ranocha commented 1 year ago

As far as I know, Polyester.jl generates plain serial code without wrapping it in the serial case - it basically executes the loop without @batch. They only do something in the really parallel case - which breaks as described by @sloede.

wsmoses commented 1 year ago

This is fixed by https://github.com/EnzymeAD/Enzyme.jl/pull/557 and https://github.com/EnzymeAD/Enzyme/pull/949 . Note that after the latter lands, you will need to wait for the jll to update here.

wsmoses commented 1 year ago

Rephrasing, those PR's will fix the type analysis assertion, however, incidentally this does then reproduce (on 2 threads, 1.8.3) the e-310 correctness issue.