diff --git a/collects/tests/typed-scheme/optimizer/generic/float-promotion.rkt b/collects/tests/typed-scheme/optimizer/generic/float-promotion.rkt index 1fc32fa9..09d106f4 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 3f99e881..796242a9 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 00000000..6d6d6b8a --- /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/typed-scheme/optimizer/float.rkt b/collects/typed-scheme/optimizer/float.rkt index 17917d44..334b3600 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