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

SCM Repository

[diderot] Diff of /branches/pure-cfg/src/compiler/translate/translate.sml
ViewVC logotype

Diff of /branches/pure-cfg/src/compiler/translate/translate.sml

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

revision 505, Thu Feb 3 17:03:20 2011 UTC revision 506, Thu Feb 3 17:07:21 2011 UTC
# Line 83  Line 83 
83      fun recordAssign (_, [], _, _) = ()      fun recordAssign (_, [], _, _) = ()
84        | recordAssign (env, (predIndex, JOIN{arity, phiMap, ...})::_, srcVar, dstVar) = let        | recordAssign (env, (predIndex, JOIN{arity, phiMap, ...})::_, srcVar, dstVar) = let
85            val m = !phiMap            val m = !phiMap
           val m'= (case VMap.find (m, srcVar)  
                  of NONE => let  
                       val dstVar' = newVar srcVar  
                       val dfltVar = lookup env srcVar  
                       val rhs = List.tabulate (arity, fn i => if (i = predIndex) then dstVar else dfltVar)  
86                        in                        in
87                          VMap.insert (m, srcVar, (dstVar', rhs))              case VMap.find (m, srcVar)
88                        end               of NONE => () (* local temporary *)
89                    | SOME(lhs, rhs) => let                    | SOME(lhs, rhs) => let
90                        fun update (i, l as x::r) = if (i = predIndex)                        fun update (i, l as x::r) = if (i = predIndex)
91                              then dstVar::r                              then dstVar::r
92                              else x::update(i+1, r)                              else x::update(i+1, r)
93                          | update _ = raise Fail "invalid predecessor index"                          | update _ = raise Fail "invalid predecessor index"
94                        in                        in
95                          VMap.insert (m, srcVar, (lhs, update(0, rhs)))                      phiMap := VMap.insert (m, srcVar, (lhs, update(0, rhs)))
96                        end                        end
97                  (* end case *))              (* end case *)
           in  
             phiMap := m'  
98            end            end
99    
100    (* complete a pending join operation by filling in the phi nodes from the phi map and    (* complete a pending join operation by filling in the phi nodes from the phi map and
# Line 157  Line 150 
150                        val assigns = cvtExp (env, lhs', rhs)                        val assigns = cvtExp (env, lhs', rhs)
151                        in                        in
152                          recordAssign (env, joinStk, lhs, lhs');                          recordAssign (env, joinStk, lhs, lhs');
153                          cvt (env, IL.CFG.concat(cfg, IL.CFG.mkBlock assigns), stms)                          cvt (
154                              VMap.insert(env, lhs, lhs'),
155                              IL.CFG.concat(cfg, IL.CFG.mkBlock assigns),
156                              stms)
157                        end                        end
158                    | S.S_IfThenElse(x, b0, b1) => let                    | S.S_IfThenElse(x, b0, b1) => let
159                        val x' = lookup env x                        val x' = lookup env x
# Line 170  Line 166 
166                                falseBranch = IL.Node.dummy                                falseBranch = IL.Node.dummy
167                              }                              }
168                        in                        in
169                            IL.Node.addEdge (IL.CFG.exit cfg, cond);
170                          case commitJoin (env, joinStk, join)                          case commitJoin (env, joinStk, join)
171                           of (env, SOME joinNd) => (                           of (env, SOME joinNd) => (
172                                if IL.CFG.isEmpty cfg0                                if IL.CFG.isEmpty cfg0

Legend:
Removed from v.505  
changed lines
  Added in v.506

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