Home My Page Projects Code Snippets Project Openings diderot
Summary Activity Tracker Tasks SCM

SCM Repository

[diderot] Diff of /branches/pure-cfg/src/compiler/codegen/low-to-tree.sml
ViewVC logotype

Diff of /branches/pure-cfg/src/compiler/codegen/low-to-tree.sml

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 540, Wed Feb 16 03:08:40 2011 UTC revision 541, Wed Feb 16 05:30:57 2011 UTC
# Line 106  Line 106 
106            else let            else let
107              val t = newLocal lhs              val t = newLocal lhs
108              in              in
109                (rename(env, lhs, t), [T.S_Assign(t, rhs)])                (rename(addLocal(env, t), lhs, t), [T.S_Assign(t, rhs)])
110              end              end
111    
112      fun bind (env, lhs, rhs) = (case peekGlobal (env, lhs)      fun bind (env, lhs, rhs) = (case peekGlobal (env, lhs)
# Line 141  Line 141 
141                  (fn (x, stms) => T.S_Assign(t, useVar env x)::stms)                  (fn (x, stms) => T.S_Assign(t, useVar env x)::stms)
142                    (rhs, predBlks)                    (rhs, predBlks)
143            in            in
144              (rename (env, lhs, t), predBlks)              (rename (addLocal(env, t), lhs, t), predBlks)
145            end            end
146    
147      fun endScope (E{locals, ...}, stms) = T.Block{      fun endScope (E{locals, ...}, stms) = T.Block{
# Line 158  Line 158 
158                    | NONE => let                    | NONE => let
159                        val t = newLocal lhs                        val t = newLocal lhs
160                        in                        in
161                          (rename (env, lhs, t), t)                          (rename (addLocal(env, t), lhs, t), t)
162                        end                        end
163                  (* end case *))                  (* end case *))
164            in            in
# Line 192  Line 192 
192              (* end case *)              (* end case *)
193            end            end
194    
195      fun trCFG (env, prefix, suffix, cfg) = let      fun trCFG (env, prefix, finish, cfg) = let
196            fun doNode (env, ifCont : T.stm list * IL.node_kind -> T.block, stms, nd) = (            fun doNode (env, ifCont : T.stm list * IL.node_kind -> T.block, stms, nd) = (
197    print(concat["doNode (_, _, ", Nd.toString nd, ")\n"]);
198                  case Nd.kind nd                  case Nd.kind nd
199                   of IL.NULL => raise Fail "unexpected NULL"                   of IL.NULL => raise Fail "unexpected NULL"
200                    | IL.ENTRY{succ} => doNode (env, ifCont, stms, !succ)                    | IL.ENTRY{succ} => doNode (env, ifCont, stms, !succ)
201                    | IL.JOIN{phis, succ, ...} => ifCont (stms, Nd.kind nd)                    | IL.JOIN{phis, succ, ...} => ifCont (stms, Nd.kind nd)
202                    | IL.COND{cond, trueBranch, falseBranch, ...} => let                    | IL.COND{cond, trueBranch, falseBranch, ...} => let
203                          val cond = useVar env cond
204                        fun kThen (stms', _) = let                        fun kThen (stms', _) = let
205                              val (env, thenBlk) = endBlock (env, stms')                              val (env, thenBlk) = endBlock (env, stms')
206                              fun kElse (stms', IL.JOIN{phis, succ, ...}) = let                              fun kElse (stms', IL.JOIN{phis, succ, ...}) = let
207                                    val (env, elseBlk) = endBlock (env, stms')                                    val (env, elseBlk) = endBlock (env, stms')
208                                    val (env, [thenBlk, elseBlk]) =                                    val (env, [thenBlk, elseBlk]) =
209                                          List.foldl doPhi (env, [thenBlk, elseBlk]) (!phis)                                          List.foldl doPhi (env, [thenBlk, elseBlk]) (!phis)
210                                    val stm = mkIf(useVar env cond, List.rev thenBlk, List.rev elseBlk)                                    val stm = mkIf(cond, List.rev thenBlk, List.rev elseBlk)
211                                    in                                    in
212                                      doNode (env, ifCont, stm::stms, !succ)                                      doNode (env, ifCont, stm::stms, !succ)
213                                    end                                    end
# Line 223  Line 225 
225                          doNode (env, ifCont, stms' @ stms, !succ)                          doNode (env, ifCont, stms' @ stms, !succ)
226                        end                        end
227                    | IL.NEW{strand, args, succ, ...} => raise Fail "NEW unimplemented"                    | IL.NEW{strand, args, succ, ...} => raise Fail "NEW unimplemented"
228    (* FIXME: this code is broken when we have one arm of a if-then-else that is a die or stabilize *)
229                    | IL.DIE _ =>                    | IL.DIE _ =>
230                        mkBlock (List.rev (T.S_Die :: stms))                        mkBlock (List.rev (T.S_Die :: stms))
231                    | IL.STABILIZE _ =>                    | IL.STABILIZE _ =>
232                        mkBlock (List.rev stms)                        mkBlock (List.rev stms)
233                    | IL.EXIT _ => endScope (env, prefix @ List.revAppend(stms, suffix))                    | IL.EXIT _ => let
234                          val suffix = finish env
235                          in
236                            endScope (env, prefix @ List.revAppend(stms, suffix))
237                          end
238                  (* end case *))                  (* end case *))
239            in            in
240              doNode (env, fn _ => raise Fail "bogus ifCont at JOIN node", [], CFG.entry cfg)              doNode (env, fn _ => raise Fail "bogus ifCont at JOIN node", [], CFG.entry cfg)
# Line 241  Line 248 
248                  end                  end
249            val (env, stms) = ListPair.foldrEq bindStateVar (env, []) (stateIn, stateVars)            val (env, stms) = ListPair.foldrEq bindStateVar (env, []) (stateIn, stateVars)
250            in            in
251              T.Method{name = name, body = trCFG (env, stms, [], body)}              T.Method{name = name, body = trCFG (env, stms, fn _ => [], body)}
252            end            end
253    
254      fun trStrand env (IL.Strand{name, params, state, stateInit, methods}) = let      fun trStrand env (IL.Strand{name, params, state, stateInit, methods}) = let
           val stateVars = List.map (fn x => newStateVar(name, x)) state  
255            val params' = List.map newParam params            val params' = List.map newParam params
256            val env = ListPair.foldlEq (fn (x, x', env) => rename(env, x, x')) env (params, params')            val env = ListPair.foldlEq (fn (x, x', env) => rename(env, x, x')) env (params, params')
257              val stateVars = List.map (fn x => newStateVar(name, x)) state
258            (* finish the strand initialization code by initializing the state variables *)
259              fun finishInit env = let
260                    fun initVar (x, x') = T.S_Assign(x', useVar env x)
261                    in
262                      ListPair.mapEq initVar (state, stateVars)
263                    end
264            in            in
265              T.Strand{              T.Strand{
266                  name = name,                  name = name,
267                  params = params',                  params = params',
268                  state = stateVars,                  state = stateVars,
269                  stateInit = trCFG (env, [], [], stateInit),                  stateInit = trCFG (env, [], finishInit, stateInit),
270                  methods = List.map (trMethod(env, stateVars)) methods                  methods = List.map (trMethod(env, stateVars)) methods
271                }                }
272            end            end
# Line 266  Line 279 
279            in            in
280              T.Program{              T.Program{
281                  globals = globals,                  globals = globals,
282                  globalInit = trCFG (env, [], [], globalInit),                  globalInit = trCFG (env, [], fn _ => [], globalInit),
283                  strands = List.map (trStrand env) strands                  strands = List.map (trStrand env) strands
284                }                }
285            end            end

Legend:
Removed from v.540  
changed lines
  Added in v.541

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0