From aba046a92d42de70a2f777bfbe9a4e75f8e935a9 Mon Sep 17 00:00:00 2001 From: Vincent St-Amour Date: Sat, 4 Aug 2012 09:45:34 -0400 Subject: [PATCH] Swap unsafe and chaperone-unsafe vector ops in the TR optimizer. Closes PR12969. --- .../optimizer/tests/vector-chaperone1.rkt | 7 +++++++ .../optimizer/tests/vector-chaperone2.rkt | 13 +++++++++++++ collects/typed-racket/optimizer/vector.rkt | 6 +++--- 3 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 collects/tests/typed-racket/optimizer/tests/vector-chaperone1.rkt create mode 100644 collects/tests/typed-racket/optimizer/tests/vector-chaperone2.rkt diff --git a/collects/tests/typed-racket/optimizer/tests/vector-chaperone1.rkt b/collects/tests/typed-racket/optimizer/tests/vector-chaperone1.rkt new file mode 100644 index 0000000000..06f98d8bc3 --- /dev/null +++ b/collects/tests/typed-racket/optimizer/tests/vector-chaperone1.rkt @@ -0,0 +1,7 @@ +#; +( +) +#lang racket + +(define v (vector 'b 'a)) +(provide v) diff --git a/collects/tests/typed-racket/optimizer/tests/vector-chaperone2.rkt b/collects/tests/typed-racket/optimizer/tests/vector-chaperone2.rkt new file mode 100644 index 0000000000..dbc931347c --- /dev/null +++ b/collects/tests/typed-racket/optimizer/tests/vector-chaperone2.rkt @@ -0,0 +1,13 @@ +#; +( +TR opt: vector-chaperone2.rkt 12:10 (vector-ref v i) -- vector partial bounds checking elimination +'b +) +#lang typed/racket +(require/typed "vector-chaperone1.rkt" + (v (Vectorof Symbol))) +(: i Fixnum) +(define i 0) +(: x Symbol) +(define x (vector-ref v i)) +x diff --git a/collects/typed-racket/optimizer/vector.rkt b/collects/typed-racket/optimizer/vector.rkt index cd048278f2..ca191ced1b 100644 --- a/collects/typed-racket/optimizer/vector.rkt +++ b/collects/typed-racket/optimizer/vector.rkt @@ -14,7 +14,7 @@ (define-syntax-class vector-op #:commit - ;; we need the * versions of these unsafe operations to be chaperone-safe + ;; we need the non-* versions of these unsafe operations to be chaperone-safe (pattern (~literal vector-ref) #:with unsafe #'unsafe-vector-ref #:with unsafe-no-impersonator #'unsafe-vector*-ref) (pattern (~literal vector-set!) #:with unsafe #'unsafe-vector-set! #:with unsafe-no-impersonator #'unsafe-vector*-set!)) (define-syntax-class flvector-op @@ -95,7 +95,7 @@ one-sided #`(and (unsafe-fx>= new-i 0) #,one-sided))) - (op.unsafe-no-impersonator 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 ;; not an impersonator, can use unsafe-vector* ops (if #,(let ([one-sided #'(unsafe-fx< new-i (unsafe-vector-length v))]) @@ -103,7 +103,7 @@ one-sided #`(and (unsafe-fx>= new-i 0) #,one-sided))) - (op.unsafe new-v new-i #,@(syntax-map (optimize) #'(new ...))) + (op.unsafe-no-impersonator new-v new-i #,@(syntax-map (optimize) #'(new ...))) #,safe-fallback)))))) ;; similarly for flvectors (pattern (#%plain-app op:flvector-op v:expr i:fixnum-expr new:expr ...)