From 19c0e302430af50d1b41316b929159d592f27ce3 Mon Sep 17 00:00:00 2001 From: Andy Wingo Date: Thu, 30 Nov 2017 18:42:35 +0100 Subject: [PATCH] Avoid generating arity-adapting zero-value conts where possible * module/language/tree-il/compile-cps.scm (adapt-arity, convert): Avoid generating arity-adapting continuations for nullary continuations. --- module/language/tree-il/compile-cps.scm | 39 +++++++++++++++++++++---- 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/module/language/tree-il/compile-cps.scm b/module/language/tree-il/compile-cps.scm index 4c71dc7d9..6afbc17d8 100644 --- a/module/language/tree-il/compile-cps.scm +++ b/module/language/tree-il/compile-cps.scm @@ -252,6 +252,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) @@ -322,6 +323,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 ($ ) ($ ) ($ ) ($ ) @@ -330,6 +351,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) @@ -845,12 +867,17 @@ ($continue k src ($primcall 'box-set! (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))