Chez Scheme: improve eq[v]? reductions in cptypes
Improve eq? and eq? handling to reduce expressions like (eq? (newline) (void)) => (begin (newline) #t)
This commit is contained in:
parent
355b9f51be
commit
61cca93086
|
@ -922,8 +922,7 @@
|
||||||
;Test types inference for string?
|
;Test types inference for string?
|
||||||
(test-arg-types '(string-length string?) 'fixnum? 'may-omit)
|
(test-arg-types '(string-length string?) 'fixnum? 'may-omit)
|
||||||
(test-arg-types '(string-ref string? fixnum?) 'char?)
|
(test-arg-types '(string-ref string? fixnum?) 'char?)
|
||||||
(unless (eq? (system-type 'vm) 'chez-scheme) ;; cptypes doesn't know that void? => eq? to (void)
|
(test-arg-types '(string-set! string? fixnum? char?) 'void?)
|
||||||
(test-arg-types '(string-set! string? fixnum? char?) 'void?))
|
|
||||||
(test-arg-types '(string->immutable-string string?) 'string? 'may-omit)
|
(test-arg-types '(string->immutable-string string?) 'string? 'may-omit)
|
||||||
(test-arg-types '(string-append) 'string? 'may-omit)
|
(test-arg-types '(string-append) 'string? 'may-omit)
|
||||||
(test-arg-types '(string-append string?) 'string? 'may-omit)
|
(test-arg-types '(string-append string?) 'string? 'may-omit)
|
||||||
|
@ -934,8 +933,7 @@
|
||||||
;Test types inference for bytes?
|
;Test types inference for bytes?
|
||||||
(test-arg-types '(bytes-length bytes?) 'fixnum? 'may-omit)
|
(test-arg-types '(bytes-length bytes?) 'fixnum? 'may-omit)
|
||||||
(test-arg-types '(bytes-ref bytes? fixnum?) 'fixnum?)
|
(test-arg-types '(bytes-ref bytes? fixnum?) 'fixnum?)
|
||||||
(unless (eq? (system-type 'vm) 'chez-scheme) ;; cptypes doesn't know that void? => eq? to (void)
|
(test-arg-types '(bytes-set! bytes? fixnum? fixnum?) 'void?)
|
||||||
(test-arg-types '(bytes-set! bytes? fixnum? fixnum?) 'void?))
|
|
||||||
(unless (eq? (system-type 'vm) 'chez-scheme) ;; ???
|
(unless (eq? (system-type 'vm) 'chez-scheme) ;; ???
|
||||||
(test-arg-types '(bytes->immutable-bytes bytes?) 'bytes? 'may-omit))
|
(test-arg-types '(bytes->immutable-bytes bytes?) 'bytes? 'may-omit))
|
||||||
(unless (eq? (system-type 'vm) 'chez-scheme) ;; bytes-append is not primitive
|
(unless (eq? (system-type 'vm) 'chez-scheme) ;; bytes-append is not primitive
|
||||||
|
|
|
@ -84,6 +84,12 @@
|
||||||
(cptypes-equivalent-expansion?
|
(cptypes-equivalent-expansion?
|
||||||
'(pair? (list))
|
'(pair? (list))
|
||||||
#f)
|
#f)
|
||||||
|
(cptypes-equivalent-expansion?
|
||||||
|
'(eq? (newline) (void))
|
||||||
|
'(begin (newline) #t))
|
||||||
|
(cptypes-equivalent-expansion?
|
||||||
|
'(eq? (newline) 0)
|
||||||
|
'(begin (newline) #f))
|
||||||
(cptypes-equivalent-expansion?
|
(cptypes-equivalent-expansion?
|
||||||
'(lambda (x) (vector-set! x 0 0) (vector? x))
|
'(lambda (x) (vector-set! x 0 0) (vector? x))
|
||||||
'(lambda (x) (vector-set! x 0 0) #t))
|
'(lambda (x) (vector-set! x 0 0) #t))
|
||||||
|
@ -574,11 +580,12 @@
|
||||||
(test-chain* '(fixnum? integer? real?))
|
(test-chain* '(fixnum? integer? real?))
|
||||||
(test-chain* '(fixnum? exact? number?)) ; exact? may raise an error
|
(test-chain* '(fixnum? exact? number?)) ; exact? may raise an error
|
||||||
(test-chain* '(bignum? exact? number?)) ; exact? may raise an error
|
(test-chain* '(bignum? exact? number?)) ; exact? may raise an error
|
||||||
(test-chain* '((lambda (x) (eq? x (expt 256 100))) bignum? real? number?))
|
(test-chain '((lambda (x) (eqv? x (expt 256 100))) bignum? real? number?))
|
||||||
(test-chain '((lambda (x) (eqv? 0.0 x)) flonum? real? number?))
|
(test-chain '((lambda (x) (eqv? 0.0 x)) flonum? real? number?))
|
||||||
(test-chain* '((lambda (x) (or (eqv? x 0.0) (eqv? x 3.14))) flonum? real? number?))
|
(test-chain* '((lambda (x) (or (eqv? x 0.0) (eqv? x 3.14))) flonum? real? number?))
|
||||||
(test-chain* '((lambda (x) (or (eq? x 0) (eqv? x 3.14))) real? number?))
|
(test-chain* '((lambda (x) (or (eq? x 0) (eqv? x 3.14))) real? number?))
|
||||||
(test-chain '(gensym? symbol?))
|
(test-chain '(gensym? symbol?))
|
||||||
|
(test-chain '((lambda (x) (eq? x 'banana)) symbol?))
|
||||||
(test-chain '(not boolean?))
|
(test-chain '(not boolean?))
|
||||||
(test-chain '((lambda (x) (eq? x #t)) boolean?))
|
(test-chain '((lambda (x) (eq? x #t)) boolean?))
|
||||||
(test-chain* '(record? #3%$record?))
|
(test-chain* '(record? #3%$record?))
|
||||||
|
@ -594,6 +601,7 @@
|
||||||
(test-disjoint '(pair? box? fixnum? flonum? (lambda (x) (eq? #t x))))
|
(test-disjoint '(pair? box? fixnum? flonum? (lambda (x) (eq? #t x))))
|
||||||
(test-disjoint '((lambda (x) (eq? x 0)) (lambda (x) (eq? x 1)) flonum?))
|
(test-disjoint '((lambda (x) (eq? x 0)) (lambda (x) (eq? x 1)) flonum?))
|
||||||
(test-disjoint '((lambda (x) (eqv? x 0.0)) (lambda (x) (eqv? x 1.0)) fixnum?))
|
(test-disjoint '((lambda (x) (eqv? x 0.0)) (lambda (x) (eqv? x 1.0)) fixnum?))
|
||||||
|
(test-disjoint '((lambda (x) (eq? x 'banana)) (lambda (x) (eq? x 'apple))))
|
||||||
(test-disjoint* '(list? record? vector?))
|
(test-disjoint* '(list? record? vector?))
|
||||||
(not (test-disjoint* '(list? null?)))
|
(not (test-disjoint* '(list? null?)))
|
||||||
(not (test-disjoint* '(list? pair?)))
|
(not (test-disjoint* '(list? pair?)))
|
||||||
|
|
|
@ -826,10 +826,44 @@ Notes:
|
||||||
[(_ id) (or (lookup #'id #'get-type-key)
|
[(_ id) (or (lookup #'id #'get-type-key)
|
||||||
($oops 'get-type "invalid identifier ~s" #'id))])))
|
($oops 'get-type "invalid identifier ~s" #'id))])))
|
||||||
|
|
||||||
|
(define (try-compare-constants e1 e2 prim-name)
|
||||||
|
; yes => true-rec
|
||||||
|
; no => false-rec
|
||||||
|
; unknown => #f
|
||||||
|
(and (Lsrc? e1)
|
||||||
|
(Lsrc? e2)
|
||||||
|
(nanopass-case (Lsrc Expr) e1
|
||||||
|
[(quote ,d1)
|
||||||
|
(nanopass-case (Lsrc Expr) e2
|
||||||
|
[(quote ,d2)
|
||||||
|
(cond
|
||||||
|
[(eqv? d1 d2)
|
||||||
|
(cond
|
||||||
|
[(eq? prim-name 'eq?)
|
||||||
|
(cond
|
||||||
|
[(or (not (number? d1))
|
||||||
|
; To avoid problems with cross compilation and eq?-ness
|
||||||
|
; ensure that it's a fixnum in both machines.
|
||||||
|
(and (fixnum? d1)
|
||||||
|
(target-fixnum? d1)))
|
||||||
|
true-rec]
|
||||||
|
[else
|
||||||
|
#f])]
|
||||||
|
[else
|
||||||
|
true-rec])]
|
||||||
|
[else
|
||||||
|
false-rec])]
|
||||||
|
[else #f])]
|
||||||
|
[else #f])))
|
||||||
|
|
||||||
(define-specialize 2 (eq? eqv?)
|
(define-specialize 2 (eq? eqv?)
|
||||||
[(e1 e2) (let ([r1 (get-type e1)]
|
[(e1 e2) (let ([r1 (get-type e1)]
|
||||||
[r2 (get-type e2)])
|
[r2 (get-type e2)])
|
||||||
(cond
|
(cond
|
||||||
|
[(try-compare-constants r1 r2 prim-name)
|
||||||
|
=> (lambda (ret)
|
||||||
|
(values (make-seq ctxt e1 e2 ret)
|
||||||
|
ret ntypes #f #f))]
|
||||||
[(predicate-disjoint? r2 r1)
|
[(predicate-disjoint? r2 r1)
|
||||||
(values (make-seq ctxt e1 e2 false-rec)
|
(values (make-seq ctxt e1 e2 false-rec)
|
||||||
false-rec ntypes #f #f)]
|
false-rec ntypes #f #f)]
|
||||||
|
|
Loading…
Reference in New Issue
Block a user