guile-commits
[Top][All Lists]
Advanced

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

[Guile-commits] 04/08: $prompt is now its own kind of CPS term.


From: Andy Wingo
Subject: [Guile-commits] 04/08: $prompt is now its own kind of CPS term.
Date: Wed, 3 Jan 2018 15:31:23 -0500 (EST)

wingo pushed a commit to branch master
in repository guile.

commit ee15ca1455806b04f4785655ec8a2fd9dda6c01c
Author: Andy Wingo <address@hidden>
Date:   Wed Jan 3 17:17:23 2018 +0100

    $prompt is now its own kind of CPS term.
    
    * module/language/cps.scm ($prompt): Rework to be its own term kind.
      Now $continue always continues to a single continuation.  Adapt
      callers.
---
 .dir-locals.el                                |  1 +
 module/language/cps.scm                       | 24 ++++++-------
 module/language/cps/closure-conversion.scm    | 31 ++++++++--------
 module/language/cps/compile-bytecode.scm      | 51 +++++++++++++++------------
 module/language/cps/contification.scm         | 17 ++++-----
 module/language/cps/cse.scm                   | 25 +++++++------
 module/language/cps/dce.scm                   | 12 ++++++-
 module/language/cps/devirtualize-integers.scm |  8 ++---
 module/language/cps/effects-analysis.scm      | 10 +++---
 module/language/cps/licm.scm                  | 22 +++++++-----
 module/language/cps/peel-loops.scm            |  9 ++---
 module/language/cps/renumber.scm              | 21 ++++++-----
 module/language/cps/rotate-loops.scm          | 10 +++---
 module/language/cps/self-references.scm       |  8 ++---
 module/language/cps/simplify.scm              | 23 ++++++------
 module/language/cps/slot-allocation.scm       | 28 +++++++--------
 module/language/cps/specialize-numbers.scm    |  8 ++---
 module/language/cps/split-rec.scm             |  8 ++---
 module/language/cps/types.scm                 | 12 +++----
 module/language/cps/utils.scm                 | 24 +++++--------
 module/language/cps/verify.scm                | 35 +++++++++---------
 module/language/tree-il/compile-cps.scm       |  6 ++--
 22 files changed, 198 insertions(+), 195 deletions(-)

diff --git a/.dir-locals.el b/.dir-locals.el
index 3fdf789..c588b95 100644
--- a/.dir-locals.el
+++ b/.dir-locals.el
@@ -34,6 +34,7 @@
      (eval . (put '$letconst           'scheme-indent-function 1))
      (eval . (put '$continue           'scheme-indent-function 2))
      (eval . (put '$branch             'scheme-indent-function 3))
+     (eval . (put '$prompt             'scheme-indent-function 3))
      (eval . (put '$kargs              'scheme-indent-function 2))
      (eval . (put '$kfun               'scheme-indent-function 4))
      (eval . (put '$letrec             'scheme-indent-function 3))
diff --git a/module/language/cps.scm b/module/language/cps.scm
index ddd4102..771d656 100644
--- a/module/language/cps.scm
+++ b/module/language/cps.scm
@@ -127,11 +127,11 @@
             $kreceive $kargs $kfun $ktail $kclause
 
             ;; Terms.
-            $continue $branch
+            $continue $branch $prompt
 
             ;; Expressions.
             $const $prim $fun $rec $closure
-            $call $callk $primcall $values $prompt
+            $call $callk $primcall $values
 
             ;; Building macros.
             build-cont build-term build-exp
@@ -180,6 +180,7 @@
 ;; Terms.
 (define-cps-type $continue k src exp)
 (define-cps-type $branch kf kt src op param args)
+(define-cps-type $prompt k kh src escape? tag)
 
 ;; Expressions.
 (define-cps-type $const val)
@@ -191,7 +192,6 @@
 (define-cps-type $callk k proc args) ; First-order.
 (define-cps-type $primcall name param args)
 (define-cps-type $values args)
-(define-cps-type $prompt escape? tag handler)
 
 (define-syntax build-arity
   (syntax-rules (unquote)
@@ -229,12 +229,14 @@
     ((_ ($branch kf kt src op param (arg ...)))
      (make-$branch kf kt src op param (list arg ...)))
     ((_ ($branch kf kt src op param args))
-     (make-$branch kf kt src op param args))))
+     (make-$branch kf kt src op param args))
+    ((_ ($prompt k kh src escape? tag))
+     (make-$prompt k kh src escape? tag))))
 
 (define-syntax build-exp
   (syntax-rules (unquote
                  $const $prim $fun $rec $closure
-                 $call $callk $primcall $values $prompt)
+                 $call $callk $primcall $values)
     ((_ (unquote exp)) exp)
     ((_ ($const val)) (make-$const val))
     ((_ ($prim name)) (make-$prim name))
@@ -252,9 +254,7 @@
     ((_ ($primcall name param args)) (make-$primcall name param args))
     ((_ ($values (unquote args))) (make-$values args))
     ((_ ($values (arg ...))) (make-$values (list arg ...)))
-    ((_ ($values args)) (make-$values args))
-    ((_ ($prompt escape? tag handler))
-     (make-$prompt escape? tag handler))))
+    ((_ ($values args)) (make-$values args))))
 
 (define-syntax-rule (rewrite-cont x (pat cont) ...)
   (match x
@@ -290,6 +290,8 @@
      (build-term ($continue k (src exp) ,(parse-cps exp))))
     (('branch kf kt op param arg ...)
      (build-term ($branch kf kt (src exp) op param arg)))
+    (('prompt k kh escape? tag)
+     (build-term ($prompt k kh (src exp) escape? tag)))
 
     ;; Expressions.
     (('unspecified)
@@ -312,8 +314,6 @@
      (build-exp ($primcall name param arg)))
     (('values arg ...)
      (build-exp ($values arg)))
-    (('prompt escape? tag handler)
-     (build-exp ($prompt escape? tag handler)))
     (_
      (error "unexpected cps" exp))))
 
@@ -337,6 +337,8 @@
      `(continue ,k ,(unparse-cps exp)))
     (($ $branch kf kt src op param args)
      `(branch ,kf ,kt ,op ,param ,@args))
+    (($ $prompt k kh src escape? tag)
+     `(prompt ,k ,kh ,escape? ,tag))
 
     ;; Expressions.
     (($ $const val)
@@ -361,7 +363,5 @@
      `(primcall ,name ,param ,@args))
     (($ $values args)
      `(values ,@args))
-    (($ $prompt escape? tag handler)
-     `(prompt ,escape? ,tag ,handler))
     (_
      (error "unexpected cps" exp))))
diff --git a/module/language/cps/closure-conversion.scm 
b/module/language/cps/closure-conversion.scm
index b15bb63..32472f1 100644
--- a/module/language/cps/closure-conversion.scm
+++ b/module/language/cps/closure-conversion.scm
@@ -90,11 +90,11 @@ conts."
            (($ $call proc args)
             (add-uses args uses))
            (($ $primcall name param args)
-            (add-uses args uses))
-           (($ $prompt escape? tag handler)
-            (add-use tag uses))))
+            (add-uses args uses))))
         (($ $kargs _ _ ($ $branch kf kt src op param args))
          (add-uses args uses))
+        (($ $kargs _ _ ($ $prompt k kh src escape? tag))
+         (add-use tag uses))
         (_ uses)))
     conts
     empty-intset)))
@@ -117,9 +117,9 @@ conts."
       (($ $kfun src meta self ktail kclause) (ref2 ktail kclause))
       (($ $ktail) (ref0))
       (($ $kclause arity kbody kalt) (ref2 kbody kalt))
-      (($ $kargs _ _ ($ $continue k _ ($ $prompt _ _ h))) (ref2 k h))
       (($ $kargs _ _ ($ $continue k)) (ref1 k))
-      (($ $kargs _ _ ($ $branch kf kt)) (ref2 kf kt))))
+      (($ $kargs _ _ ($ $branch kf kt)) (ref2 kf kt))
+      (($ $kargs _ _ ($ $prompt k kh)) (ref2 k kh))))
   (let*-values (((single multiple) (values empty-intset empty-intset))
                 ((single multiple) (intset-fold add-ref body single multiple)))
     (intset-subtract (persistent-intset single)
@@ -244,16 +244,16 @@ shared closures to use the appropriate 'self' variable, 
if possible."
         (($ $primcall name param args)
          ($primcall name param ,(map subst args)))
         (($ $values args)
-         ($values ,(map subst args)))
-        (($ $prompt escape? tag handler)
-         ($prompt escape? (subst tag) handler))))
+         ($values ,(map subst args)))))
 
     (define (visit-term term)
       (rewrite-term term
         (($ $continue k src exp)
          ($continue k src ,(visit-exp exp)))
         (($ $branch kf kt src op param args)
-         ($branch kf kt src op param ,(map subst args)))))
+         ($branch kf kt src op param ,(map subst args)))
+        (($ $prompt k kh src escape? tag)
+         ($prompt k kh src escape? (subst tag)))))
 
     (define (visit-rec labels vars cps)
       (define (compute-env label bound self rec-bound rec-labels env)
@@ -374,11 +374,11 @@ references."
                         (($ $callk label proc args)
                          (add-use proc (add-uses args uses)))
                         (($ $primcall name param args)
-                         (add-uses args uses))
-                        (($ $prompt escape? tag handler)
-                         (add-use tag uses))))
+                         (add-uses args uses))))
                      (($ $branch kf kt src op param args)
-                      (add-uses args uses)))))
+                      (add-uses args uses))
+                     (($ $prompt k kh src escape? tag)
+                      (add-use tag uses)))))
                  (($ $kfun src meta self)
                   (values (add-def self defs) uses))
                  (_ (values defs uses))))
@@ -726,13 +726,12 @@ bound to @var{var}, and continue to @var{k}."
                (build-term
                  ($continue k src ($values args)))))))
 
-        (($ $continue k src ($ $prompt escape? tag handler))
+        (($ $prompt k kh src escape? tag)
          (convert-arg cps tag
            (lambda (cps tag)
              (with-cps cps
                (build-term
-                 ($continue k src
-                   ($prompt escape? tag handler)))))))
+                 ($prompt k kh src escape? tag))))))
 
         (($ $branch kf kt src op param args)
          (convert-args cps args
diff --git a/module/language/cps/compile-bytecode.scm 
b/module/language/cps/compile-bytecode.scm
index 0bef330..552f0a4 100644
--- a/module/language/cps/compile-bytecode.scm
+++ b/module/language/cps/compile-bytecode.scm
@@ -307,28 +307,6 @@
     (define (compile-effect label exp k)
       (match exp
         (($ $values ()) #f)
-        (($ $prompt escape? tag handler)
-         (match (intmap-ref cps handler)
-           (($ $kreceive ($ $arity req () rest () #f) khandler-body)
-            (let ((receive-args (gensym "handler"))
-                  (nreq (length req))
-                  (proc-slot (lookup-call-proc-slot label allocation)))
-              (emit-prompt asm (from-sp (slot tag)) escape? proc-slot
-                           receive-args)
-              (emit-j asm k)
-              (emit-label asm receive-args)
-              (unless (and rest (zero? nreq))
-                (emit-receive-values asm proc-slot (->bool rest) nreq))
-              (when (and rest
-                         (match (intmap-ref cps khandler-body)
-                           (($ $kargs names (_ ... rest))
-                            (maybe-slot rest))))
-                (emit-bind-rest asm (+ proc-slot 1 nreq)))
-              (for-each (match-lambda
-                          ((src . dst) (emit-fmov asm dst src)))
-                        (lookup-parallel-moves handler allocation))
-              (emit-reset-frame asm frame-size)
-              (emit-j asm (forward-label khandler-body))))))
         (($ $primcall 'cache-current-module! (scope) (mod))
          (emit-cache-current-module! asm (from-sp (slot mod)) scope))
         (($ $primcall 'scm-set! annotation (obj idx val))
@@ -428,6 +406,29 @@
         (($ $primcall 'throw/value+data param (val))
          (emit-throw/value+data asm (from-sp (slot val)) param))))
 
+    (define (compile-prompt label k kh escape? tag)
+      (match (intmap-ref cps kh)
+        (($ $kreceive ($ $arity req () rest () #f) khandler-body)
+         (let ((receive-args (gensym "handler"))
+               (nreq (length req))
+               (proc-slot (lookup-call-proc-slot label allocation)))
+           (emit-prompt asm (from-sp (slot tag)) escape? proc-slot
+                        receive-args)
+           (emit-j asm k)
+           (emit-label asm receive-args)
+           (unless (and rest (zero? nreq))
+             (emit-receive-values asm proc-slot (->bool rest) nreq))
+           (when (and rest
+                      (match (intmap-ref cps khandler-body)
+                        (($ $kargs names (_ ... rest))
+                         (maybe-slot rest))))
+             (emit-bind-rest asm (+ proc-slot 1 nreq)))
+           (for-each (match-lambda
+                      ((src . dst) (emit-fmov asm dst src)))
+                     (lookup-parallel-moves kh allocation))
+           (emit-reset-frame asm frame-size)
+           (emit-j asm (forward-label khandler-body))))))
+
     (define (compile-values label exp syms)
       (match exp
         (($ $values args)
@@ -627,7 +628,11 @@
            (emit-source asm src))
          (compile-test label (skip-elided-conts (1+ label))
                        (forward-label kf) (forward-label kt)
-                       op param args))))
+                       op param args))
+        (($ $prompt k kh src escape? tag)
+         (when src
+           (emit-source asm src))
+         (compile-prompt label (skip-elided-conts k) kh escape? tag))))
 
     (define (compile-cont label cont)
       (match cont
diff --git a/module/language/cps/contification.scm 
b/module/language/cps/contification.scm
index ca1a292..8266a23 100644
--- a/module/language/cps/contification.scm
+++ b/module/language/cps/contification.scm
@@ -60,12 +60,9 @@ predecessor."
       (($ $kfun src meta self ktail kclause) (ref2 ktail kclause))
       (($ $ktail) (ref0))
       (($ $kclause arity kbody kalt) (ref2 kbody kalt))
-      (($ $kargs names syms ($ $branch kf kt))
-       (ref2 kf kt))
-      (($ $kargs names syms ($ $continue k src exp))
-       (match exp
-         (($ $prompt escape-only? tag handler) (ref2 k handler))
-         (_ (ref1 k))))))
+      (($ $kargs names syms ($ $continue k)) (ref1 k))
+      (($ $kargs names syms ($ $branch kf kt)) (ref2 kf kt))
+      (($ $kargs names syms ($ $prompt k kh)) (ref2 k kh))))
   (let*-values (((single multiple) (values empty-intset empty-intset))
                 ((single multiple) (intmap-fold add-ref conts single 
multiple)))
     (intset-subtract (persistent-intset single)
@@ -192,11 +189,11 @@ $call, and are always called with a compatible arity."
            (($ $callk k proc args)
             (exclude-vars functions (cons proc args)))
            (($ $primcall name param args)
-            (exclude-vars functions args))
-           (($ $prompt escape? tag handler)
-            (exclude-var functions tag))))
+            (exclude-vars functions args))))
         (($ $kargs _ _ ($ $branch kf kt src op param args))
          (exclude-vars functions args))
+        (($ $kargs _ _ ($ $prompt k kh src escape? tag))
+         (exclude-var functions tag))
         (_ functions)))
     (intmap-fold visit-cont conts functions)))
 
@@ -459,7 +456,7 @@ function set."
     (match term
       (($ $continue k src exp)
        (visit-exp cps k src exp))
-      (($ $branch)
+      ((or ($ $branch) ($ $prompt))
        (with-cps cps term))))
 
   ;; Renumbering is not strictly necessary but some passes may not be
diff --git a/module/language/cps/cse.scm b/module/language/cps/cse.scm
index 8f4ae6d..3591485 100644
--- a/module/language/cps/cse.scm
+++ b/module/language/cps/cse.scm
@@ -116,11 +116,9 @@ false.  It could be that both true and false proofs are 
available."
       (match (intmap-ref conts label)
         (($ $kargs names vars term)
          (match term
-           (($ $continue k src exp)
-            (match exp
-              (($ $prompt escape? tag handler) (propagate2 k handler))
-              (_ (propagate1 k))))
-           (($ $branch kf kt) (propagate-branch kf kt))))
+           (($ $continue k) (propagate1 k))
+           (($ $branch kf kt) (propagate-branch kf kt))
+           (($ $prompt k kh) (propagate2 k kh))))
         (($ $kreceive arity k)
          (propagate1 k))
         (($ $kfun src meta self tail clause)
@@ -168,7 +166,7 @@ false.  It could be that both true and false proofs are 
available."
                       (match (intmap-ref conts k)
                         (($ $kargs names vars) vars)
                         (_ #f)))
-                     (($ $branch)
+                     ((or ($ $branch) ($ $prompt))
                       '())))))
                (compute-function-body conts kfun)))
 
@@ -218,10 +216,10 @@ false.  It could be that both true and false proofs are 
available."
              (($ $callk k proc args) #f)
              (($ $primcall name param args)
               (cons* name param (subst-vars var-substs args)))
-             (($ $values args) #f)
-             (($ $prompt escape? tag handler) #f)))
+             (($ $values args) #f)))
           (($ $branch kf kt src op param args)
-           (cons* op param (subst-vars var-substs args)))))
+           (cons* op param (subst-vars var-substs args)))
+          (($ $prompt) #f)))
 
       (define (add-auxiliary-definitions! label var-substs term-key)
         (let ((defs (and=> (intmap-ref defs label)
@@ -377,9 +375,7 @@ false.  It could be that both true and false proofs are 
available."
       (($ $primcall name param args)
        ($primcall name param ,(map subst-var args)))
       (($ $values args)
-       ($values ,(map subst-var args)))
-      (($ $prompt escape? tag handler)
-       ($prompt escape? (subst-var tag) handler))))
+       ($values ,(map subst-var args)))))
 
   (define (visit-term label term)
     (match term
@@ -403,7 +399,10 @@ false.  It could be that both true and false proofs are 
available."
           (build-term ($continue k src ($values vars))))
          (#f
           (build-term
-            ($continue k src ,(visit-exp exp))))))))
+            ($continue k src ,(visit-exp exp))))))
+      (($ $prompt k kh src escape? tag)
+       (build-term
+         ($prompt k kh src escape? (subst-var tag))))))
 
   (intmap-map
    (lambda (label cont)
diff --git a/module/language/cps/dce.scm b/module/language/cps/dce.scm
index 829ab36..7fdbfcf 100644
--- a/module/language/cps/dce.scm
+++ b/module/language/cps/dce.scm
@@ -84,6 +84,9 @@ sites."
                           ;; Branches pass no values to their
                           ;; continuations.
                           (values known unknown))
+                         (($ $kargs _ _ ($ $prompt))
+                          ;; Likewise for prompts.
+                          (values known unknown))
                          (($ $kreceive arity kargs)
                           (values known (intset-add! unknown kargs)))
                          (($ $kfun src meta self tail clause)
@@ -239,6 +242,11 @@ sites."
             (visit-exp label k exp live-labels live-vars))
            (($ $kargs _ _ ($ $branch kf kt src op param args))
             (visit-branch label kf kt args live-labels live-vars))
+           (($ $kargs _ _ ($ $prompt k kh src escape? tag))
+            ;; Prompts need special elision passes that would contify
+            ;; aborts and remove corresponding "unwind" primcalls.
+            (values (intset-add live-labels label)
+                    (adjoin-var tag live-vars)))
            (($ $kreceive arity kargs)
             (values live-labels live-vars))
            (($ $kclause arity kargs kalt)
@@ -346,7 +354,9 @@ sites."
            (values cps term)
            ;; Dead branches continue to the same continuation
            ;; (eventually).
-           (values cps (build-term ($continue kf src ($values ()))))))))
+           (values cps (build-term ($continue kf src ($values ()))))))
+      (($ $prompt)
+       (values cps term))))
   (define (visit-cont label cont cps)
     (match cont
       (($ $kargs names vars term)
diff --git a/module/language/cps/devirtualize-integers.scm 
b/module/language/cps/devirtualize-integers.scm
index 9ebe6fc..350e2ae 100644
--- a/module/language/cps/devirtualize-integers.scm
+++ b/module/language/cps/devirtualize-integers.scm
@@ -72,11 +72,11 @@
               (($ $callk kfun proc args)
                (add-uses (add-use use-counts proc) args))
               (($ $primcall name param args)
-               (add-uses use-counts args))
-              (($ $prompt escape? tag handler)
-               (add-use use-counts tag))))
+               (add-uses use-counts args))))
            (($ $branch kf kt src op param args)
-            (add-uses use-counts args))))
+            (add-uses use-counts args))
+           (($ $prompt k kh src escape? tag)
+            (add-use use-counts tag))))
         (_ use-counts)))
     cps
     (transient-intmap))))
diff --git a/module/language/cps/effects-analysis.scm 
b/module/language/cps/effects-analysis.scm
index 854bd11..62cefa0 100644
--- a/module/language/cps/effects-analysis.scm
+++ b/module/language/cps/effects-analysis.scm
@@ -596,11 +596,6 @@ the LABELS that are clobbered by the effects of LABEL."
      &no-effects)
     ((or ($ $fun) ($ $rec) ($ $closure))
      (&allocate &unknown-memory-kinds))
-    (($ $prompt)
-     ;; Although the "main" path just writes &prompt, we don't know what
-     ;; nonlocal predecessors of the handler do, so we conservatively
-     ;; assume &all-effects.
-     &all-effects)
     ((or ($ $call) ($ $callk))
      &all-effects)
     (($ $primcall name param args)
@@ -614,6 +609,11 @@ the LABELS that are clobbered by the effects of LABEL."
         (expression-effects exp))
        (($ $kargs names syms ($ $branch kf kt src op param args))
         (primitive-effects param op args))
+       (($ $kargs names syms ($ $prompt))
+        ;; Although the "main" path just writes &prompt, we don't know
+        ;; what nonlocal predecessors of the handler do, so we
+        ;; conservatively assume &all-effects.
+        &all-effects)
        (($ $kreceive arity kargs)
         (match arity
           (($ $arity _ () #f () #f) &type-check)
diff --git a/module/language/cps/licm.scm b/module/language/cps/licm.scm
index b016b3b..b1af1c8 100644
--- a/module/language/cps/licm.scm
+++ b/module/language/cps/licm.scm
@@ -68,7 +68,6 @@
                       loop-effects #t))
      (match exp
        ((or ($ $const) ($ $prim) ($ $closure)) #t)
-       (($ $prompt) #f) ;; ?
        (($ $primcall name param args)
         (and-map (lambda (arg) (not (intset-ref loop-vars arg)))
                  args))
@@ -137,14 +136,6 @@
               ((not (loop-invariant? label exp loop-vars loop-effects
                                      always-reached?))
                (let* ((loop-vars (adjoin-loop-vars loop-vars def-vars))
-                      (loop-vars (match exp
-                                   (($ $prompt escape? tag handler)
-                                    (match (intmap-ref cps handler)
-                                      (($ $kreceive arity kargs)
-                                       (match (intmap-ref cps kargs)
-                                         (($ $kargs names vars)
-                                          (adjoin-loop-vars loop-vars 
vars))))))
-                                   (_ loop-vars)))
                       (cont (build-cont
                               ($kargs names vars
                                 ($continue k src ,exp))))
@@ -217,6 +208,16 @@
           (let* ((cont (build-cont ($kargs names vars ,term)))
                  (always-reached? #f))
             (values cps cont loop-vars loop-effects
+                    pre-header-label always-reached?)))
+         (($ $prompt k kh src escape? tag)
+          (let* ((loop-vars (match (intmap-ref cps kh)
+                              (($ $kreceive arity kargs)
+                               (match (intmap-ref cps kargs)
+                                 (($ $kargs names vars)
+                                  (adjoin-loop-vars loop-vars vars))))))
+                 (cont (build-cont ($kargs names vars ,term)))
+                 (always-reached? #f))
+            (values cps cont loop-vars loop-effects
                     pre-header-label always-reached?))))))
     (($ $kreceive ($ $arity req () rest) kargs)
      (values cps cont loop-vars loop-effects pre-header-label
@@ -259,6 +260,9 @@
         (($ $kargs names vars ($ $branch kf kt src op param args))
          ($kargs names vars
            ($branch (rename kf) (rename kt) src op param args)))
+        (($ $kargs names vars ($ $prompt k kh src escape? tag))
+         ($kargs names vars
+           ($prompt (rename k) (rename kh) src escape? tag)))
         (($ $kargs names vars ($ $continue k src exp))
          ($kargs names vars
            ($continue (rename k) src ,exp)))
diff --git a/module/language/cps/peel-loops.scm 
b/module/language/cps/peel-loops.scm
index 0f23451..e8144fd 100644
--- a/module/language/cps/peel-loops.scm
+++ b/module/language/cps/peel-loops.scm
@@ -142,16 +142,17 @@
       (($ $callk k proc args)
        ($callk k (rename-var proc) ,(map rename-var args)))
       (($ $primcall name param args)
-       ($primcall name param ,(map rename-var args)))
-      (($ $prompt escape? tag handler)
-       ($prompt escape? (rename-var tag) (rename-label handler)))))
+       ($primcall name param ,(map rename-var args)))))
   (define (rename-term term)
     (rewrite-term term
       (($ $continue k src exp)
        ($continue (rename-label k) src ,(rename-exp exp)))
       (($ $branch kf kt src op param args)
        ($branch (rename-label kf) (rename-label kt) src
-         op param ,(map rename-var args)))))
+         op param ,(map rename-var args)))
+      (($ $prompt k kh src escape? tag)
+       ($prompt (rename-label k) (rename-label kh) src
+         escape? (rename-var tag)))))
   (rewrite-cont cont
     (($ $kargs names vars term)
      ($kargs names (map rename-var vars) ,(rename-term term)))
diff --git a/module/language/cps/renumber.scm b/module/language/cps/renumber.scm
index ba565c1..8adbba9 100644
--- a/module/language/cps/renumber.scm
+++ b/module/language/cps/renumber.scm
@@ -87,16 +87,14 @@
                   (match (intmap-ref conts k)
                     (($ $kargs names syms term)
                      (match term
-                       (($ $continue k src exp)
-                        (match exp
-                          (($ $prompt escape? tag handler)
-                           (visit2 k handler order visited))
-                          (_
-                           (visit k order visited))))
+                       (($ $continue k)
+                        (visit k order visited))
                        (($ $branch kf kt)
                         (if (visit-kf-first? kf kt)
                             (visit2 kf kt order visited)
-                            (visit2 kt kf order visited)))))
+                            (visit2 kt kf order visited)))
+                       (($ $prompt k kh)
+                        (visit2 k kh order visited))))
                     (($ $kreceive arity k) (visit k order visited))
                     (($ $kclause arity kbody kalt)
                      (if kalt
@@ -180,9 +178,7 @@
         (($ $callk k proc args)
          ($callk (rename-label k) (rename-var proc) ,(map rename-var args)))
         (($ $primcall name param args)
-         ($primcall name param ,(map rename-var args)))
-        (($ $prompt escape? tag handler)
-         ($prompt escape? (rename-var tag) (rename-label handler)))))
+         ($primcall name param ,(map rename-var args)))))
     (define (rename-arity arity)
       (match arity
         (($ $arity req opt rest () aok?)
@@ -207,7 +203,10 @@
                   ($continue (rename-label k) src ,(rename-exp exp)))
                  (($ $branch kf kt src op param args)
                   ($branch (rename-label kf) (rename-label kt) src
-                    op param ,(map rename-var args))))))
+                    op param ,(map rename-var args)))
+                 (($ $prompt k kh src escape? tag)
+                  ($prompt (rename-label k) (rename-label kh) src
+                    escape? (rename-var tag))))))
            (($ $kreceive ($ $arity req () rest () #f) k)
             ($kreceive req rest (rename-label k)))
            (($ $ktail)
diff --git a/module/language/cps/rotate-loops.scm 
b/module/language/cps/rotate-loops.scm
index dbc2f9e..4c330f9 100644
--- a/module/language/cps/rotate-loops.scm
+++ b/module/language/cps/rotate-loops.scm
@@ -118,11 +118,11 @@ corresponding var from REPLACEMENTS; otherwise return 
VAR."
                  (($ $callk k proc args)
                   ($callk k (rename proc) ,(rename* args)))
                  (($ $primcall name param args)
-                  ($primcall name param ,(rename* args)))
-                 (($ $prompt escape? tag handler)
-                  ($prompt escape? (rename tag) handler)))))
+                  ($primcall name param ,(rename* args))))))
            (($ $branch kf kt src op param args)
-            ($branch kf kt src op param ,(rename* args)))))
+            ($branch kf kt src op param ,(rename* args)))
+           (($ $prompt k kh src escape? tag)
+            ($prompt k kh src escape? (rename tag)))))
        (define (attach-trampoline cps label src names vars args)
          (with-cps cps
            (letk ktramp-out ,(make-trampoline join-label src args))
@@ -211,7 +211,7 @@ corresponding var from REPLACEMENTS; otherwise return VAR."
                          (trivial-intset (loop-successors scc succs))
                          (match (intmap-ref cps entry)
                            ;; Can't rotate $prompt out of loop header.
-                           (($ $kargs _ _ ($ $continue _ _ ($ $prompt))) #f)
+                           (($ $kargs _ _ ($ $prompt)) #f)
                            (_ #t)))
                     ;; Loop header is an exit, and there is only one
                     ;; exit continuation.  Loop header isn't a prompt,
diff --git a/module/language/cps/self-references.scm 
b/module/language/cps/self-references.scm
index f1ffc4a..10fcb7f 100644
--- a/module/language/cps/self-references.scm
+++ b/module/language/cps/self-references.scm
@@ -46,16 +46,16 @@
       (($ $primcall name param args)
        ($primcall name param ,(map subst args)))
       (($ $values args)
-       ($values ,(map subst args)))
-      (($ $prompt escape? tag handler)
-       ($prompt escape? (subst tag) handler))))
+       ($values ,(map subst args)))))
 
   (define (rename-term term)
     (rewrite-term term
       (($ $continue k src exp)
        ($continue k src ,(rename-exp exp)))
       (($ $branch kf kt src op param args)
-       ($branch kf kt src op param ,(map subst args)))))
+       ($branch kf kt src op param ,(map subst args)))
+      (($ $prompt k kh src escape? tag)
+       ($prompt k kh src escape? (subst tag)))))
 
   (define (visit-label label cps)
     (match (intmap-ref cps label)
diff --git a/module/language/cps/simplify.scm b/module/language/cps/simplify.scm
index f546583..a1ac5c9 100644
--- a/module/language/cps/simplify.scm
+++ b/module/language/cps/simplify.scm
@@ -77,11 +77,11 @@
          (($ $primcall name param args)
           (ref* args))
          (($ $values args)
-          (ref* args))
-         (($ $prompt escape? tag handler)
-          (ref tag))))
+          (ref* args))))
       (($ $kargs _ _ ($ $branch kf kt src op param args))
        (ref* args))
+      (($ $kargs _ _ ($ $prompt k kh src escape? tag))
+       (ref tag))
       (_
        (values single multiple))))
   (let*-values (((single multiple) (values empty-intset empty-intset))
@@ -188,12 +188,9 @@
       (($ $kfun src meta self ktail kclause) (ref2 ktail kclause))
       (($ $ktail) (ref0))
       (($ $kclause arity kbody kalt) (ref2 kbody kalt))
-      (($ $kargs names syms ($ $continue k src exp))
-       (match exp
-         (($ $prompt _ _ handler) (ref2 k handler))
-         (_ (ref1 k))))
-      (($ $kargs names syms ($ $branch kf kt))
-       (ref2 kf kt))))
+      (($ $kargs names syms ($ $continue k)) (ref1 k))
+      (($ $kargs names syms ($ $branch kf kt)) (ref2 kf kt))
+      (($ $kargs names syms ($ $prompt k kh)) (ref2 k kh))))
   (let*-values (((single multiple) (values empty-intset empty-intset))
                 ((single multiple) (intset-fold add-ref body single multiple)))
     (intset-subtract (persistent-intset single)
@@ -259,11 +256,11 @@
                   (($ $primcall name param args)
                    ($primcall name param ,(map subst args)))
                   (($ $values args)
-                   ($values ,(map subst args)))
-                  (($ $prompt escape? tag handler)
-                   ($prompt escape? (subst tag) handler)))))
+                   ($values ,(map subst args))))))
             (($ $branch kf kt src op param args)
-             ($branch kf kt src op param ,(map subst args))))))
+             ($branch kf kt src op param ,(map subst args)))
+            (($ $prompt k kh src escape? tag)
+             ($prompt k kh src escape? (subst tag))))))
     (transform-conts
      (lambda (label cont)
        (rewrite-cont cont
diff --git a/module/language/cps/slot-allocation.scm 
b/module/language/cps/slot-allocation.scm
index 8abb0ea..106496a 100644
--- a/module/language/cps/slot-allocation.scm
+++ b/module/language/cps/slot-allocation.scm
@@ -57,7 +57,7 @@
   (representations allocation-representations)
 
   ;; A map of LABEL to /call allocs/, for expressions that continue to
-  ;; $kreceive continuations: non-tail calls and $prompt expressions.
+  ;; $kreceive continuations: non-tail calls and $prompt terms.
   ;;
   ;; A call alloc contains two pieces of information: the call's /proc
   ;; slot/ and a /dead slot map/.  The proc slot indicates the slot of a
@@ -155,11 +155,11 @@ by a label, respectively."
            (($ $primcall name param args)
             (return (get-defs k) (vars->intset args)))
            (($ $values args)
-            (return (get-defs k) (vars->intset args)))
-           (($ $prompt escape? tag handler)
-            (return empty-intset (intset tag)))))
+            (return (get-defs k) (vars->intset args)))))
         (($ $kargs _ _ ($ $branch kf kt src op param args))
          (return empty-intset (vars->intset args)))
+        (($ $kargs _ _ ($ $prompt k kh src escape? tag))
+         (return empty-intset (intset tag)))
         (($ $kclause arity body alt)
          (return (get-defs body) empty-intset))
         (($ $kreceive arity kargs)
@@ -231,11 +231,10 @@ body continuation in the prompt."
             (let ((labels (intset-add! labels label)))
               (match cont
                 (($ $kreceive arity k) (visit-cont k level labels))
+                (($ $kargs names syms ($ $prompt k kh src escape? tag))
+                 (visit-cont kh level (visit-cont k (1+ level) labels)))
                 (($ $kargs names syms ($ $continue k src ($ $primcall 'wind)))
                  (visit-cont k (1+ level) labels))
-                (($ $kargs names syms
-                           ($ $continue k src ($ $prompt escape? tag handler)))
-                 (visit-cont handler level (visit-cont k (1+ level) labels)))
                 (($ $kargs names syms ($ $continue k src ($ $primcall 
'unwind)))
                  (visit-cont k (1- level) labels))
                 (($ $kargs names syms ($ $continue k src exp))
@@ -261,9 +260,8 @@ body continuation in the prompt."
   (intmap-fold
    (lambda (label cont succs)
      (match cont
-       (($ $kargs _ _
-           ($ $continue k _ ($ $prompt escape? tag handler)))
-        (visit-prompt k handler succs))
+       (($ $kargs _ _ ($ $prompt k kh))
+        (visit-prompt k kh succs))
        (_ succs)))
    conts
    succs))
@@ -596,9 +594,9 @@ are comparable with eqv?.  A tmp slot may be used."
           (add-call-shuffles label k (cons proc args) shuffles))
          (($ $values args)
           (add-values-shuffles label k args shuffles))
-         (($ $prompt escape? tag handler)
-          (add-prompt-shuffles label k handler shuffles))
          (_ shuffles)))
+      (($ $kargs names vars ($ $prompt k kh src escape? tag))
+       (add-prompt-shuffles label k kh shuffles))
       (_ shuffles)))
 
   (persistent-intmap
@@ -746,6 +744,8 @@ are comparable with eqv?.  A tmp slot may be used."
      (match cont
        (($ $kargs _ _ ($ $branch))
         representations)
+       (($ $kargs _ _ ($ $prompt))
+        representations)
        (($ $kargs _ _ ($ $continue k _ exp))
         (match (get-defs k)
           (() representations)
@@ -981,8 +981,8 @@ are comparable with eqv?.  A tmp slot may be used."
               (allocate-call label k (cons proc args) slots call-allocs live))
              (($ $continue k src ($ $values args))
               (allocate-values label k args slots call-allocs))
-             (($ $continue k src ($ $prompt escape? tag handler))
-              (allocate-prompt label k handler slots call-allocs))
+             (($ $prompt k kh src escape? tag)
+              (allocate-prompt label k kh slots call-allocs))
              (_
               (values slots call-allocs)))))
         (_
diff --git a/module/language/cps/specialize-numbers.scm 
b/module/language/cps/specialize-numbers.scm
index 73fd004..9c0b895 100644
--- a/module/language/cps/specialize-numbers.scm
+++ b/module/language/cps/specialize-numbers.scm
@@ -335,11 +335,11 @@ BITS indicating the significant bits needed for a 
variable.  BITS may be
                              (match (intmap-ref cps k)
                                (($ $kargs _ defs)
                                 (h label types out param args defs)))
-                             (add-unknown-uses out args))))
-                      (($ $prompt escape? tag handler)
-                       (add-unknown-use out tag))))
+                             (add-unknown-uses out args))))))
                    (($ $branch kf kt src op param args)
-                    (add-unknown-uses out args)))))
+                    (add-unknown-uses out args))
+                   (($ $prompt k kh src escape? tag)
+                    (add-unknown-use out tag)))))
               (_ out)))))))))
 
 (define (specialize-operations cps)
diff --git a/module/language/cps/split-rec.scm 
b/module/language/cps/split-rec.scm
index 2f60b99..a38a889 100644
--- a/module/language/cps/split-rec.scm
+++ b/module/language/cps/split-rec.scm
@@ -90,11 +90,11 @@ references."
                         (($ $call proc args)
                          (add-use proc (add-uses args uses)))
                         (($ $primcall name param args)
-                         (add-uses args uses))
-                        (($ $prompt escape? tag handler)
-                         (add-use tag uses))))
+                         (add-uses args uses))))
                      (($ $branch kf kt src op param args)
-                      (add-uses args uses)))))
+                      (add-uses args uses))
+                     (($ $prompt k kh src escape? tag)
+                      (add-use tag uses)))))
                  (($ $kfun src meta self)
                   (values (add-def self defs) uses))
                  (_ (values defs uses))))
diff --git a/module/language/cps/types.scm b/module/language/cps/types.scm
index bb34624..ec74e67 100644
--- a/module/language/cps/types.scm
+++ b/module/language/cps/types.scm
@@ -1775,11 +1775,9 @@ minimum, and maximum."
 
 (define (successor-count cont)
   (match cont
-    (($ $kargs _ _ ($ $continue k src exp))
-     (match exp
-       (($ $prompt) 2)
-       (_ 1)))
+    (($ $kargs _ _ ($ $continue)) 1)
     (($ $kargs _ _ ($ $branch)) 2)
+    (($ $kargs _ _ ($ $prompt)) 2)
     (($ $kfun src meta self tail clause) (if clause 1 0))
     (($ $kclause arity body alt) (if alt 2 1))
     (($ $kreceive) 1)
@@ -1916,9 +1914,6 @@ maximum, where type is a bitset as a fixnum."
         (values (append changed0 changed1) typev)))
     ;; Each of these branches must propagate to its successors.
     (match exp
-      (($ $prompt escape? tag handler)
-       ;; The "normal" continuation enters the prompt.
-       (propagate2 k types handler types))
       (($ $primcall name param args)
        (propagate1 k
                    (match (intmap-ref conts k)
@@ -1979,6 +1974,9 @@ maximum, where type is a bitset as a fixnum."
          ;; The "normal" continuation is the #f branch.
          (propagate2 kf (infer-primcall types 0 op param args #f)
                      kt (infer-primcall types 1 op param args #f)))
+        (($ $kargs names vars ($ $prompt k kh src escape? tag))
+         ;; The "normal" continuation enters the prompt.
+         (propagate2 k types kh types))
         (($ $kreceive arity k)
          (match (intmap-ref conts k)
            (($ $kargs names vars)
diff --git a/module/language/cps/utils.scm b/module/language/cps/utils.scm
index cc153c2..d8e47e1 100644
--- a/module/language/cps/utils.scm
+++ b/module/language/cps/utils.scm
@@ -200,12 +200,12 @@ disjoint, an error will be signalled."
                 (visit-cont kbody labels)))
            (($ $kargs names syms term)
             (match term
-              (($ $continue k src ($ $prompt escape? tag handler))
-               (visit-cont k (visit-cont handler labels)))
               (($ $continue k)
                (visit-cont k labels))
               (($ $branch kf kt)
-               (visit-cont kf (visit-cont kt labels))))))))))))
+               (visit-cont kf (visit-cont kt labels)))
+              (($ $prompt k kh)
+               (visit-cont k (visit-cont kh labels))))))))))))
 
 (define* (compute-reachable-functions conts #:optional (kfun 0))
   "Compute a mapping LABEL->LABEL..., where each key is a reachable
@@ -260,11 +260,9 @@ intset."
           (match (intmap-ref conts label)
             (($ $kargs names vars term)
              (match term
-               (($ $continue k src exp)
-                (match exp
-                  (($ $prompt escape? tag handler) (propagate2 k handler))
-                  (_ (propagate1 k))))
-               (($ $branch kf kt) (propagate2 kf kt))))
+               (($ $continue k) (propagate1 k))
+               (($ $branch kf kt) (propagate2 kf kt))
+               (($ $prompt k kh) (propagate2 k kh))))
             (($ $kreceive arity k)
              (propagate1 k))
             (($ $kfun src meta self tail clause)
@@ -296,13 +294,9 @@ intset."
        (add-pred kbody (if kalt (add-pred kalt preds) preds)))
       (($ $kargs names syms term)
        (match term
-         (($ $continue k src exp)
-          (add-pred k
-                    (match exp
-                      (($ $prompt _ _ k) (add-pred k preds))
-                      (_ preds))))
-         (($ $branch kf kt)
-          (add-pred kf (add-pred kt preds)))))))
+         (($ $continue k)   (add-pred k preds))
+         (($ $branch kf kt) (add-pred kf (add-pred kt preds)))
+         (($ $prompt k kh)  (add-pred k (add-pred kh preds)))))))
   (persistent-intmap
    (intset-fold add-preds labels
                 (intset->intmap (lambda (label) '()) labels))))
diff --git a/module/language/cps/verify.scm b/module/language/cps/verify.scm
index 1e05370..9020c5e 100644
--- a/module/language/cps/verify.scm
+++ b/module/language/cps/verify.scm
@@ -102,12 +102,12 @@ definitions that are available at LABEL."
         (($ $kargs names vars term)
          (let ((out (fold1 adjoin-def vars in)))
            (match term
-             (($ $continue k src exp)
-              (match exp
-                (($ $prompt escape? tag handler) (propagate2 k handler out))
-                (_ (propagate1 k out))))
+             (($ $continue k)
+              (propagate1 k out))
              (($ $branch kf kt)
-              (propagate2 kf kt out)))))
+              (propagate2 kf kt out))
+             (($ $prompt k kh)
+              (propagate2 k kh out)))))
         (($ $kreceive arity k)
          (propagate1 k in))
         (($ $kfun src meta self tail clause)
@@ -164,9 +164,6 @@ definitions that are available at LABEL."
          (visit-first-order kfun))
         (($ $primcall name param args)
          (for-each check-use args)
-         first-order)
-        (($ $prompt escape? tag handler)
-         (check-use tag)
          first-order)))
     (define (visit-term term bound first-order)
       (define (check-use var)
@@ -203,12 +200,12 @@ definitions that are available at LABEL."
             (visit-first-order kfun))
            (($ $primcall name param args)
             (for-each check-use args)
-            first-order)
-           (($ $prompt escape? tag handler)
-            (check-use tag)
             first-order)))
         (($ $branch kf kt src name param args)
          (for-each check-use args)
+         first-order)
+        (($ $prompt k kh src escape? tag)
+         (check-use tag)
          first-order)))
     (intmap-fold
      (lambda (label bound first-order)
@@ -285,12 +282,7 @@ definitions that are available at LABEL."
          (($ $kreceive) #t)
          (($ $ktail)
           (unless (memv name '(throw throw/value throw/value+data))
-            (error "primitive should continue to $kargs, not $ktail" name)))))
-      (($ $prompt escape? tag handler)
-       (assert-nullary)
-       (match (intmap-ref conts handler)
-         (($ $kreceive) #t)
-         (cont (error "bad handler" cont))))))
+            (error "primitive should continue to $kargs, not $ktail" 
name)))))))
   (define (check-term term)
     (match term
       (($ $continue k src exp)
@@ -301,7 +293,14 @@ definitions that are available at LABEL."
          (cont (error "bad kf" cont)))
        (match (intmap-ref conts kt)
          (($ $kargs () ()) #t)
-         (cont (error "bad kt" cont))))))
+         (cont (error "bad kt" cont))))
+      (($ $prompt k kh src escape? tag)
+       (match (intmap-ref conts k)
+         (($ $kargs () ()) #t)
+         (cont (error "bad prompt body" cont)))
+       (match (intmap-ref conts kh)
+         (($ $kreceive) #t)
+         (cont (error "bad prompt handler" cont))))))
   (let ((reachable (compute-reachable-labels conts kfun)))
     (intmap-for-each
      (lambda (label cont)
diff --git a/module/language/tree-il/compile-cps.scm 
b/module/language/tree-il/compile-cps.scm
index ae02113..dbdc45c 100644
--- a/module/language/tree-il/compile-cps.scm
+++ b/module/language/tree-il/compile-cps.scm
@@ -853,7 +853,7 @@
                  (with-cps cps
                    (let$ body (convert body krest subst))
                    (letk kbody ($kargs () () ,body))
-                   (build-term ($continue kbody src ($prompt #t tag khargs))))
+                   (build-term ($prompt kbody khargs src #t tag)))
                  (convert-arg cps body
                    (lambda (cps thunk)
                      (with-cps cps
@@ -861,8 +861,8 @@
                                      ($continue krest (tree-il-src body)
                                        ($primcall 'call-thunk/no-inline #f
                                                   (thunk)))))
-                       (build-term ($continue kbody (tree-il-src body)
-                                     ($prompt #f tag khargs))))))))
+                       (build-term ($prompt kbody khargs (tree-il-src body)
+                                     #f tag)))))))
            (with-cps cps
              (letv prim vals apply)
              (let$ hbody (convert hbody k subst))



reply via email to

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