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

SCM Repository

[diderot] Annotation of /branches/vis12/src/compiler/IL/translate-fn.sml
ViewVC logotype

Annotation of /branches/vis12/src/compiler/IL/translate-fn.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1685 - (view) (download)

1 : jhr 359 (* translate-fn.sml
2 :     *
3 : jhr 435 * COPYRIGHT (c) 2010 The Diderot Project (http://diderot-language.cs.uchicago.edu)
4 : jhr 359 * All rights reserved.
5 :     *
6 :     * This functor supports the common parts of translating between different
7 :     * instances of the SSA-based ILs (e.g., from HighIL to MidIL).
8 : jhr 1116 *
9 :     * FIXME: the handling of global variables needs more care. For example, when translating from
10 :     * HighIL to LowIL, field variables go away, but are replaced by the underlying image variable
11 :     * in many uses. If the image variable was not a user-defined global, then it is not visible
12 :     * to the strand method code, which causes a IL check failure.
13 :     *
14 :     * FIXME: both this code and the Census code sets the bindings of variables (but the translation
15 :     * from SimpleAST does not).
16 : jhr 359 *)
17 :    
18 :     signature TRANSLATE_PARAMS =
19 :     sig
20 :    
21 :     structure SrcIL : SSA
22 :     structure DstIL : SSA
23 :    
24 : jhr 1640 type env
25 : jhr 359
26 : jhr 1640 val mkEnv : unit -> env
27 : jhr 359
28 : jhr 1640 val rename : (env * SrcIL.var) -> DstIL.var
29 :     val renameList : (env * SrcIL.var list) -> DstIL.var list
30 :     val renameSV : (env * SrcIL.state_var) -> DstIL.state_var
31 :     val expand : (env * SrcIL.assign) -> DstIL.cfg
32 :     val mexpand : (env * SrcIL.massign) -> DstIL.cfg
33 :    
34 :     val insertNd : (env * Stamp.stamp * DstIL.node) -> unit
35 :     val findNd : env -> Stamp.stamp -> DstIL.node option
36 :    
37 : jhr 359 end
38 :    
39 : jhr 361 functor TranslateFn (Params : TRANSLATE_PARAMS) : sig
40 : jhr 359
41 :     structure SrcIL : SSA
42 :     structure DstIL : SSA
43 :    
44 : jhr 1116 val translate : SrcIL.program -> DstIL.program
45 : jhr 361
46 : jhr 359 end = struct
47 :    
48 : jhr 1116 structure SrcIL = Params.SrcIL
49 : jhr 359 structure SrcNd = SrcIL.Node
50 : jhr 1116 structure VTbl = SrcIL.Var.Tbl
51 :     structure DstIL = Params.DstIL
52 : jhr 361 structure DstNd = DstIL.Node
53 : jhr 1116 structure DstCFG = DstIL.CFG
54 : jhr 359
55 : jhr 1640 fun rename env x = Params.rename (env, x)
56 : jhr 361
57 : jhr 1640 fun renameList (env, xs) = Params.renameList(env, xs)
58 : jhr 359
59 : jhr 1640 fun renameSV env x = Params.renameSV (env, x)
60 : jhr 359
61 : jhr 1640 fun renameNd env (nd as SrcIL.ND{id, ...}) = (
62 :     case Params.findNd env id
63 : jhr 361 of SOME nd' => nd'
64 :     | NONE => raise Fail("unable to find " ^ SrcNd.toString nd)
65 :     (* end case *))
66 :    
67 : jhr 1116 fun translateCFG (env, SrcIL.CFG{entry, exit}) = let
68 : jhr 1640 val findNd = Params.findNd env
69 : jhr 1116 fun trans (srcNd as SrcIL.ND{id, kind, ...}) = let
70 : jhr 1640 fun newNd nd = (Params.insertNd (env, id, nd); nd)
71 : jhr 360 in
72 : jhr 1116 case findNd id
73 :     of SOME nd => nd
74 :     | NONE => (case kind
75 :     of SrcIL.NULL => raise Fail "unexpected NULL node"
76 :     | SrcIL.ENTRY{succ} => let
77 :     val nd = newNd (DstNd.mkENTRY())
78 :     in
79 :     DstNd.addEdge (nd, trans (!succ));
80 :     nd
81 :     end
82 :     | SrcIL.JOIN{phis, succ, ...} => let
83 :     fun cvtPhi (x, xs) = let
84 :     val x = rename env x
85 :     val xs = List.map (rename env) xs
86 :     in
87 :     DstIL.Var.setBinding (x, DstIL.VB_PHI xs);
88 :     (x, xs)
89 :     end
90 :     val nd = newNd (DstNd.mkJOIN(List.map cvtPhi (!phis)))
91 :     in
92 :     DstNd.addEdge (nd, trans (!succ));
93 :     nd
94 :     end
95 :     | SrcIL.COND{cond, trueBranch, falseBranch, ...} => let
96 :     val nd = newNd (DstNd.mkCOND{
97 :     cond = rename env cond,
98 :     trueBranch = DstNd.dummy,
99 :     falseBranch = DstNd.dummy
100 :     })
101 :     val trueB = trans (!trueBranch)
102 :     val _ = (DstNd.setTrueBranch (nd, trueB); DstNd.setPred(trueB, nd))
103 :     val falseB = trans (!falseBranch)
104 :     val _ = (DstNd.setFalseBranch (nd, falseB); DstNd.setPred(falseB, nd))
105 :     in
106 :     nd
107 :     end
108 :     | SrcIL.COM{text, succ, ...} => let
109 :     val nd = newNd (DstNd.mkCOM text)
110 :     in
111 :     DstNd.addEdge (nd, trans (!succ));
112 :     nd
113 :     end
114 :     | SrcIL.ASSIGN{stm, succ, ...} => let
115 : jhr 1640 val cfg = Params.expand (env, stm)
116 : jhr 1116 in
117 :     if DstCFG.isEmpty cfg
118 :     then trans (!succ)
119 :     else (
120 :     DstNd.addEdge (DstCFG.exit cfg, trans (!succ));
121 :     DstCFG.entry cfg)
122 :     end
123 : jhr 1640 | SrcIL.MASSIGN{stm, succ, ...} => let
124 :     val cfg = Params.mexpand (env, stm)
125 :     in
126 :     if DstCFG.isEmpty cfg
127 :     then trans (!succ)
128 :     else (
129 :     DstNd.addEdge (DstCFG.exit cfg, trans (!succ));
130 :     DstCFG.entry cfg)
131 :     end
132 : jhr 1116 | SrcIL.NEW{strand, args, succ, ...} => let
133 :     val nd = newNd (DstNd.mkNEW{
134 :     strand = strand,
135 :     args = List.map (rename env) args
136 :     })
137 :     in
138 :     DstNd.addEdge (nd, trans (!succ));
139 :     nd
140 :     end
141 : jhr 1640 | SrcIL.SAVE{lhs, rhs, succ, ...} => let
142 :     val nd = newNd (DstNd.mkSAVE (renameSV env lhs, rename env rhs))
143 :     in
144 :     DstNd.addEdge (nd, trans (!succ));
145 :     nd
146 :     end
147 : jhr 1116 | SrcIL.EXIT{kind, live, ...} =>
148 :     newNd (DstNd.mkEXIT(kind, List.map (rename env) live))
149 :     (* end case *))
150 :     (* end case *)
151 : jhr 360 end
152 : jhr 1116 val entry = trans entry
153 :     val exit = (case findNd (SrcNd.id exit)
154 :     of SOME nd => nd
155 : jhr 1640 | NONE => DstNd.mkACTIVE() (* exit is unreachable *)
156 : jhr 1116 (* end case *))
157 : jhr 359 in
158 : jhr 1116 DstIL.CFG{entry = entry, exit = exit}
159 : jhr 359 end
160 :    
161 : jhr 1640 fun translate (SrcIL.Program{props, globalInit, initially, strands}) = let
162 :     val env = Params.mkEnv ()
163 : jhr 1116 fun transInitially (SrcIL.Initially{isArray, rangeInit, iters, create}) = let
164 :     val (argInit, strand, args) = create
165 :     fun trIter (param, lo, hi) = let
166 :     val param = rename env param
167 :     in
168 :     DstIL.Var.setBinding(param, DstIL.VB_PARAM);
169 :     (param, rename env lo, rename env hi)
170 :     end
171 :     val iters = List.map trIter iters
172 : jhr 418 in
173 : jhr 1116 DstIL.Initially{
174 :     isArray = isArray,
175 :     rangeInit = translateCFG (env, rangeInit),
176 :     create = (translateCFG (env, argInit), strand, renameList(env, args)),
177 :     iters = iters
178 :     }
179 : jhr 418 end
180 : jhr 1640 fun transMethod state (SrcIL.Method{name, body}) = DstIL.Method{
181 :     name = name,
182 :     body = translateCFG (env, body)
183 :     }
184 : jhr 1116 fun transStrand (SrcIL.Strand{name, params, state, stateInit, methods}) = let
185 :     val params = renameList (env, params)
186 : jhr 1640 val state = List.map (renameSV env) state
187 : jhr 1116 in
188 :     List.app (fn x => DstIL.Var.setBinding(x, DstIL.VB_PARAM)) params;
189 :     DstIL.Strand{
190 :     name = name,
191 :     params = params,
192 :     state = state,
193 :     stateInit = translateCFG (env, stateInit),
194 :     methods = List.map (transMethod state) methods
195 :     }
196 :     end
197 :     val prog = DstIL.Program{
198 : jhr 1640 props = props,
199 : jhr 1116 globalInit = translateCFG (env, globalInit),
200 :     initially = transInitially initially,
201 :     strands = List.map transStrand strands
202 : jhr 361 }
203 :     in
204 : jhr 1116 prog
205 : jhr 361 end
206 : jhr 359
207 :     end

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