Fix partial bounds checking elimination.
Closes PR13341.
This commit is contained in:
parent
a84e04e1e4
commit
fb73bc8b0e
|
@ -0,0 +1,24 @@
|
||||||
|
#;
|
||||||
|
(
|
||||||
|
1.0
|
||||||
|
1.0
|
||||||
|
)
|
||||||
|
|
||||||
|
#lang typed/racket
|
||||||
|
(require racket/flonum)
|
||||||
|
|
||||||
|
(define: been-there-vector? : Boolean #f)
|
||||||
|
(define: been-there-flvector? : Boolean #f)
|
||||||
|
(define (make-my-vector)
|
||||||
|
(if been-there-vector?
|
||||||
|
(error "make-my-vector should only be called once!")
|
||||||
|
(set! been-there-vector? #t))
|
||||||
|
(ann (vector 1.0 2.0 3.0) (Vectorof Flonum)))
|
||||||
|
(define (make-my-flvector)
|
||||||
|
(if been-there-flvector?
|
||||||
|
(error "make-my-flvector should only be called once!")
|
||||||
|
(set! been-there-flvector? #t))
|
||||||
|
(flvector 1.0 2.0 3.0))
|
||||||
|
|
||||||
|
(vector-ref (make-my-vector) 0)
|
||||||
|
(flvector-ref (make-my-flvector) 0)
|
|
@ -89,7 +89,7 @@
|
||||||
[new-v #,((optimize) #'v)])
|
[new-v #,((optimize) #'v)])
|
||||||
;; do the impersonator check up front, to avoid doing it twice (length and op)
|
;; do the impersonator check up front, to avoid doing it twice (length and op)
|
||||||
(if (impersonator? new-v)
|
(if (impersonator? new-v)
|
||||||
(if #,(let ([one-sided #'(unsafe-fx< new-i (unsafe-vector*-length v))])
|
(if #,(let ([one-sided #'(unsafe-fx< new-i (unsafe-vector*-length new-v))])
|
||||||
(if i-known-nonneg?
|
(if i-known-nonneg?
|
||||||
;; we know it's nonnegative, one-sided check
|
;; we know it's nonnegative, one-sided check
|
||||||
one-sided
|
one-sided
|
||||||
|
@ -98,7 +98,7 @@
|
||||||
(op.unsafe new-v new-i #,@(syntax-map (optimize) #'(new ...)))
|
(op.unsafe new-v new-i #,@(syntax-map (optimize) #'(new ...)))
|
||||||
#,safe-fallback) ; will error. to give the right error message
|
#,safe-fallback) ; will error. to give the right error message
|
||||||
;; not an impersonator, can use unsafe-vector* ops
|
;; not an impersonator, can use unsafe-vector* ops
|
||||||
(if #,(let ([one-sided #'(unsafe-fx< new-i (unsafe-vector-length v))])
|
(if #,(let ([one-sided #'(unsafe-fx< new-i (unsafe-vector-length new-v))])
|
||||||
(if i-known-nonneg?
|
(if i-known-nonneg?
|
||||||
one-sided
|
one-sided
|
||||||
#`(and (unsafe-fx>= new-i 0)
|
#`(and (unsafe-fx>= new-i 0)
|
||||||
|
@ -116,7 +116,7 @@
|
||||||
[i-known-nonneg? (subtypeof? #'i -NonNegFixnum)])
|
[i-known-nonneg? (subtypeof? #'i -NonNegFixnum)])
|
||||||
#`(let ([new-i #,((optimize) #'i)]
|
#`(let ([new-i #,((optimize) #'i)]
|
||||||
[new-v #,((optimize) #'v)])
|
[new-v #,((optimize) #'v)])
|
||||||
(if #,(let ([one-sided #'(unsafe-fx< new-i (unsafe-flvector-length v))])
|
(if #,(let ([one-sided #'(unsafe-fx< new-i (unsafe-flvector-length new-v))])
|
||||||
(if i-known-nonneg?
|
(if i-known-nonneg?
|
||||||
one-sided
|
one-sided
|
||||||
#`(and (unsafe-fx>= new-i 0)
|
#`(and (unsafe-fx>= new-i 0)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user