1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-12 14:50:19 +02:00

CPS type analysis support for mutable vs immutable vectors

* module/language/cps/types.scm (&mutable-vector, &vector): Separate
  type bits.
  (&vector): New union type.
  (constant-type): Constant vectors are immutable.
* module/language/cps/type-fold.scm (mutable-vector?)
  (immutable-vector?): New folders.
  (vector?): Add union folder.
This commit is contained in:
Andy Wingo 2018-01-07 17:16:20 +01:00
parent 8009359f6e
commit 9b3c4612bd
2 changed files with 23 additions and 6 deletions

View file

@ -114,12 +114,19 @@
(define-unary-type-predicate-folder pair? &pair) (define-unary-type-predicate-folder pair? &pair)
(define-unary-type-predicate-folder symbol? &symbol) (define-unary-type-predicate-folder symbol? &symbol)
(define-unary-type-predicate-folder variable? &box) (define-unary-type-predicate-folder variable? &box)
(define-unary-type-predicate-folder vector? &vector) (define-unary-type-predicate-folder mutable-vector? &mutable-vector)
(define-unary-type-predicate-folder immutable-vector? &immutable-vector)
(define-unary-type-predicate-folder struct? &struct) (define-unary-type-predicate-folder struct? &struct)
(define-unary-type-predicate-folder string? &string) (define-unary-type-predicate-folder string? &string)
(define-unary-type-predicate-folder number? &number) (define-unary-type-predicate-folder number? &number)
(define-unary-type-predicate-folder char? &char) (define-unary-type-predicate-folder char? &char)
(define-unary-branch-folder (vector? type min max)
(cond
((zero? (logand type &vector)) (values #t #f))
((type<=? type &vector) (values #t #t))
(else (values #f #f))))
(define-binary-branch-folder (eq? type0 min0 max0 type1 min1 max1) (define-binary-branch-folder (eq? type0 min0 max0 type1 min1 max1)
(cond (cond
((or (zero? (logand type0 type1)) (< max0 min1) (< max1 min0)) ((or (zero? (logand type0 type1)) (< max0 min1) (< max1 min0))

View file

@ -101,7 +101,8 @@
&pointer &pointer
&fluid &fluid
&pair &pair
&vector &immutable-vector
&mutable-vector
&box &box
&struct &struct
&string &string
@ -115,7 +116,7 @@
&null &nil &false &true &unspecified &undefined &eof &null &nil &false &true &unspecified &undefined &eof
;; Union types. ;; Union types.
&exact-integer &exact-number &real &number &exact-integer &exact-number &real &number &vector
;; Untagged types. ;; Untagged types.
&f64 &f64
@ -161,7 +162,8 @@
&pointer &pointer
&fluid &fluid
&pair &pair
&vector &immutable-vector
&mutable-vector
&box &box
&struct &struct
&string &string
@ -196,6 +198,9 @@
(define-syntax &number (define-syntax &number
(identifier-syntax (logior &fixnum &bignum &flonum &complex &fraction))) (identifier-syntax (logior &fixnum &bignum &flonum &complex &fraction)))
(define-syntax &vector
(identifier-syntax (logior &immutable-vector &mutable-vector)))
(define-syntax-rule (type<=? x type) (define-syntax-rule (type<=? x type)
(zero? (logand x (lognot type)))) (zero? (logand x (lognot type))))
@ -366,7 +371,7 @@ minimum, and maximum."
((symbol? val) (return &symbol #f)) ((symbol? val) (return &symbol #f))
((keyword? val) (return &keyword #f)) ((keyword? val) (return &keyword #f))
((pair? val) (return &pair #f)) ((pair? val) (return &pair #f))
((vector? val) (return &vector (vector-length val))) ((vector? val) (return &immutable-vector (vector-length val)))
((string? val) (return &string (string-length val))) ((string? val) (return &string (string-length val)))
((bytevector? val) (return &bytevector (bytevector-length val))) ((bytevector? val) (return &bytevector (bytevector-length val)))
((bitvector? val) (return &bitvector (bitvector-length val))) ((bitvector? val) (return &bitvector (bitvector-length val)))
@ -666,7 +671,8 @@ minimum, and maximum."
(define-simple-predicate-inferrer pair? &pair) (define-simple-predicate-inferrer pair? &pair)
(define-simple-predicate-inferrer symbol? &symbol) (define-simple-predicate-inferrer symbol? &symbol)
(define-simple-predicate-inferrer variable? &box) (define-simple-predicate-inferrer variable? &box)
(define-simple-predicate-inferrer vector? &vector) (define-simple-predicate-inferrer immutable-vector? &immutable-vector)
(define-simple-predicate-inferrer mutable-vector? &mutable-vector)
(define-simple-predicate-inferrer struct? &struct) (define-simple-predicate-inferrer struct? &struct)
(define-simple-predicate-inferrer string? &string) (define-simple-predicate-inferrer string? &string)
(define-simple-predicate-inferrer bytevector? &bytevector) (define-simple-predicate-inferrer bytevector? &bytevector)
@ -679,6 +685,10 @@ minimum, and maximum."
(define-simple-predicate-inferrer compnum? &complex) (define-simple-predicate-inferrer compnum? &complex)
(define-simple-predicate-inferrer fracnum? &fraction) (define-simple-predicate-inferrer fracnum? &fraction)
(define-predicate-inferrer (vector? val true?)
(define &not-vector (logand &all-types (lognot &vector)))
(restrict! val (if true? &vector &not-vector) -inf.0 +inf.0))
(define-predicate-inferrer (eq? a b true?) (define-predicate-inferrer (eq? a b true?)
;; We can only propagate information down the true leg. ;; We can only propagate information down the true leg.
(when true? (when true?