From ebca3afedb716087b5cd5d64e9ba4e5d94491367 Mon Sep 17 00:00:00 2001 From: Andy Wingo Date: Mon, 21 Jul 2014 11:47:43 +0200 Subject: [PATCH] Fix allocate-slots for $kreceive with multiple predecessors * module/language/cps/slot-allocation.scm (allocate-slots): For continuations of $call, $callk, and $values with multiple predecessors, recalculate the set of live slots. Fixes miscompilation of ice-9/futures.scm:process-future!, broken since the previous patch, now that $kreceive continuations can have multiple predecessors. --- module/language/cps/slot-allocation.scm | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/module/language/cps/slot-allocation.scm b/module/language/cps/slot-allocation.scm index 92b6e02b8..d9d53f53e 100644 --- a/module/language/cps/slot-allocation.scm +++ b/module/language/cps/slot-allocation.scm @@ -635,13 +635,17 @@ are comparable with eqv?. A tmp slot may be used." (match (lookup-cont (idx->label n) dfg) (($ $kclause) n) (($ $kargs names syms body) + (define (compute-k-live k) + (match (lookup-predecessors k dfg) + ((_) post-live) + (_ (recompute-live-slots k nargs)))) (let ((uses (vector-ref usev n))) (match (find-call body) (($ $continue k src (or ($ $call) ($ $callk))) - (allocate-call label k uses live post-live)) + (allocate-call label k uses live (compute-k-live k))) (($ $continue k src ($ $primcall)) #t) (($ $continue k src ($ $values)) - (allocate-values label k uses live post-live)) + (allocate-values label k uses live (compute-k-live k))) (($ $continue k src ($ $prompt escape? tag handler)) (allocate-prompt label k handler nargs)) (_ #f))) -- 2.20.1