summaryrefslogtreecommitdiff
path: root/module/language/tree-il/optimize.scm
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2020-05-08 16:47:07 +0200
committerAndy Wingo <wingo@pobox.com>2020-05-08 17:07:56 +0200
commit4311dc9858ba7c6db50a851e95fc7c387b9381b2 (patch)
tree6ad4eaa887b09aadea70c0664eb5ddf66becb136 /module/language/tree-il/optimize.scm
parente9c0f3071dedb0f6b39757e920cdc182435c8725 (diff)
downloadguile-4311dc9858ba7c6db50a851e95fc7c387b9381b2.tar.gz
Define new "lowering" phase in compiler
* module/language/cps/compile-bytecode.scm (compile-bytecode): * module/language/tree-il/compile-bytecode.scm (compile-bytecode): * module/language/tree-il/compile-cps.scm (compile-cps): Rely on compiler to lower incoming term already. * module/language/tree-il/optimize.scm (make-lowerer): New procedure. * module/system/base/compile.scm (compute-lowerer): New procedure, replaceing add-default-optimizations. (compute-compiler): Lower before running compiler. * module/system/base/language.scm (<language>): Change optimizations-for-level field to "lowerer". * module/scripts/compile.scm (%options, compile): Parse -O0, -O1 and so on to #:optimization-level instead of expanding to all the optimization flags. * module/language/cps/optimize.scm (lower-cps): Move here from compile-bytecode.scm. (make-cps-lowerer): New function. * module/language/cps/spec.scm (cps): Declare lowerer.
Diffstat (limited to 'module/language/tree-il/optimize.scm')
-rw-r--r--module/language/tree-il/optimize.scm12
1 files changed, 12 insertions, 0 deletions
diff --git a/module/language/tree-il/optimize.scm b/module/language/tree-il/optimize.scm
index 4123781bc..66725b9b6 100644
--- a/module/language/tree-il/optimize.scm
+++ b/module/language/tree-il/optimize.scm
@@ -28,6 +28,7 @@
#:use-module (language tree-il primitives)
#:use-module (ice-9 match)
#:export (optimize
+ make-lowerer
tree-il-optimizations))
(define (kw-arg-ref args kw default)
@@ -75,3 +76,14 @@
(#:seal-private-bindings? 3)
(#:partial-eval? 1)
(#:eta-expand? 2)))
+
+(define (make-lowerer optimization-level opts)
+ (define (enabled-for-level? level) (<= level optimization-level))
+ (let ((opts (let lp ((all-opts (tree-il-optimizations)))
+ (match all-opts
+ (() '())
+ (((kw level) . all-opts)
+ (acons kw (kw-arg-ref opts kw (enabled-for-level? level))
+ (lp all-opts)))))))
+ (lambda (exp env)
+ (optimize exp env opts))))