Add more optimizations for projections.

original commit: 262fad814afc33dbac8e927409dca225faf00686
This commit is contained in:
Eric Dobson 2014-02-22 13:08:09 -08:00
parent 758a055b0b
commit a8e01d8707
6 changed files with 105 additions and 11 deletions

View File

@ -34,7 +34,6 @@
(define unary-float-ops
(dict-set*
unary-float-math-ops
#'real-part #'#%expression
#'flreal-part #'#%expression
#'unsafe-flreal-part #'#%experession))

View File

@ -1,18 +1,48 @@
#lang racket/base
(require syntax/parse
syntax/parse/experimental/specialize
(for-template racket/base)
"../utils/utils.rkt"
(utils tc-utils)
(types numeric-tower union)
(optimizer utils logging))
(provide number-opt-expr)
(define-literal-syntax-class unary-op (+ * min max))
(define-literal-syntax-class real-part)
(define-literal-syntax-class imag-part)
(define-literal-syntax-class abs)
(define-literal-syntax-class magnitude)
(define-literal-syntax-class angle)
(define-syntax-class/specialize real-expr
(subtyped-expr -Real))
;; We don't want -0.0 here
(define-syntax-class/specialize non-neg-real-expr
(subtyped-expr (Un -PosReal -Zero -InexactRealPosZero)))
(define-syntax-class number-opt-expr
#:commit
;; these cases are all identity
(pattern (#%plain-app op:unary-op f:opt-expr)
#:do [(log-opt "unary number" "Identity elimination.")]
#:with opt #'f.opt))
#:with opt #'f.opt)
(pattern (#%plain-app op:real-part^ f:real-expr)
#:do [(log-opt "unary number" "Projection elimination.")]
#:with opt #'f.opt)
(pattern (#%plain-app op:imag-part^ f:real-expr)
#:do [(log-opt "unary number" "Projection elimination.")]
#:with opt #'0)
(pattern (#%plain-app (~or op:abs^ op:magnitude^) f:non-neg-real-expr)
#:do [(log-opt "unary number" "Projection elimination.")]
#:with opt #'f.opt)
(pattern (#%plain-app op:angle^ f:non-neg-real-expr)
#:do [(log-opt "unary number" "Projection elimination.")]
#:with opt #'0))

View File

@ -20,7 +20,7 @@ TR opt: fixnum.rkt 15:17 (+ 301 302) -- fixnum bounded expr
TR opt: fixnum.rkt 15:5 (+ 300 301) -- fixnum bounded expr
TR opt: fixnum.rkt 28:0 (add1 min-fixnum) -- fixnum add1
TR opt: fixnum.rkt 30:0 (- max-fixnum) -- unary fixnum
TR opt: fixnum.rkt 31:0 (abs max-fixnum) -- fixnum fxabs
TR opt: fixnum.rkt 31:0 (abs max-fixnum) -- unary number
TR opt: fixnum.rkt 32:0 (sub1 max-fixnum) -- fixnum sub1
TR opt: fixnum.rkt 35:0 (= (- max-fixnum max-fixnum) 0) -- binary fixnum comp
TR opt: fixnum.rkt 35:3 (- max-fixnum max-fixnum) -- fixnum bounded expr

View File

@ -9,7 +9,7 @@ TR opt: fixnum-bounded-expr.rkt 12:2 (- x (* y y)) -- fixnum bounded expr
TR opt: fixnum-bounded-expr.rkt 12:7 (* y y) -- fixnum bounded expr
TR opt: fixnum-bounded-expr.rkt 19:2 (+ x y) -- fixnum bounded expr
TR opt: fixnum-bounded-expr.rkt 22:2 (+ x y) -- fixnum bounded expr
TR opt: fixnum-bounded-expr.rkt 27:0 (abs 45) -- fixnum fxabs
TR opt: fixnum-bounded-expr.rkt 27:0 (abs 45) -- unary number
TR opt: fixnum-bounded-expr.rkt 30:0 (fx+ 5 2) -- fixnum fx+
TR opt: fixnum-bounded-expr.rkt 31:0 (fx+ (+ 34 231) (* 24 25)) -- fixnum fx+
TR opt: fixnum-bounded-expr.rkt 31:16 (* 24 25) -- fixnum bounded expr

View File

@ -2,24 +2,47 @@
#<<END
TR missed opt: pr13468.rkt 5:5 (/ (ann 0.0+0.0i Float-Complex) (ann 1 Number)) -- Float-Complex division, potential exact 0s on the rhss -- caused by: 5:42 1
TR missed opt: pr13468.rkt 8:5 (expt (ann -5.0 Flonum) (ann 2.0 Flonum)) -- unexpected complex type
TR opt: pr13468.rkt 12:5 (magnitude (ann 0 Zero)) -- unary number
TR opt: pr13468.rkt 13:5 (magnitude (ann 1 One)) -- unary number
TR opt: pr13468.rkt 14:5 (magnitude (ann 6 Byte)) -- unary number
TR opt: pr13468.rkt 15:5 (magnitude (ann 6 Index)) -- unary number
TR opt: pr13468.rkt 17:5 (magnitude (ann 6 Positive-Fixnum)) -- unary number
TR opt: pr13468.rkt 18:5 (magnitude (ann 6 Nonnegative-Fixnum)) -- unary number
TR opt: pr13468.rkt 23:5 (magnitude (ann 6 Positive-Integer)) -- unary number
TR opt: pr13468.rkt 24:5 (magnitude (ann 6 Nonnegative-Integer)) -- unary number
TR opt: pr13468.rkt 29:5 (magnitude (ann 0.0 Flonum-Zero)) -- unary float
TR opt: pr13468.rkt 30:5 (magnitude (ann 6.0 Positive-Flonum)) -- unary float
TR opt: pr13468.rkt 30:5 (magnitude (ann 6.0 Positive-Flonum)) -- unary number
TR opt: pr13468.rkt 31:5 (magnitude (ann 6.0 Nonnegative-Flonum)) -- unary float
TR opt: pr13468.rkt 32:5 (magnitude (ann -6.0 Nonpositive-Flonum)) -- unary float
TR opt: pr13468.rkt 33:5 (magnitude (ann -6.0 Negative-Flonum)) -- unary float
TR opt: pr13468.rkt 34:5 (magnitude (ann 6.0 Flonum)) -- unary float
TR opt: pr13468.rkt 38:5 (real-part (ann 0 Zero)) -- unary number
TR opt: pr13468.rkt 39:5 (real-part (ann 1 One)) -- unary number
TR opt: pr13468.rkt 3:13 6.0+2.3i -- unboxed literal
TR opt: pr13468.rkt 3:13 6.0+2.3i -- unboxed literal
TR opt: pr13468.rkt 3:5 (- (ann 6.0+2.3i Float-Complex)) -- unboxed unary float complex
TR opt: pr13468.rkt 40:5 (real-part (ann 6 Byte)) -- unary number
TR opt: pr13468.rkt 41:5 (real-part (ann 6 Index)) -- unary number
TR opt: pr13468.rkt 43:5 (real-part (ann 6 Positive-Fixnum)) -- unary number
TR opt: pr13468.rkt 44:5 (real-part (ann 6 Nonnegative-Fixnum)) -- unary number
TR opt: pr13468.rkt 45:5 (real-part (ann -6 Nonpositive-Fixnum)) -- unary number
TR opt: pr13468.rkt 46:5 (real-part (ann -6 Negative-Fixnum)) -- unary number
TR opt: pr13468.rkt 47:5 (real-part (ann 6 Fixnum)) -- unary number
TR opt: pr13468.rkt 49:5 (real-part (ann 6 Positive-Integer)) -- unary number
TR opt: pr13468.rkt 4:13 6.0+2.3i -- unboxed literal
TR opt: pr13468.rkt 4:13 6.0+2.3i -- unboxed literal
TR opt: pr13468.rkt 4:5 (/ (ann 6.0+2.3i Float-Complex)) -- unboxed unary float complex
TR opt: pr13468.rkt 55:5 (real-part (ann 0.0 Flonum-Zero)) -- unary float
TR opt: pr13468.rkt 56:5 (real-part (ann 6.0 Positive-Flonum)) -- unary float
TR opt: pr13468.rkt 57:5 (real-part (ann 6.0 Nonnegative-Flonum)) -- unary float
TR opt: pr13468.rkt 58:5 (real-part (ann -6.0 Nonpositive-Flonum)) -- unary float
TR opt: pr13468.rkt 59:5 (real-part (ann -6.0 Negative-Flonum)) -- unary float
TR opt: pr13468.rkt 60:5 (real-part (ann 6.0 Flonum)) -- unary float
TR opt: pr13468.rkt 50:5 (real-part (ann 6 Nonnegative-Integer)) -- unary number
TR opt: pr13468.rkt 51:5 (real-part (ann -6 Nonpositive-Integer)) -- unary number
TR opt: pr13468.rkt 52:5 (real-part (ann -6 Negative-Integer)) -- unary number
TR opt: pr13468.rkt 53:5 (real-part (ann 6 Integer)) -- unary number
TR opt: pr13468.rkt 55:5 (real-part (ann 0.0 Flonum-Zero)) -- unary number
TR opt: pr13468.rkt 56:5 (real-part (ann 6.0 Positive-Flonum)) -- unary number
TR opt: pr13468.rkt 57:5 (real-part (ann 6.0 Nonnegative-Flonum)) -- unary number
TR opt: pr13468.rkt 58:5 (real-part (ann -6.0 Nonpositive-Flonum)) -- unary number
TR opt: pr13468.rkt 59:5 (real-part (ann -6.0 Negative-Flonum)) -- unary number
TR opt: pr13468.rkt 60:5 (real-part (ann 6.0 Flonum)) -- unary number
TR opt: pr13468.rkt 64:5 (imag-part (ann 5.6 Real)) -- unary number
END
#<<END
-6.0-2.3i

View File

@ -0,0 +1,42 @@
#;#;
#<<END
TR opt: projections.rkt 10:0 (abs -0.0) -- unary float
TR opt: projections.rkt 11:0 (magnitude -0.0) -- unary float
TR opt: projections.rkt 2:0 (real-part 1) -- unary number
TR opt: projections.rkt 3:0 (imag-part 2) -- unary number
TR opt: projections.rkt 4:0 (abs 3) -- unary number
TR opt: projections.rkt 5:0 (magnitude 4) -- unary number
TR opt: projections.rkt 6:0 (angle 5) -- unary number
TR opt: projections.rkt 7:0 (abs 0.0) -- unary number
TR opt: projections.rkt 8:0 (magnitude 0.0) -- unary number
TR opt: projections.rkt 9:0 (angle 0.0) -- unary number
END
#<<END
1
0
3
4
0
0.0
0.0
0
0.0
0.0
3.141592653589793
END
#lang typed/racket
#reader tests/typed-racket/optimizer/reset-port
(real-part 1)
(imag-part 2)
(abs 3)
(magnitude 4)
(angle 5)
(abs 0.0)
(magnitude 0.0)
(angle 0.0)
(abs -0.0)
(magnitude -0.0)
(angle -0.0)