From 592aa2ac8ced6cb768036b08ca408928bbe10a9e Mon Sep 17 00:00:00 2001 From: Vincent St-Amour Date: Tue, 6 Jul 2010 14:28:40 -0400 Subject: [PATCH] Added an optimization for vector-length of known-length vectors. original commit: e52d63ee686e20401f0b0df80d178e40e9a0226f --- .../optimizer/generic/known-vector-length.rkt | 3 +++ collects/typed-scheme/private/optimize.rkt | 10 ++++++++++ 2 files changed, 13 insertions(+) create mode 100644 collects/tests/typed-scheme/optimizer/generic/known-vector-length.rkt 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 00000000..083d8730 --- /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/typed-scheme/private/optimize.rkt b/collects/typed-scheme/private/optimize.rkt index 670cd8ae..0cd2c8ae 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.