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 4349, Tue Aug 2 18:14:48 2016 UTC revision 4359, Thu Aug 4 01:30:23 2016 UTC
# Line 32  Line 32 
32      structure Ty = Types      structure Ty = Types
33      structure VMap = Var.Map      structure VMap = Var.Map
34      structure II = ImageInfo      structure II = ImageInfo
35        structure BV = BasisVars
36    
37    (* convert a Types.ty to a SimpleTypes.ty *)    (* convert a Types.ty to a SimpleTypes.ty *)
38      fun cvtTy ty = (case ty      fun cvtTy ty = (case ty
# Line 187  Line 188 
188    
189      and simplifyExp (errStrm, exp, stms) = let      and simplifyExp (errStrm, exp, stms) = let
190            fun doBorderCtl (f, args) = let            fun doBorderCtl (f, args) = let
191                  val (ctl, arg) = if Var.same(BasisVars.image_border, f)                  val (ctl, arg) = if Var.same(BV.image_border, f)
192                          then (BorderCtl.Default(hd args), hd(tl args))                          then (BorderCtl.Default(hd args), hd(tl args))
193                        else if Var.same(BasisVars.image_clamp, f)                        else if Var.same(BV.image_clamp, f)
194                          then (BorderCtl.Clamp, hd args)                          then (BorderCtl.Clamp, hd args)
195                        else if Var.same(BasisVars.image_mirror, f)                        else if Var.same(BV.image_mirror, f)
196                          then (BorderCtl.Mirror, hd args)                          then (BorderCtl.Mirror, hd args)
197                        else if Var.same(BasisVars.image_wrap, f)                        else if Var.same(BV.image_wrap, f)
198                          then (BorderCtl.Wrap, hd args)                          then (BorderCtl.Wrap, hd args)
199                          else raise Fail "impossible"                          else raise Fail "impossible"
200                  in                  in
# Line 204  Line 205 
205                  in                  in
206                    if Basis.isBorderCtl f                    if Basis.isBorderCtl f
207                      then (stms, doBorderCtl (f, xs))                      then (stms, doBorderCtl (f, xs))
208                    else if Var.same(f, BasisVars.fn_sphere_im)                    else if Var.same(f, BV.fn_sphere_im)
209                      then raise Fail "FIXME: implicit sphere query"                      then raise Fail "FIXME: implicit sphere query"
210                      else (case Var.kindOf f                      else (case Var.kindOf f
211                         of Var.BasisVar => let                         of Var.BasisVar => let
# Line 239  Line 240 
240                      (stms, S.E_Select(x, cvtVar fld))                      (stms, S.E_Select(x, cvtVar fld))
241                    end                    end
242                | AST.E_Prim(rator, tyArgs, args as [e], ty) => (case e                | AST.E_Prim(rator, tyArgs, args as [e], ty) => (case e
243                     of AST.E_Lit(Literal.Int n) => if Var.same(BasisVars.neg_i, rator)                     of AST.E_Lit(Literal.Int n) => if Var.same(BV.neg_i, rator)
244                          then (stms, S.E_Lit(Literal.Int(~n))) (* constant-fold negation of integer literals *)                          then (stms, S.E_Lit(Literal.Int(~n))) (* constant-fold negation of integer literals *)
245                          else doPrimApply (rator, tyArgs, args, ty)                          else doPrimApply (rator, tyArgs, args, ty)
246                      | AST.E_Lit(Literal.Real f) =>                      | AST.E_Lit(Literal.Real f) =>
247                          if Var.same(BasisVars.neg_t, rator)                          if Var.same(BV.neg_t, rator)
248                            then (stms, S.E_Lit(Literal.Real(RealLit.negate f))) (* constant-fold negation of real literals *)                            then (stms, S.E_Lit(Literal.Real(RealLit.negate f))) (* constant-fold negation of real literals *)
249                            else doPrimApply (rator, tyArgs, args, ty)                            else doPrimApply (rator, tyArgs, args, ty)
250                      | AST.E_Comprehension(e', (x, e''), seqTy) => if Basis.isReductionOp rator                      | AST.E_Comprehension(e', (x, e''), seqTy) => if Basis.isReductionOp rator
# Line 264  Line 265 
265                      | AST.E_ParallelMap(e', x, xs, _) =>                      | AST.E_ParallelMap(e', x, xs, _) =>
266                          if Basis.isReductionOp rator                          if Basis.isReductionOp rator
267                            then let                            then let
268                            (* parallel map-reduce *)                              val (result, stm) = simplifyReduction (errStrm, rator, e', x, xs, ty)
                             val x' = cvtVar x  
                             val result = SimpleVar.new ("res", Var.LocalVar, cvtTy ty)  
                             val (bodyStms, bodyResult) = simplifyExpToVar (errStrm, e', [])  
                             val (func, args) = Util.makeFunction(  
                                   Var.nameOf rator, mkBlock(S.S_Return bodyResult :: bodyStms),  
                                   SimpleVar.typeOf bodyResult)  
                             val mapReduceStm = S.S_MapReduce{  
                                     results = [result],  
                                     reductions = [rator],  
                                     body = func,  
                                     args = args,  
                                     source = [(x', xs)]  
                                   }  
269                              in                              in
270                                (mapReduceStm :: stms, S.E_Var result)                                (stm :: stms, S.E_Var result)
271                              end                              end
272                            else raise Fail "unsupported operation on parallel map"                            else raise Fail "unsupported operation on parallel map"
273                      | _ => doPrimApply (rator, tyArgs, args, ty)                      | _ => doPrimApply (rator, tyArgs, args, ty)
# Line 301  Line 289 
289                    val acc = SimpleVar.new ("accum", Var.LocalVar, seqTy')                    val acc = SimpleVar.new ("accum", Var.LocalVar, seqTy')
290                    val initStm = S.S_Var(acc, SOME(S.E_Seq([], seqTy')))                    val initStm = S.S_Var(acc, SOME(S.E_Seq([], seqTy')))
291                    val updateStm = S.S_Assign(acc,                    val updateStm = S.S_Assign(acc,
292                          S.E_Prim(BasisVars.at_dT, [S.TY elemTy], [acc, bodyResult], seqTy'))                          S.E_Prim(BV.at_dT, [S.TY elemTy], [acc, bodyResult], seqTy'))
293                    val foreachStm = S.S_Foreach(cvtVar x, xs, mkBlock(updateStm :: bodyStms))                    val foreachStm = S.S_Foreach(cvtVar x, xs, mkBlock(updateStm :: bodyStms))
294                    in                    in
295                      (foreachStm :: initStm :: stms, S.E_Var acc)                      (foreachStm :: initStm :: stms, S.E_Var acc)
# Line 412  Line 400 
400              f (exps, [], stms)              f (exps, [], stms)
401            end            end
402    
403      (* simplify a parallel map-reduce *)
404        and simplifyReduction (errStrm, rator, e, x, xs, resTy) = let
405                val rator' = if Var.same(BV.red_all, rator) then Reductions.ALL
406                      else if Var.same(BV.red_exists, rator) then Reductions.EXISTS
407                      else if Var.same(BV.red_max, rator) then Reductions.MAX
408                      else if Var.same(BV.red_mean, rator) then raise Fail "FIXME: mean reduction"
409                      else if Var.same(BV.red_min, rator) then Reductions.MIN
410                      else if Var.same(BV.red_product, rator) then Reductions.PRODUCT
411                      else if Var.same(BV.red_sum, rator) then Reductions.SUM
412                      else if Var.same(BV.red_variance, rator) then raise Fail "FIXME: variance reduction"
413                        else raise Fail "impossible: not a reduction"
414                val x' = cvtVar x
415                val result = SimpleVar.new ("res", Var.LocalVar, cvtTy resTy)
416                val (bodyStms, bodyResult) = simplifyExpToVar (errStrm, e, [])
417    (* FIXME: need to handle reductions over active/stable subsets of strands *)
418                val (func, args) = Util.makeFunction(
419                      Var.nameOf rator, mkBlock(S.S_Return bodyResult :: bodyStms),
420                      SimpleVar.typeOf bodyResult)
421                val mapReduceStm = S.S_MapReduce{
422                        results = [result],
423                        reductions = [rator'],
424                        body = func,
425                        args = args,
426                        source = x'
427                      }
428                in
429                  (result, mapReduceStm)
430                end
431    
432    
433    (* simplify a block and then prune unreachable and dead code *)    (* simplify a block and then prune unreachable and dead code *)
434      fun simplifyAndPruneBlock errStrm blk =      fun simplifyAndPruneBlock errStrm blk =
435            DeadCode.eliminate (simplifyBlock (errStrm, blk))            DeadCode.eliminate (simplifyBlock (errStrm, blk))

Legend:
Removed from v.4349  
changed lines
  Added in v.4359

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