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

SCM Repository

[diderot] Diff of /branches/pure-cfg/src/compiler/translate/translate.sml
ViewVC logotype

Diff of /branches/pure-cfg/src/compiler/translate/translate.sml

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

revision 499, Tue Feb 1 17:37:51 2011 UTC revision 500, Tue Feb 1 17:40:24 2011 UTC
# Line 163  Line 163 
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
# Line 191  Line 206 
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
# Line 222  Line 237 
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.
# Line 238  Line 253 
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
# Line 260  Line 275 
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',
# Line 272  Line 287 
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    

Legend:
Removed from v.499  
changed lines
  Added in v.500

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