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

SCM Repository

[diderot] Diff of /branches/vis15/src/compiler/simplify/simplify.sml
ViewVC logotype

Diff of /branches/vis15/src/compiler/simplify/simplify.sml

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

revision 3464, Sun Nov 29 17:38:34 2015 UTC revision 3465, Sun Nov 29 20:04:16 2015 UTC
# Line 163  Line 163 
163              | AST.S_Decl(x, NONE) => let              | AST.S_Decl(x, NONE) => let
164                  val x' = cvtVar x                  val x' = cvtVar x
165                  in                  in
166  (* QUESTION: where do we declare x? *)                    S.S_Var(x', NONE) :: stms
                   stms  
167                  end                  end
168              | AST.S_Decl(x, SOME e) => let              | AST.S_Decl(x, SOME e) => let
169                  val (stms, e') = simplifyExp (errStrm, e, stms)                  val (stms, e') = simplifyExp (errStrm, e, stms)
170                  val x' = cvtVar x                  val x' = cvtVar x
171                  in                  in
172                    S.S_Assign(x', e') :: stms                    S.S_Var(x', SOME e') :: stms
173                  end                  end
174              | AST.S_IfThenElse(e, s1, s2) => let              | AST.S_IfThenElse(e, s1, s2) => let
175                  val (stms, x) = simplifyExpToVar (errStrm, e, stms)                  val (stms, x) = simplifyExpToVar (errStrm, e, stms)
# Line 233  Line 232 
232                     of Var.BasisVar => let                     of Var.BasisVar => let
233                          val ty = cvtTy(Var.monoTypeOf x)                          val ty = cvtTy(Var.monoTypeOf x)
234                          val x' = newTemp ty                          val x' = newTemp ty
235                          val stm = S.S_Assign(x', S.E_Prim(x, [], [], ty))                          val stm = S.S_Var(x', SOME(S.E_Prim(x, [], [], ty)))
236                          in                          in
237                            (stm::stms, S.E_Var x')                            (stm::stms, S.E_Var x')
238                          end                          end
# Line 260  Line 259 
259                            val (bodyStms, bodyResult) = simplifyExpToVar (errStrm, e, [])                            val (bodyStms, bodyResult) = simplifyExpToVar (errStrm, e, [])
260                            val acc = SimpleVar.new ("accum", Var.LocalVar, cvtTy ty)                            val acc = SimpleVar.new ("accum", Var.LocalVar, cvtTy ty)
261                            val seqTy' as STy.T_Sequence(elemTy, NONE) = cvtTy seqTy                            val seqTy' as STy.T_Sequence(elemTy, NONE) = cvtTy seqTy
262                            val initStm = S.S_Assign(acc, S.E_Lit init)                            val initStm = S.S_Var(acc, SOME(S.E_Lit init))
263                            val updateStm = S.S_Assign(acc,                            val updateStm = S.S_Assign(acc,
264                                  S.E_Prim(rator, mvs, [acc, bodyResult], seqTy'))                                  S.E_Prim(rator, mvs, [acc, bodyResult], seqTy'))
265                            val foreachStm = S.S_Foreach(cvtVar x, xs, mkBlock(updateStm :: bodyStms))                            val foreachStm = S.S_Foreach(cvtVar x, xs, mkBlock(updateStm :: bodyStms))
# Line 270  Line 269 
269                          else doPrimApply (rator, tyArgs, args, ty)                          else doPrimApply (rator, tyArgs, args, ty)
270                      | AST.E_ParallelMap(e', x, xs, _) =>                      | AST.E_ParallelMap(e', x, xs, _) =>
271                          if Basis.isReductionOp rator                          if Basis.isReductionOp rator
272                            then raise Fail "FIXME"                            then let
273                              (* parallel map-reduce *)
274                                val result = SimpleVar.new ("res", Var.LocalVar, cvtTy ty)
275                                val (bodyStms, bodyResult) = simplifyExpToVar (errStrm, e', [])
276                                val (func, args) = Util.makeFunction(
277                                      Var.nameOf rator, mkBlock(S.S_Return bodyResult :: bodyStms),
278                                      SimpleVar.typeOf bodyResult)
279                                val mapReduceStm = S.S_MapReduce{
280                                        results = [result],
281                                        reductions = [rator],
282                                        body = func,
283                                        args = args,
284                                        source = xs
285                                      }
286                                in
287                                  (mapReduceStm :: stms, S.E_Var result)
288                                end
289                            else raise Fail "unsupported operation on parallel map"                            else raise Fail "unsupported operation on parallel map"
290                      | _ => doPrimApply (rator, tyArgs, args, ty)                      | _ => doPrimApply (rator, tyArgs, args, ty)
291                    (* end case *))                    (* end case *))
# Line 289  Line 304 
304                    val (bodyStms, bodyResult) = simplifyExpToVar (errStrm, e, [])                    val (bodyStms, bodyResult) = simplifyExpToVar (errStrm, e, [])
305                    val seqTy' as STy.T_Sequence(elemTy, NONE) = cvtTy seqTy                    val seqTy' as STy.T_Sequence(elemTy, NONE) = cvtTy seqTy
306                    val acc = SimpleVar.new ("accum", Var.LocalVar, seqTy')                    val acc = SimpleVar.new ("accum", Var.LocalVar, seqTy')
307                    val initStm = S.S_Assign(acc, S.E_Seq([], seqTy'))                    val initStm = S.S_Var(acc, SOME(S.E_Seq([], seqTy')))
308                    val updateStm = S.S_Assign(acc,                    val updateStm = S.S_Assign(acc,
309                          S.E_Prim(BasisVars.at_dT, [S.TY elemTy], [acc, bodyResult], seqTy'))                          S.E_Prim(BasisVars.at_dT, [S.TY elemTy], [acc, bodyResult], seqTy'))
310                    val foreachStm = S.S_Foreach(cvtVar x, xs, mkBlock(updateStm :: bodyStms))                    val foreachStm = S.S_Foreach(cvtVar x, xs, mkBlock(updateStm :: bodyStms))
# Line 323  Line 338 
338                | AST.E_Cond(e1, e2, e3, ty) => let                | AST.E_Cond(e1, e2, e3, ty) => let
339                  (* a conditional expression gets turned into an if-then-else statememt *)                  (* a conditional expression gets turned into an if-then-else statememt *)
340                    val result = newTemp(cvtTy ty)                    val result = newTemp(cvtTy ty)
341                    val (stms, x) = simplifyExpToVar (errStrm, e1, S.S_Var result :: stms)                    val (stms, x) = simplifyExpToVar (errStrm, e1, S.S_Var(result, NONE) :: stms)
342                    fun simplifyBranch e = let                    fun simplifyBranch e = let
343                          val (stms, e) = simplifyExp (errStrm, e, [])                          val (stms, e) = simplifyExp (errStrm, e, [])
344                          in                          in
# Line 351  Line 366 
366                    val result = newTemp dstTy                    val result = newTemp dstTy
367                    val rhs = S.E_Coerce{srcTy = cvtTy srcTy, dstTy = dstTy, x = x}                    val rhs = S.E_Coerce{srcTy = cvtTy srcTy, dstTy = dstTy, x = x}
368                    in                    in
369                      (S.S_Assign(result, rhs)::stms, S.E_Var result)                      (S.S_Var(result, SOME rhs)::stms, S.E_Var result)
370                    end                    end
371              (* end case *)              (* end case *)
372            end            end
# Line 364  Line 379 
379                | _ => let                | _ => let
380                    val x = newTemp (S.typeOf e)                    val x = newTemp (S.typeOf e)
381                    in                    in
382                      (S.S_Assign(x, e)::stms, x)                      (S.S_Var(x, SOME e)::stms, x)
383                    end                    end
384              (* end case *)              (* end case *)
385            end            end
# Line 391  Line 406 
406                      | SOME e => let                      | SOME e => let
407                          val (stms, e') = simplifyExp (errStrm, e, stms)                          val (stms, e') = simplifyExp (errStrm, e, stms)
408                          in                          in
409                            simplifyState (r, x'::xs, S.S_Assign(x', e') :: stms)                            simplifyState (r, x'::xs, S.S_Var(x', SOME e') :: stms)
410                          end                          end
411                    (* end case *)                    (* end case *)
412                  end                  end

Legend:
Removed from v.3464  
changed lines
  Added in v.3465

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