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

SCM Repository

[diderot] Diff of /branches/vis15/src/compiler/translate/translate.sml
ViewVC logotype

Diff of /branches/vis15/src/compiler/translate/translate.sml

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

revision 5285, Thu Aug 10 16:50:56 2017 UTC revision 5286, Thu Aug 10 17:53:04 2017 UTC
# Line 32  Line 32 
32    
33      val cvtTy = TranslateTy.tr      val cvtTy = TranslateTy.tr
34    
35      (* code contexts *)
36        datatype context = Method | GlobalUpdate | Other
37    
38    (* maps from SimpleAST variables to the current corresponding SSA variable *)    (* maps from SimpleAST variables to the current corresponding SSA variable *)
39      type env = IR.var VMap.map      datatype env = E of context * IR.var VMap.map
40    
41  (* +DEBUG *)  (* +DEBUG *)
42      fun prEnv (prefix, env) = let      fun prEnv (prefix, E(_, env)) = let
43            val wid = ref 0            val wid = ref 0
44            fun pr s = (print s; wid := !wid + size s)            fun pr s = (print s; wid := !wid + size s)
45            fun nl () = if (!wid > 0) then (print "\n"; wid := 0) else ()            fun nl () = if (!wid > 0) then (print "\n"; wid := 0) else ()
# Line 68  Line 71 
71              SV.newProp newSVar              SV.newProp newSVar
72            end            end
73    
74      fun lookup env x = (case VMap.find (env, x)      fun emptyEnv cxt = E(cxt, VMap.empty)
75    
76        fun lookup (E(_, vMap)) x = (case VMap.find (vMap, x)
77             of SOME x' => x'             of SOME x' => x'
78              | NONE => raise Fail(concat[              | NONE => raise Fail(concat[
79                    "no binding for ", SV.kindToString(SV.kindOf x), " ",                    "no binding for ", SV.kindToString(SV.kindOf x), " ",
# Line 76  Line 81 
81                  ])                  ])
82            (* end case *))            (* end case *))
83    
84        fun find (E(_, vMap), x) = VMap.find(vMap, x)
85    
86        fun insert (E(cxt, vMap), x, x') = E(cxt, VMap.insert(vMap, x, x'))
87    
88        fun context (E(_, vMap), cxt) = E(cxt, vMap)
89    
90        fun inMethod (E(Method, _)) = true
91          | inMethod _ = false
92    
93        fun inGlobalUpdate (E(GlobalUpdate, _)) = true
94          | inGlobalUpdate _ = false
95    
96    (* create a new instance of a variable *)    (* create a new instance of a variable *)
97      fun newVar x = IR.Var.new (SV.nameOf x, cvtTy(SV.typeOf x))      fun newVar x = IR.Var.new (SV.nameOf x, cvtTy(SV.typeOf x))
98    
# Line 123  Line 140 
140            fun cvtVar (x, (env, xs)) = let            fun cvtVar (x, (env, xs)) = let
141                  val x' = newVar x                  val x' = newVar x
142                  in                  in
143                    (VMap.insert(env, x, x'), x'::xs)                    (insert(env, x, x'), x'::xs)
144                  end                  end
145            val (env, xs) = List.foldl cvtVar (env, []) xs            val (env, xs) = List.foldl cvtVar (env, []) xs
146            in            in
# Line 163  Line 180 
180           * at the end of the loop body.  Since we don't know what y''' is at this point, we           * at the end of the loop body.  Since we don't know what y''' is at this point, we
181           * just use y''.           * just use y''.
182           *)           *)
183            fun doVar (y, (env', phiMap)) = (case VMap.find(env, y)            fun doVar (y, (env', phiMap)) = let
184                   of SOME y' => let                  val y' = lookup env y
185                        val y'' = newVar y                        val y'' = newVar y
186                        in                        in
187                          (VMap.insert(env', y, y''), VMap.insert(phiMap, y, (y'', [y', y''])))                    (insert(env', y, y''), VMap.insert(phiMap, y, (y'', [y', y''])))
188                        end                        end
                   | NONE => raise Fail(concat["variable ", SV.uniqueNameOf y, " is not bound"])  
                 (* end case *))  
189            val (env', phiMap) = List.foldl doVar (env, VMap.empty) phiVars            val (env', phiMap) = List.foldl doVar (env, VMap.empty) phiVars
190            in            in
191              JOIN{              JOIN{
# Line 198  Line 213 
213            val arity = Array.length predKill (* the original arity before any killPath calls *)            val arity = Array.length predKill (* the original arity before any killPath calls *)
214            val m = !phiMap            val m = !phiMap
215            in            in
216              case VMap.find (env, srcVar)              case find (env, srcVar)
217               of NONE => () (* local temporary *)               of NONE => () (* local temporary *)
218                | SOME dstVar' => (case VMap.find (m, srcVar)                | SOME dstVar' => (case VMap.find (m, srcVar)
219                     of NONE => let                     of NONE => let
# Line 266  Line 281 
281  print(concat["doVar (", SV.uniqueNameOf srcVar, ", ", IR.phiToString phi, ", _) @ ", IR.Node.toString nd, "\n"]);  print(concat["doVar (", SV.uniqueNameOf srcVar, ", ", IR.phiToString phi, ", _) @ ", IR.Node.toString nd, "\n"]);
282  *)  *)
283                        recordAssign (joinStk, srcVar, dstVar);                        recordAssign (joinStk, srcVar, dstVar);
284                        (VMap.insert (env, srcVar, dstVar), (dstVar, filterPhiRHS srcVars)::phis))                        (insert (env, srcVar, dstVar), (dstVar, filterPhiRHS srcVars)::phis))
285                  val (env, phis') = VMap.foldli doVar (env, []) (!phiMap)                  val (env, phis') = VMap.foldli doVar (env, []) (!phiMap)
286                  in                  in
287                    phis := phis';                    phis := phis';
# Line 281  Line 296 
296  *)  *)
297                        recordAssign (joinStk, srcVar, dstVar);                        recordAssign (joinStk, srcVar, dstVar);
298                        IR.Var.setBinding (dstVar, IR.VB_PHI xs);                        IR.Var.setBinding (dstVar, IR.VB_PHI xs);
299                        (VMap.insert (env, srcVar, dstVar), (dstVar, xs)::phis)                        (insert (env, srcVar, dstVar), (dstVar, xs)::phis)
300                      end                      end
301                val (env, phis') = VMap.foldli doVar (env, []) (!phiMap)                val (env, phis') = VMap.foldli doVar (env, []) (!phiMap)
302                in                in
# Line 404  Line 419 
419     *    blk     -- the block to translate     *    blk     -- the block to translate
420     *)     *)
421      fun cvtBlock (state, env : env, joinStk, blk as S.Block{code, ...}) = let      fun cvtBlock (state, env : env, joinStk, blk as S.Block{code, ...}) = let
           fun inMethod () = (case state of ([], _) => false | _ => true)  
422            fun cvt (env : env, cfg, []) = (cfg, env)            fun cvt (env : env, cfg, []) = (cfg, env)
423              | cvt (env, cfg, stm::stms) = (case stm              | cvt (env, cfg, stm::stms) = (case stm
424                   of S.S_Var(x, NONE) => let                   of S.S_Var(x, NONE) => let
425                        val x' = newVar x                        val x' = newVar x
426                        in                        in
427                          cvt (VMap.insert (env, x, x'), cfg, stms)                          cvt (insert (env, x, x'), cfg, stms)
428                        end                        end
429                    | S.S_Var(x, SOME e) => let                    | S.S_Var(x, SOME e) => let
430                        val x' = newVar x                        val x' = newVar x
# Line 418  Line 432 
432                        in                        in
433                          recordAssign (joinStk, x, x');                          recordAssign (joinStk, x, x');
434                          cvt (                          cvt (
435                            VMap.insert(env, x, x'),                            insert(env, x, x'),
436                            IR.CFG.concat(cfg, IR.CFG.mkBlock assigns),                            IR.CFG.concat(cfg, IR.CFG.mkBlock assigns),
437                            stms)                            stms)
438                        end                        end
# Line 433  Line 447 
447   *)   *)
448                          if isGlobalVar lhs                          if isGlobalVar lhs
449                            then cvt (                            then cvt (
450                              VMap.insert(env, lhs, lhs'),                              insert(env, lhs, lhs'),
451                              IR.CFG.concat(                              IR.CFG.concat(
452                                cfg,                                cfg,
453                                IR.CFG.mkBlock(assigns @ [IR.GASSGN(cvtGlobalVar lhs, lhs')])),                                IR.CFG.mkBlock(assigns @ [IR.GASSGN(cvtGlobalVar lhs, lhs')])),
# Line 441  Line 455 
455                            else (                            else (
456                              recordAssign (joinStk, lhs, lhs');                              recordAssign (joinStk, lhs, lhs');
457                              cvt (                              cvt (
458                                VMap.insert(env, lhs, lhs'),                                insert(env, lhs, lhs'),
459                                IR.CFG.concat(cfg, IR.CFG.mkBlock assigns),                                IR.CFG.concat(cfg, IR.CFG.mkBlock assigns),
460                                stms))                                stms))
461                        end                        end
# Line 496  Line 510 
510                        val phiVars = VSet.listItems(                        val phiVars = VSet.listItems(
511                              VSet.intersection(AnalyzeSimple.assignedVars b, AnalyzeSimple.liveOut b))                              VSet.intersection(AnalyzeSimple.assignedVars b, AnalyzeSimple.liveOut b))
512                        val join as JOIN{env, nd=foreachNd, ...} = newForeach (env, x', xs', phiVars)                        val join as JOIN{env, nd=foreachNd, ...} = newForeach (env, x', xs', phiVars)
513                        val (body, _) = cvtBlock (state, VMap.insert(env, x, x'), (1, join)::joinStk, b)                        val (body, _) = cvtBlock (state, insert(env, x, x'), (1, join)::joinStk, b)
514                        val body = IR.CFG.appendNode (body, IR.Node.mkNEXT())                        val body = IR.CFG.appendNode (body, IR.Node.mkNEXT())
515                        val env = commitJoin (joinStk, join)                        val env = commitJoin (joinStk, join)
516                        in                        in
# Line 525  Line 539 
539                        end                        end
540                    | S.S_Continue => (                    | S.S_Continue => (
541                        killPath joinStk;                        killPath joinStk;
542                        if inMethod()                        if inMethod env
543                          then (                          then (
544                              IR.CFG.concat (cfg, saveStrandState (env, state, IR.Node.mkACTIVE())),                              IR.CFG.concat (cfg, saveStrandState (env, state, IR.Node.mkACTIVE())),
545                              env                              env
546                            )                            )
547                          else if inGlobalUpdate env
548                            then (IR.CFG.appendNode (cfg, IR.Node.mkNEXTSTEP()), env)
549                          else (IR.CFG.appendNode (cfg, IR.Node.mkRETURN NONE), env))                          else (IR.CFG.appendNode (cfg, IR.Node.mkRETURN NONE), env))
550                    | S.S_Die => (                    | S.S_Die => (
551                        killPath joinStk;                        killPath joinStk;
# Line 556  Line 572 
572                             *)                             *)
573                              val strandTy = cvtTy(SV.typeOf source)                              val strandTy = cvtTy(SV.typeOf source)
574                              val src = IR.Var.new (SV.nameOf source, DstTy.SeqTy(strandTy, NONE))                              val src = IR.Var.new (SV.nameOf source, DstTy.SeqTy(strandTy, NONE))
575                              val env' = VMap.insert (env, source, src)                              val env' = insert (env, source, src)
576                              val srcAssign = IR.ASSGN(src, IR.OP(Op.Strands(strandTy, domain), []))                              val srcAssign = IR.ASSGN(src, IR.OP(Op.Strands(strandTy, domain), []))
577                              val result' = newVar result                              val result' = newVar result
578                              val env = VMap.insert(env, result, result')                              val env = insert(env, result, result')
579                              val mr' = (reduction, cvtFuncVar f, List.map (lookup env') args)                              val mr' = (reduction, cvtFuncVar f, List.map (lookup env') args)
580                              in                              in
581                                (env, srcAssign :: assigns, result'::lhs, mr'::mrs')                                (env, srcAssign :: assigns, result'::lhs, mr'::mrs')
# Line 582  Line 598 
598            fun load (x, (env, stms)) = let            fun load (x, (env, stms)) = let
599                  val x' = newVar x                  val x' = newVar x
600                  val stm = IR.ASSGN(x', IR.GLOBAL(cvtGlobalVar x))                  val stm = IR.ASSGN(x', IR.GLOBAL(cvtGlobalVar x))
601                  val env = VMap.insert (env, x, x')                  val env = insert (env, x, x')
602                  in                  in
603                    (env, stm::stms)                    (env, stm::stms)
604                  end                  end
# Line 622  Line 638 
638  (*DEBUG*)handle ex => (print "error in cvtMethod\n"; raise ex)  (*DEBUG*)handle ex => (print "error in cvtMethod\n"; raise ex)
639    
640    (* convert global code *)    (* convert global code *)
641      fun cvtGlobalBlock block = let      fun cvtGlobalBlock cxt block = let
642          (* load the globals into fresh variables *)          (* load the globals into fresh variables *)
643            val (loadCFG, env) = loadGlobals (VMap.empty, block)            val (loadCFG, env) = loadGlobals (emptyEnv cxt, block)
644          (* convert the code *)          (* convert the code *)
645            val (cfg, _) = cvtBlock (([], []), env, [], block)            val (cfg, _) = cvtBlock (([], []), env, [], block)
646            val cfg = IR.CFG.concat (loadCFG, cfg)            val cfg = IR.CFG.concat (loadCFG, cfg)
647            val cfg = IR.CFG.prependNode (IR.Node.mkENTRY(), cfg)            val cfg = IR.CFG.prependNode (IR.Node.mkENTRY(), cfg)
648            val cfg = IR.CFG.appendNode (cfg, IR.Node.mkRETURN NONE)            val cfg = if inGlobalUpdate env
649                    then IR.CFG.appendNode (cfg, IR.Node.mkNEXTSTEP())
650                    else IR.CFG.appendNode (cfg, IR.Node.mkRETURN NONE)
651            in            in
652              cfg              cfg
653            end            end
# Line 640  Line 658 
658            fun cvtParam (x, (env, xs)) = let            fun cvtParam (x, (env, xs)) = let
659                  val x' = newVar x                  val x' = newVar x
660                  in                  in
661                    (VMap.insert(env, x, x'), x'::xs)                    (insert(env, x, x'), x'::xs)
662                  end                  end
663            val (env, params) = List.foldl cvtParam (VMap.empty, []) params            val (env, params) = List.foldl cvtParam (emptyEnv Other, []) params
664            in            in
665              (env, List.rev params)              (env, List.rev params)
666            end            end
# Line 682  Line 700 
700            val inputs' = List.map (Inputs.map cvtGlobalVar) inputs            val inputs' = List.map (Inputs.map cvtGlobalVar) inputs
701            val inputs = List.map Inputs.varOf inputs            val inputs = List.map Inputs.varOf inputs
702            val constInit = let            val constInit = let
703                  val (cfg, _) = cvtBlock (([], []), VMap.empty, [], constInit)                  val (cfg, _) = cvtBlock (([], []), emptyEnv Other, [], constInit)
704                  val cfg = IR.CFG.prependNode (IR.Node.mkENTRY(), cfg)                  val cfg = IR.CFG.prependNode (IR.Node.mkENTRY(), cfg)
705                  val cfg = IR.CFG.appendNode (cfg, IR.Node.mkRETURN NONE)                  val cfg = IR.CFG.appendNode (cfg, IR.Node.mkRETURN NONE)
706                  in                  in
# Line 699  Line 717 
717                (* we start by loading the input globals, since they may be needed to compute the                (* we start by loading the input globals, since they may be needed to compute the
718                 * other globals                 * other globals
719                 *)                 *)
720                  val (loadBlk, env) = loadGlobals (VMap.empty, globInit)                  val (loadBlk, env) = loadGlobals (emptyEnv Other, globInit)
721                  val (globBlk, env) = cvtBlock (([], []), env, [], globInit)                  val (globBlk, env) = cvtBlock (([], []), env, [], globInit)
722                  val cfg = IR.CFG.prependNode (IR.Node.mkENTRY(), loadBlk)                  val cfg = IR.CFG.prependNode (IR.Node.mkENTRY(), loadBlk)
723                  val cfg = IR.CFG.concat(cfg, globBlk)                  val cfg = IR.CFG.concat(cfg, globBlk)
# Line 720  Line 738 
738                  val (stateInit, env) = let                  val (stateInit, env) = let
739                      (* load globals into local variables *)                      (* load globals into local variables *)
740                        val (loadGlobsCFG, env) = loadGlobals (env, stateInit)                        val (loadGlobsCFG, env) = loadGlobals (env, stateInit)
741                        val env = List.foldl (fn (x, env) => VMap.insert(env, x, newVar x)) env state                        val env = List.foldl (fn (x, env) => insert(env, x, newVar x)) env state
742                        val (cfg, env) = cvtBlock (([], []), env, [], stateInit)                        val (cfg, env) = cvtBlock (([], []), env, [], stateInit)
743                        val cfg = IR.CFG.concat(loadGlobsCFG, cfg)                        val cfg = IR.CFG.concat(loadGlobsCFG, cfg)
744                        val cfg = IR.CFG.prependNode (IR.Node.mkENTRY(), cfg)                        val cfg = IR.CFG.prependNode (IR.Node.mkENTRY(), cfg)
# Line 738  Line 756 
756                          (cfg, env)                          (cfg, env)
757                        end                        end
758                  fun cvtMeth isStabilize blk =                  fun cvtMeth isStabilize blk =
759                        cvtMethod (env, isStabilize, state, svars, blk)                        cvtMethod (context(env, Method), isStabilize, state, svars, blk)
760                  in                  in
761                    IR.Strand{                    IR.Strand{
762                        name = name,                        name = name,
# Line 752  Line 770 
770                      }                      }
771                  end                  end
772  (*DEBUG*)handle ex => raise ex  (*DEBUG*)handle ex => raise ex
773            val create = Create.map cvtGlobalBlock create            val create = Create.map (cvtGlobalBlock Other) create
774            val prog = IR.Program{            val prog = IR.Program{
775                    props = props,                    props = props,
776                    consts = consts',                    consts = consts',
# Line 763  Line 781 
781                    globInit = globInit,                    globInit = globInit,
782                    strand = cvtStrand strand,                    strand = cvtStrand strand,
783                    create = create,                    create = create,
784                    start = Option.map cvtGlobalBlock start,                    start = Option.map (cvtGlobalBlock Other) start,
785                    update = Option.map cvtGlobalBlock update                    update = Option.map (cvtGlobalBlock GlobalUpdate) update
786                  }                  }
787            in            in
788              Census.init prog;              Census.init prog;

Legend:
Removed from v.5285  
changed lines
  Added in v.5286

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