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 3852, Fri May 13 15:00:57 2016 UTC revision 3853, Fri May 13 18:14:10 2016 UTC
# Line 64  Line 64 
64      val {getFn = getStateVar, ...} = SV.newProp mkStateVar      val {getFn = getStateVar, ...} = SV.newProp mkStateVar
65      end      end
66    
67      (* for variables that are in an equivalence class (see UnifyVars), we use a single
68       * TreeIR variable (or vector of variables) to represent them.
69       *)
70        datatype eq_var_rep = NOEQ | VAR of TV.t | VEC of TV.t list
71        local
72          val {peekFn : IR.var -> eq_var_rep option, setFn, ...} =
73                V.newProp (fn x => raise Fail(V.toString x))
74        in
75        fun eqClassRepOf (env, x) = (case UnifyVars.eqClassOf x
76               of SOME x' => (case peekFn x'
77                     of SOME b => b
78                      | NONE => let
79                          val rep = (case V.ty x'
80                                 of Ty.TensorTy[d] => VEC(Util.newVectorVars(Env.layoutVec env d))
81                                  | ty => VAR(Util.newLocalVar x)
82                                (* end case *))
83                          in
84                            setFn (x, rep);
85                            rep
86                          end
87                    (* end case *))
88                | NONE => NOEQ
89              (* end case *))
90        end
91    
92      fun mkBlock stms = T.Block{locals = ref [], body = stms}      fun mkBlock stms = T.Block{locals = ref [], body = stms}
93      fun mkIf (x, stms, []) = T.S_IfThen(x, mkBlock stms)      fun mkIf (x, stms, []) = T.S_IfThen(x, mkBlock stms)
94        | mkIf (x, stms1, stms2) = T.S_IfThenElse(x, mkBlock stms1, mkBlock stms2)        | mkIf (x, stms1, stms2) = T.S_IfThenElse(x, mkBlock stms1, mkBlock stms2)
# Line 178  Line 203 
203                | Op.VClamp n => bindVOp TOp.VClamp                | Op.VClamp n => bindVOp TOp.VClamp
204                | Op.VMapClamp n => bindVOp TOp.VMapClamp                | Op.VMapClamp n => bindVOp TOp.VMapClamp
205                | Op.VLerp n => bindVOp TOp.VLerp                | Op.VLerp n => bindVOp TOp.VLerp
206                | Op.TensorIndex(ty, idxs) => ??                | Op.TensorIndex(ty, idxs) => bindOp(TOp.TensorIndex(Util.trType ty, idxs))
207                | Op.ProjectLast(ty, idxs) => ??                | Op.ProjectLast(ty, idxs) => bindOp(TOp.ProjectLast(Util.trType ty, idxs))
208                | Op.Zero ty => ??                | Op.Zero ty => bindOp (TOp.Zero(Util.trType ty))
209                | Op.Select(Ty.TupleTy tys, i) => ??                | Op.Select(ty, i) => bindOp (TOp.Select(Util.trType ty, i))
210                | Op.Subscript(Ty.SeqTy(ty, NONE)) => ??                | Op.Subscript ty => bindOp (TOp.Subscript(Util.trType ty))
211                | Op.Subscript(Ty.SeqTy(ty, SOME _)) => ??                | Op.MkDynamic(ty, n) => bindOp (TOp.MkDynamic(Util.trType ty, n))
212                | Op.MkDynamic(ty, n) => ??                | Op.Append ty => bindOp (TOp.Append(Util.trType ty))
213                | Op.Append ty => ??                | Op.Prepend ty => bindOp (TOp.Prepend(Util.trType ty))
214                | Op.Prepend ty => ??                | Op.Concat ty => bindOp (TOp.Concat(Util.trType ty))
215                | Op.Concat ty => ??                | Op.Range => bindOp TOp.Range
216                | Op.Range => ??                | Op.Length ty => bindOp (TOp.Length(Util.trType ty))
               | Op.Length ty => ??  
217                | Op.SphereQuery(ty1, ty2) => raise Fail "FIXME: SphereQuery"                | Op.SphereQuery(ty1, ty2) => raise Fail "FIXME: SphereQuery"
218                | Op.Sqrt => bindOp TOp.Sqrt                | Op.Sqrt => bindOp TOp.Sqrt
219                | Op.Cos => bindOp TOp.Cos                | Op.Cos => bindOp TOp.Cos
# Line 208  Line 232 
232                | Op.Trunc d => bindVOp TOp.Trunc                | Op.Trunc d => bindVOp TOp.Trunc
233                | Op.IntToReal => bindOp TOp.IntToReal                | Op.IntToReal => bindOp TOp.IntToReal
234                | Op.RealToInt 1 => bindOp (TOp.RealToInt 1)                | Op.RealToInt 1 => bindOp (TOp.RealToInt 1)
235                | Op.RealToInt d => ??                | Op.RealToInt d => Env.TREE(T.E_Op(TOp.RealToInt d, List.map (singleArg env) args))
236  (* FIXME  (* FIXME
237                | Op.R_All ty => ??                | Op.R_All ty => ??
238                | Op.R_Exists ty => ??                | Op.R_Exists ty => ??
# Line 225  Line 249 
249                | Op.LoadVoxel info => bindOp (TOp.LoadVoxel info)                | Op.LoadVoxel info => bindOp (TOp.LoadVoxel info)
250                | Op.Inside(info, s) => bindOp (TOp.Inside(info, s))                | Op.Inside(info, s) => bindOp (TOp.Inside(info, s))
251                | Op.ImageDim(info, d) => bindOp(TOp.ImageDim(info, d))                | Op.ImageDim(info, d) => bindOp(TOp.ImageDim(info, d))
252                | Op.LoadSeq(ty, file) => ??                | Op.LoadSeq(ty, file) => bindOp(TOp.LoadSeq(Util.trType ty, file))
253                | Op.LoadImage(ty, file) => ??                | Op.LoadImage(ty, file) => bindOp(TOp.LoadImage(Util.trType ty, file))
254                | Op.MathFn f => bindOp (TOp.MathFn f)                | Op.MathFn f => bindOp (TOp.MathFn f)
255                | rator => raise Fail("bogus operator " ^ Op.toString srcRator)                | rator => raise Fail("bogus operator " ^ Op.toString srcRator)
256              (* end case *)              (* end case *)
# Line 243  Line 267 
267          (* simple binding for lhs variable; we check to see if it is part of an merged          (* simple binding for lhs variable; we check to see if it is part of an merged
268           * equivalence class, in which case we need to generate the assigment.           * equivalence class, in which case we need to generate the assigment.
269           *)           *)
270            fun bindSimple rhs = (case UnifyVars.eqClassOf lhs            fun bindSimple rhs = (case eqClassRepOf(env, lhs)
271                   of SOME x => [T.S_Assign(x', rhs)]                   of NOEQ =>(Env.bindSimple (env, lhs, Env.TREE rhs); [])
272                    | NONE => (Env.bindSimple (env, lhs, Env.TREE rhs); [])                    | VAR x' => [T.S_Assign(x', rhs)]
273                      | VEC _ => raise Fail "unexpected VEC"
274                  (* end case *))                  (* end case *))
275            fun assignOp (rator, args) = let            fun assignOp (rator, args) = let
276  (* FIXME: what if lhs is EqClass var? *)  (* FIXME: what if lhs is EqClass var? *)
# Line 275  Line 300 
300                    val rhs = trOp (env, rator, args)                    val rhs = trOp (env, rator, args)
301                    in                    in
302                      if Env.isInlineOp env rator                      if Env.isInlineOp env rator
303                        then (case (rhs, UnifyVars.eqClassOf lhs, useCount lhs > 1)                        then (case (rhs, eqClassRepOf(env, lhs), V.useCount lhs > 1)
304                            of (_, NONE, false) => (Env.bindSimple (env, lhs, rhs); [])                            of (_, NOEQ, false) => (Env.bindSimple (env, lhs, rhs); [])
305                             | (Env.TREE e, NONE, true) => let                             | (Env.TREE e, NOEQ, true) => let
306                                  val t = Util.newLocalVar lhs                                  val t = Util.newLocalVar lhs
307                                  in                                  in
308                                    Env.bindSimple (env, lhs, Env.TREE(T.E_Var t));                                    Env.bindSimple (env, lhs, Env.TREE(T.E_Var t));
309                                    [T.S_Assign(t, e)]                                    [T.S_Assign(t, e)]
310                                  end                                  end
311                             | (Env.TREE e, SOME x, _) => [T.S_Assign(x', e)]                             | (Env.TREE e, VAR x', _) => [T.S_Assign(x', e)]
312                             | (Env.VEC(layout, es), NONE, true) => let                             | (Env.VEC(layout, es), NOEQ, true) => let
313                                  val vs = Util.newVectorVars layout                                  val vs = Util.newVectorVars layout
314                                  in                                  in
315                                    Env.bindSimple (env, lhs, Env.VEC(layout, List.map T.E_Var vs));                                    Env.bindSimple (env, lhs, Env.VEC(layout, List.map T.E_Var vs));
316                                    ListPair.mapEq T.S_Assign (vs, es)                                    ListPair.mapEq T.S_Assign (vs, es)
317                                  end                                  end
318                             | (Env.VEC(layout, es), SOME x, _) => ??                             | (Env.VEC(layout, es), VEC xs, _) => ??
319                               | _ => raise Fail "inconsistent"
320                           (* end case *))                           (* end case *))
321                        else ??                        else ??
322                    end                    end

Legend:
Removed from v.3852  
changed lines
  Added in v.3853

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