summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2014-06-29 19:31:27 +0200
committerAndy Wingo <wingo@pobox.com>2014-06-29 19:31:41 +0200
commitb5cb1c77fffb65642165cfc9153e95eba770b509 (patch)
tree574e3978a2bfa33dd95670663087ba18efb7b63d
parent2c02a21023c946a3d31c43417d440d6babbf2622 (diff)
downloadguile-b5cb1c77fffb65642165cfc9153e95eba770b509.tar.gz
Fix intset pruning for empty intsets
* module/language/cps/intset.scm (make-intset/prune): Fix empty intset case.
-rw-r--r--module/language/cps/intset.scm38
1 files changed, 21 insertions, 17 deletions
diff --git a/module/language/cps/intset.scm b/module/language/cps/intset.scm
index 8bda290c1..8c5fef724 100644
--- a/module/language/cps/intset.scm
+++ b/module/language/cps/intset.scm
@@ -91,23 +91,27 @@
(make-intset min* shift* (clone-branch-and-set #f idx root))))
(define (make-intset/prune min shift root)
- (if (= shift *leaf-bits*)
- (make-intset min shift root)
- (let lp ((i 0) (elt #f))
- (cond
- ((< i *branch-size*)
- (if (vector-ref root i)
- (if elt
- (make-intset min shift root)
- (lp (1+ i) i))
- (lp (1+ i) elt)))
- (elt
- (let ((shift (- shift *branch-bits*)))
- (make-intset/prune (+ min (ash elt shift))
- shift
- (vector-ref root elt))))
- ;; Shouldn't be reached...
- (else empty-intset)))))
+ (cond
+ ((not root)
+ empty-intset)
+ ((= shift *leaf-bits*)
+ (make-intset min shift root))
+ (else
+ (let lp ((i 0) (elt #f))
+ (cond
+ ((< i *branch-size*)
+ (if (vector-ref root i)
+ (if elt
+ (make-intset min shift root)
+ (lp (1+ i) i))
+ (lp (1+ i) elt)))
+ (elt
+ (let ((shift (- shift *branch-bits*)))
+ (make-intset/prune (+ min (ash elt shift))
+ shift
+ (vector-ref root elt))))
+ ;; Shouldn't be reached...
+ (else empty-intset))))))
(define (intset-add bs i)
(define (adjoin i shift root)