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

SCM Repository

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

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

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

revision 2297, Fri Mar 15 22:05:31 2013 UTC revision 2298, Fri Mar 15 22:18:22 2013 UTC
# Line 264  Line 264 
264                  in                  in
265                    if List.all (fn b => b) mask                    if List.all (fn b => b) mask
266                      then [IL.ASSGN(lhs, IL.OP(Op.TensorSub(IL.Var.ty x), x::indices))]                      then [IL.ASSGN(lhs, IL.OP(Op.TensorSub(IL.Var.ty x), x::indices))]
267                      else [IL.ASSGN(lhs, IL.OP(Op.Slice(IL.Var.ty lhs, mask), x::indices))]                      else [IL.ASSGN(lhs, IL.OP(Op.Slice(IL.Var.ty x, mask), x::indices))]
268                  end                  end
 (* DEPRECATED  
             | S.E_Input(_, name, desc, NONE) =>  
                 [IL.ASSGN(lhs, IL.OP(Op.Input(IL.Var.ty lhs, name, desc), []))]  
             | S.E_Input(_, name, desc, SOME dflt) =>  
                 [IL.ASSGN(lhs, IL.OP(Op.InputWithDefault(IL.Var.ty lhs, name, desc), [lookup env dflt]))]  
 *)  
269              | S.E_Coerce{srcTy, dstTy, x} => (case (srcTy, dstTy)              | S.E_Coerce{srcTy, dstTy, x} => (case (srcTy, dstTy)
270                   of (Ty.T_Int, Ty.T_Tensor _) =>                   of (Ty.T_Int, Ty.T_Tensor _) =>
271                        [IL.ASSGN(lhs, IL.OP(Op.IntToReal, [lookup env x]))]                        [IL.ASSGN(lhs, IL.OP(Op.IntToReal, [lookup env x]))]
# Line 424  Line 418 
418                    | S.S_Stabilize => (                    | S.S_Stabilize => (
419                        killPath joinStk;                        killPath joinStk;
420                        (IL.CFG.concat (cfg, saveStrandState (env, state, IL.Node.mkSTABILIZE())), env))                        (IL.CFG.concat (cfg, saveStrandState (env, state, IL.Node.mkSTABILIZE())), env))
421                      | S.S_Return _ => raise Fail "unexpected return"
422                    | S.S_Print args => let                    | S.S_Print args => let
423                        val args = List.map (lookup env) args                        val args = List.map (lookup env) args
424                        val nd = IL.Node.mkMASSIGN([], Op.Print(List.map IL.Var.ty args), args)                        val nd = IL.Node.mkMASSIGN([], Op.Print(List.map IL.Var.ty args), args)
# Line 519  Line 514 
514            end            end
515    
516    (* check strands for properties *)    (* check strands for properties *)
517      fun checkProps (strands,S.Block(globalInit))= let      fun checkProps (strands, globalBlock) = let
518            val hasDie = ref false            val hasDie = ref false
519            val hasNew = ref false            val hasNew = ref false
520        val hasCom = ref false        val hasCom = ref false
521        val hasReduce = ref false        val hasReduce = ref false
   
522        val gridIs2D = ref false        val gridIs2D = ref false
       val size = ref (Literal.Int 0)  
523            fun chkStm e = (case e            fun chkStm e = (case e
524                   of S.S_IfThenElse(_, b1, b2) => (chkBlk b1; chkBlk b2)                   of S.S_IfThenElse(_, b1, b2) => (chkBlk b1; chkBlk b2)
525                    | S.S_New _ => (hasNew := true)                    | S.S_New _ => hasNew := true
526                    | S.S_Die => (hasDie := true)                    | S.S_Die => hasDie := true
527                    | S.S_Foreach (_,_,b1) => (hasCom :=  true; chkBlk b1)                    | S.S_Foreach (_,_,b1) => (hasCom :=  true; chkBlk b1)
528                    | S.S_Assign(x,e2) => (case e2  (* FIXME: this should only be true for global reductions *)
529                        of S.E_Reduction _ => hasReduce := true                    | S.S_Assign(x, S.E_Reduction _) => hasReduce := true
                        | _ => ()  
                       (* end case *))  
530                    | _ => ()                    | _ => ()
531                (* end case *))                (* end case *))
532            and chkBlk (S.Block body) = List.app chkStm body            and chkBlk (S.Block body) = List.app chkStm body
533            fun chkStrand (S.Strand{stateInit, state, methods, ...}) = let            fun chkStrand (S.Strand{stateInit, state, methods, ...}) = let
534                    fun chkStateVar p = (case (Var.nameOf p, Var.monoTypeOf p)
       val t = (fn p => (case (Var.nameOf(p),Var.monoTypeOf(p))  
535                         of ("pos",Ty.T_Tensor(Ty.Shape[Ty.DimConst 2])) => gridIs2D := true                         of ("pos",Ty.T_Tensor(Ty.Shape[Ty.DimConst 2])) => gridIs2D := true
536                          | _=> ()                          | _=> ()
537                        (* end case *)))                        (* end case *))
538         fun chkMeth (S.Method(_, body)) = chkBlk body         fun chkMeth (S.Method(_, body)) = chkBlk body
539                  in                  in
540            List.app t state;                    List.app chkStateVar state;
541                    chkBlk stateInit;                    chkBlk stateInit;
542                    List.app chkMeth methods                    List.app chkMeth methods
543                  end                  end
   
   
   
544            fun condCons (x, v, l) = if !x then v::l else l            fun condCons (x, v, l) = if !x then v::l else l
545            in            in
546                chkBlk globalBlock;
547              List.app chkStrand strands;              List.app chkStrand strands;
548              condCons (hasDie, StrandUtil.StrandsMayDie,              condCons (hasDie, StrandUtil.StrandsMayDie,
549          condCons (gridIs2D, StrandUtil.GridIs2D,          condCons (gridIs2D, StrandUtil.GridIs2D,
# Line 575  Line 563 
563              (IL.CFG.mkBlock stms, env)              (IL.CFG.mkBlock stms, env)
564            end            end
565    
566      fun translate (S.Program{inputs, globals, globalInit, globalBlock,init, strands,...}) = let    (* gather the top-level definitions in a block.  This is a hack that is used to make all
567       * of the globally defined variables visible to the rest of the program (including intermediate
568       * results) so that later transforms (e.g., field normalization) will work.  Eventually the
569       * variable analysis phase ought to clean things up.
570       *)
571        fun definedVars (IL.CFG{entry, ...}) = let
572              fun gather (nd, vars) = (case IL.Node.kind nd
573                     of IL.NULL => vars
574                      | IL.ENTRY{succ, ...} => gather(!succ, vars)
575                      | IL.COND{trueBranch, ...} => let
576                          val (phis, succ) = findJoin (!trueBranch)
577                          val vars = List.foldl (fn ((x, _), vars) => x::vars) vars (!phis)
578                          in
579                            gather (succ, vars)
580                          end
581                      | IL.COM{succ, ...} => gather (!succ, vars)
582                      | IL.ASSIGN{stm=(x, _), succ, ...} => gather(!succ, x::vars)
583                      | IL.MASSIGN{stm=(xs, _, _), succ, ...} => gather(!succ, xs@vars)
584                      | _ => raise Fail("gather: unexpected " ^ IL.Node.toString nd)
585                    (* end case *))
586              and findJoin nd = (case IL.Node.kind nd
587                     of IL.JOIN{phis, succ, ...} => (phis, !succ)
588                      | IL.COND{trueBranch, ...} => findJoin (#2 (findJoin (!trueBranch)))
589                      | IL.COM{succ, ...} => findJoin (!succ)
590                      | IL.ASSIGN{succ, ...} => findJoin (!succ)
591                      | IL.MASSIGN{succ, ...} => findJoin (!succ)
592                      | _ => raise Fail("findJoin: unexpected " ^ IL.Node.toString nd)
593                    (* end case *))
594              in
595                List.rev (gather (entry, []))
596              end
597    
598        fun translate (S.Program{
599                inputs, globals, globalInit, globalBlock, init, strands, ...
600              }) = let
601             val (globalInit',globalBlock',env) = let             val (globalInit',globalBlock',env) = let
602                  fun mkExit env = let                  fun mkExit env = let
603                        val nd = IL.Node.mkRETURN(VMap.listItems env)                        val nd = IL.Node.mkRETURN(VMap.listItems env)
# Line 587  Line 609 
609          val (globalBlk,env') = cvtBlock(([],[]),env,[],globalBlock)          val (globalBlk,env') = cvtBlock(([],[]),env,[],globalBlock)
610                  val cfg = IL.CFG.prependNode (IL.Node.mkENTRY(), inputBlk)                  val cfg = IL.CFG.prependNode (IL.Node.mkENTRY(), inputBlk)
611                  val cfg = IL.CFG.concat(cfg, globDeclBlk)                  val cfg = IL.CFG.concat(cfg, globDeclBlk)
                 val cfg = IL.CFG.concat (cfg, mkExit env)  
612          val cfgGlobal = IL.CFG.prependNode(IL.Node.mkENTRY(), globalBlk)          val cfgGlobal = IL.CFG.prependNode(IL.Node.mkENTRY(), globalBlk)
613                  val cfgGlobal = IL.CFG.concat (cfgGlobal, mkExit env')                  val cfgGlobal = IL.CFG.concat (cfgGlobal, mkExit env')
614                    val cfg = IL.CFG.concat (cfg, mkExit env)
615                  in                  in
616                    (cfg, cfgGlobal,env')                    (cfg, cfgGlobal,env')
617                  end                  end
# Line 640  Line 662 
662                      }                      }
663                  end                  end
664            val prog = IL.Program{            val prog = IL.Program{
665            props = checkProps (strands,globalInit),                    props = checkProps (strands, globalBlock),
666                    globalInit = globalInit',                    globalInit = globalInit',
667            globalBlock = globalBlock',            globalBlock = globalBlock',
668                    initially = init,                    initially = init,

Legend:
Removed from v.2297  
changed lines
  Added in v.2298

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