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

SCM Repository

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

Diff of /branches/vis15/src/compiler/low-to-tree/low-to-tree.sml

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

revision 4091, Wed Jun 29 02:44:36 2016 UTC revision 4092, Wed Jun 29 13:58:36 2016 UTC
# Line 78  Line 78 
78                | NONE => let                | NONE => let
79                    val rep = (case V.ty x                    val rep = (case V.ty x
80                           of Ty.TensorTy[d] => VEC(U.newVectorVars(Env.layoutVec env d))                           of Ty.TensorTy[d] => VEC(U.newVectorVars(Env.layoutVec env d))
81  (* FIXME: we should analyse the assignments to x and determine if the type should be TensorTy                            | ty => if AssignTypes.isMemoryVar x
82   * or TensorRefTy.                                then VAR(U.newMemVar x)
83   *)                                else VAR(U.newLocalVar x)
                           | Ty.TensorTy(_::_) => VAR(U.newMemVar x)  
                           | ty => VAR(U.newLocalVar x)  
84                          (* end case *))                          (* end case *))
85                    in                    in
86                      setFn (x, rep);                      setFn (x, rep);
# Line 140  Line 138 
138    
139    (* define a new local variable and bind x to it in the environment. *)    (* define a new local variable and bind x to it in the environment. *)
140      fun newLocal (env, x) = let      fun newLocal (env, x) = let
141            val x' = U.newLocalVar x            val x' = if AssignTypes.isMemoryVar x then U.newMemVar x else U.newLocalVar x
142            in            in
143              Env.bindSimple (env, x, T.E_Var x');              Env.bindSimple (env, x, T.E_Var x');
144              x'              x'
# Line 535  Line 533 
533                    | mkVecs (_, []) = raise Fail "too many arguments for CONS"                    | mkVecs (_, []) = raise Fail "too many arguments for CONS"
534                  val es = mkVecs (args, #pieces layout)                  val es = mkVecs (args, #pieces layout)
535                  in                  in
536                    case (eqClassRepOf(env, lhs), V.useCount lhs > 1)                    case eqClassRepOf(env, lhs)
537                     of (NOEQ, false) => (Env.bindVar(env, lhs, Env.VEC(layout, es)); stms)                     of NOEQ => if (V.useCount lhs > 1)
538                      | (NOEQ, true) => let                          then (Env.bindVar(env, lhs, Env.VEC(layout, es)); stms)
539                            else let
540                          val vs = U.newVectorVars layout                          val vs = U.newVectorVars layout
541                          in                          in
542                            Env.bindVar (env, lhs, Env.VEC(layout, List.map T.E_Var vs));                            Env.bindVar (env, lhs, Env.VEC(layout, List.map T.E_Var vs));
543                            ListPair.foldl (fn (v, e, stms) => mkDefn(v, e)::stms) stms (vs, es)                            ListPair.foldl (fn (v, e, stms) => mkDefn(v, e)::stms) stms (vs, es)
544                          end                          end
545                      | (VEC xs, _) =>                      | VEC xs =>
546                          ListPair.foldl (fn (x, e, stms) => mkAssign(x, e)::stms) stms (xs, es)                          ListPair.foldl (fn (x, e, stms) => mkAssign(x, e)::stms) stms (xs, es)
547                      | _ => raise Fail "inconsistent"                      | _ => raise Fail "inconsistent"
548                    (* end case *)                    (* end case *)
# Line 553  Line 552 
552                  val cons = T.E_Cons(args, ty)                  val cons = T.E_Cons(args, ty)
553                  in                  in
554                    case eqClassRepOf(env, lhs)                    case eqClassRepOf(env, lhs)
555                     of NOEQ => mkDefn (newMemLocal (env, lhs), cons) :: stms                     of NOEQ => if (V.useCount lhs > 1)
556                            then mkDefn (newMemLocal (env, lhs), cons) :: stms
557                            else (
558                              Env.bindVar (env, lhs, Env.RHS(ty, cons));
559                              stms)
560                      | VAR x => mkAssign (x, cons) :: stms                      | VAR x => mkAssign (x, cons) :: stms
561                      | VEC xs => raise Fail "inconsistent"                      | VEC xs => raise Fail "inconsistent"
562                    (* end case *)                    (* end case *)
# Line 630  Line 633 
633                    val seq = T.E_Seq(es, ty)                    val seq = T.E_Seq(es, ty)
634                    in                    in
635                      case eqClassRepOf(env, lhs)                      case eqClassRepOf(env, lhs)
636                       of NOEQ => mkDefn (newMemLocal (env, lhs), seq) :: stms                       of NOEQ => if (V.useCount lhs > 1)
637                              then mkDefn (newMemLocal (env, lhs), seq) :: stms
638                              else (
639                                Env.bindVar (env, lhs, Env.RHS(ty, seq));
640                                stms)
641                        | VAR x => mkAssign (x, seq) :: stms                        | VAR x => mkAssign (x, seq) :: stms
642                        | VEC xs => raise Fail "inconsistent"                        | VEC xs => raise Fail "inconsistent"
643                      (* end case *)                      (* end case *)
# Line 663  Line 670 
670                    | Env.TREE e => e                    | Env.TREE e => e
671                    | _ => raise Fail("expected scalar binding for " ^ V.toString x)                    | _ => raise Fail("expected scalar binding for " ^ V.toString x)
672                  (* end case *))                  (* end case *))
673            (* analyze the CFG *)
674            val _ = UnifyVars.analyze cfg            val _ = UnifyVars.analyze cfg
675              val _ = AssignTypes.analyze cfg
676          (* join (stk, stms, k): handle a control-flow join, where env is the          (* join (stk, stms, k): handle a control-flow join, where env is the
677           * current environment, stk is the stack of open ifs (the top of stk specifies           * current environment, stk is the stack of open ifs (the top of stk specifies
678           * which branch we are in), stms are the TreeIL statements preceding the join           * which branch we are in), stms are the TreeIL statements preceding the join

Legend:
Removed from v.4091  
changed lines
  Added in v.4092

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