guile-commits
[Top][All Lists]
Advanced

[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))))



reply via email to

[Prev in Thread] Current Thread [Next in Thread]