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 3857, Sat May 14 14:13:04 2016 UTC revision 3858, Sat May 14 17:13:59 2016 UTC
# Line 120  Line 120 
120        | cvtScalarTy (Ty.TensorTy[]) = TTy.realTy        | cvtScalarTy (Ty.TensorTy[]) = TTy.realTy
121        | cvtScalarTy ty = raise Fail(concat["cvtScalarTy(", Ty.toString ty, ")"])        | cvtScalarTy ty = raise Fail(concat["cvtScalarTy(", Ty.toString ty, ")"])
122    
123      (* define a new local variable and bind x to it. *)
124        fun newLocal (env, x) = let
125              val x' = Util.newLocalVar x
126              in
127                Env.bindSimple (env, x, Env.TREE(T.E_Var x'));
128                x'
129              end
130    
131    (* get a variable's binding as a single argument expression.  This means that    (* get a variable's binding as a single argument expression.  This means that
132     * if x is bound to a vector of expressions, then we need to pack it.     * if x is bound to a vector of expressions, then we need to pack it.
133     *)     *)
# Line 170  Line 178 
178            end            end
179    
180      fun trOp (env, srcRator, args) = let      fun trOp (env, srcRator, args) = let
 (* FIXME: if the use count of lhs is > 1, then we should bind to a local variable *)  
181            fun bindOp rator = Env.TREE(T.E_Op(rator, List.map (scalarArg env) args))            fun bindOp rator = Env.TREE(T.E_Op(rator, List.map (scalarArg env) args))
182            fun bindVOp rator = let            fun bindVOp rator = let
183                  val (layout, argss) = vectorArgs (env, args)                  val (layout, argss) = vectorArgs (env, args)
# Line 233  Line 240 
240                    val ({pieces, ...}, es) = vectorArg (env, v)                    val ({pieces, ...}, es) = vectorArg (env, v)
241                    fun select (i, w::ws, e::es) =                    fun select (i, w::ws, e::es) =
242                          if (i < w)                          if (i < w)
 (* FIXME: what if lhs is used more than once? *)  
243                            then Env.TREE(T.E_Op(TOp.VIndex(w, i), [e]))                            then Env.TREE(T.E_Op(TOp.VIndex(w, i), [e]))
244                            else select (i-w, ws, es)                            else select (i-w, ws, es)
245                      | select _ = raise Fail("bogus " ^ Op.toString srcRator)                      | select _ = raise Fail("bogus " ^ Op.toString srcRator)
# Line 322  Line 328 
328                    | VAR x' => [mkAssign(x', rhs)]                    | VAR x' => [mkAssign(x', rhs)]
329                    | VEC _ => raise Fail "unexpected VEC"                    | VEC _ => raise Fail "unexpected VEC"
330                  (* end case *))                  (* end case *))
331            fun assignOp (rator, args) = let            fun assignOp (rator, args) = (case eqClassRepOf(env, lhs)
332  (* FIXME: what if lhs is EqClass var? *)                   of NOEQ =>
333                  val t = Util.newLocalVar lhs                        [mkDefn(newLocal (env, lhs), T.E_Op(rator, List.map (scalarArg env) args))]
334                  val stm = mkDefn(t, T.E_Op(rator, List.map (scalarArg env) args))                    | VAR x' => [mkAssign(x', T.E_Op(rator, List.map (scalarArg env) args))]
335                  in                    | VEC _ => raise Fail "unexpected VEC"
336                    Env.bindSimple (env, lhs, Env.TREE(T.E_Var t));                  (* end case *))
                   [stm]  
                 end  
337            in            in
338              case rhs              case rhs
339               of IR.GLOBAL x => bindSimple (T.E_Global(mkGlobalVar x))               of IR.GLOBAL x => bindSimple (T.E_Global(mkGlobalVar x))
# Line 349  Line 353 
353                    in                    in
354                      case (rhs, eqClassRepOf(env, lhs), needAssignment)                      case (rhs, eqClassRepOf(env, lhs), needAssignment)
355                       of (_, NOEQ, false) => (Env.bindSimple (env, lhs, rhs); [])                       of (_, NOEQ, false) => (Env.bindSimple (env, lhs, rhs); [])
356                        | (Env.TREE e, NOEQ, true) => let                        | (Env.TREE e, NOEQ, true) => [mkDefn(newLocal(env, lhs), e)]
                           val t = Util.newLocalVar lhs  
                           in  
                             Env.bindSimple (env, lhs, Env.TREE(T.E_Var t));  
                             [mkDefn(t, e)]  
                           end  
357                        | (Env.TREE e, VAR x', _) => [mkAssign(x', e)]                        | (Env.TREE e, VAR x', _) => [mkAssign(x', e)]
358                        | (Env.VEC(layout, es), NOEQ, true) => let                        | (Env.VEC(layout, es), NOEQ, true) => let
359                            val vs = Util.newVectorVars layout                            val vs = Util.newVectorVars layout
# Line 369  Line 368 
368                | IR.CONS(args, Ty.TensorTy[d]) => let                | IR.CONS(args, Ty.TensorTy[d]) => let
369                    val layout = Env.layoutVec env d                    val layout = Env.layoutVec env d
370                    fun mkVecs (args, w::ws) = let                    fun mkVecs (args, w::ws) = let
371  (* FIXME: what about padding? *)                        (* take arguments from args to build a vector value of width w; pad as
372                           * necessary.
373                           *)
374                          fun take (0, args, es) = T.E_Vec(List.rev es) :: mkVecs (args, ws)                          fun take (0, args, es) = T.E_Vec(List.rev es) :: mkVecs (args, ws)
375                            | take (i, [], es) = if #padded layout andalso null ws                            | take (i, [], es) = if #padded layout andalso null ws
376                                then let                                then let
# Line 398  Line 399 
399                        | _ => raise Fail "inconsistent"                        | _ => raise Fail "inconsistent"
400                      (* end case *)                      (* end case *)
401                    end                    end
402                | IR.CONS(args, Ty.TensorTy shape) => raise Fail "FIXME: CONS"                | IR.CONS(args, ty) => [
403                | IR.SEQ(args, ty) => raise Fail "FIXME: SEQ"                      mkDefn (
404                          newLocal(env, lhs),
405                          T.E_Cons(List.map (singleArg env) args, Util.trType ty))
406                      ]
407                  | IR.SEQ(args, ty) => [
408                        mkDefn (
409                          newLocal(env, lhs),
410                          T.E_Seq(List.map (singleArg env) args, Util.trType ty))
411                      ]
412                | rhs => raise Fail(concat["unexpected ", IR.RHS.toString rhs, " in LowIR code"])                | rhs => raise Fail(concat["unexpected ", IR.RHS.toString rhs, " in LowIR code"])
413              (* end case *)              (* end case *)
414            end            end
# Line 495  Line 504 
504                          doNode (!succ, ifStk, stms' @ stms)                          doNode (!succ, ifStk, stms' @ stms)
505                        end                        end
506                    | IR.MASSIGN{stm=(ys, rator, xs), succ, ...} => let                    | IR.MASSIGN{stm=(ys, rator, xs), succ, ...} => let
507                        fun doLHSVar (y, ys) = let                        fun doLHSVar (y, ys) = newLocal (env, y) :: ys
                             val t = Util.newLocalVar y  
                             in  
                               Env.bindSimple (env, y, Env.TREE(T.E_Var t));  
                               t::ys  
                             end  
508                        val ys = List.foldr doLHSVar [] ys                        val ys = List.foldr doLHSVar [] ys
509                        val rator = (case rator                        val rator = (case rator
510                               of Op.Print tys => TOp.Print(List.map Util.trType tys)                               of Op.Print tys => TOp.Print(List.map Util.trType tys)

Legend:
Removed from v.3857  
changed lines
  Added in v.3858

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