1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-05-22 20:40:29 +02:00

Fix compute-label-and-var-ranges for global DFG computation

* module/language/cps/dfg.scm (compute-label-and-var-ranges): Fix to
  work with global DFGs -- it wasn't taking $letrec into account for var
  ranges.

* module/language/cps/dce.scm (compute-live-code): Use bitvectors to
  represent the live var set.
This commit is contained in:
Andy Wingo 2014-04-01 18:16:00 +02:00
parent f9bceb770b
commit 0912202a51
2 changed files with 35 additions and 15 deletions

View file

@ -79,15 +79,15 @@
(define (compute-live-code fun) (define (compute-live-code fun)
(let* ((fun-data-table (make-hash-table)) (let* ((fun-data-table (make-hash-table))
(live-vars (make-hash-table))
(dfg (compute-dfg fun #:global? #t)) (dfg (compute-dfg fun #:global? #t))
(live-vars (make-bitvector (dfg-var-count dfg) #f))
(changed? #f)) (changed? #f))
(define (mark-live! sym) (define (mark-live! var)
(unless (value-live? sym) (unless (value-live? var)
(set! changed? #t) (set! changed? #t)
(hashq-set! live-vars sym #t))) (bitvector-set! live-vars var #t)))
(define (value-live? sym) (define (value-live? var)
(hashq-ref live-vars sym)) (bitvector-ref live-vars var))
(define (ensure-fun-data fun) (define (ensure-fun-data fun)
(or (hashq-ref fun-data-table fun) (or (hashq-ref fun-data-table fun)
(call-with-values (lambda () (call-with-values (lambda ()
@ -168,6 +168,8 @@
(mark-live! self)) (mark-live! self))
(($ $ktail) #f)) (($ $ktail) #f))
(lp (1- n)))))))) (lp (1- n))))))))
(unless (= (dfg-var-count dfg) (var-counter))
(error "internal error" (dfg-var-count dfg) (var-counter)))
(let lp () (let lp ()
(set! changed? #f) (set! changed? #f)
(visit-fun fun) (visit-fun fun)
@ -175,8 +177,8 @@
(values fun-data-table live-vars))) (values fun-data-table live-vars)))
(define (process-eliminations fun fun-data-table live-vars) (define (process-eliminations fun fun-data-table live-vars)
(define (value-live? sym) (define (value-live? var)
(hashq-ref live-vars sym)) (bitvector-ref live-vars var))
(define (make-adaptor name k defs) (define (make-adaptor name k defs)
(let* ((names (map (lambda (_) 'tmp) defs)) (let* ((names (map (lambda (_) 'tmp) defs))
(syms (map (lambda (_) (fresh-var)) defs)) (syms (map (lambda (_) (fresh-var)) defs))

View file

@ -889,14 +889,32 @@ BODY for each body continuation in the prompt."
min-var max-var var-count) min-var max-var var-count)
(let ((min-label (min* label min-label)) (let ((min-label (min* label min-label))
(max-label (max label max-label))) (max-label (max label max-label)))
(define (visit-letrec body min-var max-var var-count)
(match body
(($ $letk conts body)
(visit-letrec body min-var max-var var-count))
(($ $letrec names vars funs body)
(visit-letrec body
(cond (min-var (fold min min-var vars))
((pair? vars) (fold min (car vars) (cdr vars)))
(else min-var))
(fold max max-var vars)
(+ var-count (length vars))))
(($ $continue) (values min-var max-var var-count))))
(match cont (match cont
(($ $kargs names vars) (($ $kargs names vars body)
(values min-label max-label (1+ label-count) (call-with-values
(cond (min-var (fold min min-var vars)) (lambda ()
((pair? vars) (fold min (car vars) (cdr vars))) (if global?
(else min-var)) (visit-letrec body min-var max-var var-count)
(fold max max-var vars) (values min-var max-var var-count)))
(+ var-count (length vars)))) (lambda (min-var max-var var-count)
(values min-label max-label (1+ label-count)
(cond (min-var (fold min min-var vars))
((pair? vars) (fold min (car vars) (cdr vars)))
(else min-var))
(fold max max-var vars)
(+ var-count (length vars))))))
(($ $kentry self) (($ $kentry self)
(values min-label max-label (1+ label-count) (values min-label max-label (1+ label-count)
(min* self min-var) (max self max-var) (1+ var-count))) (min* self min-var) (max self max-var) (1+ var-count)))