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

SCM Repository

[diderot] Diff of /trunk/src/compiler/tree-il/low-to-tree-fn.sml
ViewVC logotype

Diff of /trunk/src/compiler/tree-il/low-to-tree-fn.sml

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

revision 1300, Thu Jun 9 21:11:47 2011 UTC revision 1301, Thu Jun 9 23:58:40 2011 UTC
# Line 236  Line 236 
236                    in                    in
237                      (env, [T.S_LoadImage(t, ImageInfo.dim info, useVar env a)])                      (env, [T.S_LoadImage(t, ImageInfo.dim info, useVar env a)])
238                    end                    end
239                | IL.OP(Op.Input(ty, name), []) => let                | IL.OP(Op.Input(ty, name, desc), []) => let
240                    val (env, t) = doLHS()                    val (env, t) = doLHS()
241                    in                    in
242                      (env, [T.S_Input(t, name, NONE)])                      (env, [T.S_Input(t, name, desc, NONE)])
243                    end                    end
244                | IL.OP(Op.InputWithDefault(ty, name), [a]) => let                | IL.OP(Op.InputWithDefault(ty, name, desc), [a]) => let
245                    val (env, t) = doLHS()                    val (env, t) = doLHS()
246                    in                    in
247                      (env, [T.S_Input(t, name, SOME(useVar env a))])                      (env, [T.S_Input(t, name, desc, SOME(useVar env a))])
248                    end                    end
249                | IL.OP(rator, args) => let                | IL.OP(rator, args) => let
250                    val exp = T.E_Op(rator, List.map (useVar env) args)                    val exp = T.E_Op(rator, List.map (useVar env) args)
# Line 455  Line 455 
455              condCons (hasNew, T.NewStrands, []))              condCons (hasNew, T.NewStrands, []))
456            end            end
457    
458      (* split the globalInit into the part that specifies the inputs and the rest of
459       * the global initialization.
460       *)
461        fun splitGlobalInit globalInit = let
462              fun walk (nd, lastInput, live) = (case Nd.kind nd
463                     of IL.ENTRY{succ} => walk (!succ, lastInput, live)
464                      | IL.COM{succ, ...} => walk (!succ, lastInput, live)
465                      | IL.ASSIGN{stm=(lhs, rhs), succ, ...} => (case rhs
466                           of IL.OP(Op.Input _, _) => walk (!succ, nd, lhs::live)
467                            | IL.OP(Op.InputWithDefault _, _) => walk (!succ, nd, lhs::live)
468                            | _ => walk (!succ, lastInput, live)
469                          (* end case *))
470                      | _ => if Nd.isNULL lastInput
471                          then let (* no inputs *)
472                            val entry = Nd.mkENTRY()
473                            val exit = Nd.mkEXIT(ExitKind.RETURN, [])
474                            in
475                              Nd.addEdge (entry, exit);
476                              {inputInit = IL.CFG{entry=entry, exit=exit}, globalInit = globalInit}
477                            end
478                          else let (* split at lastInput *)
479                            val inputExit = Nd.mkEXIT(ExitKind.RETURN, live)
480                            val globalEntry = Nd.mkENTRY()
481                            val [gFirst] = Nd.succs lastInput
482                            in
483                              Nd.replaceInEdge {src = lastInput, oldDst = gFirst, dst = inputExit};
484                              Nd.replaceOutEdge {oldSrc = lastInput, src = globalEntry, dst = gFirst};
485                              {
486                                inputInit = IL.CFG{entry = IL.CFG.entry globalInit, exit = inputExit},
487                                globalInit = IL.CFG{entry = globalEntry, exit = IL.CFG.exit globalInit}
488                              }
489                            end
490                    (* end case *))
491              in
492                walk (IL.CFG.entry globalInit, Nd.dummy, [])
493              end
494    
495      fun translate prog = let      fun translate prog = let
496          (* first we do a variable analysis pass on the Low IL *)          (* first we do a variable analysis pass on the Low IL *)
497            val prog as IL.Program{globalInit, initially, strands} = VA.optimize prog            val prog as IL.Program{globalInit, initially, strands} = VA.optimize prog
# Line 465  Line 502 
502            val globals = List.map            val globals = List.map
503                  (fn x => let val x' = newGlobal x in global(env, x, x'); x' end)                  (fn x => let val x' = newGlobal x in global(env, x, x'); x' end)
504                    (IL.CFG.liveAtExit globalInit)                    (IL.CFG.liveAtExit globalInit)
505              val {inputInit, globalInit} = splitGlobalInit globalInit
506            val strands = List.map (trStrand env) strands            val strands = List.map (trStrand env) strands
507            in            in
508              T.Program{              T.Program{
509                  props = checkProps strands,                  props = checkProps strands,
510                  globals = globals,                  globals = globals,
511                    inputInit = trCFG (env, [], fn _ => [], inputInit),
512                  globalInit = trCFG (env, [], fn _ => [], globalInit),                  globalInit = trCFG (env, [], fn _ => [], globalInit),
513                  strands = strands,                  strands = strands,
514                  initially = trInitially (env, initially)                  initially = trInitially (env, initially)

Legend:
Removed from v.1300  
changed lines
  Added in v.1301

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