Hello,
This question has stemmed from the work described in Does overdubbing in generated function inserts inlined code , where I would like to understand the code rewriting of CodeInstances. I decided to try to do everything manually without IRTools / Cassete to know, on which internals they are built on.
Currently, I am stucked on the following problem. Consider following function
function test(x::T) where T<:Union{Float64, Float32}
x < T(pi)
end
which test, if some variable is smaller then pi
(I have encountered this when overdubbing Main.sin
). When I retrieve the code using
retrieve_code_info
function retrieve_code_info(sigtypes, world = Base.get_world_counter())
S = Tuple{map(s -> Core.Compiler.has_free_typevars(s) ? typeof(s.parameters[1]) : s, sigtypes)...}
_methods = Base._methods_by_ftype(S, -1, world)
if isempty(_methods)
@info("method $(sigtypes) does not exist")
return(nothing)
end
type_signature, raw_static_params, method = _methods[1]
method_instance = Core.Compiler.specialize_method(method, type_signature, raw_static_params, false)
code_info = Core.Compiler.retrieve_code_info(method_instance)
end
the code looks like this
CodeInfo(
@ REPL[33]:2 within `test'
1 ─ %1 = ($(Expr(:static_parameter, 1)))(Main.pi)
│ %2 = x < %1
└── return %2
)
from which I conclude that T(pi)
is translated to ($(Expr(:static_parameter, 1)))(Main.pi)
and the Expr(:static_parameter, 1)
is an accessor to the first Type parameter T
.
Now comes the problem.
When I am overdubbing, I do substitute function signature test(x)
with a generated function overdub(f args...)
which takes code info for test(x)
and manipulates it (and it does the same for any other function) does not have any type parameters. Hence, I do not have access to T
in a generated function overdub(typeof(test), args...)
. My question is, what is the general strategy to translate such line, for example in Zygote
to make it compatible with a signature of overdub(f, args...)? The only strategy I can imagine at the moment is to remove the
$(Expr(:static_parameter, 1))from the type definition, yet I am afraid that doing so will make the code type-unstable. I have search IRTools, Zygote and Cassette for
static_parameters` but without luck.
Thanks for help and clarifications.
Tomas