diff --git a/collects/tests/typed-scheme/optimizer/missed-optimizations/unary-float.rkt b/collects/tests/typed-scheme/optimizer/missed-optimizations/unary-float.rkt new file mode 100644 index 0000000000..3ad437d2fe --- /dev/null +++ b/collects/tests/typed-scheme/optimizer/missed-optimizations/unary-float.rkt @@ -0,0 +1,18 @@ +#; +( +unary-float.rkt 14:0 (#%app sin (quote 3.4)) -- unary, arg float-arg-expr, return type not Float +unary-float.rkt 15:0 (#%app sin (quote 3)) -- unary, arg float-arg-expr, return type not Float +unary-float.rkt 16:0 (#%app abs (quote 3.4)) -- unary, arg float-arg-expr, return type not Float +-0.2555411020268312 +0.1411200080598672 +3.4 +3 +) + +#lang typed/racket + +(sin (ann 3.4 Real)) +(sin 3) +(abs (ann 3.4 Real)) +(abs (ann 3 Integer)) ; stays within Integer, should not be reported + diff --git a/collects/tests/typed-scheme/optimizer/tests/float-complex-sin.rkt b/collects/tests/typed-scheme/optimizer/tests/float-complex-sin.rkt index f63b79db16..fb4222ebb6 100644 --- a/collects/tests/typed-scheme/optimizer/tests/float-complex-sin.rkt +++ b/collects/tests/typed-scheme/optimizer/tests/float-complex-sin.rkt @@ -1,10 +1,11 @@ #; ( -float-complex-sin.rkt 15:10 (#%app + (#%app sin (#%app * t (quote 6.28))) (quote 0.0+0.0i)) -- unboxed float complex -float-complex-sin.rkt 15:11 + -- unboxed binary float complex -float-complex-sin.rkt 15:13 (#%app sin (#%app * t (quote 6.28))) -- float-coerce-expr in complex ops -float-complex-sin.rkt 15:18 (#%app * t (quote 6.28)) -- binary, args all float-arg-expr, return type not Float -- caused by: 15:21 t -float-complex-sin.rkt 15:30 0.0+0.0i -- unboxed literal +float-complex-sin.rkt 16:10 (#%app + (#%app sin (#%app * t (quote 6.28))) (quote 0.0+0.0i)) -- unboxed float complex +float-complex-sin.rkt 16:11 + -- unboxed binary float complex +float-complex-sin.rkt 16:13 (#%app sin (#%app * t (quote 6.28))) -- float-coerce-expr in complex ops +float-complex-sin.rkt 16:13 (#%app sin (#%app * t (quote 6.28))) -- unary, arg float-arg-expr, return type not Float +float-complex-sin.rkt 16:18 (#%app * t (quote 6.28)) -- binary, args all float-arg-expr, return type not Float -- caused by: 16:21 t +float-complex-sin.rkt 16:30 0.0+0.0i -- unboxed literal -0.0031853017931379904+0.0i ) diff --git a/collects/typed-scheme/optimizer/float.rkt b/collects/typed-scheme/optimizer/float.rkt index 6944820046..79c5419eeb 100644 --- a/collects/typed-scheme/optimizer/float.rkt +++ b/collects/typed-scheme/optimizer/float.rkt @@ -77,7 +77,13 @@ (define-syntax-class float-opt-expr #:commit (pattern (#%plain-app (~var op (float-op unary-float-ops)) f:float-arg-expr) - #:when (subtypeof? this-syntax -Flonum) + #:when (let* ([safe-to-opt? (subtypeof? this-syntax -Flonum)] + [missed-optimization? (and (not safe-to-opt?) + (in-real-layer? this-syntax))]) + (when missed-optimization? + (log-missed-optimization "unary, arg float-arg-expr, return type not Float" + this-syntax)) + safe-to-opt?) #:with opt (begin (log-optimization "unary float" #'op) #'(op.unsafe f.opt)))