[svn] r6174: nemerle/branches/optimizer/ncc: Makefile generation/Optimizer.n generation/SSA.n generation/T...

pawel svnadmin at nemerle.org
Wed Apr 5 01:09:44 CEST 2006


Log:
LocalValue oriented SSA tree (before int based one).


Author: pawel
Date: Wed Apr  5 01:09:41 2006
New Revision: 6174

Added:
   nemerle/branches/optimizer/ncc/generation/SSA.n
   nemerle/branches/optimizer/ncc/testsuite/optimizer/
   nemerle/branches/optimizer/ncc/testsuite/optimizer/branch.n
   nemerle/branches/optimizer/ncc/testsuite/optimizer/branch2.n
   nemerle/branches/optimizer/ncc/testsuite/optimizer/brute.n
   nemerle/branches/optimizer/ncc/testsuite/optimizer/factorial.n
   nemerle/branches/optimizer/ncc/testsuite/optimizer/fib.n
   nemerle/branches/optimizer/ncc/testsuite/optimizer/imperative.n
   nemerle/branches/optimizer/ncc/testsuite/optimizer/propagate.n
   nemerle/branches/optimizer/ncc/testsuite/optimizer/scope.n
Modified:
   nemerle/branches/optimizer/ncc/Makefile
   nemerle/branches/optimizer/ncc/generation/Optimizer.n
   nemerle/branches/optimizer/ncc/generation/Typer3.n
   nemerle/branches/optimizer/ncc/misc/PrettyPrint.n
   nemerle/branches/optimizer/ncc/typing/TypedTree.n

Modified: nemerle/branches/optimizer/ncc/Makefile
==============================================================================
--- nemerle/branches/optimizer/ncc/Makefile	(original)
+++ nemerle/branches/optimizer/ncc/Makefile	Wed Apr  5 01:09:41 2006
@@ -34,7 +34,7 @@
 ############################################################
 
 COMPILER_PATH = ../boot/
-NCC_FLAGS     = -dowarn:10006 -pedantic-lexer -def:_$(STAGE) -stats -greedy- $(NEM_FLAGS) $(ADD_FLAGS) -O
+NCC_FLAGS     = -dowarn:10006 -pedantic-lexer -def:_$(STAGE) -stats -greedy- $(NEM_FLAGS) $(ADD_FLAGS)
 COMPILER      = $(COMPILER_PATH)ncc.exe
 COMPILER_DEP  = $(COMPILER_PATH)ncc.exe $(COMPILER_PATH)Nemerle.Macros.dll
 EXECUTE       = $(NET_ENGINE) $(NET_FLAGS)
@@ -89,6 +89,7 @@
 	generation/Typer3.n		 \
 	generation/Typer4.n		 \
 	generation/Optimizer.n		 \
+	generation/SSA.n		 \
 	hierarchy/ExtensionMethod.n      \
 	hierarchy/BuiltinMethod.n        \
 	hierarchy/ClassMembers.n	 \

Modified: nemerle/branches/optimizer/ncc/generation/Optimizer.n
==============================================================================
--- nemerle/branches/optimizer/ncc/generation/Optimizer.n	(original)
+++ nemerle/branches/optimizer/ncc/generation/Optimizer.n	Wed Apr  5 01:09:41 2006
@@ -10,87 +10,132 @@
 
 namespace Nemerle.Compiler
   class Optimizer
+    LabelChronology : Hashtable[int,int]
+    LabIdx : Hashtable[int,TExpr.Label]
+    defSet : Hashtable[int,TExpr*Hashtable[LocalValue,int]]
     mutable e : TExpr;
+    parms : list [Fun_parm];
+    static mutable OptCounter = 0
 
-    public this(e' : TExpr)
-      e = e'
+    public this(body' : TExpr, parms' : list [Fun_parm])
+      LabelChronology = Hashtable()
+      defSet = Hashtable()
+      LabIdx = Hashtable()
+      e = body'
+      parms = parms'
     
-    static StripUnusedLabels(e : TExpr) : TExpr
-      def h = Hashtable()
     
+    StripUnusedLabels(e : TExpr) : TExpr
+      def h = Hashtable()
       def WalkerGatherUsedLabels(_ : TExpr) : TExpr
         | TExpr.Goto(k, _) =>
             h[k] = true
             null
         | _ =>
             null
+      _ = e.Walk(WalkerGatherUsedLabels)            
       
-      def WalkerStripLabels(_ : TExpr) : TExpr
+      mutable idx = 1
+      
+      def WalkerStripLabels(expr : TExpr) : TExpr
         | TExpr.Label (k, body) when !h[k] =>
             body.Walk(WalkerStripLabels)
+        | TExpr.Label (k, _) =>
+            LabelChronology[k] = idx
+            idx++
+            LabIdx[k] = expr:>TExpr.Label
+            null
         | _ =>
             null
-            
-      _ = e.Walk(WalkerGatherUsedLabels)
-      print("Stripping labels\n")
+//      print("Stripping labels\n")
       e.Walk(WalkerStripLabels)
       
-    static CopyPropagate(e : TExpr) : TExpr
-      print("Copy propagate\n")
+    WalkLabels(f : int * TExpr -> TExpr) : TExpr -> TExpr
+      mutable cont = true
+      mutable idx = 0
+      def g(e : TExpr) :TExpr
+        if (cont)
+          match (e)
+            | TExpr.Label (k, _) =>
+                idx = LabelChronology[k]
+            | _ => ()
+          def r = f(idx, e)
+          when (r:object == e:object)
+            cont = false
+          r
+        else
+          e
+      g  
+      
+      
+    CopyPropagate(e : TExpr) : TExpr
+
+//4000 2000
+     if ((OptCounter!=427) && (OptCounter==3473) || true)
+//      print("Copy propagate $(OptCounter)\n")
+//      print("$(e)")      
+      OptCounter++
       def WalkerFind(mutable e2 : TExpr)
         | TExpr.DefValIn(name, TExpr.LocalRef(refer), body) when !(name.ValKind is LocalValue.Kind.FunParm) =>
-            print("  propagate $refer (type:$(refer.ValKind.GetType()) into $name\n")
+//            print("  propagate $(name.GetHashCode()) $refer (type:$(refer.ValKind.GetType()) into $name\n")
+          
             mutable clean = true            
             def WalkerProp(e)
  /*              | TExpr.Goto =>
                   clean = false
-                  e            
-             | TExpr.Label => 
-                  clean = false
                   e            */
+              | TExpr.Label(k,_) when LabelChronology[k]<=defSet[k][1][name] => 
+                  clean = false
+                  e           
               | TExpr.DefValIn(refe, _, _) when refe.Equals(name) =>
                   clean = false              
                   e
               | TExpr.Assign(TExpr.LocalRef(refe), _) when refe.Equals(name) =>
                   clean = false
+//                  print("ass___\n")
                   e
               | TExpr.LocalRef(refe) when refe.Equals(name) =>
-                  print("  Propagate! ($refe -> $refer) ## in func $(refer.DefinedIn) \n")
+//                  print("  Propagate! ($refe -> $refer) ## in func $(refer.DefinedIn) \n")
                   TExpr.LocalRef(refer)
               | _ => null
 
-            (e2:>TExpr.DefValIn).body = body.Walk(WalkerProp)
+            (e2:>TExpr.DefValIn).body = body.Walk(fun(e) {if (clean) WalkerProp(e) else e})
             
             if (clean)
-              print("  Delete $name ##\n")
-              (e2:>TExpr.DefValIn).body  //.Walk(CopyPropagate)
+//              print("  Delete $name ##\n")
+              (e2:>TExpr.DefValIn).body.Walk(CopyPropagate)
             else
               null
         | _ =>
             null
-      e.Walk(WalkerFind)
+      def res = e.Walk(WalkerFind)
+//      print("$(res)")
+      res
+     else
+      OptCounter++     
+      e
             
     static TupleDismounter(e : TExpr) : TExpr
-      print("TupleDismount\n")
+//      print("TupleDismount\n")
       def WalkerTuple(mutable ala : TExpr)
         | TExpr.DefValIn(name, TExpr.Tuple(args), body) =>
-            print("Search for $name -- $args\n")
+//            print("Search for $name -- $args\n")
             mutable clean = true
             def WalkerTupleFindUsage(e)
               | TExpr.TupleIndexer(TExpr.LocalRef(refer), x, y) when refer.Equals(name) =>
-                  print(" Just index $refer $x $y\n")
+//                  print(" Just index $refer $x $y\n")
                   e
               | TExpr.LocalRef(refer) when refer.Equals(name) =>
-                  print("$name referenced outside indexer\n")
+//                  print("$name referenced outside indexer\n")
                   clean = false
                   e.Walk(WalkerTuple)
               | TExpr.MultipleAssign(assigns) =>
                   def AssignCheck(_)
                     | (lv,TExpr.TypeConversion(TExpr.Tuple(_),_,_))::xs when lv.Equals(name) =>
-                        print("$name Multiple assing tuple\n")
+//                        print("$name Multiple assing tuple\n")
                         AssignCheck(xs)
                     | (lv,t)::_ when lv.Equals(name) =>
-                        print("$name Multiple assing fault $(t.GetType())\n")                    
+//                        print("$name Multiple assing fault $(t.GetType())\n")                    
                         clean = false
                         e
                     | _ => null
@@ -99,7 +144,7 @@
 
             _ = body.Walk(WalkerTupleFindUsage)
             if (clean)
-              print(" Dismount! $(name)\n")
+//              print(" Dismount! $(name)\n")
               
               def bas = Util.tmpname(name.Name + "_")
               def ltab = Hashtable()
@@ -113,7 +158,7 @@
 
               def WalkerTupleToVals(e)
                 | TExpr.TupleIndexer(TExpr.LocalRef(refer), x, _) when refer.Equals(name) =>
-                    print(" replace! ##")
+//                    print(" replace! ##")
                     TExpr.LocalRef(ltab[x])
                 | TExpr.MultipleAssign(assigns) =>
                     def NewAssigns(al)
@@ -130,7 +175,7 @@
                     TExpr.MultipleAssign(NewAssigns(assigns))
                 | _ => null
 
-              CopyPropagate(CreateDefVal(args,0,body).Walk(WalkerTupleToVals)).Walk(WalkerTuple)
+              CreateDefVal(args,0,body).Walk(WalkerTupleToVals).Walk(WalkerTuple)
             else
               null
         | _ => null
@@ -149,12 +194,80 @@
       print("\n")
       null  */
     
+    public DataFlow(e : TExpr) : void
+//      def defSet = Hashtable()
+      
+      def PathFlow (e : TExpr, mutable defs : Hashtable[LocalValue,int]) : Hashtable[LocalValue,int]
+
+        def PropagateFlow (l : int, end : TExpr ,mutable defs : Hashtable[LocalValue,int])
+          defSet[l] = (defSet[l][0], defs.Clone())
+          
+          mutable END = false
+          
+          def Propagate(idx : int, e : TExpr) : TExpr
+            match(e)
+              | TExpr.Label (k, _) =>
+                  defSet[k] = (e, defs.Clone())
+//                  print("l$k ($idx):\t$(defs)\n")                  
+                  null
+              | TExpr.Goto when e:object == end:object =>
+                  END = true
+                  e
+              | TExpr.Goto(k, _) when LabelChronology[k]<=idx =>
+                  PropagateFlow(k, e, defs)
+                  null
+              | _ => null
+              
+          defSet[l][0].Walk(WalkLabels(Propagate))
+//          assert(END)
+        
+
+        def WalkerFlow (idx : int, e : TExpr) : TExpr
+          match(e)
+            | TExpr.Label (k, _)  =>
+                defSet[k] = (e, defs.Clone())
+//                print("l$k ($idx):\t$(defs)\n")
+                null
+            | TExpr.Goto(k, _) when LabelChronology[k]<=idx =>
+//                print("  goto-up $k\n")
+                PropagateFlow(k, e, defs)
+                null            
+
+            | TExpr.Goto(k, _) =>
+                print("  goto-down $k/$idx\n")
+//                def PathFlow[k]
+                null            
+            | TExpr.DefValIn(name, TExpr.LocalRef(refer), _) =>
+//                print(". $name = $refer\n")
+                defs[name] = idx
+                null
+/*           | TExpr.DefValIn(name, val, body) =>
+                print(". $name = $val\n")
+                defs = (idx,name)::defs
+                null*/
+            | TExpr.Assign(TExpr.LocalRef(name), val)  =>
+//                print("  $name = $val\n")
+                defs[name] = idx
+                null
+            | _ =>
+                null
+        e.Walk(WalkLabels(WalkerFlow))
+//        print("$defs\n")
+        defs
+      _ = PathFlow(e,Hashtable())
+      ()
+    
+    
     public Run() : TExpr
-      print("Optimize!\n")
-      print("$e\n")
+//      print("Optimize!\n")
+//      print("$e\n")
 //      _ = e.Walk(WalkerPrint)
       e = StripUnusedLabels(e)
+//      print("$e\n")      
       e = TupleDismounter(e)
+//      print("$e\n")      
+//      DataFlow(e)
 //      e = CopyPropagate(e)
-      print("$e\n") 
+      def ssa = SSA(e, parms, LabIdx)
+      e = ssa.GetResult()
       e

Added: nemerle/branches/optimizer/ncc/generation/SSA.n
==============================================================================
--- (empty file)
+++ nemerle/branches/optimizer/ncc/generation/SSA.n	Wed Apr  5 01:09:41 2006
@@ -0,0 +1,222 @@
+#pragma indent
+using Nemerle.Collections
+using Nemerle.Utility
+using Nemerle.Logging
+
+using Nemerle.Compiler
+using Nemerle.Compiler.Typedtree
+using Nemerle.Compiler.SolverMacros
+using Nemerle.IO
+
+namespace Nemerle.Compiler
+  variant SSAflow
+    | Goto
+        id : int 
+        defs : list[TExpr.SSAidx]
+    
+  class SSA
+    mutable i : int
+    ex : TExpr
+    parms : list [Fun_parm]
+    LabIdx : Hashtable[int,TExpr.Label]
+    mutable tasks : list[SSAflow]
+        
+    public this (e : TExpr, parms' : list [Fun_parm], li: Hashtable[int,TExpr.Label])
+      LabIdx = li
+      parms = parms'
+      i = 0
+      def parm = Hashtable()
+      foreach (p in parms)
+        parm[p.decl] = i
+        i++
+      (ex, _) = NodesAdd(e, [parm])
+      
+      print("--SSA--\n$ex\n") 
+      PropagateDefs()       
+      print("--SSA after gotos--\n$ex\n")       
+      
+
+    NodesAdd(e : TExpr, mutable defchain : list[Hashtable[LocalValue,int]]) : TExpr * Hashtable[LocalValue,int]
+      def defs' =  Hashtable()
+      defchain = defs'::defchain
+      
+      def getIdx(name)
+        mutable i = -1
+        foreach(defs in defchain)
+          when (defs.Contains(name))
+            i = defs[name]
+        assert(i > -1)
+        i
+        
+      def getSSAidxs()
+        def de = Hashtable(defs')
+        foreach(d in defchain.Tail)
+          foreach((k,v) in d.KeyValuePairs)
+            unless (de.Contains(k))
+              de[k]=v
+        
+        mutable ssaidxs = []
+        de.Iter(fun(name,idx) { ssaidxs = TExpr.SSAidx(TExpr.LocalRef(name), idx)::ssaidxs })
+        ssaidxs
+        
+
+      def AddSSAWalk(e : TExpr) : TExpr
+        | TExpr.DefValIn(_, TExpr.DefaultValue, _) =>
+            null
+
+        | TExpr.DefValIn(name, val, body) =>
+            def val' = val.Walk(AddSSAWalk)
+            i++
+            defs'[name] = i
+            def i' = i
+            def body' = body.Walk(AddSSAWalk)
+            TExpr.SSAidx(TExpr.DefValIn(name, val', body'), i')
+
+        | TExpr.Assign(TExpr.LocalRef(name), expr) =>
+            def expr' = expr.Walk(AddSSAWalk)
+            i++
+            def c = i            
+            defs'[name] = i
+            TExpr.Assign(TExpr.SSAidx(TExpr.LocalRef(e.Type, name), c), expr')
+        
+        | TExpr.MultipleAssign(assigns) =>
+            def e' = e.Walk(fun(x){ if (x==e:object) null else AddSSAWalk(x)})
+            i++
+            foreach ((lv, _) in assigns)
+              defs'[lv] = i
+            TExpr.SSAidx(e',i)
+
+        | TExpr.LocalRef(name) =>
+            TExpr.SSAidx(e, getIdx(name))
+
+//Jezeli mamy juz phi..
+        | TExpr.Label(_id, TExpr.SSAphip(_body, _phi)) =>
+            null
+            
+        | TExpr.Label(id, body) =>
+            mutable phi = Hashtable()
+            
+            foreach(defs in defchain)
+              foreach ((name, i') in defs.KeyValuePairs)
+                def nam = TExpr.LocalRef(name)
+                i++
+                phi[name] = (i, [TExpr.SSAidx(nam, i')])
+                defs'[name] = i
+
+            def body' = body.Walk(AddSSAWalk)
+            
+            LabIdx[id] = TExpr.Label(id, TExpr.SSAphip(body', phi))
+            LabIdx[id]
+            
+        | TExpr.If(cond, the, els) =>
+            def cond' = cond.Walk(AddSSAWalk)
+            def (the', the_defs) = NodesAdd(the, defchain)
+            def (els', els_defs) = NodesAdd(els, defchain)
+            
+            mutable phi = Hashtable()
+            
+            foreach ((name, i') in the_defs.KeyValuePairs)
+              if (els_defs.Contains(name))
+                def i'' = els_defs[name]
+                when (i' != i'')
+                  i++
+                  def nam = TExpr.LocalRef(name)
+                  phi[name] = (i, [TExpr.SSAidx(nam, i'), TExpr.SSAidx(nam, i'')])
+                  defs'[name] = i
+                  els_defs.Remove(name)
+                  the_defs.Remove(name)
+              else when (defs'.Contains(name))
+                def i'' = defs'[name]
+                when (i' != i'')
+                  i++
+                  def nam = TExpr.LocalRef(name)
+                  phi[name] = (i, [TExpr.SSAidx(nam, i'), TExpr.SSAidx(nam, i'')])
+                  defs'[name] = i                
+                  the_defs.Remove(name)
+                
+            foreach ((name, i') in els_defs.KeyValuePairs)
+              when (defs'.Contains(name))
+                def i'' = defs'[name]
+                when (i' != i'')
+                  i++
+                  def nam = TExpr.LocalRef(name)
+                  phi[name] = (i, [TExpr.SSAidx(nam, i'), TExpr.SSAidx(nam, i'')])
+                  defs'[name] = i                
+                  els_defs.Remove(name)
+            
+            if (phi.Count>0)
+              TExpr.SSAphi(TExpr.If(cond', the', els'), phi)
+            else
+              TExpr.If(cond', the', els')
+
+// Pamietac o 'usunieciu definicji' po goto              
+        | TExpr.Goto(id, _) =>
+            tasks = SSAflow.Goto(id, getSSAidxs())::tasks
+            defs'.Clear()
+            defchain = [defs']
+            null
+ 
+        | _ =>
+            null
+
+      foreach(d in defchain.Tail)
+        foreach((k,v) in d.KeyValuePairs) 
+          unless (defs'.Contains(k))
+            defs'[k]=v
+            
+      (e.Walk(AddSSAWalk), defs')
+      
+    PropagateDefs() : void
+      foreach (t in tasks)
+        match(t)
+          | Goto(id , defs) =>
+              print("G $id $defs \n")
+              match (LabIdx[id])
+                | TExpr.Label(_, TExpr.SSAphip(_, phis)) =>
+                    print(" $phis \n")                
+                    foreach(ssanode in defs)
+                      match (ssanode)
+                        | TExpr.SSAidx(TExpr.LocalRef(name), idx) when phis.Contains(name) =>
+                            phis[name] = (phis[name][0], ssanode::phis[name][1])
+                        | TExpr.SSAidx(expr, idx) =>
+                            print("  dump $idx#$expr\n")
+                        | _ =>
+                            assert(false)
+
+                | _ =>
+                    assert(false)
+      
+/*    CopyPropagate() : void
+    
+      def into = Hashtable()
+      
+      def PropagateWalk(e : TExpr) : TExpr
+        | TExpr.SSAidx(TExpr.DefValIn(name, TExpr.SSAidx(expr, idx), body), idx') =>
+            into[(name,idx')] = (expr,idx)
+          
+            
+        | TExpr.SSAphip(_, phi) =>
+            foreach((loc ,(idx, args)) in phi)
+              match(args)
+                | SSAidx(expr, idx')::[] when (idx' == idx) => 
+                    phi.Remove(loc)
+                    into[(name,
+        | _ =>
+            null
+  */                          
+
+    public GetResult() : TExpr
+      NodesRemove(ex)
+      
+    static NodesRemove(e : TExpr) : TExpr
+      def RemoveSSAWalk(_ : TExpr) : TExpr
+        | TExpr.SSAidx(expr, _) =>
+            expr.Walk(RemoveSSAWalk)
+        | TExpr.SSAphi(body, _) =>
+            body.Walk(RemoveSSAWalk)
+        | TExpr.SSAphip(body, _) =>
+            body.Walk(RemoveSSAWalk)
+        | _ =>
+            null
+
+      e.Walk(RemoveSSAWalk)

Modified: nemerle/branches/optimizer/ncc/generation/Typer3.n
==============================================================================
--- nemerle/branches/optimizer/ncc/generation/Typer3.n	(original)
+++ nemerle/branches/optimizer/ncc/generation/Typer3.n	Wed Apr  5 01:09:41 2006
@@ -184,11 +184,11 @@
           | FunBody.Typed (body) =>
             // FIXME?: Typed3 
             def body = BuildRevSequence (Walk (body) :: initializers);
-            def body =
+/*            def body =
               if ((the_method != null) && (Options.Optimize))
                 Optimizer(body).Run()
               else
-                body;
+                body;*/
             
             def expr = TExpr.Label (body.Type, start_label, body);
             def expr =
@@ -197,12 +197,11 @@
               else
                 SubstExpr (expr);
             
-/*            def expr =
-              if (Options.Optimize)
-                Optm(expr).Run()
+            def expr =
+              if ((the_method != null) && (Options.Optimize))
+                Optimizer(expr, current_local_fun.parms).Run()
               else
-                expr;*/
-
+                expr;
             
             current_local_fun.body = FunBody.Typed (expr);
             when (Options.ShouldDump (current_local_fun))

Modified: nemerle/branches/optimizer/ncc/misc/PrettyPrint.n
==============================================================================
--- nemerle/branches/optimizer/ncc/misc/PrettyPrint.n	(original)
+++ nemerle/branches/optimizer/ncc/misc/PrettyPrint.n	Wed Apr  5 01:09:41 2006
@@ -912,6 +912,15 @@
       }   
 
 
+      // prints a Phi functions for SSA
+      def print_ssa_phi (phis : Hashtable[LocalValue, (int * list[TT.TExpr.SSAidx])])
+      {
+        append("Phi");
+        foreach ((name, (idx, list)) in phis.KeyValuePairs)
+          append ($" $idx#$(name.Name):$list")
+      }
+
+
       // indent the top level expressions
       when (is_top_level) indent ();
 
@@ -1195,6 +1204,18 @@
                           indentation, result)
           else
             append ("(Delayed)")
+            
+        | TT.TExpr.SSAidx(expr, idx) =>
+          append ($"$idx#");
+          recurse (expr)
+
+        | TT.TExpr.SSAphi(expr, phi) =>
+          recurse (expr);
+          append ($"\n$(indentation)$(print_ssa_phi(phi))");
+            
+        | TT.TExpr.SSAphip(expr, phi) =>
+          append ($"$(print_ssa_phi(phi))\n$indentation");
+          recurse (expr)
       }
 
       //append ($"{$(expr.Type)}");

Added: nemerle/branches/optimizer/ncc/testsuite/optimizer/branch.n
==============================================================================
--- (empty file)
+++ nemerle/branches/optimizer/ncc/testsuite/optimizer/branch.n	Wed Apr  5 01:09:41 2006
@@ -0,0 +1,30 @@
+#pragma indent
+using Nemerle.IO
+
+mutable a = 10
+mutable d = a
+mutable b = 3
+
+
+def f(x)
+ | 1 =>
+   if (true)
+    def c = a
+    a = 1000
+    d = 4
+    if (true)
+      a = 11
+    else
+      a = 13
+   else  
+    def c = a
+    a = 10
+    b = 2
+    
+    f(1)
+ | 0 =>()
+
+f(1)
+    
+print("$a $b $d")
+

Added: nemerle/branches/optimizer/ncc/testsuite/optimizer/branch2.n
==============================================================================
--- (empty file)
+++ nemerle/branches/optimizer/ncc/testsuite/optimizer/branch2.n	Wed Apr  5 01:09:41 2006
@@ -0,0 +1,23 @@
+#pragma indent
+using Nemerle.IO
+
+
+mutable b = 0
+b = 
+  if (true) 
+    b=3
+    b+1
+  else 2
+
+print("$b")
+
+//
+a = fun
+
+fun b()
+a()
+
+a = fun
+
+
+

Added: nemerle/branches/optimizer/ncc/testsuite/optimizer/brute.n
==============================================================================
--- (empty file)
+++ nemerle/branches/optimizer/ncc/testsuite/optimizer/brute.n	Wed Apr  5 01:09:41 2006
@@ -0,0 +1,24 @@
+#pragma indent
+using Nemerle.Imperative
+using Nemerle.IO
+
+def a = 3
+def d = a
+mutable b = a
+mutable c = a
+for (;c<10;c++)
+  def ala = 2
+  b = d
+
+def bo = match ('+')
+    | '+' | '-' =>  
+      b = 3    
+      true
+    | _ => 
+      false
+    
+
+when (true || false)
+  b = d
+
+print("s$b $bo\n")

Added: nemerle/branches/optimizer/ncc/testsuite/optimizer/factorial.n
==============================================================================
--- (empty file)
+++ nemerle/branches/optimizer/ncc/testsuite/optimizer/factorial.n	Wed Apr  5 01:09:41 2006
@@ -0,0 +1,28 @@
+#pragma indent
+using Nemerle.IO
+
+def factt(_,_)
+  | (1,acc) => acc
+  | (x,acc) => factt(x-1,acc*x)
+  
+def fact(x) 
+  factt(x,1)
+    
+  
+def fact2(x)
+  | 1 => 1
+  | x => x * fact2(x-1)
+  
+  
+def g(mutable x )
+  x = x + 10
+  g(x)
+
+
+g(1)
+g(2)
+
+
+  
+print("$(fact(5))")
+

Added: nemerle/branches/optimizer/ncc/testsuite/optimizer/fib.n
==============================================================================
--- (empty file)
+++ nemerle/branches/optimizer/ncc/testsuite/optimizer/fib.n	Wed Apr  5 01:09:41 2006
@@ -0,0 +1,10 @@
+#pragma indent
+using Nemerle.IO
+
+def fib(n,s)
+  if (n<2)
+    1+s
+  else
+    fib(n-1,fib(n-2,s))
+    
+print("$(fib(40,0))")

Added: nemerle/branches/optimizer/ncc/testsuite/optimizer/imperative.n
==============================================================================
--- (empty file)
+++ nemerle/branches/optimizer/ncc/testsuite/optimizer/imperative.n	Wed Apr  5 01:09:41 2006
@@ -0,0 +1,18 @@
+#pragma indent
+using Nemerle.Imperative
+using Nemerle.IO
+
+def a = 3
+def d = a
+mutable b = a
+mutable c = a
+while (true)
+  while (true)
+    b=d
+    continue
+    b=d
+  //  break
+  
+print("$b")
+
+

Added: nemerle/branches/optimizer/ncc/testsuite/optimizer/propagate.n
==============================================================================
--- (empty file)
+++ nemerle/branches/optimizer/ncc/testsuite/optimizer/propagate.n	Wed Apr  5 01:09:41 2006
@@ -0,0 +1,21 @@
+#pragma indent
+using Nemerle.IO
+
+def a(x)
+  mutable b = x
+  match (b)
+   | 4 => 
+      b = 1000
+      b
+   | 100 =>
+      b
+   | _ =>
+      a(4)
+/*      
+def b(_)
+  | (1,2) => 2
+  | (2,5) => 3*/
+  
+
+print("$(a(4))")
+// $(b(2,5)) $(b(2,5))")

Added: nemerle/branches/optimizer/ncc/testsuite/optimizer/scope.n
==============================================================================
--- (empty file)
+++ nemerle/branches/optimizer/ncc/testsuite/optimizer/scope.n	Wed Apr  5 01:09:41 2006
@@ -0,0 +1,9 @@
+#pragma indent
+using Nemerle.IO
+
+def b = 3
+def a = b
+print(a)
+def b = 3
+def a = b
+print(a)

Modified: nemerle/branches/optimizer/ncc/typing/TypedTree.n
==============================================================================
--- nemerle/branches/optimizer/ncc/typing/TypedTree.n	(original)
+++ nemerle/branches/optimizer/ncc/typing/TypedTree.n	Wed Apr  5 01:09:41 2006
@@ -29,6 +29,7 @@
 using Nemerle.Compiler;
 using Nemerle.Utility;
 using Nemerle.Compiler.Typedtree;
+using Nemerle.Collections;
 
 namespace Nemerle.Compiler.Typedtree
 {
@@ -484,6 +485,10 @@
                               default : option [TExpr]; 
                               cases : list [int * TExpr]; }
     
+    | SSAidx                { expr : TExpr; mutable idx : int; }
+    | SSAphi                { body : TExpr; phis : Hashtable[LocalValue, (int * list[TExpr.SSAidx])]; }
+    | SSAphip               { body : TExpr; phis : Hashtable[LocalValue, (int * list[TExpr.SSAidx])]; }    
+    
     public mutable ty : TyVar;
     
     [FlagAccessor (IsAssigned, flags = WantSetter | Internal)]



More information about the svn mailing list