guile-commits
[Top][All Lists]
Advanced

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

[Guile-commits] 01/02: Run fix-letrec before peval


From: Andy Wingo
Subject: [Guile-commits] 01/02: Run fix-letrec before peval
Date: Tue, 13 Aug 2019 08:06:44 -0400 (EDT)

wingo pushed a commit to branch master
in repository guile.

commit cd4d4e70c5aa70be6ac650111b753deb36569fde
Author: Andy Wingo <address@hidden>
Date:   Tue Aug 13 13:59:14 2019 +0200

    Run fix-letrec before peval
    
    * module/language/tree-il/optimize.scm (optimize): Change to run
      fix-letrec before peval.  Also, run it unconditionally, so that later
      passes don't have to deal with letrec.
    * module/language/tree-il/peval.scm (build-var-table, peval): Remove
      letrec cases.
---
 module/language/tree-il/optimize.scm |  5 ++---
 module/language/tree-il/peval.scm    | 37 ++++--------------------------------
 2 files changed, 6 insertions(+), 36 deletions(-)

diff --git a/module/language/tree-il/optimize.scm 
b/module/language/tree-il/optimize.scm
index 13b0977..b06ced8 100644
--- a/module/language/tree-il/optimize.scm
+++ b/module/language/tree-il/optimize.scm
@@ -49,8 +49,8 @@
   (maybe-verify x)
   (run-pass resolve*           #:resolve-primitives? #t)
   (run-pass expand-primitives  #:expand-primitives?  #t)
+  (set! x (fix-letrec x))
   (run-pass peval*             #:partial-eval?       #t)
-  (run-pass fix-letrec         #:fix-letrec?         #t)
   x)
 
 (define (tree-il-optimizations)
@@ -59,5 +59,4 @@
   ;; will result in a lot of code that will never get optimized nicely.
   '((#:resolve-primitives? 2)
     (#:expand-primitives? 1)
-    (#:partial-eval? 1)
-    (#:fix-letrec? 1)))
+    (#:partial-eval? 1)))
diff --git a/module/language/tree-il/peval.scm 
b/module/language/tree-il/peval.scm
index b8a0fe9..e1938e6 100644
--- a/module/language/tree-il/peval.scm
+++ b/module/language/tree-il/peval.scm
@@ -1,6 +1,6 @@
 ;;; Tree-IL partial evaluator
 
-;; Copyright (C) 2011-2014, 2017 Free Software Foundation, Inc.
+;; Copyright (C) 2011-2014, 2017, 2019 Free Software Foundation, Inc.
 
 ;;;; This library is free software; you can redistribute it and/or
 ;;;; modify it under the terms of the GNU Lesser General Public
@@ -144,10 +144,8 @@
         (fold (lambda (name sym res)
                 (vhash-consq sym (make-var name sym 0 #f) res))
               res names gensyms))
-       (($ <letrec> src in-order? names gensyms vals body)
-        (fold (lambda (name sym res)
-                (vhash-consq sym (make-var name sym 0 #f) res))
-              res names gensyms))
+       (($ <letrec>)
+        (error "unexpected letrec"))
        (($ <fix> src names gensyms vals body)
         (fold (lambda (name sym res)
                 (vhash-consq sym (make-var name sym 0 #f) res))
@@ -592,10 +590,6 @@ top-level bindings from ENV and return the resulting 
expression."
          (let ((body (loop body)))
            (and body
                 (make-let src names gensyms vals body))))
-        (($ <letrec> src in-order? names gensyms vals body)
-         (let ((body (loop body)))
-           (and body
-                (make-letrec src in-order? names gensyms vals body))))
         (($ <fix> src names gensyms vals body)
          (let ((body (loop body)))
            (and body
@@ -980,7 +974,7 @@ top-level bindings from ENV and return the resulting 
expression."
                             (lambda (names gensyms vals body)
                               (if (null? names) (error "what!" names))
                               (make-let src names gensyms vals body)))))))
-      (($ <letrec> src in-order? names gensyms vals body)
+      (($ <fix> src names gensyms vals body)
        ;; Note the difference from the `let' case: here we use letrec*
        ;; so that the `visit' procedure for the new operands closes over
        ;; an environment that includes the operands.  Also we don't try
@@ -993,23 +987,6 @@ top-level bindings from ENV and return the resulting 
expression."
                  (ops (make-bound-operands vars new vals visit))
                  (env* (fold extend-env env gensyms ops))
                  (body* (visit body counter ctx)))
-         (if (and (const? body*) (every constant-expression? vals))
-             ;; We may have folded a loop completely, even though there
-             ;; might be cyclical references between the bound values.
-             ;; Handle this degenerate case specially.
-             body*
-             (prune-bindings ops in-order? body* counter ctx
-                             (lambda (names gensyms vals body)
-                               (make-letrec src in-order?
-                                            names gensyms vals body))))))
-      (($ <fix> src names gensyms vals body)
-       (letrec* ((visit (lambda (exp counter ctx)
-                          (loop exp env* counter ctx)))
-                 (vars (map lookup-var gensyms))
-                 (new (fresh-gensyms vars))
-                 (ops (make-bound-operands vars new vals visit))
-                 (env* (fold extend-env env gensyms ops))
-                 (body* (visit body counter ctx)))
          (if (const? body*)
              body*
              (prune-bindings ops #f body* counter ctx
@@ -1104,12 +1081,6 @@ top-level bindings from ENV and return the resulting 
expression."
             (make-let src* names vars vals
                       (simplify-conditional
                        (make-conditional src body subsequent alternate))))
-           (($ <conditional> src
-               ($ <letrec> src* in-order? names vars vals body)
-               subsequent alternate)
-            (make-letrec src* in-order? names vars vals
-                         (simplify-conditional
-                          (make-conditional src body subsequent alternate))))
            (($ <conditional> src ($ <fix> src* names vars vals body)
                subsequent alternate)
             (make-fix src* names vars vals



reply via email to

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