From bdf84f371d4ccf952e08251703a4249c37f81a85 Mon Sep 17 00:00:00 2001 From: Vincent St-Amour Date: Tue, 3 Aug 2010 16:55:03 -0400 Subject: [PATCH] Optimize coercion of integer literals. --- .../typed-scheme/optimizer/generic/float-promotion.rkt | 2 +- .../optimizer/generic/inexact-complex-fixnum.rkt | 2 +- .../tests/typed-scheme/optimizer/generic/literal-int.rkt | 6 ++++++ .../optimizer/hand-optimized/float-promotion.rkt | 2 +- .../optimizer/hand-optimized/inexact-complex-fixnum.rkt | 2 +- .../typed-scheme/optimizer/hand-optimized/literal-int.rkt | 7 +++++++ .../optimizer/non-optimized/float-promotion.rkt | 2 +- .../optimizer/non-optimized/inexact-complex-fixnum.rkt | 2 +- .../typed-scheme/optimizer/non-optimized/literal-int.rkt | 6 ++++++ collects/typed-scheme/optimizer/float.rkt | 7 ++++++- 10 files changed, 31 insertions(+), 7 deletions(-) create mode 100644 collects/tests/typed-scheme/optimizer/generic/literal-int.rkt create mode 100644 collects/tests/typed-scheme/optimizer/hand-optimized/literal-int.rkt create mode 100644 collects/tests/typed-scheme/optimizer/non-optimized/literal-int.rkt diff --git a/collects/tests/typed-scheme/optimizer/generic/float-promotion.rkt b/collects/tests/typed-scheme/optimizer/generic/float-promotion.rkt index 1fc32fa94c..09d106f41b 100644 --- a/collects/tests/typed-scheme/optimizer/generic/float-promotion.rkt +++ b/collects/tests/typed-scheme/optimizer/generic/float-promotion.rkt @@ -1,4 +1,4 @@ (module float-promotion typed/scheme #:optimize (require racket/unsafe/ops racket/flonum) - (+ 1 2.0) + (+ (quotient 1 1) 2.0) (+ (expt 100 100) 2.0)) diff --git a/collects/tests/typed-scheme/optimizer/generic/inexact-complex-fixnum.rkt b/collects/tests/typed-scheme/optimizer/generic/inexact-complex-fixnum.rkt index 3f99e88165..796242a912 100644 --- a/collects/tests/typed-scheme/optimizer/generic/inexact-complex-fixnum.rkt +++ b/collects/tests/typed-scheme/optimizer/generic/inexact-complex-fixnum.rkt @@ -1,3 +1,3 @@ #lang typed/scheme #:optimize (require racket/unsafe/ops) -(+ 2 1.0+2.0i 3.0+6.0i) +(+ (quotient 2 1) 1.0+2.0i 3.0+6.0i) diff --git a/collects/tests/typed-scheme/optimizer/generic/literal-int.rkt b/collects/tests/typed-scheme/optimizer/generic/literal-int.rkt new file mode 100644 index 0000000000..6d6d6b8a5f --- /dev/null +++ b/collects/tests/typed-scheme/optimizer/generic/literal-int.rkt @@ -0,0 +1,6 @@ +#lang typed/scheme #:optimize + +(require racket/unsafe/ops) + +(+ 1 2.0) +1 diff --git a/collects/tests/typed-scheme/optimizer/hand-optimized/float-promotion.rkt b/collects/tests/typed-scheme/optimizer/hand-optimized/float-promotion.rkt index e00890c47c..9577549259 100644 --- a/collects/tests/typed-scheme/optimizer/hand-optimized/float-promotion.rkt +++ b/collects/tests/typed-scheme/optimizer/hand-optimized/float-promotion.rkt @@ -1,4 +1,4 @@ (module float-promotion typed/scheme #:optimize (require racket/unsafe/ops racket/flonum) - (unsafe-fl+ (unsafe-fx->fl 1) 2.0) + (unsafe-fl+ (unsafe-fx->fl (quotient 1 1)) 2.0) (unsafe-fl+ (->fl (expt 100 100)) 2.0)) diff --git a/collects/tests/typed-scheme/optimizer/hand-optimized/inexact-complex-fixnum.rkt b/collects/tests/typed-scheme/optimizer/hand-optimized/inexact-complex-fixnum.rkt index 655a1d2500..fffff67767 100644 --- a/collects/tests/typed-scheme/optimizer/hand-optimized/inexact-complex-fixnum.rkt +++ b/collects/tests/typed-scheme/optimizer/hand-optimized/inexact-complex-fixnum.rkt @@ -1,6 +1,6 @@ #lang typed/scheme (require racket/unsafe/ops) -(let* ((unboxed-gensym-1 (unsafe-fx->fl 2)) +(let* ((unboxed-gensym-1 (unsafe-fx->fl (unsafe-fxquotient 2 1))) (unboxed-gensym-2 1.0+2.0i) (unboxed-gensym-3 (unsafe-flreal-part unboxed-gensym-2)) (unboxed-gensym-4 (unsafe-flimag-part unboxed-gensym-2)) diff --git a/collects/tests/typed-scheme/optimizer/hand-optimized/literal-int.rkt b/collects/tests/typed-scheme/optimizer/hand-optimized/literal-int.rkt new file mode 100644 index 0000000000..7c83eb758a --- /dev/null +++ b/collects/tests/typed-scheme/optimizer/hand-optimized/literal-int.rkt @@ -0,0 +1,7 @@ +#lang racket + +(require racket/unsafe/ops) + +(unsafe-fl+ 1.0 2.0) +1 +(void) diff --git a/collects/tests/typed-scheme/optimizer/non-optimized/float-promotion.rkt b/collects/tests/typed-scheme/optimizer/non-optimized/float-promotion.rkt index 25d69bac3a..76ac18bf81 100644 --- a/collects/tests/typed-scheme/optimizer/non-optimized/float-promotion.rkt +++ b/collects/tests/typed-scheme/optimizer/non-optimized/float-promotion.rkt @@ -1,4 +1,4 @@ (module float-promotion typed/scheme (require racket/unsafe/ops racket/flonum) - (+ 1 2.0) + (+ (quotient 1 1) 2.0) (+ (expt 100 100) 2.0)) diff --git a/collects/tests/typed-scheme/optimizer/non-optimized/inexact-complex-fixnum.rkt b/collects/tests/typed-scheme/optimizer/non-optimized/inexact-complex-fixnum.rkt index ffc9f04a0a..051ed12280 100644 --- a/collects/tests/typed-scheme/optimizer/non-optimized/inexact-complex-fixnum.rkt +++ b/collects/tests/typed-scheme/optimizer/non-optimized/inexact-complex-fixnum.rkt @@ -1,3 +1,3 @@ #lang typed/scheme (require racket/unsafe/ops) -(+ 2 1.0+2.0i 3.0+6.0i) +(+ (quotient 2 1) 1.0+2.0i 3.0+6.0i) diff --git a/collects/tests/typed-scheme/optimizer/non-optimized/literal-int.rkt b/collects/tests/typed-scheme/optimizer/non-optimized/literal-int.rkt new file mode 100644 index 0000000000..6f93f3b72e --- /dev/null +++ b/collects/tests/typed-scheme/optimizer/non-optimized/literal-int.rkt @@ -0,0 +1,6 @@ +#lang typed/scheme + +(require racket/unsafe/ops) + +(+ 1 2.0) +1 diff --git a/collects/typed-scheme/optimizer/float.rkt b/collects/typed-scheme/optimizer/float.rkt index 17917d4424..334b36001d 100644 --- a/collects/typed-scheme/optimizer/float.rkt +++ b/collects/typed-scheme/optimizer/float.rkt @@ -1,7 +1,7 @@ #lang scheme/base (require syntax/parse - syntax/id-table racket/dict + syntax/id-table racket/dict scheme/flonum (for-template scheme/base scheme/flonum scheme/unsafe/ops) "../utils/utils.rkt" (types abbrev type-table utils subtype) @@ -59,6 +59,11 @@ ;; note: none of the unary operations have types where non-float arguments ;; can result in float (as opposed to real) results (define-syntax-class float-arg-expr + ;; we can convert literals right away + (pattern (quote n) + #:when (exact-integer? (syntax->datum #'n)) + #:with opt + (datum->syntax #'here (->fl (syntax->datum #'n)))) (pattern e:fixnum-expr #:with opt #'(unsafe-fx->fl e.opt)) (pattern e:int-expr