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. ;; Generic effect-free predicates.
(define-primitive-effects (define-primitive-effects
((eq? . _)) ((eq? x y))
((eqv? . _)) ((equal? x y))
((equal? . _)) ((fixnum? arg))
((pair? arg)) ((char? arg))
((eq-null? arg))
((eq-nil? arg))
((eq-false? arg))
((eq-true? arg))
((unspecified? arg))
((undefined? arg))
((eof-object? arg))
((null? arg)) ((null? arg))
((nil? arg )) ((false? arg))
((nil? arg))
((heap-object? arg))
((pair? arg))
((symbol? arg)) ((symbol? arg))
((variable? arg)) ((variable? arg))
((vector? arg)) ((vector? arg))
((struct? arg)) ((struct? arg))
((string? arg)) ((string? arg))
((number? arg)) ((number? arg))
((char? arg))
((bytevector? arg)) ((bytevector? arg))
((keyword? arg)) ((keyword? arg))
((bitvector? arg)) ((bitvector? arg))
((procedure? arg)) ((procedure? arg))
((thunk? arg))) ((thunk? arg))
((heap-number? arg)))
;; Fluids. ;; Fluids.
(define-primitive-effects (define-primitive-effects

View file

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

View file

@ -97,6 +97,13 @@
((type<=? type &immediate-types) (values #t #f)) ((type<=? type &immediate-types) (values #t #f))
(else (values #f #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. ;; All the cases that are in compile-bytecode.
(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)

View file

@ -596,6 +596,13 @@ minimum, and maximum."
(logand &all-types (lognot &immediate-types))) (logand &all-types (lognot &immediate-types)))
(restrict! val (if true? &heap-object-types &immediate-types) -inf.0 +inf.0)) (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-syntax-rule (define-simple-predicate-inferrer predicate type)
(define-predicate-inferrer (predicate val true?) (define-predicate-inferrer (predicate val true?)
(let ((type (if true? (let ((type (if true?