diff --git a/collects/tests/typed-scheme/optimizer/generic/known-vector-length.rkt b/collects/tests/typed-scheme/optimizer/generic/known-vector-length.rkt new file mode 100644 index 0000000000..083d8730f1 --- /dev/null +++ b/collects/tests/typed-scheme/optimizer/generic/known-vector-length.rkt @@ -0,0 +1,3 @@ +(module known-vector-length typed/scheme #:optimize + (require racket/unsafe/ops) + (+ 2 (vector-length (ann (vector 1 2) (Vector Integer Integer))))) diff --git a/collects/tests/typed-scheme/optimizer/hand-optimized/known-vector-length.rkt b/collects/tests/typed-scheme/optimizer/hand-optimized/known-vector-length.rkt new file mode 100644 index 0000000000..e480939a25 --- /dev/null +++ b/collects/tests/typed-scheme/optimizer/hand-optimized/known-vector-length.rkt @@ -0,0 +1,3 @@ +(module known-vector-length typed/scheme #:optimize + (require racket/unsafe/ops) + (+ 2 (begin (vector 1 2) 2))) diff --git a/collects/typed-scheme/private/optimize.rkt b/collects/typed-scheme/private/optimize.rkt index 670cd8ae1b..0cd2c8ae8d 100644 --- a/collects/typed-scheme/private/optimize.rkt +++ b/collects/typed-scheme/private/optimize.rkt @@ -231,6 +231,16 @@ (begin (log-optimization "unary pair" #'op) #'(op.unsafe p.opt))) + ;; vector-length of a known-length vector + (pattern (#%plain-app (~and op (~or (~literal vector-length) + (~literal unsafe-vector-length) + (~literal unsafe-vector*-length))) + v:vector-opt-expr) + #:with opt + (begin (log-optimization "known-length vector" #'op) + (match (type-of #'v) + [(tc-result1: (HeterogenousVector: es)) + #`(begin v.opt #,(length es))]))) ; v may have side effects ;; we can optimize vector-length on all vectors. ;; since the program typechecked, we know the arg is a vector. ;; we can optimize no matter what.