Skip to content

GC corruption with Enzyme cache modification #785

@gdalle

Description

@gdalle

While working on #782 I observed a very weird bug on the example inspired by #766. I compute a Jacobian with Enzyme, then I run a completely unrelated BenchmarkTools command and the REPL crashes:

GC error (probable corruption)
Allocations: 47629904 (Pool: 47628617; Big: 1287); GC: 34

Interestingly, the crash doesn't happen...

  • with the main branch of DifferentiationInterface
  • or if I don't compute the Jacobian beforehand
  • or if I run the benchmark in a function instead of the global scope
  • or if I use Chairmarks instead of BenchmarkTools

EDIT1: BenchmarkTools is no longer a suspect, the bug still appears when we replace @benchmarl 1+1 with GC.gc(true).


MWE:

# setup

using Pkg
Pkg.activate(; temp=true)
Pkg.add(;
    url="https://github.com/JuliaDiff/DifferentiationInterface.jl",
    subdir="DifferentiationInterface",
    rev="gd/enzyme_cache",
)
Pkg.add(["BenchmarkTools", "Enzyme"])

Pkg.status()
versioninfo()

# actual code

using BenchmarkTools
using DifferentiationInterface
using Enzyme: Enzyme
const DI = DifferentiationInterface

function f!(y, x, c)
    copyto!(c.a[1], x)
    c.a[1] = c.b[1] .+ 1
    copyto!(y, c.b[1])
    return nothing
end

# begin block (no crash if this block is run in a function)
x = rand(4)
y = similar(x)
c = (; a=[similar(x)], b=[similar(x)])
f!(y, x, c)
backend = AutoEnzyme(; mode=Enzyme.Forward)
prep = DI.prepare_jacobian(f!, y, backend, x, Cache(c))
DI.jacobian(f!, y, prep, backend, x, Cache(c))  # no crash if this is skipped
@benchmark 1 + 1
# end block

Error:

Details
julia> @benchmark 1 + 1
GC error (probable corruption)
Allocations: 47629904 (Pool: 47628617; Big: 1287); GC: 34
<?#0x303df08a0::Memory{Any}(4, 0x301576520)[
  ntuple(Base.var"#181#183"{Tuple{Int64}, Tuple{Bool}, Tuple{Int64}, Array{Symbol, 1}}, Int64) from ntuple(F, Integer) where {F},
  #<null>,
  #<null>,
  #<null>]>

thread 0 ptr queue:
~~~~~~~~~~ ptr queue top ~~~~~~~~~~
Task(next=nothing, queue=nothing, storage=Base.IdDict{Any, Any}(ht=Memory{Any}(32, 0x1169bf460)[
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  :LLVMContext,
  Array{LLVM.Context, 1}(dims=(0,), mem=Memory{LLVM.Context}(8, 0x3024fbc80)[LLVM.Context(ref=0x000000012fe85300), LLVM.Context(ref=0x000000012feacb00), LLVM.Context(ref=0x0000000000000000), LLVM.Context(ref=0x0000000000000000), LLVM.Context(ref=0x0000000000000000), LLVM.Context(ref=0x0000000000000000), LLVM.Context(ref=0x0000000000000000), LLVM.Context(ref=0x0000000000000000)]),
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  :current_tracy_ctx,
  Array{Tracy.TracyZoneContext, 1}(dims=(0,), mem=Memory{Tracy.TracyZoneContext}(8, 0x3154fef00)[Tracy.TracyZoneContext(id=0x00000000, active=0), Tracy.TracyZoneContext(id=0x00000000, active=0), Tracy.TracyZoneContext(id=0x01130008, active=1), Tracy.TracyZoneContext(id=0x01130008, active=1), Tracy.TracyZoneContext(id=0x00000001, active=0), Tracy.TracyZoneContext(id=0xffffffff, active=-1), Tracy.TracyZoneContext(id=0x00000001, active=0), Tracy.TracyZoneContext(id=0x16b3000a, active=1)]),
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  :SOURCE_PATH,
  nothing,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  :LLVMTSContext,
  Array{LLVM.ThreadSafeContext, 1}(dims=(0,), mem=Memory{LLVM.ThreadSafeContext}(8, 0x3024fbbc0)[LLVM.ThreadSafeContext(ref=0x000000012fe85300), LLVM.ThreadSafeContext(ref=0x000000012fed0510), LLVM.ThreadSafeContext(ref=0x0000000000000000), LLVM.ThreadSafeContext(ref=0x0000000000000000), LLVM.ThreadSafeContext(ref=0x0000000000000000), LLVM.ThreadSafeContext(ref=0x0000000000000000), LLVM.ThreadSafeContext(ref=0x0000000000000000), LLVM.ThreadSafeContext(ref=0x0000000000000000)]),
  #<null>,
  #<null>], count=4, ndel=14), donenotify=nothing, result=nothing, scope=nothing, code=#<null>, rngState0=0x7ea6f88ad751ff7b, rngState1=0xd917910f41e27532, rngState2=0x46344149527e18ac, rngState3=0xfb8703e290bfee8a, rngState4=0x96df01052e8306ae, _state=0x00, sticky=true, _isexception=false, priority=0x0000)
==========
Core.Binding(value=Main, globalref=Main.Main, owner=<circular reference @-1>, ty=Any, flags=0x07)
==========
Core.Binding(value=Core, globalref=Main.Core, owner=<circular reference @-1>, ty=Any, flags=0x01)
==========
Core.Binding(value=#<null>, globalref=Main.getfield, owner=#<null>, ty=#<null>, flags=0x00)
==========
Core.Binding(value=Base, globalref=Main.Base, owner=<circular reference @-1>, ty=#<null>, flags=0x01)
==========
Core.Binding(value=#<null>, globalref=Main.Float64, owner=Core.Binding(value=Float64, globalref=Core.Float64, owner=<circular reference @-1>, ty=Any, flags=0x07), ty=#<null>, flags=0x00)
==========
Core.Binding(value=#<null>, globalref=Main.Float32, owner=Core.Binding(value=Float32, globalref=Core.Float32, owner=<circular reference @-1>, ty=Any, flags=0x07), ty=#<null>, flags=0x00)
==========
Core.Binding(value=#<null>, globalref=Main.Float16, owner=Core.Binding(value=Float16, globalref=Core.Float16, owner=<circular reference @-1>, ty=Any, flags=0x07), ty=#<null>, flags=0x00)
==========
Core.Binding(value=#<null>, globalref=Main.remotecall_wait, owner=#<null>, ty=#<null>, flags=0x00)
==========
Core.Binding(value=#<null>, globalref=Main.Distributed, owner=#<null>, ty=#<null>, flags=0x00)
==========
Core.Binding(value=#<null>, globalref=Main.procs, owner=#<null>, ty=#<null>, flags=0x00)
==========
Core.Binding(value=#<null>, globalref=Main.main, owner=#<null>, ty=#<null>, flags=0x00)
==========
Core.Binding(value=Base.IdDict{Any, Any}(ht=Memory{Any}(32, 0x119a79560)[
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  Base.Docs.Binding(mod=Main, var=:Main),
  Base.Docs.MultiDoc(order=Array{Type, 1}(dims=(1,), mem=Memory{Type}(8, 0x119a7a390)[Union{}, #<null>, #<null>, #<null>, #<null>, #<null>, #<null>, #<null>]), docs=Base.IdDict{Any, Any}(ht=Memory{Any}(32, 0x119a7a020)[
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  Union{},
  Base.Docs.DocStr(text=svec("    Main\n\n`Main` is the top-level module, and Julia starts with `Main` set as the current module.  Variables defined at the prompt go in `Main`, and `varinfo` lists variables in `Main`.\n```jldoctest\njulia> @__MODULE__\nMain\n```\n"), object=nothing, data=Base.Dict{Symbol, Any}(slots=Memory{UInt8}(16, 0x11d9b3ab0)[0x00, 0xc2, 0x00, 0xa8, 0xda, 0xbb, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], keys=Memory{Symbol}(16, 0x119a7a280)[
  #<null>,
  :typesig,
  #<null>,
  :module,
  :linenumber,
  :binding,
  :path,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>], vals=Memory{Any}(16, 0x119a7a1c0)[
  #<null>,
  Union{},
  #<null>,
  Base.BaseDocs,
  3546,
  Base.Docs.Binding(mod=Main, var=:Main),
  "docs/basedocs.jl",
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>], ndel=0, count=5, age=0x0000000000000008, idxfloor=1, maxprobe=1)),
  #<null>,
  #<null>], count=1, ndel=0)),
  #<null>,
  #<null>,
  Base.Docs.Binding(mod=Main, var=:include),
  Base.Docs.MultiDoc(order=Array{Type, 1}(dims=(1,), mem=Memory{Type}(8, 0x119a79f50)[
  Tuple{Function, AbstractString},
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>]), docs=Base.IdDict{Any, Any}(ht=Memory{Any}(32, 0x119a79b70)[
  Tuple{Function, AbstractString},
  Base.Docs.DocStr(text=svec("    include([mapexpr::Function,] path::AbstractString)\n\nEvaluate the contents of the input source file in the global scope of the containing module.\nEvery module (except those defined with `baremodule`) has its own\ndefinition of `include`, which evaluates the file in that module.\nReturns the result of the last evaluated expression of the input file. During including,\na task-local include path is set to the directory containing the file. Nested calls to\n`include` will search relative to that path. This function is typically used to load source\ninteractively, or to combine files in packages that are broken into multiple source files.\nThe argument `path` is normalized using [`normpath`](@ref) which will resolve\nrelative path tokens such as `..` and convert `/` to the appropriate path separator.\n\nThe optional first argument `mapexpr` can be used to transform the included code before\nit is evaluated: for each parsed expression `expr` in `path`, the `include` function\nactually evaluates `mapexpr(expr)`.  If it is omitted, `mapexpr` defaults to [`identity`](@ref).\n\nUse [`Base.include`](@ref) to evaluate a file into another module.\n\n!!! compat \"Julia 1.5\"\n    Julia 1.5 is required for passing the `mapexpr` argument.\n"), object=nothing, data=Base.Dict{Symbol, Any}(slots=Memory{UInt8}(16, 0x11d9b3570)[0x00, 0xc2, 0x00, 0xa8, 0xda, 0xbb, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], keys=Memory{Symbol}(16, 0x119a79dd0)[
  #<null>,
  :typesig,
  #<null>,
  :module,
  :linenumber,
  :binding,
  :path,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>], vals=Memory{Any}(16, 0x119a79d10)[
  #<null>,
  Tuple{Function, AbstractString},
  #<null>,
  Main,
  13,
  Base.Docs.Binding(mod=Main, var=:include),
  "sysimg.jl",
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>], ndel=0, count=5, age=0x0000000000000006, idxfloor=1, maxprobe=1)),
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>], count=1, ndel=0)),
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  Base.Docs.Binding(mod=Main, var=:eval),
  Base.Docs.MultiDoc(order=Array{Type, 1}(dims=(1,), mem=Memory{Type}(8, 0x119a79aa0)[
  Tuple{Any},
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>]), docs=Base.IdDict{Any, Any}(ht=Memory{Any}(32, 0x119a796d0)[
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  Tuple{Any},
  Base.Docs.DocStr(text=svec("    eval(expr)\n\nEvaluate an expression in the global scope of the containing module.\nEvery `Module` (except those defined with `baremodule`) has its own 1-argument\ndefinition of `eval`, which evaluates expressions in that module.\n"), object=nothing, data=Base.Dict{Symbol, Any}(slots=Memory{UInt8}(16, 0x11d9b3430)[0x00, 0xc2, 0x00, 0xa8, 0xda, 0xbb, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], keys=Memory{Symbol}(16, 0x119a79930)[
  #<null>,
  :typesig,
  #<null>,
  :module,
  :linenumber,
  :binding,
  :path,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>], vals=Memory{Any}(16, 0x119a79870)[
  #<null>,
  Tuple{Any},
  #<null>,
  Main,
  41,
  Base.Docs.Binding(mod=Main, var=:eval),
  "sysimg.jl",
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>], ndel=0, count=5, age=0x0000000000000006, idxfloor=1, maxprobe=1)),
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>], count=1, ndel=0)),
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>,
  #<null>], count=3, ndel=0), globalref=Main.var"##meta#59", owner=<circular reference @-1>, ty=Any, flags=0x00)
==========
Core.Binding(value=Main.include, globalref=Main.include, owner=<circular reference @-1>, ty=#<null>, flags=0x01)
==========
Core.Binding(value=typeof(Main.include), globalref=Main.var"#include", owner=<circular reference @-1>, ty=Any, flags=0x01)
==========
Core.Binding(value=#<null>, globalref=Main.Function, owner=#<null>, ty=#<null>, flags=0x00)
==========
Core.Binding(value=#<null>, globalref=Main.AbstractString, owner=#<null>, ty=#<null>, flags=0x00)
==========
Core.Binding(value=#<null>, globalref=Main.Union, owner=#<null>, ty=#<null>, flags=0x00)
==========
Core.Binding(value=#<null>, globalref=Main.Tuple, owner=#<null>, ty=#<null>, flags=0x00)
==========
Core.Binding(value=#<null>, globalref=Main.isa, owner=#<null>, ty=#<null>, flags=0x00)
==========
Core.Binding(value=#<null>, globalref=Main.String, owner=#<null>, ty=#<null>, flags=0x00)
==========
Core.Binding(value=#<null>, globalref=Main.identity, owner=#<null>, ty=#<null>, flags=0x00)
==========
Core.Binding(value=Main.eval, globalref=Main.eval, owner=<circular reference @-1>, ty=#<null>, flags=0x01)
==========
Core.Binding(value=typeof(Main.eval), globalref=Main.var"#eval", owner=<circular reference @-1>, ty=Any, flags=0x01)
==========
Core.Binding(value=#<null>, globalref=Main.Any, owner=#<null>, ty=#<null>, flags=0x00)
==========
Core.Binding(value=#<null>, globalref=Main.var"@__MODULE__", owner=#<null>, ty=#<null>, flags=0x00)
==========
Core.Binding(value=#<null>, globalref=Main.var"@__FILE__", owner=#<null>, ty=#<null>, flags=0x00)
==========
Core.Binding(value=#<null>, globalref=Main.pushfirst!, owner=#<null>, ty=#<null>, flags=0x00)
==========
Core.Binding(value=#<null>, globalref=Main.abspath, owner=#<null>, ty=#<null>, flags=0x00)
==========
Core.Binding(value=#<null>, globalref=Main.GC, owner=#<null>, ty=#<null>, flags=0x00)
==========
Core.Binding(value=#<null>, globalref=Main.var"@eval", owner=Core.Binding(value=Base.var"@eval", globalref=Base.var"@eval", owner=<circular reference @-1>, ty=#<null>, flags=0x07), ty=#<null>, flags=0x00)
==========
Core.Binding(value=#<null>, globalref=Main.var"@elapsed", owner=#<null>, ty=#<null>, flags=0x00)
==========
Core.Binding(value=#<null>, globalref=Main.current_task, owner=#<null>, ty=#<null>, flags=0x00)
==========
Core.Binding(value=#<null>, globalref=Main.maximum, owner=#<null>, ty=#<null>, flags=0x00)
==========
Core.Binding(value=#<null>, globalref=Main.textwidth, owner=#<null>, ty=#<null>, flags=0x00)
==========
Core.Binding(value=#<null>, globalref=Main.string, owner=#<null>, ty=#<null>, flags=0x00)
==========
Core.Binding(value=#<null>, globalref=Main.push!, owner=#<null>, ty=#<null>, flags=0x00)
==========
Core.Binding(value=#<null>, globalref=Main.empty!, owner=#<null>, ty=#<null>, flags=0x00)
==========
Core.Binding(value=#<null>, globalref=Main.LOAD_PATH, owner=#<null>, ty=#<null>, flags=0x00)
==========
Core.Binding(value=#<null>, globalref=Main.:(*), owner=#<null>, ty=#<null>, flags=0x00)
==========
Core.Binding(value=#<null>, globalref=Main.:(-), owner=Core.Binding(value=Base.:(-), globalref=Base.:(-), owner=<circular reference @-1>, ty=#<null>, flags=0x07), ty=#<null>, flags=0x00)
==========
Core.Binding(value=#<null>, globalref=Main.:(^), owner=#<null>, ty=#<null>, flags=0x00)
==========
Core.Binding(value=#<null>, globalref=Main.:(==), owner=#<null>, ty=#<null>, flags=0x00)
==========
Core.Binding(value=#<null>, globalref=Main.Cvoid, owner=#<null>, ty=#<null>, flags=0x00)
==========
Core.Binding(value=#<null>, globalref=Main.isfile, owner=#<null>, ty=#<null>, flags=0x00)
==========
Core.Binding(value=#<null>, globalref=Main.:(+), owner=Core.Binding(value=Base.:(+), globalref=Base.:(+), owner=<circular reference @-1>, ty=#<null>, flags=0x07), ty=#<null>, flags=0x00)
==========
Core.Binding(value=#<null>, globalref=Main.println, owner=#<null>, ty=#<null>, flags=0x00)
==========
Core.Binding(value=#<null>, globalref=Main.print, owner=#<null>, ty=#<null>, flags=0x00)
==========
Core.Binding(value=#<null>, globalref=Main.stdout, owner=#<null>, ty=#<null>, flags=0x00)
==========
Core.Binding(value=#<null>, globalref=Main.show, owner=#<null>, ty=#<null>, flags=0x00)
==========
Core.Binding(value=#<null>, globalref=Main.IOContext, owner=Core.Binding(value=Base.IOContext{IO_t} where IO_t<:IO, globalref=Base.IOContext, owner=<circular reference @-1>, ty=Any, flags=0x07), ty=#<null>, flags=0x00)
==========
Core.Binding(value=#<null>, globalref=Main.:(=>), owner=#<null>, ty=#<null>, flags=0x00)
==========
Core.Binding(value=#<null>, globalref=Main.:(/), owner=Core.Binding(value=Base.:(/), globalref=Base.:(/), owner=<circular reference @-1>, ty=#<null>, flags=0x07), ty=#<null>, flags=0x00)
==========
Core.Binding(value=#<null>, globalref=Main.DEPOT_PATH, owner=#<null>, ty=#<null>, flags=0x00)
==========
Core.Binding(value=#<null>, globalref=Main.Sys, owner=#<null>, ty=#<null>, flags=0x00)
==========
Core.Binding(value=#<null>, globalref=Main.IOBuffer, owner=Core.Binding(value=Base.GenericIOBuffer{GenericMemory{:not_atomic, UInt8, Core.AddrSpace{Core}(0x00)}}, globalref=Base.IOBuffer, owner=<circular reference @-1>, ty=Any, flags=0x07), ty=#<null>, flags=0x00)
==========
Core.Binding(value=#<null>, globalref=Main.var"@warn", owner=Core.Binding(value=Base.CoreLogging.var"@warn", globalref=Base.CoreLogging.var"@warn", owner=<circular reference @-1>, ty=#<null>, flags=0x07), ty=#<null>, flags=0x00)
==========
Core.Binding(value=#<null>, globalref=Main.IJulia, owner=#<null>, ty=#<null>, flags=0x00)
==========
Core.Binding(value=#<null>, globalref=Main.Atom, owner=#<null>, ty=#<null>, flags=0x00)
==========
Core.Binding(value=Revise, globalref=Main.Revise, owner=<circular reference @-1>, ty=Any, flags=0x09)
==========
Core.Binding(value=#<null>, globalref=Main.Pkg, owner=Core.Binding(value=Pkg, globalref=Pkg.Pkg, owner=<circular reference @-1>, ty=Any, flags=0x07), ty=#<null>, flags=0x00)
==========
Core.Binding(value=Main.var"#1#2", globalref=Main.var"#1#2", owner=<circular reference @-1>, ty=Any, flags=0x01)
==========
Core.Binding(value=#<null>, globalref=Main.atreplinit, owner=Core.Binding(value=Base.atreplinit, globalref=Base.atreplinit, owner=<circular reference @-1>, ty=#<null>, flags=0x07), ty=#<null>, flags=0x00)
==========
Core.Binding(value=#<null>, globalref=Main.OhMyREPL, owner=Core.Binding(value=OhMyREPL, globalref=OhMyREPL.OhMyREPL, owner=<circular reference @-1>, ty=Any, flags=0x07), ty=#<null>, flags=0x00)
==========
Core.Binding(value=#<null>, globalref=Main.format, owner=Core.Binding(value=JuliaFormatter.format, globalref=JuliaFormatter.format, owner=<circular reference @-1>, ty=Any, flags=0x07), ty=#<null>, flags=0x00)
==========
Core.Binding(value=#<null>, globalref=Main.activate, owner=Core.Binding(value=TestEnv.activate, globalref=TestEnv.activate, owner=<circular reference @-1>, ty=Any, flags=0x01), ty=#<null>, flags=0x00)
==========
Core.Binding(value=BenchmarkTools, globalref=Main.BenchmarkTools, owner=<circular reference @-1>, ty=Any, flags=0x09)
==========
Core.Binding(value=DifferentiationInterface, globalref=Main.DifferentiationInterface, owner=<circular reference @-1>, ty=Any, flags=0x09)
==========
Core.Binding(value=#<null>, globalref=Main.Enzyme, owner=Core.Binding(value=Enzyme, globalref=Enzyme.Enzyme, owner=<circular reference @-1>, ty=Any, flags=0x07), ty=#<null>, flags=0x00)
==========
Core.Binding(value=DifferentiationInterface, globalref=Main.DI, owner=<circular reference @-1>, ty=Any, flags=0x01)
==========
Core.Binding(value=Main.f!, globalref=Main.f!, owner=<circular reference @-1>, ty=#<null>, flags=0x01)
==========
Core.Binding(value=typeof(Main.f!), globalref=Main.var"#f!", owner=<circular reference @-1>, ty=Any, flags=0x01)
==========
Core.Binding(value=#<null>, globalref=Main.copyto!, owner=Core.Binding(value=Base.copyto!, globalref=Base.copyto!, owner=<circular reference @-1>, ty=#<null>, flags=0x07), ty=#<null>, flags=0x00)
==========
Core.Binding(value=#<null>, globalref=Main.nothing, owner=Core.Binding(value=nothing, globalref=Core.nothing, owner=<circular reference @-1>, ty=Any, flags=0x07), ty=#<null>, flags=0x00)
==========
Core.Binding(value=#<null>, globalref=Main.rand, owner=Core.Binding(value=Base.rand, globalref=Base.rand, owner=<circular reference @-1>, ty=#<null>, flags=0x07), ty=#<null>, flags=0x00)
==========
Core.Binding(value=Array{Float64, 1}(dims=(4,), mem=Memory{Float64}(4, 0x10b05ff20)[0.60356, 0.450652, 0.564336, 0.599159]), globalref=Main.x, owner=<circular reference @-1>, ty=Any, flags=0x00)
==========
Core.Binding(value=#<null>, globalref=Main.Vector, owner=Core.Binding(value=Array{T, 1} where T, globalref=Base.Vector, owner=<circular reference @-1>, ty=Any, flags=0x07), ty=#<null>, flags=0x00)
==========
Core.Binding(value=#<null>, globalref=Main.similar, owner=Core.Binding(value=Base.similar, globalref=Base.similar, owner=<circular reference @-1>, ty=#<null>, flags=0x07), ty=#<null>, flags=0x00)
==========
Core.Binding(value=Array{Float64, 1}(dims=(4,), mem=Memory{Float64}(4, 0x10a7b0520)[6.3952e-314, 0, 0, 0]), globalref=Main.y, owner=<circular reference @-1>, ty=Any, flags=0x00)
==========
Core.Binding(value=(a=Array{Array{Float64, 1}, 1}(dims=(1,), mem=Memory{Array{Float64, 1}}(1, 0x3038a1b80)[Array{Float64, 1}(dims=(4,), mem=Memory{Float64}(4, 0x108beed20)[1, 1, 1, 1])]), b=Array{Array{Float64, 1}, 1}(dims=(1,), mem=Memory{Array{Float64, 1}}(1, 0x3038a1be0)[Array{Float64, 1}(dims=(4,), mem=Memory{Float64}(4, 0x303911260)[6.3952e-314, 0, 0, 0])])), globalref=Main.c, owner=<circular reference @-1>, ty=Any, flags=0x00)
==========
Core.Binding(value=#<null>, globalref=Main.AutoEnzyme, owner=Core.Binding(value=ADTypes.AutoEnzyme{M, A} where A where M, globalref=ADTypes.AutoEnzyme, owner=<circular reference @-1>, ty=Any, flags=0x07), ty=#<null>, flags=0x00)
==========
Core.Binding(value=ADTypes.AutoEnzyme{EnzymeCore.ForwardMode{false, EnzymeCore.FFIABI, false, false}, Nothing}(mode=EnzymeCore.ForwardMode{false, EnzymeCore.FFIABI, false, false}()), globalref=Main.backend, owner=<circular reference @-1>, ty=Any, flags=0x00)
==========
Core.Binding(value=#<null>, globalref=Main.Cache, owner=Core.Binding(value=DifferentiationInterface.Cache{T} where T, globalref=DifferentiationInterface.Cache, owner=<circular reference @-1>, ty=Any, flags=0x07), ty=#<null>, flags=0x00)
==========
Array{NTuple{4, Array{Float64, 1}}, 1}(dims=(1,), mem=Memory{NTuple{4, Array{Float64, 1}}}(1, 0x301f651a0)[(Array{Float64, 1}(dims=(4,), mem=Memory{Float64}(4, 0x301f65060)[1, 0, 0, 0]), Array{Float64, 1}(dims=(4,), mem=Memory{Float64}(4, 0x301f650e0)[0, 1, 0, 0]), Array{Float64, 1}(dims=(4,), mem=Memory{Float64}(4, 0x301f65120)[0, 0, 1, 0]), Array{Float64, 1}(dims=(4,), mem=Memory{Float64}(4, 0x301f65160)[0, 0, 0, 1]))])
==========
Array{NTuple{4, Array{Float64, 1}}, 1}(dims=(1,), mem=Memory{NTuple{4, Array{Float64, 1}}}(1, 0x301f652e0)[(Array{Float64, 1}(dims=(4,), mem=Memory{Float64}(4, 0x301f651e0)[0, 0, 0, 0]), Array{Float64, 1}(dims=(4,), mem=Memory{Float64}(4, 0x301f65220)[0, 0, 0, 0]), Array{Float64, 1}(dims=(4,), mem=Memory{Float64}(4, 0x301f65260)[0, 0, 0, 0]), Array{Float64, 1}(dims=(4,), mem=Memory{Float64}(4, 0x301f652a0)[0, 0, 0, 0]))])
==========
Array{Array{Float64, 1}, 1}(dims=(1,), mem=Memory{Array{Float64, 1}}(1, 0x301bdd020)[Array{Float64, 1}(dims=(4,), mem=Memory{Float64}(4, 0x108beed60)[0, 0, 0, 0])])
==========
Array{Array{Float64, 1}, 1}(dims=(1,), mem=Memory{Array{Float64, 1}}(1, 0x301bdd080)[Array{Float64, 1}(dims=(4,), mem=Memory{Float64}(4, 0x301f65360)[0, 0, 0, 0])])
==========
Array{Array{Float64, 1}, 1}(dims=(1,), mem=Memory{Array{Float64, 1}}(1, 0x301bdd0e0)[Core.Compiler.EscapeAnalysis.ArgEscapeCache(argescapes=Array{Core.Compiler.EscapeAnalysis.ArgEscapeInfo, 1}(dims=(3,), mem=Memory{Core.Compiler.EscapeAnalysis.ArgEscapeInfo}(3, 0x303df07a0)[Core.Compiler.EscapeAnalysis.ArgEscapeInfo(escape_bits=0x00), Core.Compiler.EscapeAnalysis.ArgEscapeInfo(escape_bits=0x01), Core.Compiler.EscapeAnalysis.ArgEscapeInfo(escape_bits=0x00)]), argaliases=Array{Core.Compiler.EscapeAnalysis.ArgAliasing, 1}(dims=(0,), mem=Memory{Core.Compiler.EscapeAnalysis.ArgAliasing}(0, 0x11a008260)[]))])
==========
Array{Array{Float64, 1}, 1}(dims=(1,), mem=Memory{Array{Float64, 1}}(1, 0x301bdd140)[Array{Float64, 1}(dims=(4,), mem=Memory{Float64}(4, 0x301f653e0)[0, 0, 0, 0])])
==========
~~~~~~~~~~ ptr queue bottom ~~~~~~~~~~

[11821] signal 6: Abort trap: 6
in expression starting at REPL[14]:1
__pthread_kill at /usr/lib/system/libsystem_kernel.dylib (unknown line)
Allocations: 47629904 (Pool: 47628617; Big: 1287); GC: 34
[1]    11821 abort      julia

Versions:

Details
julia> versioninfo()
Julia Version 1.11.5
Commit 760b2e5b739 (2025-04-14 06:53 UTC)
Build Info:
  Official https://julialang.org/ release
Platform Info:
  OS: macOS (arm64-apple-darwin24.0.0)
  CPU: 11 × Apple M3 Pro
  WORD_SIZE: 64
  LLVM: libLLVM-16.0.6 (ORCJIT, apple-m2)
Threads: 1 default, 0 interactive, 1 GC (on 5 virtual cores)

julia> Pkg.status()
Status `/private/var/folders/pt/myrxq2gs5hzcp79v5475_dh40000gp/T/jl_VFcwsH/Project.toml`
  [6e4b80f9] BenchmarkTools v1.6.0
  [a0c0ee7d] DifferentiationInterface v0.6.53 `https://github.com/JuliaDiff/DifferentiationInterface.jl:DifferentiationInterface#gd/enzyme_cache`
  [7da242da] Enzyme v0.13.41

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