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

SCM Repository

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

Diff of /branches/pure-cfg/src/compiler/high-il/high-opt.sml

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

revision 490, Wed Jan 19 19:49:01 2011 UTC revision 491, Wed Jan 26 15:31:09 2011 UTC
# Line 78  Line 78 
78                   of SOME rhs' => (V.setBinding(y, IL.VB_RHS rhs'); (y, rhs'))                   of SOME rhs' => (V.setBinding(y, IL.VB_RHS rhs'); (y, rhs'))
79                    | NONE => (y, rhs)                    | NONE => (y, rhs)
80                  (* end case *))                  (* end case *))
81            fun doNode (IL.ND{kind=IL.BLOCK{body, ...}, ...}) =            fun doNode (nd as IL.ND{kind=IL.ASSIGN{stm=(y, rhs), ...}, ...}) = (case doRHS rhs
82                  body := List.map doAssign (!body)                   of SOME rhs' => (
83                          V.setBinding(y, IL.VB_RHS rhs');
84                          IL.CFG.replaceNode (nd, IL.Node.mkASSIGN(y, rhs')))
85                      | NONE => ()
86                    (* end case *))
87              | doNode _ = ()              | doNode _ = ()
88            in            in
89              List.app doNode nodes              List.app doNode nodes
# Line 88  Line 92 
92    (* reduce the code by removing variables with use counts of 0 *)    (* reduce the code by removing variables with use counts of 0 *)
93      fun reduce nodes = let      fun reduce nodes = let
94            fun checkVar (y, _) = (useCount y > 0) orelse (ST.tick cntUnused; false)            fun checkVar (y, _) = (useCount y > 0) orelse (ST.tick cntUnused; false)
95            fun doNode (IL.ND{kind, ...}) = (case kind            fun doNode (nd as IL.ND{kind, ...}) = (case kind
96                   of IL.JOIN{phis, ...} => let                   of IL.JOIN{phis, ...} => let
97                        fun doVar (y, xs) = if (useCount y = 0)                        fun doVar (y, xs) = if (useCount y = 0)
98                              then (                              then (
# Line 99  Line 103 
103                        in                        in
104                          phis := List.filter doVar (!phis)                          phis := List.filter doVar (!phis)
105                        end                        end
106                    | IL.BLOCK{body, ...} => let                    | IL.ASSIGN{stm=(y, rhs), ...} =>
                     (* check for unused lhs variables in reverse order *)  
                       fun doAssigns [] = []  
                         | doAssigns ((y, rhs)::r) = let  
                             val r = doAssigns r  
                             in  
107                                if (useCount y = 0)                                if (useCount y = 0)
108                                  then (                                  then (
109                                    ST.tick cntUnused;                                    ST.tick cntUnused;
# Line 114  Line 113 
113                                      | IL.OP(_, xs) => List.app decUse xs                                      | IL.OP(_, xs) => List.app decUse xs
114                                      | IL.CONS xs => List.app decUse xs                                      | IL.CONS xs => List.app decUse xs
115                                    (* end case *);                                    (* end case *);
116                                    r)                            IL.CFG.deleteNode nd)
117                                  else (y, rhs)::r                          else ()
                             end  
                       in  
                         body := doAssigns (!body)  
                       end  
118                    | _ => ()                    | _ => ()
119                  (* end case *))                  (* end case *))
120            in            in
# Line 139  Line 134 
134    
135      fun optimize (prog as IL.Program{globals, globalInit, actors}) = let      fun optimize (prog as IL.Program{globals, globalInit, actors}) = let
136            val _ = Census.init prog            val _ = Census.init prog
137            fun doStmt stm = let            fun doCFG cfg = let
138                  val nodes = IL.sortNodes stm                  val nodes = IL.CFG.sort cfg
139                  in                  in
140                    loopToFixPt simplify nodes;                    loopToFixPt simplify nodes;
141                    loopToFixPt reduce nodes;                    loopToFixPt reduce nodes;
142                    nodes                    nodes
143                  end                  end
144            val globInitNodes = doStmt globalInit            val globInitNodes = doCFG globalInit
145            fun doMethod (IL.Method{body, ...}) = let            fun doMethod (IL.Method{body, ...}) = let
146                  val nodes = IL.sortNodes body                  val nodes = IL.CFG.sort body
147                  in                  in
148                    loopToFixPt simplify nodes;                    loopToFixPt simplify nodes;
149                    loopToFixPt reduce nodes                    loopToFixPt reduce nodes
150                  end                  end
151            fun doActor (IL.Actor{stateInit, methods, ...}) = let            fun doActor (IL.Actor{stateInit, methods, ...}) = let
152                  val nodes = IL.sortNodes stateInit                  val nodes = IL.CFG.sort stateInit
153                  in                  in
154                    loopToFixPt simplify nodes;                    loopToFixPt simplify nodes;
155                    loopToFixPt reduce nodes;                    loopToFixPt reduce nodes;

Legend:
Removed from v.490  
changed lines
  Added in v.491

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