From 8dc23d43eb23eac7a887ae2f3ef3633c54d3ba87 Mon Sep 17 00:00:00 2001 From: Vincent St-Amour Date: Mon, 26 Jul 2010 16:12:46 -0400 Subject: [PATCH] Added unboxed letrec bindings. --- .../optimizer/generic/nested-unboxed-let.rkt | 7 ++++++ .../optimizer/generic/unboxed-letrec.rkt | 8 +++++++ .../hand-optimized/nested-unboxed-let.rkt | 23 +++++++++++++++++++ .../hand-optimized/unboxed-letrec.rkt | 20 ++++++++++++++++ .../non-optimized/nested-unboxed-let.rkt | 7 ++++++ .../non-optimized/unboxed-letrec.rkt | 8 +++++++ .../typed-scheme/optimizer/unboxed-let.rkt | 6 +++-- 7 files changed, 77 insertions(+), 2 deletions(-) create mode 100644 collects/tests/typed-scheme/optimizer/generic/nested-unboxed-let.rkt create mode 100644 collects/tests/typed-scheme/optimizer/generic/unboxed-letrec.rkt create mode 100644 collects/tests/typed-scheme/optimizer/hand-optimized/nested-unboxed-let.rkt create mode 100644 collects/tests/typed-scheme/optimizer/hand-optimized/unboxed-letrec.rkt create mode 100644 collects/tests/typed-scheme/optimizer/non-optimized/nested-unboxed-let.rkt create mode 100644 collects/tests/typed-scheme/optimizer/non-optimized/unboxed-letrec.rkt diff --git a/collects/tests/typed-scheme/optimizer/generic/nested-unboxed-let.rkt b/collects/tests/typed-scheme/optimizer/generic/nested-unboxed-let.rkt new file mode 100644 index 0000000000..c16bdebb38 --- /dev/null +++ b/collects/tests/typed-scheme/optimizer/generic/nested-unboxed-let.rkt @@ -0,0 +1,7 @@ +#lang typed/scheme #:optimize + +(require racket/unsafe/ops) + +(let ((x (+ 1.0+2.0i 2.0+3.0i))) + (let ((x (+ x 2.0+3.0i))) + (+ x 3.0+6.0i))) diff --git a/collects/tests/typed-scheme/optimizer/generic/unboxed-letrec.rkt b/collects/tests/typed-scheme/optimizer/generic/unboxed-letrec.rkt new file mode 100644 index 0000000000..aed81a45aa --- /dev/null +++ b/collects/tests/typed-scheme/optimizer/generic/unboxed-letrec.rkt @@ -0,0 +1,8 @@ +#lang typed/scheme #:optimize + +(require racket/unsafe/ops) + +(letrec ((#{f : (Any -> Any)} (lambda: ((x : Any)) (f x))) + (#{x : Inexact-Complex} 1.0+2.0i) + (#{y : Inexact-Complex} (+ 2.0+4.0i 3.0+6.0i))) + (+ x y)) diff --git a/collects/tests/typed-scheme/optimizer/hand-optimized/nested-unboxed-let.rkt b/collects/tests/typed-scheme/optimizer/hand-optimized/nested-unboxed-let.rkt new file mode 100644 index 0000000000..abb6b45bb0 --- /dev/null +++ b/collects/tests/typed-scheme/optimizer/hand-optimized/nested-unboxed-let.rkt @@ -0,0 +1,23 @@ +#lang typed/scheme #:optimize + +(require racket/unsafe/ops) + +(let* ((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+3.0i) + (unboxed-gensym-5 (unsafe-flreal-part unboxed-gensym-4)) + (unboxed-gensym-6 (unsafe-flimag-part unboxed-gensym-4)) + (unboxed-gensym-7 (unsafe-fl+ unboxed-gensym-2 unboxed-gensym-5)) + (unboxed-gensym-8 (unsafe-fl+ unboxed-gensym-3 unboxed-gensym-6))) + (let* ((unboxed-gensym-1 2.0+3.0i) + (unboxed-gensym-2 (unsafe-flreal-part unboxed-gensym-1)) + (unboxed-gensym-3 (unsafe-flimag-part unboxed-gensym-1)) + (unboxed-gensym-4 (unsafe-fl+ unboxed-gensym-7 unboxed-gensym-2)) + (unboxed-gensym-5 (unsafe-fl+ unboxed-gensym-8 unboxed-gensym-3)) + (unboxed-gensym-6 3.0+6.0i) + (unboxed-gensym-7 (unsafe-flreal-part unboxed-gensym-6)) + (unboxed-gensym-8 (unsafe-flimag-part unboxed-gensym-6)) + (unboxed-gensym-9 (unsafe-fl+ unboxed-gensym-4 unboxed-gensym-7)) + (unboxed-gensym-10 (unsafe-fl+ unboxed-gensym-5 unboxed-gensym-8))) + (unsafe-make-flrectangular unboxed-gensym-9 unboxed-gensym-10))) diff --git a/collects/tests/typed-scheme/optimizer/hand-optimized/unboxed-letrec.rkt b/collects/tests/typed-scheme/optimizer/hand-optimized/unboxed-letrec.rkt new file mode 100644 index 0000000000..3f130559db --- /dev/null +++ b/collects/tests/typed-scheme/optimizer/hand-optimized/unboxed-letrec.rkt @@ -0,0 +1,20 @@ +#lang racket + +(require racket/unsafe/ops) + +(letrec ((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+4.0i) + (unboxed-gensym-5 (unsafe-flreal-part unboxed-gensym-4)) + (unboxed-gensym-6 (unsafe-flimag-part unboxed-gensym-4)) + (unboxed-gensym-7 3.0+6.0i) + (unboxed-gensym-8 (unsafe-flreal-part unboxed-gensym-7)) + (unboxed-gensym-9 (unsafe-flimag-part unboxed-gensym-7)) + (unboxed-gensym-10 (unsafe-fl+ unboxed-gensym-5 unboxed-gensym-8)) + (unboxed-gensym-11 (unsafe-fl+ unboxed-gensym-6 unboxed-gensym-9)) + (f (lambda (x) (f x)))) + (let* ((unboxed-gensym-12 (unsafe-fl+ unboxed-gensym-2 unboxed-gensym-10)) + (unboxed-gensym-13 (unsafe-fl+ unboxed-gensym-3 unboxed-gensym-11))) + (unsafe-make-flrectangular unboxed-gensym-12 unboxed-gensym-13))) +(void) diff --git a/collects/tests/typed-scheme/optimizer/non-optimized/nested-unboxed-let.rkt b/collects/tests/typed-scheme/optimizer/non-optimized/nested-unboxed-let.rkt new file mode 100644 index 0000000000..ad913a3bed --- /dev/null +++ b/collects/tests/typed-scheme/optimizer/non-optimized/nested-unboxed-let.rkt @@ -0,0 +1,7 @@ +#lang typed/scheme + +(require racket/unsafe/ops) + +(let ((x (+ 1.0+2.0i 2.0+3.0i))) + (let ((x (+ x 2.0+3.0i))) + (+ x 3.0+6.0i))) diff --git a/collects/tests/typed-scheme/optimizer/non-optimized/unboxed-letrec.rkt b/collects/tests/typed-scheme/optimizer/non-optimized/unboxed-letrec.rkt new file mode 100644 index 0000000000..f3a82c188c --- /dev/null +++ b/collects/tests/typed-scheme/optimizer/non-optimized/unboxed-letrec.rkt @@ -0,0 +1,8 @@ +#lang typed/scheme + +(require racket/unsafe/ops) + +(letrec ((#{f : (Any -> Any)} (lambda: ((x : Any)) (f x))) + (#{x : Inexact-Complex} 1.0+2.0i) + (#{y : Inexact-Complex} (+ 2.0+4.0i 3.0+6.0i))) + (+ x y)) diff --git a/collects/typed-scheme/optimizer/unboxed-let.rkt b/collects/typed-scheme/optimizer/unboxed-let.rkt index 1f28db6371..ceb1c9751b 100644 --- a/collects/typed-scheme/optimizer/unboxed-let.rkt +++ b/collects/typed-scheme/optimizer/unboxed-let.rkt @@ -15,7 +15,8 @@ (define-syntax-class unboxed-let-opt-expr #:literal-sets (kernel-literals) - (pattern (~and exp (let-values (clause:expr ...) body:expr ...)) + (pattern (~and exp ((~and op (~or (~literal let-values) (~literal letrec-values))) + (clause:expr ...) body:expr ...)) ;; we look for bindings of complexes that are not mutated and only ;; used in positions where we would unbox them ;; these are candidates for unboxing @@ -40,7 +41,8 @@ (r (in-list (syntax->list #'(opt-candidates.real-binding ...)))) (i (in-list (syntax->list #'(opt-candidates.imag-binding ...))))) (dict-set! unboxed-vars-table v (list r i))) - #`(let* (opt-candidates.bindings ... ... opt-others.res ...) + #`(#,(if (free-identifier=? #'op #'let-values) #'let* #'letrec) + (opt-candidates.bindings ... ... opt-others.res ...) #,@(map (optimize) (syntax->list #'(body ...))))))) ;; if a variable is only used in complex arithmetic operations, it's safe