guile-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Guile-commits] 01/05: Eta-reduce branches


From: Andy Wingo
Subject: [Guile-commits] 01/05: Eta-reduce branches
Date: Sun, 03 Jan 2016 17:32:55 +0000

wingo pushed a commit to branch master
in repository guile.

commit 39002f251ee59f42fcaff8eb8c5fa8185a3ac77b
Author: Andy Wingo <address@hidden>
Date:   Sun Jan 3 16:16:54 2016 +0100

    Eta-reduce branches
    
    * module/language/cps/simplify.scm (compute-eta-reductions): Eta-reduce
      branches as well, so that passing a constant to a branch will fold to
      the true or false branch, provided that the test variable was just
      used in the branch.
---
 module/language/cps/simplify.scm |   65 ++++++++++++++++++++++---------------
 1 files changed, 39 insertions(+), 26 deletions(-)

diff --git a/module/language/cps/simplify.scm b/module/language/cps/simplify.scm
index a53bdbf..7878a1e 100644
--- a/module/language/cps/simplify.scm
+++ b/module/language/cps/simplify.scm
@@ -111,34 +111,34 @@
 ;;; as candidates.  This prevents back-edges and so breaks SCCs, and is
 ;;; optimal if labels are sorted.  If the labels aren't sorted it's
 ;;; suboptimal but cheap.
-(define (compute-eta-reductions conts kfun)
-  (let ((singly-used (compute-singly-referenced-vars conts)))
-    (define (singly-used? vars)
-      (match vars
-        (() #t)
-        ((var . vars)
-         (and (intset-ref singly-used var) (singly-used? vars)))))
-    (define (visit-fun kfun body eta)
-      (define (visit-cont label eta)
-        (match (intmap-ref conts label)
-          (($ $kargs names vars ($ $continue k src ($ $values vars)))
-           (intset-maybe-add! eta label
-                              (match (intmap-ref conts k)
-                                (($ $kargs)
-                                 (and (not (eqv? label k)) ; A
-                                      (not (intset-ref eta label)) ; B
-                                      (singly-used? vars)))
-                                (_ #f))))
-          (_
-           eta)))
-      (intset-fold visit-cont body eta))
-    (persistent-intset
-     (intmap-fold visit-fun
-                  (compute-reachable-functions conts kfun)
-                  empty-intset))))
+(define (compute-eta-reductions conts kfun singly-used)
+  (define (singly-used? vars)
+    (match vars
+      (() #t)
+      ((var . vars)
+       (and (intset-ref singly-used var) (singly-used? vars)))))
+  (define (visit-fun kfun body eta)
+    (define (visit-cont label eta)
+      (match (intmap-ref conts label)
+        (($ $kargs names vars ($ $continue k src ($ $values vars)))
+         (intset-maybe-add! eta label
+                            (match (intmap-ref conts k)
+                              (($ $kargs)
+                               (and (not (eqv? label k)) ; A
+                                    (not (intset-ref eta label)) ; B
+                                    (singly-used? vars)))
+                              (_ #f))))
+        (_
+         eta)))
+    (intset-fold visit-cont body eta))
+  (persistent-intset
+   (intmap-fold visit-fun
+                (compute-reachable-functions conts kfun)
+                empty-intset)))
 
 (define (eta-reduce conts kfun)
-  (let ((label-set (compute-eta-reductions conts kfun)))
+  (let* ((singly-used (compute-singly-referenced-vars conts))
+         (label-set (compute-eta-reductions conts kfun singly-used)))
     ;; Replace any continuation to a label in LABEL-SET with the label's
     ;; continuation.  The label will denote a $kargs continuation, so
     ;; only terms that can continue to $kargs need be taken into
@@ -155,6 +155,19 @@
               (($ $kargs names syms ($ $continue kf src ($ $branch kt exp)))
                ($kargs names syms
                  ($continue (subst kf) src ($branch (subst kt) ,exp))))
+              (($ $kargs names syms ($ $continue k src ($ $const val)))
+               ,(match (intmap-ref conts k)
+                  (($ $kargs (_)
+                             ((? (lambda (var) (intset-ref singly-used var))
+                                 var))
+                      ($ $continue kf _ ($ $branch kt ($ $values (var)))))
+                   (build-cont
+                     ($kargs names syms
+                       ($continue (subst (if val kt kf)) src ($values ())))))
+                  (_
+                   (build-cont
+                     ($kargs names syms
+                       ($continue (subst k) src ($const val)))))))
               (($ $kargs names syms ($ $continue k src exp))
                ($kargs names syms
                  ($continue (subst k) src ,exp)))



reply via email to

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