diff options
author | dos-reis <gdr@axiomatics.org> | 2011-12-18 04:29:19 +0000 |
---|---|---|
committer | dos-reis <gdr@axiomatics.org> | 2011-12-18 04:29:19 +0000 |
commit | d286893196d08cbe61ff2c80f470d8c0a7f606cf (patch) | |
tree | 44e9f6e45d3a5266be0f0f5b9a85fd18d1d19647 /src/interp/g-opt.boot | |
parent | a3517dedf8b4791ce1b6378cb431802b647c7222 (diff) | |
download | open-axiom-d286893196d08cbe61ff2c80f470d8c0a7f606cf.tar.gz |
* interp/g-opt.boot (removeScope!): New.
(optimize!): Call it.
(optimizeFunctionDef): Simplify.
Diffstat (limited to 'src/interp/g-opt.boot')
-rw-r--r-- | src/interp/g-opt.boot | 28 |
1 files changed, 10 insertions, 18 deletions
diff --git a/src/interp/g-opt.boot b/src/interp/g-opt.boot index 7816eafb..75d358da 100644 --- a/src/interp/g-opt.boot +++ b/src/interp/g-opt.boot @@ -371,14 +371,22 @@ cleanLoop! x == prefixWalk!(x,function f) where xs.first := g(first xs,tag) x +removeScope! x == prefixWalk!(x,function f) where + f x == + x is ['%scope,g,y] => + hasNoLeave?(y,g) => resetTo(x,f y) + x + x + ++ Transform an intermediate form (output of the elaborator) to ++ a lower intermediate form, applying several transformations ++ generaly intended to improve quality and efficiency. optimize! x == x := spliceSeq! packWhen! transformIF! removeLeave! cleanLoop! x changeVariableDefinitionToStore(x,nil) - simplifyVMForm cancelScopeLeave! spliceSeq! packWhen! inlineLocals! - groupTranscients! cancelScopeLeave! removeJunk! reduceXLAM! x + simplifyVMForm removeScope! cancelScopeLeave! spliceSeq! packWhen! + inlineLocals! groupTranscients! cancelScopeLeave! + removeJunk! reduceXLAM! x ++ A non-mutating version of `optimize!'. optimize x == @@ -395,22 +403,6 @@ optimizeFunctionDef(def) == sayBrightlyI bright '"Intermediate VM code:" pp expr - expr.absBody := - removeTopLevelLabel expr.absBody where - removeTopLevelLabel body == - body is ['%scope,g,u] => - removeTopLevelLabel replaceLeaveByReturn(u,g) - body - replaceLeaveByReturn(x,g) == - fn(x,g) - x - fn(x,g) == - x is ['%leave,=g,:u] => - x.first := "RETURN" - x.rest := replaceLeaveByReturn(u,g) - x isnt [.,:.] => nil - replaceLeaveByReturn(first x,g) - replaceLeaveByReturn(rest x,g) [first def,expr] resetTo(x,y) == |