unofficial mirror of bug-guile@gnu.org 
 help / color / mirror / Atom feed
From: Matt Wette <matt.wette@gmail.com>
To: 38486@debbugs.gnu.org
Subject: bug#38486: specialize-numbers.scm: compute-significant-bits
Date: Sat, 21 Mar 2020 19:43:30 -0700	[thread overview]
Message-ID: <df13517f-ebe3-7809-a2ce-d987b477d937@gmail.com> (raw)
In-Reply-To: <460c32b1-966a-079d-4187-de63f93c6e5f@gmail.com>

I've narrowed it down to the named let loop "lp" in this routine in
module/language/cps/specialize-numbers.scm


(define (compute-significant-bits cps types kfun)
   "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))))
     (let lp ((worklist (intmap-keys preds)) (visited empty-intset)
              (out empty-intmap))
       (match (intset-prev worklist)
         (#f out)
         (label
          (let ((worklist (intset-remove worklist label))
                (visited* (intset-add visited label)))
            (define (continue out*)
              (if (and (eq? out out*) (eq? visited visited*))
                  (lp worklist visited out)
                  (lp (intset-union worklist (intmap-ref preds label))
                      visited* out*)))
            (define (add-def out var)
              (intmap-add out var 0 sigbits-union))
            (define (add-defs out vars)
              (match vars
                (() out)
                ((var . vars) (add-defs (add-def out var) vars))))
            (define (add-unknown-use out var)
              (intmap-add out var (inferred-sigbits types label var)
                          sigbits-union))
            (define (add-unknown-uses out vars)
              (match vars
                (() out)
                ((var . vars)
                 (add-unknown-uses (add-unknown-use out var) vars))))
            (continue
             (match (intmap-ref cps label)
               (($ $kfun src meta self)
                (add-def out self))
               (($ $kargs names vars ($ $continue k src exp))
                (let ((out (add-defs out vars)))
                  (match exp
                    ((or ($ $const) ($ $prim) ($ $fun) ($ $closure) ($ 
$rec))
                     ;; No uses, so no info added to sigbits.
                     out)
                    (($ $values args)
                     (match (intmap-ref cps k)
                       (($ $kargs _ vars)
                        (if (intset-ref visited k)
                            (fold (lambda (arg var out)
                                    (intmap-add out arg (intmap-ref out var)
                                                sigbits-union))
                                  out args vars)
                            out))
                       (($ $ktail)
                        (add-unknown-uses out args))))
                    (($ $call proc args)
                     (add-unknown-use (add-unknown-uses out args) proc))
                    (($ $callk label proc args)
                     (add-unknown-use (add-unknown-uses out args) proc))
                    (($ $branch kt ($ $values (arg)))
                     (add-unknown-use out arg))
                    (($ $branch kt ($ $primcall name args))
                     (add-unknown-uses out args))
                    (($ $primcall name args)
                     (let ((h (significant-bits-handler name)))
                       (if h
                           (match (intmap-ref cps k)
                             (($ $kargs _ defs)
                              (h label types out args defs)))
                           (add-unknown-uses out args))))
                    (($ $prompt escape? tag handler)
                     (add-unknown-use out tag)))))
               (_ out)))))))))






  parent reply	other threads:[~2020-03-22  2:43 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-12-04  4:58 bug#38486: Compiler does not terminate Zack Marvel
2019-12-04  8:43 ` tomas
2020-03-21 20:32 ` bug#38486: compile livelock Matt Wette
2020-03-21 20:57 ` bug#38486: try all options Matt Wette
2020-03-21 21:42 ` bug#38486: hang Matt Wette
2020-03-22  2:43 ` Matt Wette [this message]
2020-03-23 16:08 ` bug#38486: done Matt Wette

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/guile/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=df13517f-ebe3-7809-a2ce-d987b477d937@gmail.com \
    --to=matt.wette@gmail.com \
    --cc=38486@debbugs.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).