Add more optimizations for projections.
original commit: 262fad814afc33dbac8e927409dca225faf00686
This commit is contained in:
parent
758a055b0b
commit
a8e01d8707
|
@ -34,7 +34,6 @@
|
|||
(define unary-float-ops
|
||||
(dict-set*
|
||||
unary-float-math-ops
|
||||
#'real-part #'#%expression
|
||||
#'flreal-part #'#%expression
|
||||
#'unsafe-flreal-part #'#%experession))
|
||||
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
Loading…
Reference in New Issue
Block a user