guile-commits
[Top][All Lists]
Advanced

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

[Guile-commits] 01/01: Update peval tests for fix-letrec


From: Andy Wingo
Subject: [Guile-commits] 01/01: Update peval tests for fix-letrec
Date: Tue, 13 Aug 2019 09:08:53 -0400 (EDT)

wingo pushed a commit to branch master
in repository guile.

commit e2f8ccc5ba3f4f4269d80aa278a8b10dbc605c64
Author: Andy Wingo <address@hidden>
Date:   Tue Aug 13 15:07:57 2019 +0200

    Update peval tests for fix-letrec
    
    * module/language/tree-il/fix-letrec.scm (fix-scc): Initial binding of
      letrec values is unspecified, not false.
    * test-suite/tests/peval.test (pass-if-peval): Fix letrec before
      pevalling.  Update tests.  A couple got better, no regressions.
---
 module/language/tree-il/fix-letrec.scm |   2 +-
 test-suite/tests/peval.test            | 148 +++++++++++++++++----------------
 2 files changed, 76 insertions(+), 74 deletions(-)

diff --git a/module/language/tree-il/fix-letrec.scm 
b/module/language/tree-il/fix-letrec.scm
index 55d6705..227bbfb 100644
--- a/module/language/tree-il/fix-letrec.scm
+++ b/module/language/tree-il/fix-letrec.scm
@@ -207,7 +207,7 @@
       ((and (lambda? init) (not (hashq-ref assigned sym)))
        (make-fix src (list name) (list sym) (list init) body))
       ((memq sym (free-variables init fv-cache))
-       (make-let src (list name) (list sym) (list (make-const src #f))
+       (make-let src (list name) (list sym) (list (make-void src))
                  (make-seq src
                            (make-lexical-set src name sym init)
                            body)))
diff --git a/test-suite/tests/peval.test b/test-suite/tests/peval.test
index 1b1eff9..22b78f6 100644
--- a/test-suite/tests/peval.test
+++ b/test-suite/tests/peval.test
@@ -24,6 +24,7 @@
   #:use-module (system base message)
   #:use-module (language tree-il)
   #:use-module (language tree-il primitives)
+  #:use-module (language tree-il fix-letrec)
   #:use-module (rnrs bytevectors) ;; for the bytevector primitives
   #:use-module (srfi srfi-13))
 
@@ -35,10 +36,11 @@
   (syntax-rules ()
     ((_ in pat)
      (pass-if-peval in pat
-                    (expand-primitives
-                     (resolve-primitives
-                      (compile 'in #:from 'scheme #:to 'tree-il)
-                      (current-module)))))
+                    (fix-letrec
+                     (expand-primitives
+                      (resolve-primitives
+                       (compile 'in #:from 'scheme #:to 'tree-il)
+                       (current-module))))))
     ((_ in pat code)
      (pass-if 'in
        (let ((evaled (unparse-tree-il (peval code))))
@@ -544,7 +546,7 @@
                          b
                          (f (car x3) (fold f (cdr x3) b null? car cdr))))))
       (fold * x 1 zero? (lambda (x1) x1) (lambda (x2) (- x2 1))))
-    (letrec (fold) (_) (_)
+    (fix (fold) (_) (_)
             (call (lexical fold _)
                    (primitive *)
                    (toplevel x)
@@ -756,10 +758,10 @@
                   x)))
       (frob f) ; may mutate `x'
       x)
-    (letrec (x) (_) ((const 0))
-            (seq
-              (call (toplevel frob) (lambda _ _))
-              (lexical x _))))
+    (let (x) (_) ((const 0))
+         (seq
+          (call (toplevel frob) (lambda _ _))
+          (lexical x _))))
 
   (pass-if-peval
     ;; Bindings mutated.
@@ -767,7 +769,7 @@
                   (set! f (lambda (_) x))
                   x)))
       (f 2))
-    (letrec _ . _))
+    (let (f) (_) ((void)) (seq _ (call . _))))
 
   (pass-if-peval
     ;; Bindings possibly mutated.
@@ -783,14 +785,14 @@
     ;; Inlining stops at recursive calls with dynamic arguments.
     (let loop ((x x))
       (if (< x 0) x (loop (1- x))))
-    (letrec (loop) (_) ((lambda (_)
-                          (lambda-case
-                           (((x) #f #f #f () (_))
-                            (if _ _
-                                (call (lexical loop _)
-                                      (primcall - (lexical x _)
-                                                (const 1))))))))
-            (call (lexical loop _) (toplevel x))))
+    (fix (loop) (_) ((lambda (_)
+                       (lambda-case
+                        (((x) #f #f #f () (_))
+                         (if _ _
+                             (call (lexical loop _)
+                                   (primcall - (lexical x _)
+                                             (const 1))))))))
+         (call (lexical loop _) (toplevel x))))
 
   (pass-if-peval
     ;; Recursion on the 2nd argument is fully evaluated.
@@ -812,21 +814,21 @@
           (if (< x 0)
               x
               (loop (1+ x) (1+ y)))))
-    (letrec (loop) (_) ((lambda (_)
-                          (lambda-case
-                           (((x y) #f #f #f () (_ _))
-                            (if (primcall >
-                                          (lexical y _) (const 0))
-                                _ _)))))
-            (call (lexical loop _) (toplevel x) (const 0))))
+    (fix (loop) (_) ((lambda (_)
+                       (lambda-case
+                        (((x y) #f #f #f () (_ _))
+                         (if (primcall >
+                                       (lexical y _) (const 0))
+                             _ _)))))
+         (call (lexical loop _) (toplevel x) (const 0))))
 
   (pass-if-peval
-    ;; Infinite recursion: `peval' gives up and leaves it as is.
+    ;; Infinite recursion: `peval' can inline some but eventually gives up.
     (letrec ((f (lambda (x) (g (1- x))))
              (g (lambda (x) (h (1+ x))))
              (h (lambda (x) (f x))))
       (f 0))
-    (letrec _ . _))
+    (fix (f) (_) (_) (call . _)))
 
   (pass-if-peval
     ;; Infinite recursion: all the arguments to `loop' are static, but
@@ -834,8 +836,8 @@
     (let loop ((x 0))
       (and (< x top)
            (loop (1+ x))))
-    (letrec (loop) (_) ((lambda . _))
-            (call (lexical loop _) (const 0))))
+    (fix (loop) (_) ((lambda . _))
+         (call (lexical loop _) (const 0))))
 
   (pass-if-peval
     ;; This test checks that the `start' binding is indeed residualized.
@@ -851,24 +853,23 @@
                (call (lexical here _))))))
 
   (pass-if-peval
-   ;; FIXME: should this one residualize the binding?
+   ;; FIXME: Signal an error?
    (letrec ((a a))
      1)
-   (const 1))
+   (let (a) (_) ((void)) (seq (set! . _) (const 1))))
 
   (pass-if-peval
    ;; This is a fun one for peval to handle.
    (letrec ((a a))
      a)
-   (letrec (a) (_) ((lexical a _))
-           (lexical a _)))
+   (let (a) (_) ((void)) (seq (set! . _) (lexical a _))))
 
   (pass-if-peval
    ;; Another interesting recursive case.
    (letrec ((a b) (b a))
      a)
-   (letrec (a) (_) ((lexical a _))
-           (lexical a _)))
+   (let (a b) (_ _) ((void) (void))
+        (seq (set! . _) (seq (set! . _) (lexical a _)))))
 
   (pass-if-peval
    ;; Another pruning case, that `a' is residualized.
@@ -881,16 +882,17 @@
    ;; "b c a" is the current order that we get with unordered letrec,
    ;; but it's not important to this test, so if it changes, just adapt
    ;; the test.
-   (letrec (b a) (_ _)
-           ((lambda _
-              (lambda-case
-               ((() #f #f #f () ())
-                (call (lexical a _)))))
-            (lambda _
-              (lambda-case
-               ((() #f #f #f () ())
-                (call (lexical a _))))))
-     (call (toplevel foo) (lexical b _))))
+   (fix (a) (_)
+        ((lambda _
+           (lambda-case
+            ((() #f #f #f () ())
+             (call (lexical a _))))))
+        (fix (b) (_)
+             ((lambda _
+                (lambda-case
+                 ((() #f #f #f () ())
+                  (call (lexical a _))))))
+             (call (toplevel foo) (lexical b _)))))
 
   (pass-if-peval
    ;; In this case, we can prune the bindings.  `a' ends up being copied
@@ -1239,17 +1241,17 @@
    ;; reference.)
    (while #t #t)
    (let (_) (_) ((primcall make-prompt-tag . _))
-        (letrec (lp) (_)
-                ((lambda _
-                   (lambda-case
-                    ((() #f #f #f () ())
-                     (letrec (loop) (_)
-                             ((lambda _
-                                (lambda-case
-                                 ((() #f #f #f () ())
-                                  (call (lexical loop _))))))
-                             (call (lexical loop _)))))))
-                (call (lexical lp _)))))
+        (fix (lp) (_)
+             ((lambda _
+                (lambda-case
+                 ((() #f #f #f () ())
+                  (fix (loop) (_)
+                       ((lambda _
+                          (lambda-case
+                           ((() #f #f #f () ())
+                            (call (lexical loop _))))))
+                       (call (lexical loop _)))))))
+             (call (lexical lp _)))))
 
   (pass-if-peval
    (lambda (a . rest)
@@ -1397,20 +1399,20 @@
     (lambda ()
       (lambda-case
        (((f x) #f #f #f () (_ _))
-        (letrec (lp)
-          (_)
-          ((lambda ((name . lp))
-             (lambda-case
-              (((x) #f #f #f () (_))
-               (let (x*)
-                 (_)
-                 ((call (lexical f _) (lexical x _)))
-                 (if (primcall
-                      eq?
-                      (lexical x _)
-                      (lexical x* _))
-                     (lexical x* _)
-                     (call (lexical lp _)
-                           (lexical x* _))))))))
-          (call (lexical lp _)
-                (lexical x _))))))))
+        (fix (lp)
+             (_)
+             ((lambda ((name . lp))
+                (lambda-case
+                 (((x) #f #f #f () (_))
+                  (let (x*)
+                    (_)
+                    ((call (lexical f _) (lexical x _)))
+                    (if (primcall
+                         eq?
+                         (lexical x _)
+                         (lexical x* _))
+                        (lexical x* _)
+                        (call (lexical lp _)
+                              (lexical x* _))))))))
+             (call (lexical lp _)
+                   (lexical x _))))))))



reply via email to

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