diff --git a/module/language/tree-il/compile-cps.scm b/module/language/tree-il/compile-cps.scm index 875aa8e91..49274c478 100644 --- a/module/language/tree-il/compile-cps.scm +++ b/module/language/tree-il/compile-cps.scm @@ -248,6 +248,7 @@ ($continue k src ($values (unspecified)))))) (letk kvoid ($kargs () () ,body)) kvoid)) + (($ $kargs ()) (with-cps cps k)) (($ $kreceive arity kargs) (match arity (($ $arity () () (not #f) () #f) @@ -318,6 +319,26 @@ ;; cps exp k-name alist -> cps term (define (convert cps exp k subst) + (define (zero-valued? exp) + (match exp + ((or ($ ) ($ ) ($ ) + ($ )) + #t) + (($ src names syms vals body) (zero-valued? body)) + ;; Can't use here as the hack that uses to convert its + ;; functions relies on continuation being single-valued. + ;; (($ src names syms vals body) (zero-valued? body)) + (($ src exp body) (zero-valued? body)) + (($ src head tail) (zero-valued? tail)) + (($ src name args) + (match (prim-instruction name) + (#f #f) + (inst + (match (prim-arity inst) + ((out . in) + (and (eqv? out 0) + (eqv? in (length args)))))))) + (_ #f))) (define (single-valued? exp) (match exp ((or ($ ) ($ ) ($ ) ($ ) @@ -326,6 +347,7 @@ (($ src names syms vals body) (single-valued? body)) (($ src names syms vals body) (single-valued? body)) (($ src exp body) (single-valued? body)) + (($ src head tail) (single-valued? tail)) (($ src name args) (match (prim-instruction name) (#f #f) @@ -909,12 +931,17 @@ ($continue k src ($primcall 'box-set! #f (box exp)))))))))) (($ src head tail) - (with-cps cps - (let$ tail (convert tail k subst)) - (letv vals) - (letk kseq ($kargs ('vals) (vals) ,tail)) - (letk kreceive ($kreceive '() 'vals kseq)) - ($ (convert head kreceive subst)))) + (if (zero-valued? head) + (with-cps cps + (let$ tail (convert tail k subst)) + (letk kseq ($kargs () () ,tail)) + ($ (convert head kseq subst))) + (with-cps cps + (let$ tail (convert tail k subst)) + (letv vals) + (letk kseq ($kargs ('vals) (vals) ,tail)) + (letk kreceive ($kreceive '() 'vals kseq)) + ($ (convert head kreceive subst))))) (($ src names syms vals body) (let lp ((cps cps) (names names) (syms syms) (vals vals))