From fb31a6556e04d9aa6aa31c215394a80b9d146bd7 Mon Sep 17 00:00:00 2001 From: Vincent St-Amour Date: Tue, 3 Aug 2010 15:31:38 -0400 Subject: [PATCH] Added optimization for make-polar --- .../optimizer/generic/invalid-make-polar.rkt | 3 ++ .../optimizer/generic/make-polar.rkt | 9 ++++++ .../hand-optimized/invalid-make-polar.rkt | 4 +++ .../optimizer/hand-optimized/make-polar.rkt | 28 +++++++++++++++++++ .../non-optimized/invalid-make-polar.rkt | 3 ++ .../optimizer/non-optimized/make-polar.rkt | 9 ++++++ .../optimizer/inexact-complex.rkt | 24 +++++++++++++++- 7 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 collects/tests/typed-scheme/optimizer/generic/invalid-make-polar.rkt create mode 100644 collects/tests/typed-scheme/optimizer/generic/make-polar.rkt create mode 100644 collects/tests/typed-scheme/optimizer/hand-optimized/invalid-make-polar.rkt create mode 100644 collects/tests/typed-scheme/optimizer/hand-optimized/make-polar.rkt create mode 100644 collects/tests/typed-scheme/optimizer/non-optimized/invalid-make-polar.rkt create mode 100644 collects/tests/typed-scheme/optimizer/non-optimized/make-polar.rkt diff --git a/collects/tests/typed-scheme/optimizer/generic/invalid-make-polar.rkt b/collects/tests/typed-scheme/optimizer/generic/invalid-make-polar.rkt new file mode 100644 index 0000000000..f6a646b6df --- /dev/null +++ b/collects/tests/typed-scheme/optimizer/generic/invalid-make-polar.rkt @@ -0,0 +1,3 @@ +#lang typed/scheme #:optimize + +(make-polar 0 0) diff --git a/collects/tests/typed-scheme/optimizer/generic/make-polar.rkt b/collects/tests/typed-scheme/optimizer/generic/make-polar.rkt new file mode 100644 index 0000000000..137f0b17da --- /dev/null +++ b/collects/tests/typed-scheme/optimizer/generic/make-polar.rkt @@ -0,0 +1,9 @@ +#lang typed/scheme #:optimize + +(require racket/unsafe/ops) + +;; top level +(make-polar 1.0 1.0) + +;; nested +(+ 1.0+2.0i (make-polar 2.0 4.0)) diff --git a/collects/tests/typed-scheme/optimizer/hand-optimized/invalid-make-polar.rkt b/collects/tests/typed-scheme/optimizer/hand-optimized/invalid-make-polar.rkt new file mode 100644 index 0000000000..ed82cb7cdb --- /dev/null +++ b/collects/tests/typed-scheme/optimizer/hand-optimized/invalid-make-polar.rkt @@ -0,0 +1,4 @@ +#lang racket + +(make-polar 0 0) +(void) diff --git a/collects/tests/typed-scheme/optimizer/hand-optimized/make-polar.rkt b/collects/tests/typed-scheme/optimizer/hand-optimized/make-polar.rkt new file mode 100644 index 0000000000..f3f021e069 --- /dev/null +++ b/collects/tests/typed-scheme/optimizer/hand-optimized/make-polar.rkt @@ -0,0 +1,28 @@ +#lang racket + +(require racket/unsafe/ops) + +;; top level +(let*-values (((unboxed-gensym-1) 1.0) + ((unboxed-gensym-2) 1.0) + ((unboxed-gensym-3) (unsafe-fl* unboxed-gensym-1 + (unsafe-flcos unboxed-gensym-2))) + ((unboxed-gensym-4) (unsafe-fl* unboxed-gensym-1 + (unsafe-flsin unboxed-gensym-2)))) + (unsafe-make-flrectangular unboxed-gensym-3 unboxed-gensym-4)) + +;; nested +(let*-values (((unboxed-gensym-1) 1.0+2.0i) + ((unboxed-gensym-2) (unsafe-flreal-part unboxed-gensym-1)) + ((unboxed-gensym-3) (unsafe-flimag-part unboxed-gensym-1)) + ((unboxed-gensym-4) 2.0) + ((unboxed-gensym-5) 4.0) + ((unboxed-gensym-6) (unsafe-fl* unboxed-gensym-4 + (unsafe-flcos unboxed-gensym-5))) + ((unboxed-gensym-7) (unsafe-fl* unboxed-gensym-4 + (unsafe-flsin unboxed-gensym-5))) + ((unboxed-gensym-8) (unsafe-fl+ unboxed-gensym-2 unboxed-gensym-6)) + ((unboxed-gensym-9) (unsafe-fl+ unboxed-gensym-3 unboxed-gensym-7))) + (unsafe-make-flrectangular unboxed-gensym-8 unboxed-gensym-9)) + +(void) diff --git a/collects/tests/typed-scheme/optimizer/non-optimized/invalid-make-polar.rkt b/collects/tests/typed-scheme/optimizer/non-optimized/invalid-make-polar.rkt new file mode 100644 index 0000000000..2f12c8ec0e --- /dev/null +++ b/collects/tests/typed-scheme/optimizer/non-optimized/invalid-make-polar.rkt @@ -0,0 +1,3 @@ +#lang typed/scheme + +(make-polar 0 0) diff --git a/collects/tests/typed-scheme/optimizer/non-optimized/make-polar.rkt b/collects/tests/typed-scheme/optimizer/non-optimized/make-polar.rkt new file mode 100644 index 0000000000..4c26b974c5 --- /dev/null +++ b/collects/tests/typed-scheme/optimizer/non-optimized/make-polar.rkt @@ -0,0 +1,9 @@ +#lang typed/scheme + +(require racket/unsafe/ops) + +;; top level +(make-polar 1.0 1.0) + +;; nested +(+ 1.0+2.0i (make-polar 2.0 4.0)) diff --git a/collects/typed-scheme/optimizer/inexact-complex.rkt b/collects/typed-scheme/optimizer/inexact-complex.rkt index d18ac9f0b1..5fed84154d 100644 --- a/collects/typed-scheme/optimizer/inexact-complex.rkt +++ b/collects/typed-scheme/optimizer/inexact-complex.rkt @@ -232,8 +232,20 @@ #:with imag-binding (unboxed-gensym) #:with (bindings ...) (begin (log-optimization "make-rectangular elimination" #'op) - #`(((real-binding) real.opt) + #'(((real-binding) real.opt) ((imag-binding) imag.opt)))) + (pattern (#%plain-app (~and op (~literal make-polar)) + r:float-coerce-expr theta:float-coerce-expr) + #:with magnitude (unboxed-gensym) + #:with angle (unboxed-gensym) + #:with real-binding (unboxed-gensym) + #:with imag-binding (unboxed-gensym) + #:with (bindings ...) + (begin (log-optimization "make-rectangular elimination" #'op) + #'(((magnitude) r.opt) + ((angle) theta.opt) + ((real-binding) (unsafe-fl* magnitude (unsafe-flcos angle))) + ((imag-binding) (unsafe-fl* magnitude (unsafe-flsin angle)))))) ;; if we see a variable that's already unboxed, use the unboxed bindings (pattern v:id @@ -308,6 +320,16 @@ (begin (log-optimization "unary inexact complex" #'op) #'(op.unsafe n.opt))) + (pattern (~and exp (#%plain-app (~and op (~literal make-polar)) r theta)) + #:when (isoftype? #'exp -InexactComplex) + #:with exp*:unboxed-inexact-complex-opt-expr #'exp + #:with opt + (begin (log-optimization "make-polar" #'op) + (reset-unboxed-gensym) + #'(let*-values (exp*.bindings ...) + (unsafe-make-flrectangular exp*.real-binding + exp*.imag-binding)))) + (pattern (~and e (#%plain-app op:id args:expr ...)) #:with unboxed-info (dict-ref unboxed-funs-table #'op #f) #:when (syntax->datum #'unboxed-info)