Skip to content

Commit f978017

Browse files
committed
inline inferred blocks
1 parent 0580dde commit f978017

File tree

3 files changed

+28
-5
lines changed

3 files changed

+28
-5
lines changed

Manifest.toml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,11 @@ uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b"
99

1010
[[IRTools]]
1111
deps = ["InteractiveUtils", "MacroTools", "Test"]
12-
git-tree-sha1 = "90ee39f9beaaa186e4968417ea2b8ed5673c91c0"
12+
git-tree-sha1 = "5b2ef472bd7001923ea0d703583865ade78c80a3"
13+
repo-rev = "master"
14+
repo-url = "https://github.com/MikeInnes/IRTools.jl.git"
1315
uuid = "7869d1d1-7146-5819-86e3-90919afe41df"
14-
version = "0.3.3"
16+
version = "0.4.0"
1517

1618
[[InteractiveUtils]]
1719
deps = ["Markdown"]

src/infer.jl

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ mutable struct Frame
8686
edges::Vector{Any}
8787
stmts::Vector{Vector{Variable}}
8888
rettype::AType
89+
outer::Bool
8990
end
9091

9192
getblock(fr::Frame, b, follow) =
@@ -95,7 +96,7 @@ getblock(fr::Frame, b, follow) =
9596
# TODO clear up inlined edges
9697
uninline!(fr::Frame, b, follow) = deleteat!(fr.inlined[b], follow+1:length(fr.inlined[b]))
9798

98-
Frame(ir::IR) = Frame(ir, [IR[] for _ = 1:length(blocks(ir))], [], keys.(blocks(ir)), Union{})
99+
Frame(ir::IR; outer = false) = Frame(ir, [IR[] for _ = 1:length(blocks(ir))], [], keys.(blocks(ir)), Union{}, outer)
99100

100101
function frame(ir::IR, args...)
101102
prepare_ir!(ir)
@@ -200,7 +201,7 @@ function step!(inf::Inference)
200201
error("Unrecognised expression $(st.expr)")
201202
end
202203
elseif (brs = openbranches(block); length(brs) == 1 && !isreturn(brs[1])
203-
&& !(brs[1].block == length(frame.ir.blocks)))
204+
&& !(frame.outer && brs[1].block == length(frame.ir.blocks)))
204205
inferbranch!(inf, frame, b, f, brs[1])
205206
else
206207
for br in brs
@@ -249,3 +250,19 @@ function return_type(ir::IR, args...)
249250
infer!(inf)
250251
return fr.rettype
251252
end
253+
254+
function inlineable(ir::IR, inf::Inference)
255+
for (v, st) in ir
256+
Ts = exprtype.((ir,), st.expr.args)
257+
haskey(inf.frames, Ts) && return (v, Ts)
258+
end
259+
end
260+
261+
function inlineall(ir::IR, inf::Inference)
262+
while (next = inlineable(ir, inf)) != nothing
263+
v, Ts = next
264+
subir = inf.frames[Ts].ir
265+
ir = inline(ir, v, subir)
266+
end
267+
return ir
268+
end

src/trace.jl

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,11 @@ function abstract!(tr, bl, env)
133133
for i = 1:length(args)
134134
argtypes(ir)[i] = exprtype(tr.ir, rename(env, args[i]))
135135
end
136-
infer!(Inference(Frame(ir), tr.primitives))
136+
inf = Inference(Frame(ir, outer = true), tr.primitives)
137+
infer!(inf)
138+
# TODO weird that we need to expand here; perhaps inlining is impicitly pruning
139+
# somehow.
140+
ir = inlineall(ir, inf) |> expand!
137141
inline!(tr.ir, ir, rename.((env,), args))
138142
for (k, v) in zip(arguments(block(bl.ir, after)), arguments(blocks(tr.ir)[end]))
139143
env[k] = v

0 commit comments

Comments
 (0)