[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