summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2014-07-21 11:47:43 +0200
committerAndy Wingo <wingo@pobox.com>2014-07-21 11:47:43 +0200
commitebca3afedb716087b5cd5d64e9ba4e5d94491367 (patch)
tree1e789c8534b41486afc41ab5c75f9c16b8a587d7
parent6d7b6a171e2eafd1dd48424f39f5796a67e73ad4 (diff)
downloadguile-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.scm8
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)))