From dc27708f0b0b039d9356e8d93d71daf563906fb7 Mon Sep 17 00:00:00 2001 From: Andy Wingo Date: Mon, 13 Jul 2015 11:03:00 +0200 Subject: [PATCH] Fix intset-subtract to reliably produce empty-intset * module/language/cps/intset.scm (intset-subtract): Reliably produce empty-intset if the result is empty. --- module/language/cps/intset.scm | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/module/language/cps/intset.scm b/module/language/cps/intset.scm index 7f8316ea7..005bb7e26 100644 --- a/module/language/cps/intset.scm +++ b/module/language/cps/intset.scm @@ -646,10 +646,10 @@ (else (make-intset/prune a-min a-shift root))))))))) (define (intset-subtract a b) - (define tmp (new-leaf)) ;; Intersect leaves. (define (subtract-leaves a b) - (logand a (lognot b))) + (let ((out (logand a (lognot b)))) + (if (zero? out) #f out))) ;; Subtract B from A starting at index I; the result will be fresh. (define (subtract-branches/fresh shift a b i fresh) (let lp ((i 0)) @@ -721,7 +721,9 @@ (new (lp a-min a-shift old))) (if (eq? old new) a-root - (clone-branch-and-set a-root a-idx new))))))))))) + (let ((root (clone-branch-and-set a-root a-idx new))) + (and (or new (not (branch-empty? root))) + root)))))))))))) (define (bitvector->intset bv) (define (finish-tail out min tail)