Skip to content

Commit 18470ee

Browse files
vchuravymaleadt
authored andcommitted
Use an early IR transform to replace GlobalRefs
1 parent fa386cc commit 18470ee

File tree

3 files changed

+69
-0
lines changed

3 files changed

+69
-0
lines changed

src/GPUCompiler.jl

+1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ include("bpf.jl")
2929
include("runtime.jl")
3030

3131
# compiler implementation
32+
include("early_transform.jl")
3233
include("jlgen.jl")
3334
include("irgen.jl")
3435
include("optim.jl")

src/early_transform.jl

+49
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
function static_eval(mod, name)
2+
if Base.isbindingresolved(mod, name) && Base.isdefined(mod, name)
3+
return Some(getfield(mod, name))
4+
else
5+
return nothing
6+
end
7+
end
8+
static_eval(gr::GlobalRef) = static_eval(gr.mod, gr.name)
9+
10+
function ir_element(x, code::Vector)
11+
while isa(x, Core.SSAValue)
12+
x = code[x.id]
13+
end
14+
return x
15+
end
16+
17+
"""
18+
is_ir_element(x, y, code::Vector)
19+
20+
Return `true` if `x === y` or if `x` is an `SSAValue` such that
21+
`is_ir_element(code[x.id], y, code)` is `true`.
22+
"""
23+
function is_ir_element(x, y, code::Vector)
24+
result = false
25+
while true # break by default
26+
if x === y #
27+
result = true
28+
break
29+
elseif isa(x, Core.SSAValue)
30+
x = code[x.id]
31+
else
32+
break
33+
end
34+
end
35+
return result
36+
end
37+
38+
39+
function early_transform!(mi, src)
40+
for (i, x) in enumerate(src.code)
41+
stmt = Base.Meta.isexpr(x, :(=)) ? x.args[2] : x
42+
if stmt isa GlobalRef
43+
@show static_eval(stmt)
44+
end
45+
# TODO: Walk stmt.args and find other uses of `:GlobalRef`
46+
# TODO: decide which GlobalRef to rewrite?
47+
end
48+
return nothing
49+
end

src/jlgen.jl

+19
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,25 @@ Core.Compiler.code_cache(interp::GPUInterpreter) = WorldView(interp.global_cache
213213
Core.Compiler.lock_mi_inference(interp::GPUInterpreter, mi::MethodInstance) = nothing
214214
Core.Compiler.unlock_mi_inference(interp::GPUInterpreter, mi::MethodInstance) = nothing
215215

216+
import Core.Compiler: retrieve_code_info, validate_code_in_debug_mode, InferenceState
217+
# Replace usage sites of `retrieve_code_info`, OptimizationState is one such, but in all interesting use-cases
218+
# it is derived from an InferenceState. There is a third one in `typeinf_ext` in case the module forbids inference.
219+
function InferenceState(result::InferenceResult, cached::Symbol, interp::GPUInterpreter)
220+
src = retrieve_code_info(result.linfo)
221+
src === nothing && return nothing
222+
validate_code_in_debug_mode(result.linfo, src, "lowered")
223+
src = transform(interp, result.linfo, src)
224+
validate_code_in_debug_mode(result.linfo, src, "transformed")
225+
return InferenceState(result, src, cached, interp)
226+
end
227+
228+
function transform(interp, mi, src)
229+
src = copy(src)
230+
early_transform!(mi, src)
231+
return src
232+
end
233+
234+
216235
function Core.Compiler.add_remark!(interp::GPUInterpreter, sv::InferenceState, msg)
217236
@safe_debug "Inference remark during GPU compilation of $(sv.linfo): $msg"
218237
end

0 commit comments

Comments
 (0)