[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Guile-commits] 09/09: Wire up new closure conversion pass
From: |
Andy Wingo |
Subject: |
[Guile-commits] 09/09: Wire up new closure conversion pass |
Date: |
Wed, 15 Jul 2015 07:51:43 +0000 |
wingo pushed a commit to branch master
in repository guile.
commit 981802c4c228c9f662ebb22cefcbb241cf2b107b
Author: Andy Wingo <address@hidden>
Date: Wed Jul 15 09:43:33 2015 +0200
Wire up new closure conversion pass
* module/language/cps/compile-bytecode.scm (compile-bytecode): Only
convert closures if the #:cps2-convert? option is not passed.
* module/language/cps2/compile-cps.scm (conts->fun*, compile-cps): Add
support for CPS2 closure conversion, disabled by default.
---
module/language/cps/compile-bytecode.scm | 4 +++-
module/language/cps2/compile-cps.scm | 27 +++++++++++++++++++++++----
2 files changed, 26 insertions(+), 5 deletions(-)
diff --git a/module/language/cps/compile-bytecode.scm
b/module/language/cps/compile-bytecode.scm
index 86a3db7..b66b1a6 100644
--- a/module/language/cps/compile-bytecode.scm
+++ b/module/language/cps/compile-bytecode.scm
@@ -517,7 +517,9 @@
;;
;; (set! exp (optimize exp opts))
- (set! exp (convert-closures exp))
+ (set! exp (if (not (kw-arg-ref opts #:cps2-convert? #f))
+ (convert-closures exp)
+ exp))
;; first-order optimization should go here
(set! exp (reify-primitives exp))
(set! exp (renumber exp))
diff --git a/module/language/cps2/compile-cps.scm
b/module/language/cps2/compile-cps.scm
index 4294f94..da51d35 100644
--- a/module/language/cps2/compile-cps.scm
+++ b/module/language/cps2/compile-cps.scm
@@ -27,6 +27,7 @@
#:use-module (language cps2)
#:use-module ((language cps) #:prefix cps:)
#:use-module (language cps2 utils)
+ #:use-module (language cps2 closure-conversion)
#:use-module (language cps2 optimize)
#:use-module (language cps2 renumber)
#:use-module (language cps intmap)
@@ -34,7 +35,7 @@
;; Precondition: For each function in CONTS, the continuation names are
;; topologically sorted.
-(define (conts->fun conts)
+(define* (conts->fun conts #:optional (kfun 0))
(define (convert-fun kfun)
(let ((doms (compute-dom-edges (compute-idoms conts kfun))))
(define (visit-cont label)
@@ -97,8 +98,26 @@
(($ $kfun src meta self tail clause)
(kfun (cps:$kfun src meta self (tail (cps:$ktail))
,(visit-clause clause)))))))
- (convert-fun 0))
+ (convert-fun kfun))
+
+(define (conts->fun* conts)
+ (cps:build-cps-term
+ (cps:$program
+ ,(intmap-fold-right (lambda (label cont out)
+ (match cont
+ (($ $kfun)
+ (cons (conts->fun conts label) out))
+ (_ out)))
+ conts
+ '()))))
+
+(define (kw-arg-ref args kw default)
+ (match (memq kw args)
+ ((_ val . _) val)
+ (_ default)))
(define (compile-cps exp env opts)
- (let ((exp (renumber (optimize-higher-order-cps exp opts))))
- (values (conts->fun exp) env env)))
+ (let ((exp (optimize-higher-order-cps exp opts)))
+ (if (kw-arg-ref opts #:cps2-convert? #f)
+ (values (conts->fun* (renumber (convert-closures exp))) env env)
+ (values (conts->fun (renumber exp)) env env))))
- [Guile-commits] branch master updated (dbe6247 -> 981802c), Andy Wingo, 2015/07/15
- [Guile-commits] 01/09: Reorganizing of intset/intmap helper functions, Andy Wingo, 2015/07/15
- [Guile-commits] 02/09: intset-union fast paths, Andy Wingo, 2015/07/15
- [Guile-commits] 03/09: Fix intset-subtract to reliably produce empty-intset, Andy Wingo, 2015/07/15
- [Guile-commits] 04/09: CPS2 renumber works with first-order CPS, Andy Wingo, 2015/07/15
- [Guile-commits] 05/09: Tweak intset printing, Andy Wingo, 2015/07/15
- [Guile-commits] 06/09: Beginnings of first-order CPS optimization, Andy Wingo, 2015/07/15
- [Guile-commits] 07/09: Verify pass works on first-order CPS, Andy Wingo, 2015/07/15
- [Guile-commits] 09/09: Wire up new closure conversion pass,
Andy Wingo <=
- [Guile-commits] 08/09: Add CPS2 closure conversion module, Andy Wingo, 2015/07/15