From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED!not-for-mail From: Mark H Weaver Newsgroups: gmane.lisp.guile.bugs Subject: bug#31594: Code causes guild compile to hang Date: Tue, 05 Jun 2018 22:23:41 -0400 Message-ID: <87vaaw1wlu.fsf@netris.org> References: <87efhk3nb5.fsf@netris.org> NNTP-Posting-Host: blaine.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Trace: blaine.gmane.org 1528251853 11023 195.159.176.226 (6 Jun 2018 02:24:13 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Wed, 6 Jun 2018 02:24:13 +0000 (UTC) User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.1 (gnu/linux) Cc: 31594@debbugs.gnu.org To: Tommi =?UTF-8?Q?H=C3=B6yn=C3=A4l=C3=A4nmaa?= Original-X-From: bug-guile-bounces+guile-bugs=m.gmane.org@gnu.org Wed Jun 06 04:24:09 2018 Return-path: Envelope-to: guile-bugs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by blaine.gmane.org with esmtp (Exim 4.84_2) (envelope-from ) id 1fQO7M-0002kR-5N for guile-bugs@m.gmane.org; Wed, 06 Jun 2018 04:24:08 +0200 Original-Received: from localhost ([::1]:50016 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fQO9S-0005Kl-KD for guile-bugs@m.gmane.org; Tue, 05 Jun 2018 22:26:18 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:33953) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fQO9H-0005KL-BT for bug-guile@gnu.org; Tue, 05 Jun 2018 22:26:11 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fQO9E-0004a6-1j for bug-guile@gnu.org; Tue, 05 Jun 2018 22:26:07 -0400 Original-Received: from debbugs.gnu.org ([208.118.235.43]:56076) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fQO9D-0004ZD-Sl for bug-guile@gnu.org; Tue, 05 Jun 2018 22:26:03 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1fQO9C-0001wG-HM for bug-guile@gnu.org; Tue, 05 Jun 2018 22:26:03 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Mark H Weaver Original-Sender: "Debbugs-submit" Resent-CC: bug-guile@gnu.org Resent-Date: Wed, 06 Jun 2018 02:26:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 31594 X-GNU-PR-Package: guile X-GNU-PR-Keywords: Original-Received: via spool by 31594-submit@debbugs.gnu.org id=B31594.15282519097394 (code B ref 31594); Wed, 06 Jun 2018 02:26:02 +0000 Original-Received: (at 31594) by debbugs.gnu.org; 6 Jun 2018 02:25:09 +0000 Original-Received: from localhost ([127.0.0.1]:35740 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1fQO8K-0001vB-QD for submit@debbugs.gnu.org; Tue, 05 Jun 2018 22:25:09 -0400 Original-Received: from world.peace.net ([64.112.178.59]:52410) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1fQO8I-0001ue-E6 for 31594@debbugs.gnu.org; Tue, 05 Jun 2018 22:25:07 -0400 Original-Received: from mhw by world.peace.net with esmtpsa (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.89) (envelope-from ) id 1fQO8B-0007k2-3Q; Tue, 05 Jun 2018 22:24:59 -0400 In-Reply-To: <87efhk3nb5.fsf@netris.org> (Mark H. Weaver's message of "Tue, 05 Jun 2018 18:01:34 -0400") X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 208.118.235.43 X-BeenThere: bug-guile@gnu.org List-Id: "Bug reports for GUILE, GNU's Ubiquitous Extension Language" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-guile-bounces+guile-bugs=m.gmane.org@gnu.org Original-Sender: "bug-guile" Xref: news.gmane.org gmane.lisp.guile.bugs:9056 Archived-At: Mark H Weaver writes: > Tommi H=C3=B6yn=C3=A4l=C3=A4nmaa 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))) ((>=3D 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))) ((>=3D j n)) >> (if (and (not (=3D 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/c= ps/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)))))))))) =20 (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 # # 13) CPS: 0 --> # 1 --> # 2 --> # 3 --> # 4 --> # 5 --> # 6 --> # 7 --> # 8 --> # 9 --> # 10 --> # 11 --> # 12 --> # 13 --> # 14 --> # 15 --> # 16 --> # 17 --> # 18 --> # 19 --> # 20 --> # 21 --> # 22 --> # 23 --> # 24 --> # 25 --> # 26 --> # 27 --> # 28 --> # 29 --> # 30 --> # 31 --> # 32 --> # 33 --> # 34 --> #scm 30)))> 35 --> #=3D 16 3= 1))))> 36 --> #u64 16)))> 37 --> # 38 --> # 39 --> # 40 --> # 41 --> # 42 --> # 43 --> # 44 --> # 45 --> # 46 --> # 47 --> #=3D 41 31= ))))> 48 --> # 49 --> #u64 41)))> 50 --> # 51 --> # 52 --> # 53 --> # 54 --> # 55 --> # 56 --> # 57 --> # 58 --> # 59 --> # 60 --> # 61 --> # 62 --> # 63 --> # 64 --> # 65 --> # 66 --> # 67 --> # 68 --> # 69 --> #=3D 57 3= 1))))> 70 --> #u64 57)))> 71 --> # 72 --> # 73 --> # 74 --> # 75 --> # 76 --> # 77 --> # 78 --> # 79 --> # 80 --> # 81 --> #=3D 67 3= 1))))> 82 --> # 83 --> #u64 67)))> 84 --> # 85 --> # 86 --> # 87 --> # 88 --> # 89 --> # 90 --> # 91 --> # 92 --> # 93 --> # 94 --> # 95 --> # 96 --> # 97 --> # 98 --> # 99 --> # 100 --> # 101 --> # 102 --> # 103 --> # TYPES: 13 --> #(# #) 14 --> #(# #) 15 --> #(# #) 16 --> #(# #) 17 --> #(# #) 18 --> #(# #) 19 --> #(# #) 20 --> #(# #) 21 --> #(# #) 22 --> #(# #) 23 --> #(# #) 24 --> #(# #) 25 --> #(# #) 26 --> #(# #) 27 --> #(# #) 28 --> #(# #) 29 --> #(# #) 30 --> #(# #) 31 --> #(# #) 32 --> #(# #) 33 --> #(# #) 34 --> #(# #) 35 --> #(# # #) 36 --> #(# #) 37 --> #(# #) 38 --> #(# # #) 39 --> #(# #) 40 --> #(# #) 41 --> #(# #) 42 --> #(# #) 43 --> #(# #) 44 --> #(# #) 45 --> #(# #) 46 --> #(# #) 47 --> #(# # #) 48 --> #(# # #) 49 --> #(# #) 50 --> #(# #) 51 --> #(# # #) 52 --> #(# #) 53 --> #(# #) 54 --> #(# #) 55 --> #(# #) 56 --> #(# #) 57 --> #(# #) 58 --> #(# #) 59 --> #(# #) 60 --> #(# #) 61 --> #(# #) 62 --> #(# # #) 63 --> #(# #) 64 --> #(# #) 65 --> #(# #) 66 --> #(# #) 67 --> #(# #) 68 --> #(# #) 69 --> #(# # #) 70 --> #(# #) 71 --> #(# #) 72 --> #(# # #) 73 --> #(# #) 74 --> #(# #) 75 --> #(# #) 76 --> #(# #) 77 --> #(# #) 78 --> #(# #) 79 --> #(# #) 80 --> #(# #) 81 --> #(# # #) 82 --> #(# # #) 83 --> #(# #) 84 --> #(# #) 85 --> #(# # #) 86 --> #(# #) 87 --> #(# #) 88 --> #(# #) 89 --> #(# #) 90 --> #(# #) 91 --> #(# #) 92 --> #(# #) 93 --> #(# #) 94 --> #(# #) 95 --> #(# #) 96 --> #(# # #) 97 --> #(# #) 98 --> #(# #) 99 --> #(# #) 100 --> #(# #) 101 --> #(# #) 102 --> #(# #) 103 --> #(#) ;;; (preds #) ;;; (lp worklist # visited # ou= t #) ;;; (lp worklist # visited # ou= t #) ;;; (lp worklist # visited # ou= t #) ;;; (lp worklist # visited # ou= t #) ;;; (lp worklist # visited # ou= t #) ;;; (lp worklist # visited # ou= t #) ;;; (lp worklist # visited # ou= t #) ;;; (lp worklist # visited # ou= t #) ;;; (lp worklist # visited # ou= t #) ;;; (lp worklist # visited # ou= t #) ;;; (lp worklist # visited # ou= t #) ;;; (lp worklist # visited # ou= t #) ;;; (lp worklist # visited # ou= t #) ;;; (lp worklist # visited # ou= t #) ;;; (lp worklist # visited # ou= t #) ;;; (lp worklist # visited # ou= t #) ;;; (lp worklist # visited # ou= t #) ;;; (lp worklist # visited # ou= t #) ;;; (lp worklist # visited # ou= t #) ;;; (lp worklist # visited # ou= t #) ;;; (lp worklist # visited # ou= t #) ;;; (lp worklist # visited # ou= t #) ;;; (lp worklist # visited # ou= t #) ;;; (lp worklist # visited # ou= t #) ;;; (lp worklist # visited # ou= t #) ;;; (lp worklist # visited # ou= t #) ;;; (lp worklist # visited # ou= t #) ;;; (lp worklist # visited # ou= t #) ;;; (lp worklist # visited # ou= t #) ;;; (lp worklist # visited # ou= t #) ;;; (lp worklist # visited # ou= t #) ;;; (lp worklist # visited # ou= t #) ;;; (lp worklist # visited # ou= t #) ;;; (lp worklist # visited # ou= t #) ;;; (lp worklist # visited # ou= t #) ;;; (lp worklist # visited # ou= t #) ;;; (lp worklist # visited # ou= t #) ;;; (lp worklist # visited # ou= t #) ;;; (lp worklist # visited # ou= t #) ;;; (lp worklist # visited # ou= t #) ;;; (lp worklist # visited # ou= t #) ;;; [the 6 loop states above repeat forever] --8<---------------cut here---------------end--------------->8--- To be continued ... Mark