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

SCM Repository

[diderot] Diff of /trunk/src/compiler/translate/translate.sml
ViewVC logotype

Diff of /trunk/src/compiler/translate/translate.sml

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

revision 239, Fri Aug 6 00:36:04 2010 UTC revision 240, Fri Aug 6 04:59:16 2010 UTC
# Line 76  Line 76 
76                        val (s1, env1, assigned1) = cvtBlock(env, b1)                        val (s1, env1, assigned1) = cvtBlock(env, b1)
77                        val (s2, env2, assigned2) = cvtBlock(env, b2)                        val (s2, env2, assigned2) = cvtBlock(env, b2)
78                        val assigned = VSet.union(assigned1, assigned2)                        val assigned = VSet.union(assigned1, assigned2)
79    (* PROBLEM: what about variables that are assigned for the first time in one branch
80     * and not the other?  This situation should only occur for variables who's scope is
81     * the branch of the if.  Short-term solution is to ignore variables that are defined
82     * in only one branch.
83     *)
84                        val (env, phis) = let                        val (env, phis) = let
85                              fun mkPhi (x, (env, phis)) = let                              fun mkPhi (x, (env, phis)) = (
86                                    val x1 = lookup env1 x                                    case (VMap.find(env1, x), VMap.find(env2, x))
87                                    val x2 = lookup env2 x                                     of (SOME x1, SOME x2) => let
88                                    val x' = newVar x                                    val x' = newVar x
89                                    in                                    in
90                                      (VMap.insert(env, x, x'), (x', [x1, x2])::phis)                                      (VMap.insert(env, x, x'), (x', [x1, x2])::phis)
91                                    end                                    end
92                                        | _ => (env, phis)
93                                      (* end case *))
94                              in                              in
95                                VSet.foldl mkPhi (env, []) assigned                                VSet.foldl mkPhi (env, []) assigned
96                              end                              end
# Line 120  Line 127 
127              toStmt (env, VSet.empty, stms)              toStmt (env, VSet.empty, stms)
128            end            end
129    
130      fun translate (S.Program{globals, staticInit, globalInit, actors}) = let      fun translate (S.Program{globals, globalInit, actors}) = let
131            val (globalInit, env, _) = cvtBlock (VMap.empty, globalInit)            val (globalInit, env, _) = cvtBlock (VMap.empty, globalInit)
132          (* get the SSA names for the globals and a reduced environment *)          (* get the SSA names for the globals and a reduced environment *)
133            val (env, globs) = let            val (env, globs) = let

Legend:
Removed from v.239  
changed lines
  Added in v.240

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