1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-05-02 13:00:26 +02:00

$dfa includes CFA fields

* module/language/cps/dfg.scm ($dfa): Include CFA min-label, k-map, and
  k-order inline.
  (dfa-k-idx, dfa-k-sym, dfa-k-count): Adapt.
  (compute-live-variables): Extract fields of CFA for make-dfa.
  (print-dfa): Adapt (and fix positional record matching).
This commit is contained in:
Andy Wingo 2014-04-02 11:45:26 +02:00
parent 4ec3ded05d
commit a57f6e1e36

View file

@ -646,10 +646,13 @@ body continuation in the prompt."
;; Data-flow analysis. ;; Data-flow analysis.
(define-record-type $dfa (define-record-type $dfa
(make-dfa cfa min-var var-count in out) (make-dfa min-label k-map k-order min-var var-count in out)
dfa? dfa?
;; CFA, for its reverse-post-order numbering ;; CFA, for its label sort order
(cfa dfa-cfa) (min-label dfa-min-label)
(k-map dfa-k-map)
(k-order dfa-k-order)
;; Minimum var in this function. ;; Minimum var in this function.
(min-var dfa-min-var) (min-var dfa-min-var)
;; Minimum var in this function. ;; Minimum var in this function.
@ -660,13 +663,13 @@ body continuation in the prompt."
(out dfa-out)) (out dfa-out))
(define (dfa-k-idx dfa k) (define (dfa-k-idx dfa k)
(cfa-k-idx (dfa-cfa dfa) k)) (vector-ref (dfa-k-map dfa) (- k (dfa-min-label dfa))))
(define (dfa-k-sym dfa idx) (define (dfa-k-sym dfa idx)
(cfa-k-sym (dfa-cfa dfa) idx)) (vector-ref (dfa-k-order dfa) idx))
(define (dfa-k-count dfa) (define (dfa-k-count dfa)
(cfa-k-count (dfa-cfa dfa))) (vector-length (dfa-k-map dfa)))
(define (dfa-var-idx dfa var) (define (dfa-var-idx dfa var)
(let ((idx (- var (dfa-min-var dfa)))) (let ((idx (- var (dfa-min-var dfa))))
@ -730,11 +733,11 @@ body continuation in the prompt."
(compute-maximum-fixed-point (cfa-preds cfa) (compute-maximum-fixed-point (cfa-preds cfa)
live-out live-in defv usev #t) live-out live-in defv usev #t)
(make-dfa cfa min-var nvars live-in live-out))) (make-dfa (cfa-min-label cfa) (cfa-k-map cfa) (cfa-order cfa) min-var nvars live-in live-out)))
(define (print-dfa dfa) (define (print-dfa dfa)
(match dfa (match dfa
(($ $dfa cfa min-var in out) (($ $dfa min-label k-map k-order min-var var-count in out)
(define (print-var-set bv) (define (print-var-set bv)
(let lp ((n 0)) (let lp ((n 0))
(let ((n (bit-position #t bv n))) (let ((n (bit-position #t bv n)))
@ -742,8 +745,8 @@ body continuation in the prompt."
(format #t " ~A" (+ n min-var)) (format #t " ~A" (+ n min-var))
(lp (1+ n)))))) (lp (1+ n))))))
(let lp ((n 0)) (let lp ((n 0))
(when (< n (cfa-k-count cfa)) (when (< n (vector-length k-order))
(format #t "~A:\n" (cfa-k-sym cfa n)) (format #t "~A:\n" (vector-ref k-order n))
(format #t " in:") (format #t " in:")
(print-var-set (vector-ref in n)) (print-var-set (vector-ref in n))
(newline) (newline)