163 |
val join = newJoin 2 |
val join = newJoin 2 |
164 |
val cfg0 = cvtBlock (env, (0, join)::joinStk, b0) |
val cfg0 = cvtBlock (env, (0, join)::joinStk, b0) |
165 |
val cfg1 = cvtBlock (env, (1, join)::joinStk, b1) |
val cfg1 = cvtBlock (env, (1, join)::joinStk, b1) |
166 |
|
fun skipEmpty cfg = if IL.CFG.isEmpty cfg |
167 |
|
then join |
168 |
|
else IL.CFG.entry cfg |
169 |
val cond = IL.Node.mkCOND { |
val cond = IL.Node.mkCOND { |
170 |
cond = x', |
cond = x', |
171 |
trueBranch = IL.CFG.entry cfg0, |
trueBranch = skipEmpty cfg0, |
172 |
elseBranch = IL.CFG.entry cfg1 |
elseBranch = skipEmpty cfg1 |
173 |
} |
} |
174 |
in |
in |
175 |
case commitJoin (env, joinStk, join) |
case commitJoin (env, joinStk, join) |
176 |
of (env, SOME joinNd) => ( |
of (env, SOME joinNd) => ( |
177 |
(* add edges from cfg0 and cfg1 to joinNd *)) |
if IL.CFG.isEmpty cfg0 |
178 |
| (env, NONE) => |
then () |
179 |
|
else IL.CFG.addEdge (IL.CFG.exit cfg0, joinNd); |
180 |
|
if IL.CFG.isEmpty cfg1 |
181 |
|
then () |
182 |
|
else IL.CFG.addEdge (IL.CFG.exit cfg1, joinNd); |
183 |
|
cvt ( |
184 |
|
env, |
185 |
|
IL.CFG{entry = IL.CFG.entry, exit = joinNd}, |
186 |
|
stms)) |
187 |
|
(* the join node has only zero or one predecessors, so |
188 |
|
* it was killed. |
189 |
|
*) |
190 |
|
| (env, NONE) => ?? |
191 |
(* end case *) |
(* end case *) |
192 |
end |
end |
193 |
| S.S_New(strandId, args) => let |
| S.S_New(strandId, args) => let |
206 |
IL.CFG.appendNode (cfg, IL.Node.mkSTABILIZE ())) |
IL.CFG.appendNode (cfg, IL.Node.mkSTABILIZE ())) |
207 |
(* end case *)) |
(* end case *)) |
208 |
in |
in |
209 |
cvt (env, IL.CFG{entry=?, exit=?}, stms) |
cvt (env, IL.CFG.empty, stms) |
210 |
end |
end |
211 |
|
|
212 |
fun cvtTopLevelBlock (env, blk) = let |
fun cvtTopLevelBlock (env, blk) = let |
237 |
(env, List.rev xs) |
(env, List.rev xs) |
238 |
end |
end |
239 |
|
|
240 |
fun translate (S.Program{globals, globalInit, actors}) = let |
fun translate (S.Program{globals, globalInit, strands}) = let |
241 |
val (globalInit, env) = cvtTopLevelBlock (VMap.empty, globalInit) |
val (globalInit, env) = cvtTopLevelBlock (VMap.empty, globalInit) |
242 |
(* get the SSA names for the globals and a reduced environment that just defines |
(* get the SSA names for the globals and a reduced environment that just defines |
243 |
* the globals. |
* the globals. |
253 |
in |
in |
254 |
(env, List.rev globs) |
(env, List.rev globs) |
255 |
end |
end |
256 |
fun cvtActor (S.Actor{name, params, state, stateInit, methods}) = let |
fun cvtStrand (S.Strand{name, params, state, stateInit, methods}) = let |
257 |
val (env, params) = let |
val (env, params) = let |
258 |
fun cvtParam (x, (env, xs)) = let |
fun cvtParam (x, (env, xs)) = let |
259 |
val x' = newVar x |
val x' = newVar x |
275 |
IL.Method{name=name, stateIn=stateIn, stateOut=stateOut, body=body} |
IL.Method{name=name, stateIn=stateIn, stateOut=stateOut, body=body} |
276 |
end |
end |
277 |
in |
in |
278 |
IL.Actor{ |
IL.Strand{ |
279 |
name = name, |
name = name, |
280 |
params = params, |
params = params, |
281 |
state = state', |
state = state', |
287 |
IL.Program{ |
IL.Program{ |
288 |
globals = globs, |
globals = globs, |
289 |
globalInit = globalInit, |
globalInit = globalInit, |
290 |
actors = List.map cvtActor actors |
strands = List.map cvtStrand strands |
291 |
} |
} |
292 |
end |
end |
293 |
|
|