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

SCM Repository

[diderot] Diff of /branches/vis15/src/compiler/translate/analyze-simple.sml
ViewVC logotype

Diff of /branches/vis15/src/compiler/translate/analyze-simple.sml

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

revision 4310, Sat Jul 30 02:16:22 2016 UTC revision 4516, Mon Sep 5 16:19:47 2016 UTC
# Line 127  Line 127 
127              | _ => ()              | _ => ()
128            (* end case *))            (* end case *))
129    
   (* does a variable have local scope *)  
     fun isLocal x = (case SV.kindOf x  
            of SV.LocalVar => true  
             | SV.IterVar => true  
             | _ => false  
           (* end case *))  
   
130      fun analyzeBlock cxt blk = let      fun analyzeBlock cxt blk = let
131            val globals = ref VSet.empty            val globals = ref VSet.empty
132            fun addGlobal x = (globals := VSet.add(!globals, x))            fun addGlobal x = (globals := VSet.add(!globals, x))
133            fun addVar (x, vs) =            fun addVar (x, vs) = let
134                  if isLocal x then VSet.add(vs, x)                  fun addGlobal x = (globals := VSet.add(!globals, x); vs)
135                  else (case (SV.kindOf x, cxt)                  in
136                     of (SV.ConstVar, ConstInit) => ()                    case (SV.kindOf x, cxt)
137                       of (SV.ConstVar, ConstInit) => vs
138                      | (SV.ConstVar, _) => addGlobal x                      | (SV.ConstVar, _) => addGlobal x
139                      | (SV.InputVar, ConstInit) => ()                      | (SV.InputVar, ConstInit) => vs
140                      | (SV.InputVar, _) => addGlobal x                      | (SV.InputVar, _) => addGlobal x
141                      | (SV.GlobalVar, ConstInit) => ()                      | (SV.GlobalVar, ConstInit) => vs
142                      | (SV.GlobalVar, GlobalInit) => ()                      | (SV.GlobalVar, GlobalInit) => vs
143                      | (SV.GlobalVar, _) => addGlobal x                      | (SV.GlobalVar, _) => addGlobal x
144                      | _ => ()                      | (SV.StrandStateVar, _) => VSet.add(vs, x)
145                    (* end case *);                      | (SV.StrandOutputVar, _) => VSet.add(vs, x)
146                    vs)                      | (SV.LocalVar, _) => VSet.add(vs, x)
147                        | (SV.IterVar, _) => VSet.add(vs, x)
148                        | _ => vs
149                      (* end case *)
150                    end
151            fun addList (xs, vs) = List.foldl addVar vs xs            fun addList (xs, vs) = List.foldl addVar vs xs
152          (* compute the used local and global variables of a Simple AST expression *)          (* compute the used local and global variables of a Simple AST expression *)
153            fun addUses (e, vs) = let            fun addUses (e, vs) = let
# Line 157  Line 155 
155                         of S.E_Var x => [x]                         of S.E_Var x => [x]
156                          | S.E_Lit _ => []                          | S.E_Lit _ => []
157                          | S.E_Kernel _ => []                          | S.E_Kernel _ => []
158                          | S.E_Select _ => raise Fail "unexpected E_Select" (* should be handled by doStm *)                          | S.E_Select(y, z) => (
159                                markSharedStateVar z;
160                                [y])
161                          | S.E_Apply(_, xs) => xs                          | S.E_Apply(_, xs) => xs
162                          | S.E_Prim(_, _, xs, _) => xs                          | S.E_Prim(_, _, xs, _) => xs
163                          | S.E_Tensor(xs, _) => xs                          | S.E_Tensor(xs, _) => xs
164                          | S.E_Seq(xs, _) => xs                          | S.E_Seq(xs, _) => xs
165                            | S.E_Tuple xs => xs
166                            | S.E_Project(x, i) => [x]
167                          | S.E_Slice(x, _, _) => [x]                          | S.E_Slice(x, _, _) => [x]
168                          | S.E_Coerce{x, ...} => [x]                          | S.E_Coerce{x, ...} => [x]
169                          | S.E_BorderCtl(BorderCtl.Default x, y) => [x, y]                          | S.E_BorderCtl(BorderCtl.Default x, y) => [x, y]
# Line 185  Line 187 
187                  (VSet.subtract(live, x), VSet.subtract(assigns, x))                  (VSet.subtract(live, x), VSet.subtract(assigns, x))
188              | doStm (S.S_Var(x, SOME e), (live, assigns)) =              | doStm (S.S_Var(x, SOME e), (live, assigns)) =
189                  (addUses(e, VSet.subtract(live, x)), VSet.subtract(assigns, x))                  (addUses(e, VSet.subtract(live, x)), VSet.subtract(assigns, x))
             | doStm (S.S_Assign(x, S.E_Select(y, z)), (live, assigns)) = (  
                 markUpdate (cxt, x);  
                 markSharedStateVar z;  
                 (addVar (y, VSet.subtract(live, x)), addVar(x, assigns)))  
190              | doStm (S.S_Assign(x, e), (live, assigns)) = (              | doStm (S.S_Assign(x, e), (live, assigns)) = (
191                  markUpdate (cxt, x);                  markUpdate (cxt, x);
192                  (addUses(e, VSet.subtract(live, x)), addVar(x, assigns)))                  (addUses(e, VSet.subtract(live, x)), addVar(x, assigns)))
193              | doStm (S.S_Foreach(x, _, b), (liveIn, assignsIn)) = let              | doStm (S.S_Foreach(x, xs, b), (liveIn, assignsIn)) = let
194                    val liveIn = addVar(xs, liveIn)
195                  val (liveOut, assigns) = doBlock (b, liveIn)                  val (liveOut, assigns) = doBlock (b, liveIn)
196                  val liveOut = VSet.union(VSet.subtract(liveOut, x), liveIn)                  val liveOut = VSet.union(VSet.subtract(liveOut, x), liveIn)
197                  val assigns = VSet.union(VSet.subtract(assigns, x), assignsIn)                  val assigns = VSet.union(VSet.subtract(assigns, x), assignsIn)
# Line 210  Line 209 
209                  end                  end
210              | doStm (S.S_Return x, (live, assigns)) = (addVar (x, live), assigns)              | doStm (S.S_Return x, (live, assigns)) = (addVar (x, live), assigns)
211              | doStm (S.S_Print xs, (live, assigns)) = (addList (xs, live), assigns)              | doStm (S.S_Print xs, (live, assigns)) = (addList (xs, live), assigns)
212              | doStm (S.S_MapReduce{results, ...}, acc) = (              | doStm (S.S_MapReduce mrs, acc) = (
213                  List.app (fn x => markUpdate (cxt, x)) results;                  List.app (fn (S.MapReduce{result, ...}) => markUpdate (cxt, result)) mrs;
214                  acc)                  acc)
215              | doStm (_, acc) = acc              | doStm (_, acc) = acc
216            val (bnd, assigns) = doBlock (blk, VSet.empty)            val (bnd, assigns) = doBlock (blk, VSet.empty)
# Line 219  Line 218 
218              setGlobalsOfBlock (blk, !globals)              setGlobalsOfBlock (blk, !globals)
219            end            end
220    
221      fun analyze (S.Program{constInit, funcs, globInit, strand, create, init, update, ...}) = let      fun analyze prog = let
222            val S.Strand{stateInit, initM, updateM, stabilizeM, ...} = strand            val S.Program{
223            in                    props, constInit, funcs, globInit, strand, create, start, update, ...
224                    } = prog
225              val S.Strand{state, stateInit, startM, updateM, stabilizeM, ...} = strand
226              in
227              (* if the program has communication then the "pos" variable is shared *)
228                if Properties.hasProp Properties.StrandCommunication props
229                  then (case List.find (fn x => (SV.nameOf x = "pos")) state
230                     of SOME x => markSharedStateVar x
231                      | NONE => raise Fail "impossible: missing 'pos' state variable"
232                    (* end case *))
233                  else ();
234              analyzeBlock ConstInit constInit;              analyzeBlock ConstInit constInit;
235              List.app (fn (S.Func{f, body, ...}) => analyzeBlock UserFunc body) funcs;              List.app (fn (S.Func{f, body, ...}) => analyzeBlock UserFunc body) funcs;
236              analyzeBlock GlobalInit globInit;              analyzeBlock GlobalInit globInit;
237              analyzeBlock StateInit stateInit;              analyzeBlock StateInit stateInit;
238              Option.app (analyzeBlock InitMeth) initM;              Option.app (analyzeBlock InitMeth) startM;
239              analyzeBlock UpdateMeth updateM;              analyzeBlock UpdateMeth updateM;
240              Option.app (analyzeBlock StabilizeMeth) stabilizeM;              Option.app (analyzeBlock StabilizeMeth) stabilizeM;
241              Create.app (analyzeBlock Create) create;              Create.app (analyzeBlock Create) create;
242              Option.app (analyzeBlock GlobalUpdate) init;              Option.app (analyzeBlock GlobalUpdate) start;
243              Option.app (analyzeBlock GlobalUpdate) update              Option.app (analyzeBlock GlobalUpdate) update
244            end            end
245    

Legend:
Removed from v.4310  
changed lines
  Added in v.4516

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