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:
parent
587842d874
commit
c2fa345093
4 changed files with 33 additions and 9 deletions
|
@ -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
|
||||
|
|
|
@ -95,12 +95,12 @@
|
|||
string?
|
||||
keyword?
|
||||
bytevector?
|
||||
bitvector?))
|
||||
bitvector?
|
||||
heap-number?))
|
||||
|
||||
;; FIXME: Support these.
|
||||
(define *other-predicates*
|
||||
'(weak-vector?
|
||||
number?
|
||||
hash-table?
|
||||
pointer?
|
||||
fluid?
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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?
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue