better loop lifting semantics

This commit is contained in:
Mike J Innes 2016-10-26 11:19:45 +01:00
parent 42b50c976a
commit 652c26728e
1 changed files with 5 additions and 2 deletions

View File

@ -6,11 +6,14 @@ end
Delay(name) = Delay(name, nothing)
function liftloops!(ex, params)
e = Flow.normedges(ex)
ex = Flow.normedges(ex)
hidden = intersect((b.args[1] for b in ex.args), params)
edges = Dict(h => gensym("edge") for h in hidden)
declared = Dict(h => false for h in hidden)
liftvar(s) = get(declared, s, false) ? s : get(edges, s, s)
for b in ex.args
b.args[2] = MacroTools.postwalk(x -> get(edges, x, x), b.args[2])
b.args[2] = MacroTools.postwalk(liftvar, b.args[2])
declared[b.args[1]] = true
end
for (h, e) in edges
unshift!(ex.args, :($e = $(Delay(h))($h)))