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

Add missing compiler support for heap-object? primcall et al.

* module/language/cps/effects-analysis.scm: Reorder effect-free
  primitives.  Add immediate predicates and heap-number?.
* module/language/cps/primitives.scm (*heap-type-predicates*): Add
  heap-number?.
* module/language/cps/type-fold.scm (heap-number?): New folder.
* module/language/cps/types.scm (heap-number?): New inferrer.
This commit is contained in:
Andy Wingo 2017-10-29 14:35:19 +01:00
parent 587842d874
commit c2fa345093
4 changed files with 33 additions and 9 deletions

View file

@ -263,24 +263,34 @@ is or might be a read or a write to the same location as A."
;; Generic effect-free predicates.
(define-primitive-effects
((eq? . _))
((eqv? . _))
((equal? . _))
((pair? arg))
((eq? x y))
((equal? x y))
((fixnum? arg))
((char? arg))
((eq-null? arg))
((eq-nil? arg))
((eq-false? arg))
((eq-true? arg))
((unspecified? arg))
((undefined? arg))
((eof-object? arg))
((null? arg))
((nil? arg ))
((false? arg))
((nil? arg))
((heap-object? arg))
((pair? arg))
((symbol? arg))
((variable? arg))
((vector? arg))
((struct? arg))
((string? arg))
((number? arg))
((char? arg))
((bytevector? arg))
((keyword? arg))
((bitvector? arg))
((procedure? arg))
((thunk? arg)))
((thunk? arg))
((heap-number? arg)))
;; Fluids.
(define-primitive-effects

View file

@ -95,12 +95,12 @@
string?
keyword?
bytevector?
bitvector?))
bitvector?
heap-number?))
;; FIXME: Support these.
(define *other-predicates*
'(weak-vector?
number?
hash-table?
pointer?
fluid?

View file

@ -97,6 +97,13 @@
((type<=? type &immediate-types) (values #t #f))
(else (values #f #f))))
(define-unary-branch-folder (heap-number? type min max)
(define &types (logior &bignum &flonum &fraction &complex))
(cond
((zero? (logand type &types)) (values #t #f))
((type<=? type &types) (values #t #t))
(else (values #f #f))))
;; All the cases that are in compile-bytecode.
(define-unary-type-predicate-folder pair? &pair)
(define-unary-type-predicate-folder symbol? &symbol)

View file

@ -596,6 +596,13 @@ minimum, and maximum."
(logand &all-types (lognot &immediate-types)))
(restrict! val (if true? &heap-object-types &immediate-types) -inf.0 +inf.0))
(define-predicate-inferrer (heap-number? val true?)
(define &heap-number-types
(logior &bignum &flonum &complex &fraction))
(define &other-types
(logand &all-types (lognot &heap-number-types)))
(restrict! val (if true? &heap-number-types &other-types) -inf.0 +inf.0))
(define-syntax-rule (define-simple-predicate-inferrer predicate type)
(define-predicate-inferrer (predicate val true?)
(let ((type (if true?