Subject: bug#31594: Code causes guild compile to hang

From: Mark H Weaver <[email-masked]>
Date: Tue, 05 Jun 2018 22:23:41 -0400

Mark H Weaver <[email-masked]> writes:

> Tommi Höynälänmaa <[email-masked]> writes:
>
>> The following code causes command "guild compile" to hang:
>> ---cut here---
>> (define (select-nearest-methods binder
>>                 index v-fixed-args v-rest-arg vb-included)
>>   (dwl4 "select-nearest-methods")
>>   (assert (is-binder? binder))
>>   (let ((n (vector-length vb-included)))
>>     (do ((i 0 (+ i 1))) ((>= i n))
>>       (if (vector-ref vb-included i)
>>       (let ((t1 (get-item-at-index
>>              (vector-ref v-fixed-args i)
>>              (vector-ref v-rest-arg i)
>>              index)))
>>         (do ((j 0 (+ j 1))) ((>= j n))
>>           (if (and (not (= i j))
>>                (vector-ref vb-included j))
>>           (let ((t2 (get-item-at-index
>>                  (vector-ref v-fixed-args j)
>>                  (vector-ref v-rest-arg j)
>>                  index)))
>>             (if (is-t-subtype? binder t1 t2)
>>             ;; t2 is excluded
>>             (vector-set! vb-included j #f))))))))))
>> ---cut here---

Further investigation reveals that the loop in compute-significant-bits
in (language cps specialize-numbers) fails to terminate.  I instrumented
it as follows:

--8<---------------cut here---------------start------------->8---
diff --git a/module/language/cps/specialize-numbers.scm b/module/language/cps/specialize-numbers.scm
index d5587037b..7be0b5e33 100644
--- a/module/language/cps/specialize-numbers.scm
+++ b/module/language/cps/specialize-numbers.scm
@@ -211,9 +211,21 @@
   "Given the locally inferred types @var{types}, compute a map of VAR ->
 BITS indicating the significant bits needed for a variable.  BITS may be
 #f to indicate all bits, or a non-negative integer indicating a bitmask."
-  (let ((preds (invert-graph (compute-successors cps kfun))))
+  (pk 'compute-significant-bits cps types kfun)
+  (when (getenv "GUILE_DEBUG_CPS")
+    (format (current-warning-port) "CPS:\n")
+    (for-each (match-lambda
+                ((k . v) (format (current-warning-port) "  ~s --> ~s\n" k v)))
+              (reverse (intmap-fold acons cps '())))
+    (format (current-warning-port) "TYPES:\n")
+    (for-each (match-lambda
+                ((k . v) (format (current-warning-port) "  ~s --> ~s\n" k v)))
+              (reverse (intmap-fold acons types '()))))
+  (pk 'compute-significant-bits-result
+   (let ((preds (pk 'preds (invert-graph (compute-successors cps kfun)))))
     (let lp ((worklist (intmap-keys preds)) (visited empty-intset)
              (out empty-intmap))
+       (pk 'lp 'worklist worklist 'visited visited 'out out)
       (match (intset-prev worklist)
         (#f out)
         (label
@@ -276,7 +288,7 @@
                           (add-unknown-uses out args))))
                    (($ $prompt escape? tag handler)
                     (add-unknown-use out tag)))))
-              (_ out)))))))))
+               (_ out))))))))))
 
 (define (specialize-operations cps)
   (define (visit-cont label cont cps types sigbits)
--8<---------------cut here---------------end--------------->8---

and here's a reformatted version of the resulting output when compiling
Tommi's code above:

--8<---------------cut here---------------start------------->8---
;;; (compute-significant-bits #<intmap 0-103> #<intmap 13+0-90> 13)

CPS:
  0 --> #<cps (kfun () 0 12 1)>
  1 --> #<cps (kclause (() () #f () #f) 2)>
  2 --> #<cps (kargs () () (continue 3 (primcall current-module)))>
  3 --> #<cps (kargs (module) (1) (continue 4 (const 0)))>
  4 --> #<cps (kargs (scope) (2) (continue 5 (primcall cache-current-module! 1 2)))>
  5 --> #<cps (kargs () () (continue 6 (closure 13 0)))>
  6 --> #<cps (kargs (arg) (3) (continue 7 (const select-nearest-methods)))>
  7 --> #<cps (kargs (name) (4) (continue 8 (primcall define! 4)))>
  8 --> #<cps (kargs (box) (5) (continue 9 (closure 13 0)))>
  9 --> #<cps (kargs (#f) (6) (continue 10 (primcall box-set! 5 6)))>
  10 --> #<cps (kargs () () (continue 11 (unspecified)))>
  11 --> #<cps (kargs (unspecified) (7) (continue 12 (values 7)))>
  12 --> #<cps (ktail)>
  13 --> #<cps (kfun ((name . select-nearest-methods)) 8 103 14)>
  14 --> #<cps (kclause ((binder index v-fixed-args v-rest-arg vb-included) () #f () #f) 15)>
  15 --> #<cps (kargs (binder index v-fixed-args v-rest-arg vb-included) (9 10 11 12 13) (continue 16 (const dwl4)))>
  16 --> #<cps (kargs (name) (14) (continue 17 (const #t)))>
  17 --> #<cps (kargs (bound?) (15) (continue 18 (const 0)))>
  18 --> #<cps (kargs (scope) (16) (continue 19 (primcall cached-toplevel-box 16 14 15)))>
  19 --> #<cps (kargs (box) (17) (continue 20 (primcall box-ref 17)))>
  20 --> #<cps (kargs (arg) (18) (continue 21 (const "select-nearest-methods")))>
  21 --> #<cps (kargs (arg) (19) (continue 22 (call 18 19)))>
  22 --> #<cps (kreceive () vals 23)>
  23 --> #<cps (kargs (tmp) (20) (continue 24 (const assert)))>
  24 --> #<cps (kargs (name) (21) (continue 25 (primcall cached-toplevel-box 16 21 15)))>
  25 --> #<cps (kargs (box) (22) (continue 26 (primcall box-ref 22)))>
  26 --> #<cps (kargs (arg) (23) (continue 27 (const is-binder?)))>
  27 --> #<cps (kargs (name) (24) (continue 28 (primcall cached-toplevel-box 16 24 15)))>
  28 --> #<cps (kargs (box) (25) (continue 29 (primcall box-ref 25)))>
  29 --> #<cps (kargs (arg) (26) (continue 30 (call 26 9)))>
  30 --> #<cps (kreceive (arg) rest 31)>
  31 --> #<cps (kargs (tmp tmp) (27 28) (continue 32 (call 23 27)))>
  32 --> #<cps (kreceive () vals 33)>
  33 --> #<cps (kargs (tmp) (29) (continue 34 (primcall vector-length 13)))>
  34 --> #<cps (kargs (u64) (30) (continue 35 (primcall u64->scm 30)))>
  35 --> #<cps (kargs (n) (31) (continue 36 (branch 101 (primcall >= 16 31))))>
  36 --> #<cps (kargs () () (continue 37 (primcall scm->u64 16)))>
  37 --> #<cps (kargs (unboxed) (32) (continue 38 (primcall vector-ref 13 32)))>
  38 --> #<cps (kargs (arg) (33) (continue 67 (branch 39 (values 33))))>
  39 --> #<cps (kargs () () (continue 40 (const get-item-at-index)))>
  40 --> #<cps (kargs (name) (34) (continue 41 (primcall cached-toplevel-box 16 34 15)))>
  41 --> #<cps (kargs (box) (35) (continue 42 (primcall box-ref 35)))>
  42 --> #<cps (kargs (arg) (36) (continue 43 (primcall vector-ref 11 32)))>
  43 --> #<cps (kargs (arg) (37) (continue 44 (primcall vector-ref 12 32)))>
  44 --> #<cps (kargs (arg) (38) (continue 45 (call 36 37 38 10)))>
  45 --> #<cps (kreceive (t1) rest 46)>
  46 --> #<cps (kargs (tmp tmp) (39 40) (continue 47 (values 16)))>
  47 --> #<cps (kargs (j) (41) (continue 48 (branch 67 (primcall >= 41 31))))>
  48 --> #<cps (kargs () () (continue 49 (branch 65 (primcall = 16 41))))>
  49 --> #<cps (kargs () () (continue 50 (primcall scm->u64 41)))>
  50 --> #<cps (kargs (unboxed) (42) (continue 51 (primcall vector-ref 13 42)))>
  51 --> #<cps (kargs (arg) (43) (continue 65 (branch 52 (values 43))))>
  52 --> #<cps (kargs () () (continue 53 (primcall box-ref 35)))>
  53 --> #<cps (kargs (arg) (44) (continue 54 (primcall vector-ref 11 42)))>
  54 --> #<cps (kargs (arg) (45) (continue 55 (primcall vector-ref 12 42)))>
  55 --> #<cps (kargs (arg) (46) (continue 56 (call 44 45 46 10)))>
  56 --> #<cps (kreceive (t2) rest 57)>
  57 --> #<cps (kargs (tmp tmp) (47 48) (continue 58 (const is-t-subtype?)))>
  58 --> #<cps (kargs (name) (49) (continue 59 (primcall cached-toplevel-box 16 49 15)))>
  59 --> #<cps (kargs (box) (50) (continue 60 (primcall box-ref 50)))>
  60 --> #<cps (kargs (arg) (51) (continue 61 (call 51 9 39 47)))>
  61 --> #<cps (kreceive (arg) rest 62)>
  62 --> #<cps (kargs (tmp tmp) (52 53) (continue 65 (branch 63 (values 52))))>
  63 --> #<cps (kargs () () (continue 64 (const #f)))>
  64 --> #<cps (kargs (arg) (54) (continue 65 (primcall vector-set! 13 42 54)))>
  65 --> #<cps (kargs () () (continue 66 (const 1)))>
  66 --> #<cps (kargs (arg) (55) (continue 47 (primcall add 41 55)))>
  67 --> #<cps (kargs () () (continue 68 (const 1)))>
  68 --> #<cps (kargs (arg) (56) (continue 69 (const 1)))>
  69 --> #<cps (kargs (i) (57) (continue 70 (branch 101 (primcall >= 57 31))))>
  70 --> #<cps (kargs () () (continue 71 (primcall scm->u64 57)))>
  71 --> #<cps (kargs (unboxed) (58) (continue 72 (primcall vector-ref 13 58)))>
  72 --> #<cps (kargs (arg) (59) (continue 100 (branch 73 (values 59))))>
  73 --> #<cps (kargs () () (continue 74 (const get-item-at-index)))>
  74 --> #<cps (kargs (name) (60) (continue 75 (primcall cached-toplevel-box 16 60 15)))>
  75 --> #<cps (kargs (box) (61) (continue 76 (primcall box-ref 61)))>
  76 --> #<cps (kargs (arg) (62) (continue 77 (primcall vector-ref 11 58)))>
  77 --> #<cps (kargs (arg) (63) (continue 78 (primcall vector-ref 12 58)))>
  78 --> #<cps (kargs (arg) (64) (continue 79 (call 62 63 64 10)))>
  79 --> #<cps (kreceive (t1) rest 80)>
  80 --> #<cps (kargs (tmp tmp) (65 66) (continue 81 (values 16)))>
  81 --> #<cps (kargs (j) (67) (continue 82 (branch 100 (primcall >= 67 31))))>
  82 --> #<cps (kargs () () (continue 83 (branch 99 (primcall = 57 67))))>
  83 --> #<cps (kargs () () (continue 84 (primcall scm->u64 67)))>
  84 --> #<cps (kargs (unboxed) (68) (continue 85 (primcall vector-ref 13 68)))>
  85 --> #<cps (kargs (arg) (69) (continue 99 (branch 86 (values 69))))>
  86 --> #<cps (kargs () () (continue 87 (primcall box-ref 61)))>
  87 --> #<cps (kargs (arg) (70) (continue 88 (primcall vector-ref 11 68)))>
  88 --> #<cps (kargs (arg) (71) (continue 89 (primcall vector-ref 12 68)))>
  89 --> #<cps (kargs (arg) (72) (continue 90 (call 70 71 72 10)))>
  90 --> #<cps (kreceive (t2) rest 91)>
  91 --> #<cps (kargs (tmp tmp) (73 74) (continue 92 (const is-t-subtype?)))>
  92 --> #<cps (kargs (name) (75) (continue 93 (primcall cached-toplevel-box 16 75 15)))>
  93 --> #<cps (kargs (box) (76) (continue 94 (primcall box-ref 76)))>
  94 --> #<cps (kargs (arg) (77) (continue 95 (call 77 9 65 73)))>
  95 --> #<cps (kreceive (arg) rest 96)>
  96 --> #<cps (kargs (tmp tmp) (78 79) (continue 99 (branch 97 (values 78))))>
  97 --> #<cps (kargs () () (continue 98 (const #f)))>
  98 --> #<cps (kargs (arg) (80) (continue 99 (primcall vector-set! 13 68 80)))>
  99 --> #<cps (kargs () () (continue 81 (primcall add 67 56)))>
  100 --> #<cps (kargs () () (continue 69 (primcall add 57 56)))>
  101 --> #<cps (kargs () () (continue 102 (unspecified)))>
  102 --> #<cps (kargs (val) (81) (continue 103 (values 81)))>
  103 --> #<cps (ktail)>

TYPES:
  13 --> #(#<intmap> #<intmap 8+0>)
  14 --> #(#<intmap 8+0> #<intmap 8+0-5>)
  15 --> #(#<intmap 8+0-5> #<intmap 8+0-6>)
  16 --> #(#<intmap 8+0-6> #<intmap 8+0-7>)
  17 --> #(#<intmap 8+0-7> #<intmap 8+0-8>)
  18 --> #(#<intmap 8+0-8> #<intmap 8+0-9>)
  19 --> #(#<intmap 8+0-9> #<intmap 8+0-10>)
  20 --> #(#<intmap 8+0-10> #<intmap 8+0-11>)
  21 --> #(#<intmap 8+0-11> #<intmap 8+0-11>)
  22 --> #(#<intmap 8+0-11> #<intmap 8+0-12>)
  23 --> #(#<intmap 8+0-12> #<intmap 8+0-13>)
  24 --> #(#<intmap 8+0-13> #<intmap 8+0-14>)
  25 --> #(#<intmap 8+0-14> #<intmap 8+0-15>)
  26 --> #(#<intmap 8+0-15> #<intmap 8+0-16>)
  27 --> #(#<intmap 8+0-16> #<intmap 8+0-17>)
  28 --> #(#<intmap 8+0-17> #<intmap 8+0-18>)
  29 --> #(#<intmap 8+0-18> #<intmap 8+0-18>)
  30 --> #(#<intmap 8+0-18> #<intmap 8+0-20>)
  31 --> #(#<intmap 8+0-20> #<intmap 8+0-20>)
  32 --> #(#<intmap 8+0-20> #<intmap 8+0-21>)
  33 --> #(#<intmap 8+0-21> #<intmap 8+0-22>)
  34 --> #(#<intmap 8+0-22> #<intmap 8+0-23>)
  35 --> #(#<intmap 8+0-23> #<intmap 8+0-23> #<intmap 8+0-23>)
  36 --> #(#<intmap 8+0-23> #<intmap 8+0-24>)
  37 --> #(#<intmap 8+0-24> #<intmap 8+0-25>)
  38 --> #(#<intmap 8+0-25> #<intmap 8+0-25> #<intmap 8+0-25>)
  39 --> #(#<intmap 8+0-25> #<intmap 8+0-26>)
  40 --> #(#<intmap 8+0-26> #<intmap 8+0-27>)
  41 --> #(#<intmap 8+0-27> #<intmap 8+0-28>)
  42 --> #(#<intmap 8+0-28> #<intmap 8+0-29>)
  43 --> #(#<intmap 8+0-29> #<intmap 8+0-30>)
  44 --> #(#<intmap 8+0-30> #<intmap 8+0-30>)
  45 --> #(#<intmap 8+0-30> #<intmap 8+0-32>)
  46 --> #(#<intmap 8+0-32> #<intmap 8+0-33>)
  47 --> #(#<intmap 8+0-33> #<intmap 8+0-33> #<intmap 8+0-33>)
  48 --> #(#<intmap 8+0-33> #<intmap 8+0-33> #<intmap 8+0-33>)
  49 --> #(#<intmap 8+0-33> #<intmap 8+0-34>)
  50 --> #(#<intmap 8+0-34> #<intmap 8+0-35>)
  51 --> #(#<intmap 8+0-35> #<intmap 8+0-35> #<intmap 8+0-35>)
  52 --> #(#<intmap 8+0-35> #<intmap 8+0-36>)
  53 --> #(#<intmap 8+0-36> #<intmap 8+0-37>)
  54 --> #(#<intmap 8+0-37> #<intmap 8+0-38>)
  55 --> #(#<intmap 8+0-38> #<intmap 8+0-38>)
  56 --> #(#<intmap 8+0-38> #<intmap 8+0-40>)
  57 --> #(#<intmap 8+0-40> #<intmap 8+0-41>)
  58 --> #(#<intmap 8+0-41> #<intmap 8+0-42>)
  59 --> #(#<intmap 8+0-42> #<intmap 8+0-43>)
  60 --> #(#<intmap 8+0-43> #<intmap 8+0-43>)
  61 --> #(#<intmap 8+0-43> #<intmap 8+0-45>)
  62 --> #(#<intmap 8+0-45> #<intmap 8+0-45> #<intmap 8+0-45>)
  63 --> #(#<intmap 8+0-45> #<intmap 8+0-46>)
  64 --> #(#<intmap 8+0-46> #<intmap 8+0-46>)
  65 --> #(#<intmap 8+0-33> #<intmap 8+0-33,47>)
  66 --> #(#<intmap 8+0-33,47> #<intmap 8+0-33,47>)
  67 --> #(#<intmap 8+0-25> #<intmap 8+0-25,48>)
  68 --> #(#<intmap 8+0-25,48> #<intmap 8+0-25,48-49>)
  69 --> #(#<intmap 8+0-25,48-49> #<intmap 8+0-25,48-49> #<intmap 8+0-25,48-49>)
  70 --> #(#<intmap 8+0-25,48-49> #<intmap 8+0-25,48-50>)
  71 --> #(#<intmap 8+0-25,48-50> #<intmap 8+0-25,48-51>)
  72 --> #(#<intmap 8+0-25,48-51> #<intmap 8+0-25,48-51> #<intmap 8+0-25,48-51>)
  73 --> #(#<intmap 8+0-25,48-51> #<intmap 8+0-25,48-52>)
  74 --> #(#<intmap 8+0-25,48-52> #<intmap 8+0-25,48-53>)
  75 --> #(#<intmap 8+0-25,48-53> #<intmap 8+0-25,48-54>)
  76 --> #(#<intmap 8+0-25,48-54> #<intmap 8+0-25,48-55>)
  77 --> #(#<intmap 8+0-25,48-55> #<intmap 8+0-25,48-56>)
  78 --> #(#<intmap 8+0-25,48-56> #<intmap 8+0-25,48-56>)
  79 --> #(#<intmap 8+0-25,48-56> #<intmap 8+0-25,48-58>)
  80 --> #(#<intmap 8+0-25,48-58> #<intmap 8+0-25,48-59>)
  81 --> #(#<intmap 8+0-25,48-59> #<intmap 8+0-25,48-59> #<intmap 8+0-25,48-59>)
  82 --> #(#<intmap 8+0-25,48-59> #<intmap 8+0-25,48-59> #<intmap 8+0-25,48-59>)
  83 --> #(#<intmap 8+0-25,48-59> #<intmap 8+0-25,48-60>)
  84 --> #(#<intmap 8+0-25,48-60> #<intmap 8+0-25,48-61>)
  85 --> #(#<intmap 8+0-25,48-61> #<intmap 8+0-25,48-61> #<intmap 8+0-25,48-61>)
  86 --> #(#<intmap 8+0-25,48-61> #<intmap 8+0-25,48-62>)
  87 --> #(#<intmap 8+0-25,48-62> #<intmap 8+0-25,48-63>)
  88 --> #(#<intmap 8+0-25,48-63> #<intmap 8+0-25,48-64>)
  89 --> #(#<intmap 8+0-25,48-64> #<intmap 8+0-25,48-64>)
  90 --> #(#<intmap 8+0-25,48-64> #<intmap 8+0-25,48-66>)
  91 --> #(#<intmap 8+0-25,48-66> #<intmap 8+0-25,48-67>)
  92 --> #(#<intmap 8+0-25,48-67> #<intmap 8+0-25,48-68>)
  93 --> #(#<intmap 8+0-25,48-68> #<intmap 8+0-25,48-69>)
  94 --> #(#<intmap 8+0-25,48-69> #<intmap 8+0-25,48-69>)
  95 --> #(#<intmap 8+0-25,48-69> #<intmap 8+0-25,48-71>)
  96 --> #(#<intmap 8+0-25,48-71> #<intmap 8+0-25,48-71> #<intmap 8+0-25,48-71>)
  97 --> #(#<intmap 8+0-25,48-71> #<intmap 8+0-25,48-72>)
  98 --> #(#<intmap 8+0-25,48-72> #<intmap 8+0-25,48-72>)
  99 --> #(#<intmap 8+0-25,48-59> #<intmap 8+0-25,48-59>)
  100 --> #(#<intmap 8+0-25,48-51> #<intmap 8+0-25,48-51>)
  101 --> #(#<intmap 8+0-23> #<intmap 8+0-23,73>)
  102 --> #(#<intmap 8+0-23,73> #<intmap 8+0-23,73>)
  103 --> #(#<intmap 8+0-23,73>)

;;; (preds #<intmap 13+0-90>)
;;; (lp worklist #<intset 13-103>             visited #<intset>          out #<intmap>)
;;; (lp worklist #<intset 13-102>             visited #<intset 103>      out #<intmap>)
;;; (lp worklist #<intset 13-101>             visited #<intset 102-103>  out #<intmap 81+0>)
;;; (lp worklist #<intset 13-100>             visited #<intset 101-103>  out #<intmap 81+0>)
;;; (lp worklist #<intset 13-99>              visited #<intset 100-103>  out #<intmap 56+0-1,25>)
;;; (lp worklist #<intset 13-98>              visited #<intset 99-103>   out #<intmap 56+0-1,11,25>)
;;; (lp worklist #<intset 13-97>              visited #<intset 98-103>   out #<intmap 13+0,43-44,54-55,67-68>)
;;; (lp worklist #<intset 13-96>              visited #<intset 97-103>   out #<intmap 13+0,43-44,54-55,67-68>)
;;; (lp worklist #<intset 13-95>              visited #<intset 96-103>   out #<intmap 13+0,43-44,54-55,65-68>)
;;; (lp worklist #<intset 13-94>              visited #<intset 95-103>   out #<intmap 13+0,43-44,54-55,65-68>)
;;; (lp worklist #<intset 13-93>              visited #<intset 94-103>   out #<intmap 9+0,4,47-48,56,58-59,64,68-72>)
;;; (lp worklist #<intset 13-92>              visited #<intset 93-103>   out #<intmap 9+0,4,47-48,56,58-59,64,67-72>)
;;; (lp worklist #<intset 13-91>              visited #<intset 92-103>   out #<intmap 9+0,4,6-7,47-48,56,58-59,64,66-72>)
;;; (lp worklist #<intset 13-90>              visited #<intset 91-103>   out #<intmap 9+0,4,6-7,47-48,56,58-59,64-72>)
;;; (lp worklist #<intset 13-89>              visited #<intset 90-103>   out #<intmap 9+0,4,6-7,47-48,56,58-59,64-72>)
;;; (lp worklist #<intset 13-88>              visited #<intset 89-103>   out #<intmap 9+0-1,4,6-7,47-48,56,58-59,61-72>)
;;; (lp worklist #<intset 13-87>              visited #<intset 88-103>   out #<intmap 9+0-1,3-4,6-7,47-48,56,58-59,61-72>)
;;; (lp worklist #<intset 13-86>              visited #<intset 87-103>   out #<intmap 9+0-4,6-7,47-48,56,58-59,61-72>)
;;; (lp worklist #<intset 13-85>              visited #<intset 86-103>   out #<intmap 9+0-4,6-7,47-48,52,56,58-59,61-72>)
;;; (lp worklist #<intset 13-84>              visited #<intset 85-103>   out #<intmap 9+0-4,6-7,47-48,52,56,58-72>)
;;; (lp worklist #<intset 13-83>              visited #<intset 84-103>   out #<intmap 9+0-4,6-7,47-48,52,56,58-72>)
;;; (lp worklist #<intset 13-82>              visited #<intset 83-103>   out #<intmap 9+0-4,6-7,47-48,52,56,58-72>)
;;; (lp worklist #<intset 13-81>              visited #<intset 82-103>   out #<intmap 9+0-4,6-7,47-48,52,56,58-72>)
;;; (lp worklist #<intset 13-80,99>           visited #<intset 81-103>   out #<intmap 9+0-4,6-7,22,47-48,52,56,58-72>)
;;; (lp worklist #<intset 13-80,82,85,96,98>  visited #<intset 81-103>   out #<intmap 9+0-4,6-7,22,47-48,52,56,58-72>)
;;; (lp worklist #<intset 13-80,82,85,96>     visited #<intset 81-103>   out #<intmap 9+0-4,6-7,22,47-48,52,56,58-72>)
;;; (lp worklist #<intset 13-80,82,85>        visited #<intset 81-103>   out #<intmap 9+0-4,6-7,22,47-48,52,56,58-72>)
;;; (lp worklist #<intset 13-80,82>           visited #<intset 81-103>   out #<intmap 9+0-4,6-7,22,47-48,52,56,58-72>)
;;; (lp worklist #<intset 13-81>              visited #<intset 81-103>   out #<intmap 9+0-4,6-7,22,47-48,52,56,58-72>)

;;; (lp worklist #<intset 13-80,99>           visited #<intset 81-103>   out #<intmap 9+0-4,6-7,22,47-48,52,56,58-72>)
;;; (lp worklist #<intset 13-80,82,85,96,98>  visited #<intset 81-103>   out #<intmap 9+0-4,6-7,22,47-48,52,56,58-72>)
;;; (lp worklist #<intset 13-80,82,85,96>     visited #<intset 81-103>   out #<intmap 9+0-4,6-7,22,47-48,52,56,58-72>)
;;; (lp worklist #<intset 13-80,82,85>        visited #<intset 81-103>   out #<intmap 9+0-4,6-7,22,47-48,52,56,58-72>)
;;; (lp worklist #<intset 13-80,82>           visited #<intset 81-103>   out #<intmap 9+0-4,6-7,22,47-48,52,56,58-72>)
;;; (lp worklist #<intset 13-81>              visited #<intset 81-103>   out #<intmap 9+0-4,6-7,22,47-48,52,56,58-72>)

;;; (lp worklist #<intset 13-80,99>           visited #<intset 81-103>   out #<intmap 9+0-4,6-7,22,47-48,52,56,58-72>)
;;; (lp worklist #<intset 13-80,82,85,96,98>  visited #<intset 81-103>   out #<intmap 9+0-4,6-7,22,47-48,52,56,58-72>)
;;; (lp worklist #<intset 13-80,82,85,96>     visited #<intset 81-103>   out #<intmap 9+0-4,6-7,22,47-48,52,56,58-72>)
;;; (lp worklist #<intset 13-80,82,85>        visited #<intset 81-103>   out #<intmap 9+0-4,6-7,22,47-48,52,56,58-72>)
;;; (lp worklist #<intset 13-80,82>           visited #<intset 81-103>   out #<intmap 9+0-4,6-7,22,47-48,52,56,58-72>)
;;; (lp worklist #<intset 13-81>              visited #<intset 81-103>   out #<intmap 9+0-4,6-7,22,47-48,52,56,58-72>)

;;; [the 6 loop states above repeat forever]
--8<---------------cut here---------------end--------------->8---

To be continued ...

     Mark