diff options
author | Andy Wingo <wingo@pobox.com> | 2020-05-04 21:58:10 +0200 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2020-05-04 21:58:10 +0200 |
commit | 6b2d56ce15c9f6126db6bd7d5951378e05b4303f (patch) | |
tree | 2aa78e9a0a01beecf6b450b0c092807a9d10870e /module/language/tree-il/compile-bytecode.scm | |
parent | f0a9e537a0eb167acb71cdc223380610287e99fe (diff) | |
download | guile-6b2d56ce15c9f6126db6bd7d5951378e05b4303f.tar.gz |
Avoid shuffle-down for tail calls
* module/language/tree-il/compile-bytecode.scm (compile-closure): We can
emit the precise move sequence and just do a reset-frame once, so go
ahead and do that.
Diffstat (limited to 'module/language/tree-il/compile-bytecode.scm')
-rw-r--r-- | module/language/tree-il/compile-bytecode.scm | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/module/language/tree-il/compile-bytecode.scm b/module/language/tree-il/compile-bytecode.scm index 92f6a37f1..d0e5271ba 100644 --- a/module/language/tree-il/compile-bytecode.scm +++ b/module/language/tree-il/compile-bytecode.scm @@ -1246,10 +1246,13 @@ in the frame with for the lambda-case clause @var{clause}." (emit-return-values asm)) (($ <call> src proc args) - (let ((from (stack-height env))) - (fold for-push (for-push proc env) args) - (emit-reset-frame asm (+ from 1 (length args))) - (emit-shuffle-down asm from 0) + (let* ((base (stack-height env)) + (env (fold for-push (for-push proc env) args))) + (let lp ((i (length args)) (env env)) + (when (<= 0 i) + (lp (1- i) (env-prev env)) + (emit-mov asm (+ (env-idx env) base) (env-idx env)))) + (emit-reset-frame asm (+ 1 (length args))) (emit-tail-call asm))) (($ <prompt>) (visit-prompt exp env 'tail)) |