From a4735662c06871d0f487c9b6ee004845333259c0 Mon Sep 17 00:00:00 2001 From: Christian Guinard <28689358+christiangnrd@users.noreply.github.com> Date: Mon, 23 Feb 2026 22:08:17 -0400 Subject: [PATCH 1/5] Typo --- src/metal.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/metal.jl b/src/metal.jl index e217cbda..0d9792e5 100644 --- a/src/metal.jl +++ b/src/metal.jl @@ -925,7 +925,7 @@ function add_argument_metadata!(@nospecialize(job::CompilerJob), mod::LLVM.Modul args = classify_arguments(job, entry_ft; post_optimization=job.config.optimize) i = 1 for arg in args - arg.idx === nothing && continue + arg.idx === nothing && continue if job.config.optimize @assert parameters(entry_ft)[arg.idx] isa LLVM.PointerType else From 258f90f354d7fa3822419c8e22979a6c01a3f179 Mon Sep 17 00:00:00 2001 From: Christian Guinard <28689358+christiangnrd@users.noreply.github.com> Date: Mon, 23 Feb 2026 22:09:14 -0400 Subject: [PATCH 2/5] [Metal] Emit global dynamic memory --- src/metal.jl | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) diff --git a/src/metal.jl b/src/metal.jl index 0d9792e5..a9964f3f 100644 --- a/src/metal.jl +++ b/src/metal.jl @@ -196,6 +196,8 @@ function finish_ir!(@nospecialize(job::CompilerJob{MetalCompilerTarget}), mod::L add_argument_metadata!(job, mod, entry) + add_globals_metadata!(job, mod, entry) + add_module_metadata!(job, mod) end @@ -910,6 +912,96 @@ function argument_type_name(typ) end end +# global metadata generation +# +# module metadata is used to identify global buffers that are used as kernel arguments. +function add_globals_metadata!(@nospecialize(job::CompilerJob), mod::LLVM.Module, + entry::LLVM.Function) + entry_ft = function_type(entry) + + ## argument info + arg_infos = Metadata[] + + + # Iterate through arguments and create metadata for them + globs = globals(mod) + @show globs + i = 1 + for gv in globs + @show gv + gv_typ = global_value_type(gv) + (isconstant(gv) && addrspace(gv_typ) == 3) || continue + # if job.config.optimize + # @assert parameters(entry_ft)[arg.idx] isa LLVM.PointerType + # else + # parameters(entry_ft)[arg.idx] isa LLVM.PointerType || continue + # end + + # # NOTE: we emit the bare minimum of argument metadata to support + # # bindless argument encoding. Actually using the argument encoder + # # APIs (deprecated in Metal 3) turned out too difficult, given the + # # undocumented nature of the argument metadata, and the complex + # # arguments we encounter with typical Julia kernels. + global_infos = Metadata[] + + push!(global_infos, MDString("air.global_binding")) + push!(global_infos, Metadata(gv)) + + md = Metadata[] + + # argument index + push!(md, Metadata(ConstantInt(Int32(-1)))) + + push!(md, MDString("air.buffer")) + + push!(md, MDString("air.location_index")) + push!(md, Metadata(ConstantInt(Int32(i-1)))) + + # XXX: unknown + push!(md, Metadata(ConstantInt(Int32(1)))) + + push!(md, MDString("air.read_write")) # TODO: Check for const array + + push!(md, MDString("air.address_space")) + push!(md, Metadata(ConstantInt(Int32(addrspace(global_value_type(gv)))))) + + val_type = global_value_type(gv) + # val_type = if value_type(gv) <: Core.LLVMPtr + # arg.typ.parameters[1] + # else + # arg.typ + # end + + @show gv_typ + @show isconstant(gv) + # @show isconstant(gv_typ) + # @show Int32(alignment(gv)) + + push!(md, MDString("air.arg_type_size")) + push!(md, Metadata(ConstantInt(Int32(4)))) + + push!(md, MDString("air.arg_type_align_size")) + push!(md, Metadata(ConstantInt(Int32(alignment(gv))))) + + push!(md, MDString("air.arg_type_name")) + # push!(md, MDString(repr(arg.typ))) + + push!(md, MDString("air.arg_name")) + push!(md, MDString(String(LLVM.name(gv)))) + + push!(arg_infos, MDNode(md)) + + i += 1 + end + + println() + arg_infos = MDNode(arg_infos) + + push!(metadata(mod)["air.global_bindings"], arg_infos) + + return +end + # argument metadata generation # # module metadata is used to identify buffers that are passed as kernel arguments. From 705110166b15c0b1327cee36cead00cd4c287077 Mon Sep 17 00:00:00 2001 From: Christian Guinard <28689358+christiangnrd@users.noreply.github.com> Date: Mon, 1 Jun 2026 19:51:10 -0300 Subject: [PATCH 3/5] Fixup --- src/metal.jl | 26 +++++++++----------------- 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/src/metal.jl b/src/metal.jl index a9964f3f..2bcf8d3e 100644 --- a/src/metal.jl +++ b/src/metal.jl @@ -917,18 +917,11 @@ end # module metadata is used to identify global buffers that are used as kernel arguments. function add_globals_metadata!(@nospecialize(job::CompilerJob), mod::LLVM.Module, entry::LLVM.Function) - entry_ft = function_type(entry) - - ## argument info - arg_infos = Metadata[] - - # Iterate through arguments and create metadata for them globs = globals(mod) - @show globs + i = 1 for gv in globs - @show gv gv_typ = global_value_type(gv) (isconstant(gv) && addrspace(gv_typ) == 3) || continue # if job.config.optimize @@ -965,15 +958,15 @@ function add_globals_metadata!(@nospecialize(job::CompilerJob), mod::LLVM.Module push!(md, MDString("air.address_space")) push!(md, Metadata(ConstantInt(Int32(addrspace(global_value_type(gv)))))) - val_type = global_value_type(gv) + # val_type = global_value_type(gv) # val_type = if value_type(gv) <: Core.LLVMPtr # arg.typ.parameters[1] # else # arg.typ # end - @show gv_typ - @show isconstant(gv) + # @show gv_typ + # @show isconstant(gv) # @show isconstant(gv_typ) # @show Int32(alignment(gv)) @@ -984,21 +977,20 @@ function add_globals_metadata!(@nospecialize(job::CompilerJob), mod::LLVM.Module push!(md, Metadata(ConstantInt(Int32(alignment(gv))))) push!(md, MDString("air.arg_type_name")) + # XXX: Figure out how to get type + push!(md, MDString("float")) # push!(md, MDString(repr(arg.typ))) push!(md, MDString("air.arg_name")) push!(md, MDString(String(LLVM.name(gv)))) - push!(arg_infos, MDNode(md)) + push!(global_infos, MDNode(md)) + + push!(metadata(mod)["air.global_bindings"], MDNode(global_infos)) i += 1 end - println() - arg_infos = MDNode(arg_infos) - - push!(metadata(mod)["air.global_bindings"], arg_infos) - return end From 1f1a81ca243059f90e3651e88f37bd17afb47a17 Mon Sep 17 00:00:00 2001 From: Christian Guinard <28689358+christiangnrd@users.noreply.github.com> Date: Mon, 1 Jun 2026 19:53:20 -0300 Subject: [PATCH 4/5] Unused argument --- src/metal.jl | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/metal.jl b/src/metal.jl index 2bcf8d3e..ca42012f 100644 --- a/src/metal.jl +++ b/src/metal.jl @@ -196,7 +196,7 @@ function finish_ir!(@nospecialize(job::CompilerJob{MetalCompilerTarget}), mod::L add_argument_metadata!(job, mod, entry) - add_globals_metadata!(job, mod, entry) + add_globals_metadata!(job, mod) add_module_metadata!(job, mod) end @@ -915,8 +915,7 @@ end # global metadata generation # # module metadata is used to identify global buffers that are used as kernel arguments. -function add_globals_metadata!(@nospecialize(job::CompilerJob), mod::LLVM.Module, - entry::LLVM.Function) +function add_globals_metadata!(@nospecialize(job::CompilerJob), mod::LLVM.Module) # Iterate through arguments and create metadata for them globs = globals(mod) From bb5022365fbd835ed7a6676e96ae2b2b17ad880e Mon Sep 17 00:00:00 2001 From: Christian Guinard <28689358+christiangnrd@users.noreply.github.com> Date: Mon, 1 Jun 2026 20:29:43 -0300 Subject: [PATCH 5/5] Fix --- src/metal.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/metal.jl b/src/metal.jl index ca42012f..126bc95a 100644 --- a/src/metal.jl +++ b/src/metal.jl @@ -922,7 +922,7 @@ function add_globals_metadata!(@nospecialize(job::CompilerJob), mod::LLVM.Module i = 1 for gv in globs gv_typ = global_value_type(gv) - (isconstant(gv) && addrspace(gv_typ) == 3) || continue + (isconstant(gv) && gv_typ isa LLVM.PointerType && addrspace(gv_typ) == 3) || continue # if job.config.optimize # @assert parameters(entry_ft)[arg.idx] isa LLVM.PointerType # else