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 3955, Sun Jun 12 15:55:01 2016 UTC revision 4033, Thu Jun 23 14:09:17 2016 UTC
# Line 117  Line 117 
117      fun mkDefn (x, e) = T.S_Assign(true, x, e)      fun mkDefn (x, e) = T.S_Assign(true, x, e)
118      val zero = T.E_Lit(Literal.Real(RealLit.zero false))      val zero = T.E_Lit(Literal.Real(RealLit.zero false))
119    
120      (* turn an expression of type TensorTy to one of TensorTyRef *)
121        fun mkRef e = (case TreeTypeOf.exp e
122               of TTy.TensorTy(shp as _::_) => T.E_Op(TOp.TensorRef shp, [e])
123                | _ => e
124             (* end case *))
125    
126      fun cvtScalarTy Ty.BoolTy = TTy.BoolTy      fun cvtScalarTy Ty.BoolTy = TTy.BoolTy
127        | cvtScalarTy Ty.IntTy = TTy.IntTy        | cvtScalarTy Ty.IntTy = TTy.IntTy
128        | cvtScalarTy (Ty.TensorTy[]) = TTy.realTy        | cvtScalarTy (Ty.TensorTy[]) = TTy.realTy
# Line 189  Line 195 
195            fun expToArg (e, stms) = (case V.ty x            fun expToArg (e, stms) = (case V.ty x
196                   of Ty.TensorTy[d] => let                   of Ty.TensorTy[d] => let
197                        val layout = Env.layoutVec env d                        val layout = Env.layoutVec env d
198  (* QUESTION: can "e" be a complicated expression or are we guaranteed that it will just                        val e = mkRef e
  * be a memory reference?  
  *)  
199                        val es = List.tabulate (                        val es = List.tabulate (
200                              List.length(#pieces layout),                              List.length(#pieces layout),
201                              fn i => T.E_VLoad(layout, e, i))                              fn i => T.E_VLoad(layout, e, i))
# Line 344  Line 348 
348                    end                    end
349                | Op.VMapClamp n => bindVOp TOp.VMapClamp                | Op.VMapClamp n => bindVOp TOp.VMapClamp
350                | Op.VLerp n => bindVOp TOp.VLerp                | Op.VLerp n => bindVOp TOp.VLerp
351                | Op.TensorIndex(ty, idxs) => bindOp(TOp.TensorIndex(U.trType ty, idxs))                | Op.TensorIndex(Ty.TensorTy dd, idxs) => let
352                | Op.ProjectLast(ty, idxs) => bindOp(TOp.ProjectLast(U.trType ty, idxs))                    val (args, stms) = simpleArgs (env, args)
353                      in
354                        (Env.TREE(T.E_Op(TOp.TensorIndex(TTy.TensorRefTy dd, idxs), args)), stms)
355                      end
356                  | Op.ProjectLast(Ty.TensorTy dd, idxs) => let
357                      val (args, stms) = simpleArgs (env, args)
358                      in
359                        (Env.TREE(T.E_Op(TOp.ProjectLast(TTy.TensorRefTy dd, idxs), args)), stms)
360                      end
361                | Op.Select(ty, i) => bindOp (TOp.Select(U.trType ty, i))                | Op.Select(ty, i) => bindOp (TOp.Select(U.trType ty, i))
362                | Op.Subscript ty => bindOp (TOp.Subscript(U.trType ty))                | Op.Subscript ty => bindOp (TOp.Subscript(U.trType ty))
363                | Op.MkDynamic(ty, n) => bindOp (TOp.MkDynamic(U.trType ty, n))                | Op.MkDynamic(ty, n) => bindOp (TOp.MkDynamic(U.trType ty, n))
# Line 354  Line 366 
366                | Op.Concat ty => bindOp (TOp.Concat(U.trType ty))                | Op.Concat ty => bindOp (TOp.Concat(U.trType ty))
367                | Op.Range => bindOp TOp.Range                | Op.Range => bindOp TOp.Range
368                | Op.Length ty => bindOp (TOp.Length(U.trType ty))                | Op.Length ty => bindOp (TOp.Length(U.trType ty))
369                | Op.SphereQuery(ty1, ty2) => raise Fail "FIXME: SphereQuery"                | Op.SphereQuery(ty1, ty2) => bindOp (TOp.SphereQuery(U.trType ty1, U.trType ty2))
370                | Op.Sqrt => bindOp TOp.Sqrt                | Op.Sqrt => bindOp TOp.Sqrt
371                | Op.Cos => bindOp TOp.Cos                | Op.Cos => bindOp TOp.Cos
372                | Op.ArcCos => bindOp TOp.ArcCos                | Op.ArcCos => bindOp TOp.ArcCos
# Line 362  Line 374 
374                | Op.ArcSin => bindOp TOp.ArcSin                | Op.ArcSin => bindOp TOp.ArcSin
375                | Op.Tan => bindOp TOp.Tan                | Op.Tan => bindOp TOp.Tan
376                | Op.ArcTan => bindOp TOp.ArcTan                | Op.ArcTan => bindOp TOp.ArcTan
377                  | Op.Exp  => bindOp TOp.Exp
378                | Op.Ceiling 1 => bindOp TOp.RCeiling                | Op.Ceiling 1 => bindOp TOp.RCeiling
379                | Op.Ceiling d => bindVOp TOp.VCeiling                | Op.Ceiling d => bindVOp TOp.VCeiling
380                | Op.Floor 1 => bindOp TOp.RFloor                | Op.Floor 1 => bindOp TOp.RFloor
# Line 373  Line 386 
386                | Op.IntToReal => bindOp TOp.IntToReal                | Op.IntToReal => bindOp TOp.IntToReal
387                | Op.RealToInt 1 => bindOp TOp.RealToInt                | Op.RealToInt 1 => bindOp TOp.RealToInt
388                | Op.RealToInt d => let                | Op.RealToInt d => let
389                    val layout = Env.layoutVec env d                    val [v] = args
390                    val (_, args, stms) = vectorArg (env, hd args)                    val (layout, args, stms) = vectorArg (env, v)
391                    in                    in
392                      case #pieces layout                      case #pieces layout
393                       of [w] => (Env.TREE(T.E_Op(TOp.VToInt(d, w), args)), stms)                       of [w] => (Env.TREE(T.E_Op(TOp.VToInt(d, w), args)), stms)
# Line 433  Line 446 
446                    | VEC xs' => (case V.ty lhs                    | VEC xs' => (case V.ty lhs
447                         of Ty.TensorTy[d] => let                         of Ty.TensorTy[d] => let
448                              val layout = Env.layoutVec env d                              val layout = Env.layoutVec env d
449                                val rhs = mkRef rhs
450                              in                              in
451                                List.mapi                                List.mapi
452                                  (fn (i, x') => mkAssign(x', T.E_VLoad(layout, rhs, i)))                                  (fn (i, x') => mkAssign(x', T.E_VLoad(layout, rhs, i)))
# Line 465  Line 479 
479                    end                    end
480                | IR.VAR x => raise Fail "FIXME: VAR"                | IR.VAR x => raise Fail "FIXME: VAR"
481                | IR.LIT lit => bindSimple (T.E_Lit lit)                | IR.LIT lit => bindSimple (T.E_Lit lit)
482    (* FIXME: use the general IR.OP case for eigen-things, since the target info says that they
483     * are not inline.
484     *)
485                | IR.OP(Op.EigenVecs2x2, args) => assignOp (TOp.EigenVecs2x2, args)                | IR.OP(Op.EigenVecs2x2, args) => assignOp (TOp.EigenVecs2x2, args)
486                | IR.OP(Op.EigenVecs3x3, args) => assignOp (TOp.EigenVecs3x3, args)                | IR.OP(Op.EigenVecs3x3, args) => assignOp (TOp.EigenVecs3x3, args)
487                | IR.OP(Op.EigenVals2x2, args) => assignOp (TOp.EigenVals2x2, args)                | IR.OP(Op.EigenVals2x2, args) => assignOp (TOp.EigenVals2x2, args)
# Line 488  Line 505 
505                    end                    end
506                | IR.OP(rator, args) => let                | IR.OP(rator, args) => let
507                    val (rhs, stms) = trOp (env, rator, args)                    val (rhs, stms) = trOp (env, rator, args)
508                      val emitBind = (V.useCount lhs > 1) orelse not(Env.isInlineOp env rator)
509                    in                    in
510                      case (rhs, eqClassRepOf(env, lhs), V.useCount lhs > 1)                      case (rhs, eqClassRepOf(env, lhs), emitBind)
511                       of (_, NOEQ, false) => (Env.bindVar (env, lhs, rhs); stms)                       of (_, NOEQ, false) => (Env.bindVar (env, lhs, rhs); stms)
512    (* FIXME: if the rhs has TensorRef type, then we should make the lhs TensorRef too! *)
513                        | (Env.TREE e, NOEQ, true) => mkDefn'(newLocal(env, lhs), e) :: stms                        | (Env.TREE e, NOEQ, true) => mkDefn'(newLocal(env, lhs), e) :: stms
514                        | (Env.TREE e, VAR x', _) => mkAssign'(x', e) :: stms                        | (Env.TREE e, VAR x', _) => mkAssign'(x', e) :: stms
515                        | (Env.VEC(layout, es), NOEQ, true) => let                        | (Env.VEC(layout, es), NOEQ, true) => let
# Line 658  Line 677 
677                        end                        end
678                    | IR.MASSIGN{stm=([], Op.Print tys, xs), succ, ...} => let                    | IR.MASSIGN{stm=([], Op.Print tys, xs), succ, ...} => let
679                        val (es, stms') = singleArgs (env, xs)                        val (es, stms') = singleArgs (env, xs)
680                        val stm = T.S_Print(List.map U.trType tys, es)                      (* translate TensorTy to TensorRefTy in the type list *)
681                          fun trType (Ty.TensorTy(shp as _::_)) = TTy.TensorRefTy shp
682                            | trType ty = U.trType ty
683                          val tys = List.map trType tys
684                          val stm = T.S_Print(tys, List.map mkRef es)
685                        in                        in
686                          doNode (!succ, ifStk, stm :: List.revAppend (stms', stms))                          doNode (!succ, ifStk, stm :: List.revAppend (stms', stms))
687                        end                        end
# Line 742  Line 765 
765                      | T.S_IfThen(e, blk) => let                      | T.S_IfThen(e, blk) => let
766                          val (uG, nW) = chkExp (e, uG, nW)                          val (uG, nW) = chkExp (e, uG, nW)
767                          in                          in
768                            chkBlock (blk, uG, nW)                            next (chkBlock (blk, uG, nW))
769                          end                          end
770                      | T.S_IfThenElse(e, blk1, blk2) => let                      | T.S_IfThenElse(e, blk1, blk2) => let
771                          val (uG, nW) = chkExp (e, uG, nW)                          val (uG, nW) = chkExp (e, uG, nW)
772                          val (uG, nW) = chkBlock (blk1, uG, nW)                          val (uG, nW) = chkBlock (blk1, uG, nW)
773                          in                          in
774                            chkBlock (blk2, uG, nW)                            next (chkBlock (blk2, uG, nW))
775                          end                          end
776                      | T.S_For(_, e1, e2, blk) => let                      | T.S_For(_, e1, e2, blk) => let
777                          val (uG, nW) = chkExp (e1, uG, nW)                          val (uG, nW) = chkExp (e1, uG, nW)
778                          val (uG, nW) = chkExp (e2, uG, nW)                          val (uG, nW) = chkExp (e2, uG, nW)
779                          in                          in
780                            chkBlock (blk, uG, nW)                            next (chkBlock (blk, uG, nW))
781                          end                          end
782                      | T.S_Foreach(_, e, blk) => let                      | T.S_Foreach(_, e, blk) => let
783                          val (uG, nW) = chkExp (e, uG, nW)                          val (uG, nW) = chkExp (e, uG, nW)
784                          in                          in
785                            chkBlock (blk, uG, nW)                            next (chkBlock (blk, uG, nW))
786                          end                          end
787                      | T.S_LoadNrrd _ => raise Fail "unexpected LoadNrrd"                      | T.S_LoadNrrd _ => raise Fail "unexpected LoadNrrd"
788                      | T.S_Input _ => raise Fail "unexpected Input"                      | T.S_Input _ => raise Fail "unexpected Input"
# Line 777  Line 800 
800                  in                  in
801                    chkExps (es, uG, nW)                    chkExps (es, uG, nW)
802                  end                  end
803            and chkExp (T.E_Global _, uG, nW) = (true, nW)            and chkExp (T.E_Global gv, _, nW) = (true, nW)
804              | chkExp (T.E_State(SOME e, _), uG, nW) =              | chkExp (T.E_State(SOME e, _), uG, nW) = chkExp (e, uG, nW)
                 chkExp (e, uG, nW)  
805              | chkExp (T.E_Op(TOp.SphereQuery _, es), uG, nW) = chkExps (es, uG, true)              | chkExp (T.E_Op(TOp.SphereQuery _, es), uG, nW) = chkExps (es, uG, true)
806              | chkExp (T.E_Op(_, es), uG, nW) = chkExps (es, uG, nW)              | chkExp (T.E_Op(_, es), uG, nW) = chkExps (es, uG, nW)
807              | chkExp (T.E_Vec(_, _, es), uG, nW) = chkExps (es, uG, nW)              | chkExp (T.E_Vec(_, _, es), uG, nW) = chkExps (es, uG, nW)
# Line 822  Line 844 
844          (* first step is to flatten any nested CONS nodes *)          (* first step is to flatten any nested CONS nodes *)
845            val prog = Flatten.transform prog            val prog = Flatten.transform prog
846            val LowIR.Program{            val LowIR.Program{
847                    props, consts, inputs, constInit, globals, globalInit, strand, create, update                    props, consts, inputs, constInit, globals,
848                      globInit, strand, create, init, update
849                  } = prog                  } = prog
850            val trCFG = trCFG info            val trCFG = trCFG info
851            in            in
# Line 833  Line 856 
856                  inputs = List.map (Inputs.map mkGlobalVar) inputs,                  inputs = List.map (Inputs.map mkGlobalVar) inputs,
857                  constInit = trCFG constInit,                  constInit = trCFG constInit,
858                  globals = List.map mkGlobalVar globals,                  globals = List.map mkGlobalVar globals,
859                  globalInit = trCFG globalInit,                  globInit = trCFG globInit,
860                  strand = trStrand info strand,                  strand = trStrand info strand,
861                  create = let                  create = let
862                    val IR.Create{dim, code} = create                    val IR.Create{dim, code} = create
863                    in                    in
864                      T.Create{dim = dim, code = trCFG code}                      T.Create{dim = dim, code = trCFG code}
865                    end,                    end,
866                    init = Option.map trCFG init,
867                  update = Option.map trCFG update                  update = Option.map trCFG update
868                }                }
869            end            end

Legend:
Removed from v.3955  
changed lines
  Added in v.4033

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