diff options
author | Andy Wingo <wingo@pobox.com> | 2014-07-21 11:47:43 +0200 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2014-07-21 11:47:43 +0200 |
commit | ebca3afedb716087b5cd5d64e9ba4e5d94491367 (patch) | |
tree | 1e789c8534b41486afc41ab5c75f9c16b8a587d7 | |
parent | 6d7b6a171e2eafd1dd48424f39f5796a67e73ad4 (diff) | |
download | guile-ebca3afedb716087b5cd5d64e9ba4e5d94491367.tar.gz |
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.
-rw-r--r-- | module/language/cps/slot-allocation.scm | 8 |
1 files 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))) |