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

SCM Repository

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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3349 - (view) (download)

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

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