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

SCM Repository

[diderot] Diff of /trunk/src/compiler/IL/ssa-fn.sml
ViewVC logotype

Diff of /trunk/src/compiler/IL/ssa-fn.sml

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

revision 319, Wed Aug 18 04:13:08 2010 UTC revision 392, Thu Oct 14 15:34:28 2010 UTC
# Line 10  Line 10 
10  signature SSA =  signature SSA =
11    sig    sig
12    
13      structure Op : OPERATORS      structure Ty : SSA_TYPES
14        structure Op : OPERATORS where type ty = Ty.ty
15    
16    (***** CFG *****)    (***** CFG *****)
17    
# Line 88  Line 89 
89      and var = V of {      and var = V of {
90          name : string,                  (* name *)          name : string,                  (* name *)
91          id : Stamp.stamp,               (* unique ID *)          id : Stamp.stamp,               (* unique ID *)
92            bind : var_bind ref,            (* binding *)
93          useCnt : int ref,               (* count of uses *)          useCnt : int ref,               (* count of uses *)
94          props : PropList.holder          props : PropList.holder
95        }        }
96    
97        and var_bind
98          = VB_NONE
99          | VB_RHS of rhs
100          | VB_PHI of var list
101          | VB_PARAM
102          | VB_STATE_VAR
103    
104      withtype assign = (var * rhs)      withtype assign = (var * rhs)
105    
106      datatype program = Program of {      datatype program = Program of {
# Line 121  Line 130 
130          val compare : node * node -> order          val compare : node * node -> order
131          val hash : node -> word          val hash : node -> word
132          val toString : node -> string          val toString : node -> string
133          (* dummy node *)
134            val dummy : node
135          (* CFG edges *)
136          val preds : node -> node list          val preds : node -> node list
137          val setPred : node * node -> unit          val setPred : node * node -> unit
138          val hasSucc : node -> bool          val hasSucc : node -> bool
# Line 129  Line 141 
141          val setTrueBranch : node * node -> unit  (* set trueBranch successor for COND node *)          val setTrueBranch : node * node -> unit  (* set trueBranch successor for COND node *)
142          val setFalseBranch : node * node -> unit (* set falseBranch successor for COND node *)          val setFalseBranch : node * node -> unit (* set falseBranch successor for COND node *)
143          val addEdge : node * node -> unit          val addEdge : node * node -> unit
144          (* constructors *)
145            val mkENTRY : unit -> node
146            val mkJOIN : (var * var list) list -> node
147            val mkCOND : {cond : var, trueBranch : node, falseBranch : node} -> node
148            val mkBLOCK : assign list -> node
149            val mkNEW : {actor : Atom.atom, args : var list} -> node
150            val mkDIE : unit -> node
151            val mkSTABILIZE : unit -> node
152            val mkEXIT : unit -> node
153        (* properties *)        (* properties *)
154          val newProp : (node -> 'a) -> {          val newProp : (node -> 'a) -> {
155                  getFn : node -> 'a,                  getFn : node -> 'a,
# Line 152  Line 173 
173        (* return the tail-end node of a statement (not applicable to S_IF or S_LOOP) *)        (* return the tail-end node of a statement (not applicable to S_IF or S_LOOP) *)
174          val tail : stmt -> node          val tail : stmt -> node
175        (* statement constructor functions *)        (* statement constructor functions *)
176            val new : (stmt_kind * stmt option) -> stmt
177          val mkENTRY : stmt option -> stmt          val mkENTRY : stmt option -> stmt
178          val mkJOIN : (var * var list) list * stmt option -> stmt          val mkJOIN : (var * var list) list * stmt option -> stmt
179          val mkIF : var * stmt * stmt * stmt option -> stmt          val mkIF : var * stmt * stmt * stmt option -> stmt
# Line 175  Line 197 
197    
198      structure Var : sig      structure Var : sig
199          val new : string -> var          val new : string -> var
200            val name : var -> string
201            val binding : var -> var_bind
202            val setBinding : var * var_bind -> unit
203          val same : var * var -> bool          val same : var * var -> bool
204          val compare : var * var -> order          val compare : var * var -> order
205          val hash : var -> word          val hash : var -> word
# Line 201  Line 226 
226     *)     *)
227      val sortNodes : stmt -> node list      val sortNodes : stmt -> node list
228    
229      (* apply a function to all of the nodes in the graph rooted at the entry to the statement *)
230        val applyToNodes : (node -> unit) -> stmt -> unit
231    
232    end    end
233    
234  functor SSAFn (Op : OPERATORS) : SSA =  functor SSAFn (
235    struct  
236        structure Ty : SSA_TYPES
237        structure Op : OPERATORS where type ty = Ty.ty
238    
239      ) : SSA = struct
240    
241        structure Ty = Ty
242      structure Op = Op      structure Op = Op
243    
244      datatype node = ND of {      datatype node = ND of {
# Line 281  Line 314 
314    
315      and var = V of {      and var = V of {
316          name : string,                  (* name *)          name : string,                  (* name *)
317            bind : var_bind ref,            (* binding *)
318          id : Stamp.stamp,               (* unique ID *)          id : Stamp.stamp,               (* unique ID *)
319          useCnt : int ref,               (* count of uses *)          useCnt : int ref,               (* count of uses *)
320          props : PropList.holder          props : PropList.holder
321        }        }
322    
323        and var_bind
324          = VB_NONE
325          | VB_RHS of rhs
326          | VB_PHI of var list
327          | VB_PARAM
328          | VB_STATE_VAR
329    
330      withtype assign = (var * rhs)      withtype assign = (var * rhs)
331    
332      datatype program = Program of {      datatype program = Program of {
# Line 497  Line 538 
538          fun new name = V{          fun new name = V{
539                  name = name,                  name = name,
540                  id = Stamp.new(),                  id = Stamp.new(),
541                    bind = ref VB_NONE,
542                  useCnt = ref 0,                  useCnt = ref 0,
543                  props = PropList.newHolder()                  props = PropList.newHolder()
544                }                }
545            fun name (V{name, ...}) = name
546            fun binding (V{bind, ...}) = !bind
547            fun setBinding (V{bind, ...}, vb) = bind := vb
548          fun same (V{id=a, ...}, V{id=b, ...}) = Stamp.same(a, b)          fun same (V{id=a, ...}, V{id=b, ...}) = Stamp.same(a, b)
549          fun compare (V{id=a, ...}, V{id=b, ...}) = Stamp.compare(a, b)          fun compare (V{id=a, ...}, V{id=b, ...}) = Stamp.compare(a, b)
550          fun hash (V{id, ...}) = Stamp.hash id          fun hash (V{id, ...}) = Stamp.hash id
# Line 544  Line 589 
589              nodes              nodes
590            end            end
591    
592      (* apply a function to all of the nodes in the graph rooted at the entry to the statement *)
593        fun applyToNodes (f : node -> unit) stmt = let
594              val {getFn, setFn} = PropList.newFlag (fn (ND{props, ...}) => props)
595              fun dfs (nd, l) =
596                    if getFn nd
597                      then l
598                      else (
599                        f nd; (* visit *)
600                        setFn (nd, true);
601                        nd :: List.foldl dfs l (Node.succs nd))
602              val nodes = dfs (Stmt.entry stmt, [])
603              in
604                List.app (fn nd => setFn(nd, false)) nodes
605              end
606    
607    end    end

Legend:
Removed from v.319  
changed lines
  Added in v.392

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