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

SCM Repository

[diderot] Diff of /branches/vis15/src/compiler/cfg-ir/ssa-fn.sml
ViewVC logotype

Diff of /branches/vis15/src/compiler/cfg-ir/ssa-fn.sml

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

revision 3502, Thu Dec 17 23:13:35 2015 UTC revision 3506, Fri Dec 18 04:03:54 2015 UTC
# Line 101  Line 101 
101        | EXIT of {                       (* includes die and stabilize *)        | EXIT of {                       (* includes die and stabilize *)
102              pred : node ref,              pred : node ref,
103              kind : ExitKind.kind,       (* kind of exit node *)              kind : ExitKind.kind,       (* kind of exit node *)
             live : var list,            (* live variables *)  
104              succ : node option ref      (* optional fake control-flow edge for when the EXIT is *)              succ : node option ref      (* optional fake control-flow edge for when the EXIT is *)
105                                          (* not the CFG exit node *)                                          (* not the CFG exit node *)
106            }            }
# Line 138  Line 137 
137          id : Stamp.stamp,               (* variable's unique ID *)          id : Stamp.stamp,               (* variable's unique ID *)
138          name : string,                  (* variable's name *)          name : string,                  (* variable's name *)
139          ty : Ty.ty,                     (* variable's type *)          ty : Ty.ty,                     (* variable's type *)
140          input : bool,                   (* true for input variables *)          kind : global_kind,             (* the variable kind *)
141          props : PropList.holder          props : PropList.holder
142        }        }
143    
144        and global_kind = ConstVar | InputVar | GlobalVar
145    
146    (***** strand state variables *****)    (***** strand state variables *****)
147      and state_var = SV of {      and state_var = SV of {
148          id : Stamp.stamp,               (* variable's unique ID *)          id : Stamp.stamp,               (* variable's unique ID *)
# Line 163  Line 164 
164    
165    (***** Program representation *****)    (***** Program representation *****)
166    
167        type input = global_var Inputs.input
168    
169      datatype program = Program of {      datatype program = Program of {
170          props : Properties.t list,          props : Properties.t list,
171          consts : global_var list,       (* large constant variables *)          consts : global_var list,       (* large constant variables *)
172          inputs : global_var list,       (* global input variables *)          inputs : input list,            (* global input variables *)
         globals : global_var list,      (* other global variables *)  
173          constInit : cfg,                (* code that initializes constants and inputs *)          constInit : cfg,                (* code that initializes constants and inputs *)
174            globals : global_var list,      (* other global variables *)
175          globalInit : cfg,               (* CFG to initialize other globals (if any) *)          globalInit : cfg,               (* CFG to initialize other globals (if any) *)
176          strand : strand,                (* the strand definition *)          strand : strand,                (* the strand definition *)
177          create : create,                (* initial strand creation *)          create : create,                (* initial strand creation *)
# Line 192  Line 195 
195    
196      structure GlobalVar =      structure GlobalVar =
197        struct        struct
198          fun new (isIn, name, ty) = GV{          fun new (kind, name, ty) = GV{
199                  id = Stamp.new(),                  id = Stamp.new(),
200                  name = name,                  name = name,
201                  ty = ty,                  ty = ty,
202                  input = isIn,                  kind = kind,
203                  props = PropList.newHolder()                  props = PropList.newHolder()
204                }                }
205          fun name (GV{name, ...}) = name          fun name (GV{name, ...}) = name
206          fun uniqueName (GV{id, name, ...}) = name ^ Stamp.toString id          fun uniqueName (GV{id, name, ...}) = name ^ Stamp.toString id
207            fun kind (GV{kind, ...}) = kind
208          fun ty (GV{ty, ...}) = ty          fun ty (GV{ty, ...}) = ty
209          fun isInput (GV{input, ...}) = input          fun isInput (GV{kind=InputVar, ...}) = true
210              | isInput _ = false
211          fun same (GV{id=a, ...}, GV{id=b, ...}) = Stamp.same(a, b)          fun same (GV{id=a, ...}, GV{id=b, ...}) = Stamp.same(a, b)
212          fun compare (GV{id=a, ...}, GV{id=b, ...}) = Stamp.compare(a, b)          fun compare (GV{id=a, ...}, GV{id=b, ...}) = Stamp.compare(a, b)
213          fun hash (GV{id, ...}) = Stamp.hash id          fun hash (GV{id, ...}) = Stamp.hash id
# Line 366  Line 371 
371                  | GASSIGN{rhs, ...} => [rhs]                  | GASSIGN{rhs, ...} => [rhs]
372                  | NEW{args, ...} => args                  | NEW{args, ...} => args
373                  | SAVE{rhs, ...} => [rhs]                  | SAVE{rhs, ...} => [rhs]
                 | EXIT{live, ...} => live  
374                  | _ => []                  | _ => []
375                (* end case *))                (* end case *))
376          fun defs (ND{kind, ...}) = (case kind          fun defs (ND{kind, ...}) = (case kind
# Line 413  Line 417 
417          fun mkSAVE (lhs, rhs) = new (SAVE{          fun mkSAVE (lhs, rhs) = new (SAVE{
418                  pred = ref dummy, lhs = lhs, rhs = rhs, succ = ref dummy                  pred = ref dummy, lhs = lhs, rhs = rhs, succ = ref dummy
419                })                })
420          fun mkEXIT (kind, xs) = new (EXIT{kind = kind, live = xs, pred = ref dummy, succ = ref NONE})          fun mkEXIT kind = new (EXIT{kind = kind, pred = ref dummy, succ = ref NONE})
421          fun mkFRAGMENT xs = mkEXIT (ExitKind.FRAGMENT, xs)          fun mkRETURN () = mkEXIT ExitKind.RETURN
422          fun mkRETURN () = mkEXIT (ExitKind.RETURN, [])          fun mkACTIVE () = mkEXIT ExitKind.ACTIVE
423          fun mkACTIVE () = mkEXIT (ExitKind.ACTIVE, [])          fun mkSTABILIZE () = mkEXIT ExitKind.STABILIZE
424          fun mkSTABILIZE () = mkEXIT (ExitKind.STABILIZE, [])          fun mkDIE () = mkEXIT ExitKind.DIE
425          fun mkDIE () = mkEXIT (ExitKind.DIE, [])          fun mkUNREACHABLE () = mkEXIT ExitKind.UNREACHABLE
         fun mkUNREACHABLE () = mkEXIT (ExitKind.UNREACHABLE, [])  
426          fun isNULL (ND{kind=NULL, ...}) = true          fun isNULL (ND{kind=NULL, ...}) = true
427            | isNULL _ = false            | isNULL _ = false
428        (* is a node reachable from the CFG entry; UNREACHABLE exit nodes and JOINs with no real        (* is a node reachable from the CFG entry; UNREACHABLE exit nodes and JOINs with no real
# Line 613  Line 616 
616          fun entry (CFG{entry = nd, ...}) = nd          fun entry (CFG{entry = nd, ...}) = nd
617          fun exit (CFG{exit = nd, ...}) = nd          fun exit (CFG{exit = nd, ...}) = nd
618    
       (* return the list of variables that are live at exit from a CFG *)  
         fun liveAtExit cfg = (case Node.kind(exit cfg)  
                of EXIT{live, ...} => live  
                 | _ => raise Fail "bogus exit node"  
               (* end case *))  
   
619        (* DFS sorting of the graph rooted at the entry to a statement; the resulting list will        (* DFS sorting of the graph rooted at the entry to a statement; the resulting list will
620         * be in preorder with parents before children.         * be in preorder with parents before children.
621         *)         *)
# Line 810  Line 807 
807                      end                      end
808                  | _ => concat(cfg, mkBlock stms)                  | _ => concat(cfg, mkBlock stms)
809                (* end case *))                (* end case *))
   
       (* update the exit of a CFG by modifying the live variable list *)  
         fun updateExit (CFG{entry, exit as ND{kind, ...}}, f) = let  
               val newExit = (case kind  
                      of EXIT{pred, kind, live, succ=ref NONE} => let  
                           val newNd = Node.mkEXIT(kind, f live)  
                           in  
                             Node.replaceInEdge {src = !pred, oldDst = exit, dst = newNd};  
                             newNd  
                           end  
                       | _ => raise Fail "bogus exit node for updateExit"  
                     (* end case *))  
               in  
                 CFG{entry=entry, exit=newExit}  
               end  
810        end        end
811    
812      structure RHS =      structure RHS =

Legend:
Removed from v.3502  
changed lines
  Added in v.3506

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