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

SCM Repository

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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 187 - (view) (download)

1 : jhr 137 (* ssa-fn.sml
2 : jhr 124 *
3 :     * COPYRIGHT (c) 2010 The Diderot Project (http://diderot.cs.uchicago.edu)
4 :     * All rights reserved.
5 : jhr 137 *
6 :     * The IL is a combination of a block-structured tree and an SSA control-flow
7 :     * graph of blocks.
8 : jhr 124 *)
9 :    
10 : jhr 137 signature SSA =
11 :     sig
12 :     structure Op : OPERATORS
13 :    
14 :     datatype var = V of {
15 :     name : string, (* name *)
16 :     id : Stamp.stamp, (* unique ID *)
17 :     useCnt : int ref, (* count of uses *)
18 :     props : PropList.holder
19 :     }
20 :    
21 : jhr 168 (* a statement is a CFG fragment with a single entrypoint and
22 :     * a single continuation.
23 :     *)
24 :     datatype stmt
25 : jhr 187 = EXIT
26 :     | SEQ of block * stmt
27 : jhr 168 | IF of {
28 :     pre : stmt,
29 :     cond : var,
30 : jhr 187 trueBranch : stmt,
31 : jhr 168 falseBranch : stmt
32 :     }
33 :     | WHILE of {
34 : jhr 187 hdr : stmt,
35 : jhr 168 cond : var,
36 :     body : stmt
37 :     }
38 : jhr 137
39 : jhr 168 and block = BLK of {
40 :     parent : stmt ref, (* parent statement of this block *)
41 :     id : Stamp.stamp, (* unique ID *)
42 :     preds : block list ref, (* list of predecessor blocks in the CFG *)
43 :     phi : (var * var list) list ref, (* phi statements *)
44 :     body : simple_stmt list ref,
45 :     succs : block list ref (* successor blocks in the CFG *)
46 :     }
47 : jhr 137
48 : jhr 168 and simple_stmt
49 :     = ASSIGN of var * rhs
50 :     | DIE
51 :     | STABILIZE
52 :     | RETURN
53 : jhr 137
54 :     and rhs
55 :     = VAR of var
56 : jhr 176 | LIT of Literal.literal
57 : jhr 137 | OP of Op.rator * var list
58 : jhr 176 | CONS of var list (* tensor-value construction *)
59 : jhr 137
60 :     val newVar : string -> var
61 :     val newBlock : unit -> block
62 :    
63 : jhr 187 (*
64 : jhr 168 val entryBlock : stmt -> block
65 :     val nextBlock : stmt -> block
66 : jhr 187 *)
67 : jhr 168
68 : jhr 137 end
69 :    
70 :     functor SSAFn (Op : OPERATORS) : SSA =
71 : jhr 124 struct
72 :    
73 : jhr 187 structure Op = Op
74 :    
75 : jhr 124 datatype var = V of {
76 : jhr 137 name : string, (* name *)
77 :     id : Stamp.stamp, (* unique ID *)
78 :     useCnt : int ref, (* count of uses *)
79 :     props : PropList.holder
80 : jhr 124 }
81 :    
82 : jhr 187 datatype stmt
83 :     = EXIT
84 :     | SEQ of block * stmt
85 :     | IF of {
86 :     pre : stmt,
87 :     cond : var,
88 :     trueBranch : stmt,
89 :     falseBranch : stmt
90 :     }
91 :     | WHILE of {
92 :     hdr : stmt,
93 :     cond : var,
94 :     body : stmt
95 :     }
96 : jhr 124
97 : jhr 187 and block = BLK of {
98 :     parent : stmt ref, (* parent statement of this block *)
99 :     id : Stamp.stamp, (* unique ID *)
100 :     preds : block list ref, (* list of predecessor blocks in the CFG *)
101 :     phi : (var * var list) list ref, (* phi statements *)
102 :     body : simple_stmt list ref,
103 :     succs : block list ref (* successor blocks in the CFG *)
104 :     }
105 : jhr 124
106 : jhr 187 and simple_stmt
107 :     = ASSIGN of var * rhs
108 :     | DIE
109 :     | STABILIZE
110 :     | RETURN
111 : jhr 124
112 : jhr 137 and rhs
113 : jhr 129 = VAR of var
114 : jhr 187 | LIT of Literal.literal
115 : jhr 129 | OP of Op.rator * var list
116 : jhr 187 | CONS of var list (* tensor-value construction *)
117 : jhr 124
118 : jhr 137 (* block properties *)
119 :     fun parentOf (BLK{parent, ...}) = !parent
120 :     fun predsOf (BLK{preds, ...}) = !preds
121 :     fun succsOf (BLK{succs, ...}) = !succs
122 :    
123 :     (* IL construction code *)
124 :     fun newVar name = V{
125 :     name = name,
126 :     id = Stamp.new(),
127 :     useCnt = ref 0,
128 :     props = PropList.newHolder()
129 :     }
130 :    
131 :     fun newBlock () = BLK{
132 : jhr 187 parent = ref(EXIT),
133 : jhr 137 id = Stamp.new(),
134 :     preds = ref[],
135 :     phi = ref[],
136 :     body = ref[],
137 :     succs = ref[]
138 :     }
139 : jhr 187 (*
140 : jhr 137 local
141 : jhr 187 fun setParent (BLK{parent, ...}, s) = (parent := s)
142 : jhr 137 in
143 :    
144 :     fun mkIF (pre, cond, t, f) = let
145 :     val s = IF{pre=pre, cond=cond, trueBranch=t, falseBranch=f}
146 :     in
147 :     setParent (pre, s);
148 :     s
149 :     end
150 :    
151 :     fun mkWHILE (hdr, cond, body) = let
152 :     val s = WHILE{hdr=hdr, cond=cond, body=body}
153 :     in
154 :     setParent (hdr, s);
155 :     s
156 :     end
157 :    
158 :     end (* local *)
159 : jhr 187 *)
160 : jhr 137
161 : jhr 187 (*
162 : jhr 168 fun entryBlock (BLOCK blk) = blk
163 :     | entryBlock (SEQ(s1::_)) = entryBlock s1
164 :     | entryBlock (IF{pre, ...}) = entryBlock pre
165 :     | entryBlock (WHILE{hdr, ...}) = entryBlock hdr
166 :    
167 : jhr 187 fun nextBlock (BLOCK(_, next)) = nextBlock next
168 : jhr 168 | nextBlock (SEQ stms) = nextBlock(List.last stms)
169 :     | nextBlock (IF{pre, ...}) = entryBlock pre
170 :     | nextBlock (WHILE{hdr, ...}) = entryBlock hdr
171 : jhr 187 *)
172 : jhr 168
173 : jhr 124 end

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