[svn] r6151: nemerle/branches/optimizer: boot/Nemerle.Compiler.dll boot/Nemerle.Macros.dll boot/Nemerle.dl...

pawel svnadmin at nemerle.org
Sun Mar 5 02:37:45 CET 2006


Log:
Add TupleDismounter & silly CopyPropagate. Boot contains ncc without optimizer.


Author: pawel
Date: Sun Mar  5 02:37:15 2006
New Revision: 6151

Added:
   nemerle/branches/optimizer/ncc/generation/Optimizer.n
Modified:
   nemerle/branches/optimizer/boot/Nemerle.Compiler.dll
   nemerle/branches/optimizer/boot/Nemerle.Macros.dll
   nemerle/branches/optimizer/boot/Nemerle.dll
   nemerle/branches/optimizer/boot/ncc.exe
   nemerle/branches/optimizer/ncc/Makefile
   nemerle/branches/optimizer/ncc/generation/Typer3.n
   nemerle/branches/optimizer/ncc/testsuite/benchmarks/match-tuple.n

Modified: nemerle/branches/optimizer/boot/Nemerle.Compiler.dll
==============================================================================
Binary files. No diff available.

Modified: nemerle/branches/optimizer/boot/Nemerle.Macros.dll
==============================================================================
Binary files. No diff available.

Modified: nemerle/branches/optimizer/boot/Nemerle.dll
==============================================================================
Binary files. No diff available.

Modified: nemerle/branches/optimizer/boot/ncc.exe
==============================================================================
Binary files. No diff available.

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

Added: nemerle/branches/optimizer/ncc/generation/Optimizer.n
==============================================================================
--- (empty file)
+++ nemerle/branches/optimizer/ncc/generation/Optimizer.n	Sun Mar  5 02:37:15 2006
@@ -0,0 +1,160 @@
+#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
+  class Optimizer
+    mutable e : TExpr;
+
+    public this(e' : TExpr)
+      e = e'
+    
+    static StripUnusedLabels(e : TExpr) : TExpr
+      def h = Hashtable()
+    
+      def WalkerGatherUsedLabels(_ : TExpr) : TExpr
+        | TExpr.Goto(k, _) =>
+            h[k] = true
+            null
+        | _ =>
+            null
+      
+      def WalkerStripLabels(_ : TExpr) : TExpr
+        | TExpr.Label (k, body) when !h[k] =>
+            body.Walk(WalkerStripLabels)
+        | _ =>
+            null
+            
+      _ = e.Walk(WalkerGatherUsedLabels)
+      print("Stripping labels\n")
+      e.Walk(WalkerStripLabels)
+      
+    static CopyPropagate(e : TExpr) : TExpr
+      print("Copy propagate\n")
+      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")
+            mutable clean = true            
+            def WalkerProp(e)
+ /*              | TExpr.Goto =>
+                  clean = false
+                  e            
+             | TExpr.Label => 
+                  clean = false
+                  e            */
+              | TExpr.DefValIn(refe, _, _) when refe.Equals(name) =>
+                  clean = false              
+                  e
+              | TExpr.Assign(TExpr.LocalRef(refe), _) when refe.Equals(name) =>
+                  clean = false
+                  e
+              | TExpr.LocalRef(refe) when refe.Equals(name) =>
+                  print("  Propagate! ($refe -> $refer) ## in func $(refer.DefinedIn) \n")
+                  TExpr.LocalRef(refer)
+              | _ => null
+
+            (e2:>TExpr.DefValIn).body = body.Walk(WalkerProp)
+            
+            if (clean)
+              print("  Delete $name ##\n")
+              (e2:>TExpr.DefValIn).body  //.Walk(CopyPropagate)
+            else
+              null
+        | _ =>
+            null
+      e.Walk(WalkerFind)
+            
+    static TupleDismounter(e : TExpr) : TExpr
+      print("TupleDismount\n")
+      def WalkerTuple(mutable ala : TExpr)
+        | TExpr.DefValIn(name, TExpr.Tuple(args), body) =>
+            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")
+                  e
+              | TExpr.LocalRef(refer) when refer.Equals(name) =>
+                  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")
+                        AssignCheck(xs)
+                    | (lv,t)::_ when lv.Equals(name) =>
+                        print("$name Multiple assing fault $(t.GetType())\n")                    
+                        clean = false
+                        e
+                    | _ => null
+                  AssignCheck(assigns)
+              | _ => null
+
+            _ = body.Walk(WalkerTupleFindUsage)
+            if (clean)
+              print(" Dismount! $(name)\n")
+              
+              def bas = Util.tmpname(name.Name + "_")
+              def ltab = Hashtable()
+
+              def CreateDefVal(v,i,tail)
+                | (x::xs,i,t) =>
+                    ltab[i] = LocalValue(name.DefinedIn, $"$(bas)_$(i)", x.Type, LocalValue.Kind.Plain(), true)
+                    ltab[i].UseFrom(name.DefinedIn)
+                    TExpr.DefValIn(ltab[i], x , CreateDefVal(xs,i+1,t))
+                | ([],_,t) => t
+
+              def WalkerTupleToVals(e)
+                | TExpr.TupleIndexer(TExpr.LocalRef(refer), x, _) when refer.Equals(name) =>
+                    print(" replace! ##")
+                    TExpr.LocalRef(ltab[x])
+                | TExpr.MultipleAssign(assigns) =>
+                    def NewAssigns(al)
+                      | (lv,TExpr.TypeConversion(TExpr.Tuple(ex),_,_))::xs when lv.Equals(name) =>
+                          def SplitToAssigns(ex,i)
+                            | (x::xs,i) =>
+                                (ltab[i], x)::SplitToAssigns(xs,i+1)
+                            | (_,_) => NewAssigns(xs)
+                          SplitToAssigns(ex,0)
+                      | x::xs =>
+                          x::NewAssigns(xs)
+                      | [] => null
+                      
+                    TExpr.MultipleAssign(NewAssigns(assigns))
+                | _ => null
+
+              CopyPropagate(CreateDefVal(args,0,body).Walk(WalkerTupleToVals)).Walk(WalkerTuple)
+            else
+              null
+        | _ => null
+      e.Walk(WalkerTuple)
+
+/*    static WalkerPrint(x : TExpr) : TExpr
+      print("$(x.GetType())\t")
+      _ = match(x)
+        | TExpr.Call(x,y,z) =>
+            print((x,y,z))
+            null
+        | TExpr.DefValIn(name,TExpr.Tuple(arg),_) =>
+            print((name,arg))
+            null
+        | _ => null
+      print("\n")
+      null  */
+    
+    public Run() : TExpr
+      print("Optimize!\n")
+      print("$e\n")
+//      _ = e.Walk(WalkerPrint)
+      e = StripUnusedLabels(e)
+      e = TupleDismounter(e)
+//      e = CopyPropagate(e)
+      print("$e\n") 
+      e

Modified: nemerle/branches/optimizer/ncc/generation/Typer3.n
==============================================================================
--- nemerle/branches/optimizer/ncc/generation/Typer3.n	(original)
+++ nemerle/branches/optimizer/ncc/generation/Typer3.n	Sun Mar  5 02:37:15 2006
@@ -184,12 +184,26 @@
           | FunBody.Typed (body) =>
             // FIXME?: Typed3 
             def body = BuildRevSequence (Walk (body) :: initializers);
+            def body =
+              if ((the_method != null) && (Options.Optimize))
+                Optimizer(body).Run()
+              else
+                body;
+            
             def expr = TExpr.Label (body.Type, start_label, body);
             def expr =
               if (current_subst == null || current_subst.IsEmpty)
                 expr
               else
                 SubstExpr (expr);
+            
+/*            def expr =
+              if (Options.Optimize)
+                Optm(expr).Run()
+              else
+                expr;*/
+
+            
             current_local_fun.body = FunBody.Typed (expr);
             when (Options.ShouldDump (current_local_fun))
               Message.Debug ($ "after T3: $CurrentType.$(current_local_fun.name) "

Modified: nemerle/branches/optimizer/ncc/testsuite/benchmarks/match-tuple.n
==============================================================================
--- nemerle/branches/optimizer/ncc/testsuite/benchmarks/match-tuple.n	(original)
+++ nemerle/branches/optimizer/ncc/testsuite/benchmarks/match-tuple.n	Sun Mar  5 02:37:15 2006
@@ -9,6 +9,22 @@
 module Test {
   test_tuple (a : A, b : A) : int
   {
+    def _ = match ((a, b)) {
+      | (X, Y) => 1
+      | _ => 0
+    }
+    def _ = match ((a, b)) {
+      | (X, Y) => 1
+      | _ => 0
+    }
+    def _ = match ((a, b)) {
+      | (X, Y) => 1
+      | _ => 0
+    }
+    def _ = match ((a, b)) {
+      | (X, Y) => 1
+      | _ => 0
+    }
     match ((a, b)) {
       | (X, Y) => 1
       | _ => 0



More information about the svn mailing list