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 3924, Fri Jun 3 17:30:27 2016 UTC revision 3941, Wed Jun 8 19:10:45 2016 UTC
# Line 130  Line 130 
130            end            end
131    
132    (* 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
133     * 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.  Since
134       * Pack gets translated to an array, we need to create a new temp.
135     *)     *)
136      fun singleArg env x = (case useVar env x      fun singleArg env x = (case useVar env x
137             of Env.TREE e => e             of Env.TREE e => (e, [])
138              | Env.VEC(layout, es) => T.E_Pack(layout, es)              | Env.VEC(layout, es) => let
139                    val tmp = Util.newTempVar("_arg", TTy.TensorTy[#wid layout])
140                    in
141                      (T.E_Var tmp, [T.S_Assign(true, tmp, T.E_Pack(layout, es))])
142                    end
143            (* end case *))            (* end case *))
144    
145        fun singleArgs (env, es) = let
146              fun doArg (e, (es, stms)) = let
147                    val (e', stms') = singleArg env e
148                    in
149                      (e'::es, stms'@stms)
150                    end
151              in
152                List.foldr doArg ([], []) es
153              end
154    
155      fun simpleArg env x = (case useVar env x      fun simpleArg env x = (case useVar env x
156             of Env.TREE e => e             of Env.TREE e => e
157              | _ => raise Fail("expected simple binding for " ^ IR.Var.toString x)              | _ => raise Fail("expected simple binding for " ^ IR.Var.toString x)
# Line 435  Line 450 
450                        | _ => raise Fail "inconsistent"                        | _ => raise Fail "inconsistent"
451                      (* end case *)                      (* end case *)
452                    end                    end
453                | IR.CONS(args, ty) => [                | IR.CONS(args, ty) => let
454                      mkDefn (                    val (es, stms) = singleArgs (env, args)
455                        newLocal(env, lhs),                    in
456                        T.E_Cons(List.map (singleArg env) args, Util.trType ty))                      stms @ [mkDefn (newLocal(env, lhs), T.E_Cons(es, Util.trType ty))]
457                    ]                    end
458                | IR.SEQ(args, ty) => [                | IR.SEQ(args, ty) => let
459                      mkDefn (                    val (es, stms) = singleArgs (env, args)
460                        newLocal(env, lhs),                    in
461                        T.E_Seq(List.map (singleArg env) args, Util.trType ty))                      stms @ [mkDefn (newLocal(env, lhs), T.E_Seq(es, Util.trType ty))]
462                    ]                    end
463                | rhs => raise Fail(concat["unexpected ", IR.RHS.toString rhs, " in LowIR code"])                | rhs => raise Fail(concat["unexpected ", IR.RHS.toString rhs, " in LowIR code"])
464              (* end case *)              (* end case *)
465            end            end
# Line 546  Line 561 
561                          doNode (!succ, ifStk, stms' @ stms)                          doNode (!succ, ifStk, stms' @ stms)
562                        end                        end
563                    | IR.MASSIGN{stm=([], Op.Print tys, xs), succ, ...} => let                    | IR.MASSIGN{stm=([], Op.Print tys, xs), succ, ...} => let
564                        val stm = T.S_Print(List.map Util.trType tys, List.map (singleArg env) xs)                        val (es, stms') = singleArgs (env, xs)
565                          val stm = T.S_Print(List.map Util.trType tys, es)
566                        in                        in
567                          doNode (!succ, ifStk, stm :: stms)                          doNode (!succ, ifStk, stm :: List.revAppend (stms', stms))
568                        end                        end
569                    | IR.MASSIGN{stm=(ys, rator, xs), succ, ...} => raise Fail(concat[                    | IR.MASSIGN{stm=(ys, rator, xs), succ, ...} => raise Fail(concat[
570                          "unexepected operator ", Op.toString rator, " for MASSIGN"                          "unexepected operator ", Op.toString rator, " for MASSIGN"
571                        ])                        ])
572                    | IR.GASSIGN{lhs, rhs, succ, ...} => let                    | IR.GASSIGN{lhs, rhs, succ, ...} => let
573                        val stm = T.S_GAssign(mkGlobalVar lhs, singleArg env rhs)                        val (e', stms') = singleArg env rhs
574                          val stm = T.S_GAssign(mkGlobalVar lhs, e')
575                        in                        in
576                          doNode (!succ, ifStk, stm::stms)                          doNode (!succ, ifStk, stm :: stms' @ stms)
577                        end                        end
578                    | IR.NEW{strand, args, succ, ...} => let                    | IR.NEW{strand, args, succ, ...} => let
579                        val stm = T.S_New(strand, List.map (singleArg env) args)                        val (es, stms') = singleArgs (env, args)
580                          val stm = T.S_New(strand, es)
581                        in                        in
582                          doNode (!succ, ifStk, stm::stms)                          doNode (!succ, ifStk, stm :: List.revAppend (stms', stms))
583                        end                        end
584                    | IR.SAVE{lhs, rhs, succ, ...} => let                    | IR.SAVE{lhs, rhs, succ, ...} => let
585                        val stm = T.S_Save(getStateVar lhs, singleArg env rhs)                        val (e', stms') = singleArg env rhs
586                          val stm = T.S_Save(getStateVar lhs, e')
587                        in                        in
588                          doNode (!succ, ifStk, stm::stms)                          doNode (!succ, ifStk, stm :: stms' @ stms)
589                        end                        end
590                    | k as IR.EXIT{kind, succ, ...} => (case (!succ, kind)                    | k as IR.EXIT{kind, succ, ...} => (case (!succ, kind)
591                         of (NONE, ExitKind.RETURN) => mkBlock (List.rev(T.S_Exit :: stms))                         of (NONE, ExitKind.RETURN) => mkBlock (List.rev(T.S_Exit :: stms))

Legend:
Removed from v.3924  
changed lines
  Added in v.3941

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