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

SCM Repository

[diderot] Diff of /branches/staging/src/compiler/simplify/inliner.sml
ViewVC logotype

Diff of /branches/staging/src/compiler/simplify/inliner.sml

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

revision 2634, Mon May 26 13:48:02 2014 UTC revision 2635, Mon May 26 14:06:39 2014 UTC
# Line 19  Line 19 
19     * while mapping the parameters to arguments.     * while mapping the parameters to arguments.
20     *)     *)
21      fun beta (lhs, S.Func{f, params, body}, args) = let      fun beta (lhs, S.Func{f, params, body}, args) = let
22              val needsLHSPreDecl = ref false (* set to true if the lhs needs to be declared before the body *)
23            fun rename env x = (case V.Map.find(env, x)            fun rename env x = (case V.Map.find(env, x)
24                   of SOME x' => x'                   of SOME x' => x'
25                    | NONE => if SimpleVar.isGlobal x                    | NONE => if SimpleVar.isGlobal x
26                        then x                        then x
27                        else raise Fail("unknown variable " ^ V.uniqueNameOf x)                        else raise Fail("unknown variable " ^ V.uniqueNameOf x)
28                  (* end case *))                  (* end case *))
29            fun doBlock (env, S.Block stms) = let            fun doBlock (env, isTop, S.Block stms) = let
30                  fun f (stm, (env, stms)) = let                  fun f (stm, (env, stms)) = let
31                          val (env, stm) = doStmt (env, stm)                          val (env, stm) = doStmt (env, isTop, stm)
32                          in                          in
33                            (env, stm::stms)                            (env, stm::stms)
34                          end                          end
# Line 35  Line 36 
36                  in                  in
37                    S.Block(List.rev stms)                    S.Block(List.rev stms)
38                  end                  end
39            and doStmt (env, stm) = (case stm            and doStmt (env, isTop, stm) = (case stm
40                   of S.S_Var x => let                   of S.S_Var x => let
41                        val x' = V.copy x                        val x' = V.copy x
42                        in                        in
# Line 50  Line 51 
51                              end                              end
52                        (* end case *))                        (* end case *))
53                    | S.S_IfThenElse(x, b1, b2) =>                    | S.S_IfThenElse(x, b1, b2) =>
54                        (env, S.S_IfThenElse(rename env x, doBlock(env, b1), doBlock(env, b2)))                        (env, S.S_IfThenElse(rename env x, doBlock(env, false, b1), doBlock(env, false, b2)))
55                    | S.S_New(strnd, xs) => (env, S.S_New(strnd, List.map (rename env) xs))                    | S.S_New(strnd, xs) => (env, S.S_New(strnd, List.map (rename env) xs))
56                    | S.S_Die => (env, stm)                    | S.S_Die => (env, stm)
57                    | S.S_Stabilize => (env, stm)                    | S.S_Stabilize => (env, stm)
58                    | S.S_Return x => (env, S.S_Assign(lhs, S.E_Var(rename env x)))                    | S.S_Return x => (
59                          if not isTop then needsLHSPreDecl := true else ();
60                          (env, S.S_Assign(lhs, S.E_Var(rename env x))))
61                    | S.S_Print xs => (env, S.S_Print(List.map (rename env) xs))                    | S.S_Print xs => (env, S.S_Print(List.map (rename env) xs))
62                  (* end case *))                  (* end case *))
63            and doExp env exp = (case exp            and doExp env exp = (case exp
# Line 76  Line 79 
79            val env = ListPair.foldlEq            val env = ListPair.foldlEq
80                  (fn (x, x', env) => V.Map.insert(env, x, x'))                  (fn (x, x', env) => V.Map.insert(env, x, x'))
81                    V.Map.empty (params, args)                    V.Map.empty (params, args)
82              val blk as S.Block stms = doBlock (env, true, body)
83            in            in
84              doBlock (env, body)              if !needsLHSPreDecl
85                  then S.Block(S.S_Var lhs :: stms)
86                  else blk
87            end            end
88    
89    (* inline expand user-function calls in a block *)    (* inline expand user-function calls in a block *)
# Line 104  Line 110 
110    
111      fun expandFunc funcTbl (S.Func{f, params, body}) = let      fun expandFunc funcTbl (S.Func{f, params, body}) = let
112            val body' = expandBlock funcTbl body            val body' = expandBlock funcTbl body
113              val func' = S.Func{f=f, params=params, body=body'}
114            in            in
115              V.Tbl.insert funcTbl (f, S.Func{f=f, params=params, body=body'})              V.Tbl.insert funcTbl (f, func')
116            end            end
117    
118      fun expandStrand funcTbl = let      fun expandStrand funcTbl = let
# Line 138  Line 145 
145            end            end
146    
147      fun transform (prog as S.Program{funcs=[], ...}) = prog      fun transform (prog as S.Program{funcs=[], ...}) = prog
148        | transform (S.Program{inputs, globals, globalInit, funcs, strands, init}) = let        | transform (S.Program{props, inputs, globals, globalInit, funcs, strands, init}) = let
149          (* a table that maps function names to their definitions *)          (* a table that maps function names to their definitions *)
150            val funcTbl = V.Tbl.mkTable (List.length funcs, Fail "funcTbl")            val funcTbl = V.Tbl.mkTable (List.length funcs, Fail "funcTbl")
151          (* first we inline expand the function bodies in definition order *)          (* first we inline expand the function bodies in definition order *)
# Line 146  Line 153 
153            val expandBlock = expandBlock funcTbl            val expandBlock = expandBlock funcTbl
154            in            in
155              S.Program{              S.Program{
156                    props = props,
157                  inputs = inputs,                  inputs = inputs,
158                  globals = globals,                  globals = globals,
159                  globalInit = expandBlock globalInit,                  globalInit = expandBlock globalInit,

Legend:
Removed from v.2634  
changed lines
  Added in v.2635

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