[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