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

SCM Repository

[diderot] Diff of /branches/charisee/src/compiler/tree-il/low-to-tree-fn.sml
ViewVC logotype

Diff of /branches/charisee/src/compiler/tree-il/low-to-tree-fn.sml

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

revision 2686, Mon Aug 25 19:10:16 2014 UTC revision 2687, Wed Aug 27 13:28:50 2014 UTC
# Line 171  Line 171 
171    
172    (* record a local variable *)    (* record a local variable *)
173      fun addLocal (E{tbl, types,functs,locals}, x) = E{tbl=tbl,types=types, functs=functs,locals=x::locals}      fun addLocal (E{tbl, types,functs,locals}, x) = E{tbl=tbl,types=types, functs=functs,locals=x::locals}
174        fun addLocals (E{tbl, types,functs,locals}, x) = E{tbl=tbl,types=types, functs=functs,locals=x@locals}
175    
176      fun global (E{tbl, ...}, x, x') = VT.insert tbl (x, GLOB x')      fun global (E{tbl, ...}, x, x') = VT.insert tbl (x, GLOB x')
177    
# Line 183  Line 184 
184            VT.insert tbl (x, DEF(Dst.E_Var x'));            VT.insert tbl (x, DEF(Dst.E_Var x'));
185            env)            env)
186    
187        fun renameExp (env as E{tbl, ...}, x, x') = (
188            VT.insert tbl (x, DEF( x'));
189            env)
190    
191      fun peekGlobal (E{tbl, ...}, x) = (case VT.find tbl x      fun peekGlobal (E{tbl, ...}, x) = (case VT.find tbl x
192             of SOME(GLOB x') => SOME x'                    of SOME(GLOB x') => (print("\n peek global"^V.name x) ;SOME x')
193              | _ => NONE                    | _ => (print("\n Not considered global"^V.name x);NONE)
194            (* end case *))            (* end case *))
195    
     fun bindLocal (env, lhs, rhs) = if (V.useCount lhs = 1)  
                   then ( (insert(env, lhs, rhs), []))  
           else let  
             val t = newLocal lhs  
196    
197        fun bindLocal (env, lhs, rhs) =let
198            val n=V.useCount lhs
199            val _=print(String.concat["\n Count:",Int.toString n,"\n"])
200            fun AL _=let
201                val t = newLocal lhs
202              in              in
203                (rename(addLocal(env, t), lhs, t), [Dst.S_Assign([t], rhs)])                (rename(addLocal(env, t), lhs, t), [Dst.S_Assign([t], rhs)])
204              end              end
205    
206            in
207                if (n > 1)
208                then (case rhs
209                      of Dst.E_Mux(Ty.vectorLength tys,exps,cnt)=> let
210                      val name=V.name lhs
211                      val xs=List.map (fn n=>  Dst.Var.new(name^Int.toString(n), Dst.VK_Local,Ty.TensorTy [n]) ) tys
212                      val rhs=Dst.E_Mux(Ty.vectorLength  tys,List.map (fn v=>Dst.E_Var v) xs,n)
213                      val stmts=ListPair.map  (fn(x,e)=>Dst.S_Assign([x],e)) (xs,exps)
214                      val _=print(String.concat["\n New Locals\n",String.concatWith ",\n" (List.map Dst.toStringS stmts),"\n\n"])
215                      in
216                        (renameExp(addLocals(env,xs),lhs,rhs),stmts)
217                      end
218                    |_=> AL 1
219                    (*end case*))
220                else if (n = 1) then (insert(env, lhs, rhs), []) else AL 1
221            end
222    
223        fun bindGlobal(env,lhs,rhs,x)=let
224            val _=print "\n found global?"
225            in (env, [Dst.S_Assign([x], rhs)])
226            end
227    
228      fun bind (env, lhs, rhs) = (case peekGlobal (env, lhs)      fun bind (env, lhs, rhs) = (case peekGlobal (env, lhs)
229          of SOME x => ((env, [Dst.S_Assign([x], rhs)]))          of SOME x => bindGlobal(env,lhs,rhs,x)
230                    | NONE =>( bindLocal (env, lhs, rhs))          | NONE =>( bindLocal (env, lhs, rhs)) (**)
231          (* end case *))          (* end case *))
232    
233    (* set the definition of a variable, where the RHS is either a literal constant or a variable *)    (* set the definition of a variable, where the RHS is either a literal constant or a variable *)
# Line 309  Line 337 
337     *)     *)
338      fun doAssign (env, (lhs, rhs)) = let      fun doAssign (env, (lhs, rhs)) = let
339            fun doLHS () = (case peekGlobal(env, lhs)            fun doLHS () = (case peekGlobal(env, lhs)
340                   of SOME lhs' => (env, lhs')                  of SOME lhs' =>(print "doassign"; (env, lhs'))
341                    | NONE => let                    | NONE => let
342                        val t = newLocal lhs                        val t = newLocal lhs
343                        in                        in
# Line 374  Line 402 
402                      val (isFill,newSize,Pieces)=Target.getVecTy n                      val (isFill,newSize,Pieces)=Target.getVecTy n
403                      val (env, t) = doLHS()                      val (env, t) = doLHS()
404    
                     val newVars =List.tabulate(5,fn n=>newTmp (lhs,n))  
405    
406                      val cnt=useCount lhs                      val cnt=useCount lhs
407                      val _=print(String.concat["\n Used var ",Int.toString(cnt)," times"])                      val _=print(String.concat["\n Used var ",Int.toString(cnt)," times"])
# Line 549  Line 576 
576                              doNode (env', ifStk, stms' @ stms, !succ)                              doNode (env', ifStk, stms' @ stms, !succ)
577                        end                        end
578                    | Src.MASSIGN{stm=(ys, rator, xs), succ, ...} => let                    | Src.MASSIGN{stm=(ys, rator, xs), succ, ...} => let
579                          val _=print "In massign"
580                        fun doit () = let                        fun doit () = let
581                              fun doLHSVar (y, (env, ys)) = (case peekGlobal(env, y)                              fun doLHSVar (y, (env, ys)) = (case peekGlobal(env, y)
582                                     of SOME y' => (env, y'::ys)                                  of SOME y' => (print "In dolhsvar,some";(env, y'::ys))
583                                      | NONE => let                                      | NONE => let
584                                          val t = newLocal y                                          val t = newLocal y
585                                            val _=print "In dolhs none"
586                                          in                                          in
587                                            (rename (addLocal(env, t), y, t), t::ys)                                            (rename (addLocal(env, t), y, t), t::ys)
588                                          end                                          end
# Line 667  Line 696 
696     *)     *)
697      fun splitGlobalInit globalInit = let      fun splitGlobalInit globalInit = let
698  (* FIXME: can split as soon as we see a non-Input statement! *)  (* FIXME: can split as soon as we see a non-Input statement! *)
699    
700                val _ =    print "splitGlobalInit"
701            fun walk (nd, lastInput, live) = (case Nd.kind nd            fun walk (nd, lastInput, live) = (case Nd.kind nd
702                   of Src.ENTRY{succ} => walk (!succ, lastInput, live)                   of Src.ENTRY{succ} => walk (!succ, lastInput, live)
703                    | Src.COM{succ, ...} => walk (!succ, lastInput, live)                    | Src.COM{succ, ...} => walk (!succ, lastInput, live)

Legend:
Removed from v.2686  
changed lines
  Added in v.2687

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