Skip to content

Metal native compilation fails to "multiple definition of local value" #655

@ssarkka

Description

@ssarkka

Hi,

I suddenly got the following kind of error message from Metal.jl compilation of a (quite complicated) code:

Got exception outside of a @test
  Compilation to AIR failed; see above for details.
  If you think this is a bug, please file an issue and attach /var/folders/4v/k27r8hyn7nd7gcqxsd0wndlw0000gp/T/jl_S9K3ElsRKB.ll
  Stacktrace:
    [1] error(s::String)
      @ Base ./error.jl:35
    [2] macro expansion
      @ ~/.julia/packages/Metal/uq8sb/src/compiler/compilation.jl:141 [inlined]
    [3] macro expansion
      @ ~/.julia/packages/ObjectiveC/UNTzb/src/os.jl:264 [inlined]
    [4] compile(job::GPUCompiler.CompilerJob)
      @ Metal ~/.julia/packages/Metal/uq8sb/src/compiler/compilation.jl:113
    [5] actual_compilation(cache::Dict{Any, Any}, src::Core.MethodInstance, world::UInt64, cfg::GPUCompiler.CompilerConfig{GPUCompiler.MetalCompilerTarget, Metal.MetalCompilerParams}, compiler::typeof(Metal.compile), linker::typeof(Metal.link))
      @ GPUCompiler ~/.julia/packages/GPUCompiler/Ecaql/src/execution.jl:245
    [6] cached_compilation(cache::Dict{Any, Any}, src::Core.MethodInstance, cfg::GPUCompiler.CompilerConfig{GPUCompiler.MetalCompilerTarget, Metal.MetalCompilerParams}, compiler::Function, linker::Function)
      @ GPUCompiler ~/.julia/packages/GPUCompiler/Ecaql/src/execution.jl:159
    [7] macro expansion
      @ ~/.julia/packages/Metal/uq8sb/src/compiler/execution.jl:189 [inlined]
    [8] macro expansion
      @ ./lock.jl:273 [inlined]
    [9] mtlfunction(f::typeof(ParallelBP.parallel_map_gpu_kernel!), tt::Type{Tuple{ParallelBP.var"#index_stride_closure#225", typeof(kf_run_fun!), Int32, MtlDeviceMatrix{Float32, 1}, MtlDeviceArray{Float32, 3, 1}, MtlDeviceMatrix{Float32, 1}, MtlDeviceArray{Float32, 3, 1}, MtlDeviceArray{Float32, 3, 1}, MtlDeviceMatrix{Float32, 1}, MtlDeviceArray{Float32, 3, 1}, MtlDeviceArray{Float32, 3, 1}, MtlDeviceMatrix{Float32, 1}, MtlDeviceMatrix{Float32, 1}, MtlDeviceMatrix{Float32, 1}, MtlDeviceMatrix{Float32, 1}, Vararg{MtlDeviceArray{Float32, 3, 1}, 5}}}; name::Nothing, kwargs::@Kwargs{})
      @ Metal ~/.julia/packages/Metal/uq8sb/src/compiler/execution.jl:184
   [10] mtlfunction(f::typeof(ParallelBP.parallel_map_gpu_kernel!), tt::Type{Tuple{ParallelBP.var"#index_stride_closure#225", typeof(kf_run_fun!), Int32, MtlDeviceMatrix{Float32, 1}, MtlDeviceArray{Float32, 3, 1}, MtlDeviceMatrix{Float32, 1}, MtlDeviceArray{Float32, 3, 1}, MtlDeviceArray{Float32, 3, 1}, MtlDeviceMatrix{Float32, 1}, MtlDeviceArray{Float32, 3, 1}, MtlDeviceArray{Float32, 3, 1}, MtlDeviceMatrix{Float32, 1}, MtlDeviceMatrix{Float32, 1}, MtlDeviceMatrix{Float32, 1}, MtlDeviceMatrix{Float32, 1}, Vararg{MtlDeviceArray{Float32, 3, 1}, 5}}})
      @ Metal ~/.julia/packages/Metal/uq8sb/src/compiler/execution.jl:182
   [11] macro expansion
      @ ~/.julia/packages/Metal/uq8sb/src/compiler/execution.jl:85 [inlined]
   [12] (::ParallelBP.var"#prepare_gpu_kernel#226"{Int64, Int64})(kernel_fun::Function, args::Tuple{ParallelBP.var"#index_stride_closure#225", typeof(kf_run_fun!), Int32, MtlMatrix{Float32, Metal.PrivateStorage}, MtlArray{Float32, 3, Metal.PrivateStorage}, MtlMatrix{Float32, Metal.PrivateStorage}, MtlArray{Float32, 3, Metal.PrivateStorage}, MtlArray{Float32, 3, Metal.PrivateStorage}, MtlMatrix{Float32, Metal.PrivateStorage}, MtlArray{Float32, 3, Metal.PrivateStorage}, MtlArray{Float32, 3, Metal.PrivateStorage}, MtlMatrix{Float32, Metal.PrivateStorage}, MtlMatrix{Float32, Metal.PrivateStorage}, MtlMatrix{Float32, Metal.PrivateStorage}, MtlMatrix{Float32, Metal.PrivateStorage}, Vararg{MtlArray{Float32, 3, Metal.PrivateStorage}, 5}})
      @ ParallelBP ~/latex/parallel-bayes-graphs/julia/ParallelBP/src/parprim_metal.jl:26
   [13] parallel_map_gpu_prepare!(kernel_runner::GPUKernelRunner, fun!::Function, n::Int32, elem_arrays::Tuple{MtlMatrix{Float32, Metal.PrivateStorage}, MtlArray{Float32, 3, Metal.PrivateStorage}, MtlMatrix{Float32, Metal.PrivateStorage}, MtlArray{Float32, 3, Metal.PrivateStorage}, MtlArray{Float32, 3, Metal.PrivateStorage}, MtlMatrix{Float32, Metal.PrivateStorage}, MtlArray{Float32, 3, Metal.PrivateStorage}, MtlArray{Float32, 3, Metal.PrivateStorage}, MtlMatrix{Float32, Metal.PrivateStorage}, MtlMatrix{Float32, Metal.PrivateStorage}, MtlMatrix{Float32, Metal.PrivateStorage}, MtlMatrix{Float32, Metal.PrivateStorage}, Vararg{MtlArray{Float32, 3, Metal.PrivateStorage}, 5}})
      @ ParallelBP ~/latex/parallel-bayes-graphs/julia/ParallelBP/src/parprim_gpu.jl:104
   [14] parallel_map_gpu!(kernel_runner::GPUKernelRunner, fun!::Function, n::Int32, elems::Tuple{MtlMatrix{Float32, Metal.PrivateStorage}, MtlArray{Float32, 3, Metal.PrivateStorage}, MtlMatrix{Float32, Metal.PrivateStorage}, MtlArray{Float32, 3, Metal.PrivateStorage}, MtlArray{Float32, 3, Metal.PrivateStorage}, MtlMatrix{Float32, Metal.PrivateStorage}, MtlArray{Float32, 3, Metal.PrivateStorage}, MtlArray{Float32, 3, Metal.PrivateStorage}, MtlMatrix{Float32, Metal.PrivateStorage}, MtlMatrix{Float32, Metal.PrivateStorage}, MtlMatrix{Float32, Metal.PrivateStorage}, MtlMatrix{Float32, Metal.PrivateStorage}, Vararg{MtlArray{Float32, 3, Metal.PrivateStorage}, 5}})
      @ ParallelBP ~/latex/parallel-bayes-graphs/julia/ParallelBP/src/parprim_gpu.jl:119
   [15] test_prepare_kf_arrays_and_run_metal_1()
      @ Main ~/latex/parallel-bayes-graphs/julia/ParallelBP/test/pkfs_metal_tests.jl:23
   [16] macro expansion
      @ ~/latex/parallel-bayes-graphs/julia/ParallelBP/test/runtests.jl:613 [inlined]
   [17] macro expansion
      @ ~/.julia/juliaup/julia-1.11.6+0.aarch64.apple.darwin14/share/julia/stdlib/v1.11/Test/src/Test.jl:1709 [inlined]
   [18] top-level scope
      @ ~/latex/parallel-bayes-graphs/julia/ParallelBP/test/runtests.jl:609
  
  caused by: /Users/ssarkka/.julia/artifacts/22f6c84a583de5b084bf6c8915a7e7d080211be2/bin/llvm-as: <stdin>:2818:3: error: multiple definition of local value named '.sroa.04.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.2.0..sroa.04.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.0..sroa.04.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.0..sroa.04.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.0..sroa.04.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.0..sroa.04.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.0..sroa.04.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.0..sroa.04.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.0..sroa.04.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.0..sroa.04.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.0..sroa.04.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.0..sroa.04.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.0..sroa.04.s236'
    %.sroa.04.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.2.0..sroa.04.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.0..sroa.04.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.0..sroa.04.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.0..sroa.04.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.0..sroa.04.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.0..sroa.04.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.0..sroa.04.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.0..sroa.04.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.0..sroa.04.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.0..sroa.04.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.0..sroa.04.sroa.0.sroa.0.sroa.0.sroa.0.sroa.0.0..sroa.04.s236 = getelementptr inbounds { { i8 addrspace(1)*, [2 x i64] }, { i8 addrspace(1)*, [3 x i64] }, { i8 addrspace(1)*, [2 x i64] }, { i8 addrspace(1)*, [3 x i64] }, { i8 addrspace(1)*, [3 x i64] }, { i8 addrspace(1)*, [2 x i64] }, { i8 addrspace(1)*, [3 x i64] }, { i8 addrspace(1)*, [3 x i64] }, { i8 addrspace(1)*, [2 x i64] }, { i8 addrspace(1)*, [2 x i64] }, { i8 addrspace(1)*, [2 x i64] }, { i8 addrspace(1)*, [2 x i64] }, { i8 addrspace(1)*, [3 x i64] }, { i8 addrspace(1)*, [3 x i64] }, { i8 addrspace(1)*, [3 x i64] }, { i8 addrspace(1)*, [3 x i64] }, { i8 addrspace(1)*, [3 x i64] } }, { { i8 addrspace(1)*, [2 x i64] }, { i8 addrspace(1)*, [3 x i64] }, { i8 addrspace(1)*, [2 x i64] }, { i8 addrspace(1)*, [3 x i64] }, { i8 addrspace(1)*, [3 x i64] }, { i8 addrspace(1)*, [2 x i64] }, { i8 addrspace(1)*, [3 x i64] }, { i8 addrspace(1)*, [3 x i64] }, { i8 addrspace(1)*, [2 x i64] }, { i8 addrspace(1)*, [2 x i64] }, { i8 addrspace(1)*, [2 x i64] }, { i8 addrspace(1)*, [2 x i64] }, { i8 addrspace(1)*, [3 x i64] }, { i8 addrspace(1)*, [3 x i64] }, { i8 addrspace(1)*, [3 x i64] }, { i8 addrspace(1)*, [3 x i64] }, { i8 addrspace(1)*, [3 x i64] } }* %elem_arrays, i64 0, i32 0, i32 1, i64 0
    ^
  
  Stacktrace:
    [1] error(s::String)
      @ Base ./error.jl:35
    [2] macro expansion
      @ ~/.julia/packages/Metal/uq8sb/src/compiler/compilation.jl:134 [inlined]
    [3] macro expansion
      @ ~/.julia/packages/ObjectiveC/UNTzb/src/os.jl:264 [inlined]
    [4] compile(job::GPUCompiler.CompilerJob)
      @ Metal ~/.julia/packages/Metal/uq8sb/src/compiler/compilation.jl:113
    [5] actual_compilation(cache::Dict{Any, Any}, src::Core.MethodInstance, world::UInt64, cfg::GPUCompiler.CompilerConfig{GPUCompiler.MetalCompilerTarget, Metal.MetalCompilerParams}, compiler::typeof(Metal.compile), linker::typeof(Metal.link))
      @ GPUCompiler ~/.julia/packages/GPUCompiler/Ecaql/src/execution.jl:245
    [6] cached_compilation(cache::Dict{Any, Any}, src::Core.MethodInstance, cfg::GPUCompiler.CompilerConfig{GPUCompiler.MetalCompilerTarget, Metal.MetalCompilerParams}, compiler::Function, linker::Function)
      @ GPUCompiler ~/.julia/packages/GPUCompiler/Ecaql/src/execution.jl:159
    [7] macro expansion
      @ ~/.julia/packages/Metal/uq8sb/src/compiler/execution.jl:189 [inlined]
    [8] macro expansion
      @ ./lock.jl:273 [inlined]
    [9] mtlfunction(f::typeof(ParallelBP.parallel_map_gpu_kernel!), tt::Type{Tuple{ParallelBP.var"#index_stride_closure#225", typeof(kf_run_fun!), Int32, MtlDeviceMatrix{Float32, 1}, MtlDeviceArray{Float32, 3, 1}, MtlDeviceMatrix{Float32, 1}, MtlDeviceArray{Float32, 3, 1}, MtlDeviceArray{Float32, 3, 1}, MtlDeviceMatrix{Float32, 1}, MtlDeviceArray{Float32, 3, 1}, MtlDeviceArray{Float32, 3, 1}, MtlDeviceMatrix{Float32, 1}, MtlDeviceMatrix{Float32, 1}, MtlDeviceMatrix{Float32, 1}, MtlDeviceMatrix{Float32, 1}, Vararg{MtlDeviceArray{Float32, 3, 1}, 5}}}; name::Nothing, kwargs::@Kwargs{})
      @ Metal ~/.julia/packages/Metal/uq8sb/src/compiler/execution.jl:184
   [10] mtlfunction(f::typeof(ParallelBP.parallel_map_gpu_kernel!), tt::Type{Tuple{ParallelBP.var"#index_stride_closure#225", typeof(kf_run_fun!), Int32, MtlDeviceMatrix{Float32, 1}, MtlDeviceArray{Float32, 3, 1}, MtlDeviceMatrix{Float32, 1}, MtlDeviceArray{Float32, 3, 1}, MtlDeviceArray{Float32, 3, 1}, MtlDeviceMatrix{Float32, 1}, MtlDeviceArray{Float32, 3, 1}, MtlDeviceArray{Float32, 3, 1}, MtlDeviceMatrix{Float32, 1}, MtlDeviceMatrix{Float32, 1}, MtlDeviceMatrix{Float32, 1}, MtlDeviceMatrix{Float32, 1}, Vararg{MtlDeviceArray{Float32, 3, 1}, 5}}})
      @ Metal ~/.julia/packages/Metal/uq8sb/src/compiler/execution.jl:182
   [11] macro expansion
      @ ~/.julia/packages/Metal/uq8sb/src/compiler/execution.jl:85 [inlined]
   [12] (::ParallelBP.var"#prepare_gpu_kernel#226"{Int64, Int64})(kernel_fun::Function, args::Tuple{ParallelBP.var"#index_stride_closure#225", typeof(kf_run_fun!), Int32, MtlMatrix{Float32, Metal.PrivateStorage}, MtlArray{Float32, 3, Metal.PrivateStorage}, MtlMatrix{Float32, Metal.PrivateStorage}, MtlArray{Float32, 3, Metal.PrivateStorage}, MtlArray{Float32, 3, Metal.PrivateStorage}, MtlMatrix{Float32, Metal.PrivateStorage}, MtlArray{Float32, 3, Metal.PrivateStorage}, MtlArray{Float32, 3, Metal.PrivateStorage}, MtlMatrix{Float32, Metal.PrivateStorage}, MtlMatrix{Float32, Metal.PrivateStorage}, MtlMatrix{Float32, Metal.PrivateStorage}, MtlMatrix{Float32, Metal.PrivateStorage}, Vararg{MtlArray{Float32, 3, Metal.PrivateStorage}, 5}})
      @ ParallelBP ~/latex/parallel-bayes-graphs/julia/ParallelBP/src/parprim_metal.jl:26
   [13] parallel_map_gpu_prepare!(kernel_runner::GPUKernelRunner, fun!::Function, n::Int32, elem_arrays::Tuple{MtlMatrix{Float32, Metal.PrivateStorage}, MtlArray{Float32, 3, Metal.PrivateStorage}, MtlMatrix{Float32, Metal.PrivateStorage}, MtlArray{Float32, 3, Metal.PrivateStorage}, MtlArray{Float32, 3, Metal.PrivateStorage}, MtlMatrix{Float32, Metal.PrivateStorage}, MtlArray{Float32, 3, Metal.PrivateStorage}, MtlArray{Float32, 3, Metal.PrivateStorage}, MtlMatrix{Float32, Metal.PrivateStorage}, MtlMatrix{Float32, Metal.PrivateStorage}, MtlMatrix{Float32, Metal.PrivateStorage}, MtlMatrix{Float32, Metal.PrivateStorage}, Vararg{MtlArray{Float32, 3, Metal.PrivateStorage}, 5}})
      @ ParallelBP ~/latex/parallel-bayes-graphs/julia/ParallelBP/src/parprim_gpu.jl:104
   [14] parallel_map_gpu!(kernel_runner::GPUKernelRunner, fun!::Function, n::Int32, elems::Tuple{MtlMatrix{Float32, Metal.PrivateStorage}, MtlArray{Float32, 3, Metal.PrivateStorage}, MtlMatrix{Float32, Metal.PrivateStorage}, MtlArray{Float32, 3, Metal.PrivateStorage}, MtlArray{Float32, 3, Metal.PrivateStorage}, MtlMatrix{Float32, Metal.PrivateStorage}, MtlArray{Float32, 3, Metal.PrivateStorage}, MtlArray{Float32, 3, Metal.PrivateStorage}, MtlMatrix{Float32, Metal.PrivateStorage}, MtlMatrix{Float32, Metal.PrivateStorage}, MtlMatrix{Float32, Metal.PrivateStorage}, MtlMatrix{Float32, Metal.PrivateStorage}, Vararg{MtlArray{Float32, 3, Metal.PrivateStorage}, 5}})
      @ ParallelBP ~/latex/parallel-bayes-graphs/julia/ParallelBP/src/parprim_gpu.jl:119
   [15] test_prepare_kf_arrays_and_run_metal_1()

The mentioned file is attached below:

jl_S9K3ElsRKB.ll.zip

I am doing something wrong, or is there an actual bug?

Simo

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