diff --git a/collects/tests/typed-racket/optimizer/tests/dead-inf-comp.rkt b/collects/tests/typed-racket/optimizer/tests/dead-inf-comp.rkt new file mode 100644 index 00000000..34654f42 --- /dev/null +++ b/collects/tests/typed-racket/optimizer/tests/dead-inf-comp.rkt @@ -0,0 +1,209 @@ +#; +( +TR opt: dead-inf-comp.rkt 105:4 (quote dead) -- dead else branch +TR opt: dead-inf-comp.rkt 107:4 (quote dead) -- dead then branch +TR opt: dead-inf-comp.rkt 110:4 (quote dead) -- dead then branch +TR opt: dead-inf-comp.rkt 114:4 (quote dead) -- dead else branch +TR opt: dead-inf-comp.rkt 118:4 (quote dead) -- dead else branch +TR opt: dead-inf-comp.rkt 120:4 (quote dead) -- dead then branch +TR opt: dead-inf-comp.rkt 123:4 (quote dead) -- dead then branch +TR opt: dead-inf-comp.rkt 127:4 (quote dead) -- dead else branch +TR opt: dead-inf-comp.rkt 131:4 (quote dead) -- dead else branch +TR opt: dead-inf-comp.rkt 133:4 (quote dead) -- dead then branch +TR opt: dead-inf-comp.rkt 136:4 (quote dead) -- dead then branch +TR opt: dead-inf-comp.rkt 140:4 (quote dead) -- dead else branch +TR opt: dead-inf-comp.rkt 144:4 (quote dead) -- dead else branch +TR opt: dead-inf-comp.rkt 146:4 (quote dead) -- dead then branch +TR opt: dead-inf-comp.rkt 149:4 (quote dead) -- dead then branch +TR opt: dead-inf-comp.rkt 153:4 (quote dead) -- dead else branch +TR opt: dead-inf-comp.rkt 158:4 (quote dead) -- dead else branch +TR info: dead-inf-comp.rkt 156:4 (< rat +inf.f) -- exact real arith +TR opt: dead-inf-comp.rkt 160:4 (quote dead) -- dead then branch +TR info: dead-inf-comp.rkt 159:4 (< +inf.f rat) -- exact real arith +TR opt: dead-inf-comp.rkt 163:4 (quote dead) -- dead then branch +TR info: dead-inf-comp.rkt 162:4 (< rat -inf.f) -- exact real arith +TR opt: dead-inf-comp.rkt 167:4 (quote dead) -- dead else branch +TR info: dead-inf-comp.rkt 165:4 (< -inf.f rat) -- exact real arith +TR opt: dead-inf-comp.rkt 171:4 (quote dead) -- dead else branch +TR info: dead-inf-comp.rkt 169:4 (> +inf.f rat) -- exact real arith +TR opt: dead-inf-comp.rkt 173:4 (quote dead) -- dead then branch +TR info: dead-inf-comp.rkt 172:4 (> rat +inf.f) -- exact real arith +TR opt: dead-inf-comp.rkt 176:4 (quote dead) -- dead then branch +TR info: dead-inf-comp.rkt 175:4 (> -inf.f rat) -- exact real arith +TR opt: dead-inf-comp.rkt 180:4 (quote dead) -- dead else branch +TR info: dead-inf-comp.rkt 178:4 (> rat -inf.f) -- exact real arith +TR opt: dead-inf-comp.rkt 184:4 (quote dead) -- dead else branch +TR info: dead-inf-comp.rkt 182:4 (<= rat +inf.f) -- exact real arith +TR opt: dead-inf-comp.rkt 186:4 (quote dead) -- dead then branch +TR info: dead-inf-comp.rkt 185:4 (<= +inf.f rat) -- exact real arith +TR opt: dead-inf-comp.rkt 189:4 (quote dead) -- dead then branch +TR info: dead-inf-comp.rkt 188:4 (<= rat -inf.f) -- exact real arith +TR opt: dead-inf-comp.rkt 193:4 (quote dead) -- dead else branch +TR info: dead-inf-comp.rkt 191:4 (<= -inf.f rat) -- exact real arith +TR opt: dead-inf-comp.rkt 197:4 (quote dead) -- dead else branch +TR info: dead-inf-comp.rkt 195:4 (>= +inf.f rat) -- exact real arith +TR opt: dead-inf-comp.rkt 199:4 (quote dead) -- dead then branch +TR info: dead-inf-comp.rkt 198:4 (>= rat +inf.f) -- exact real arith +TR opt: dead-inf-comp.rkt 202:4 (quote dead) -- dead then branch +TR info: dead-inf-comp.rkt 201:4 (>= -inf.f rat) -- exact real arith +TR opt: dead-inf-comp.rkt 206:4 (quote dead) -- dead else branch +TR info: dead-inf-comp.rkt 204:4 (>= rat -inf.f) -- exact real arith +TR opt: dead-inf-comp.rkt 99:0 #%module-begin -- in-range +TR opt: dead-inf-comp.rkt 99:0 #%module-begin -- dead else branch +TR opt: dead-inf-comp.rkt 99:0 #%module-begin -- dead else branch +TR opt: dead-inf-comp.rkt 99:0 #%module-begin -- dead else branch +TR opt: dead-inf-comp.rkt 209:0 (for: ((i (in-range 5 +inf.0 2)) (j 3)) (displayln i)) -- dead else branch +TR opt: dead-inf-comp.rkt 209:0 (for: ((i (in-range 5 +inf.0 2)) (j 3)) (displayln i)) -- dead else branch +TR info: dead-inf-comp.rkt 209:41 displayln -- hidden parameter +TR opt: dead-inf-comp.rkt 209:0 (for: ((i (in-range 5 +inf.0 2)) (j 3)) (displayln i)) -- dead else branch +TR opt: dead-inf-comp.rkt 209:0 (for: ((i (in-range 5 +inf.0 2)) (j 3)) (displayln i)) -- dead else branch +TR opt: dead-inf-comp.rkt 209:0 (for: ((i (in-range 5 +inf.0 2)) (j 3)) (displayln i)) -- dead else branch +TR info: dead-inf-comp.rkt 209:41 displayln -- hidden parameter +TR opt: dead-inf-comp.rkt 209:0 (for: ((i (in-range 5 +inf.0 2)) (j 3)) (displayln i)) -- dead else branch +'live +'live +'live +'live +'live +'live +'live +'live +'live +'live +'live +'live +'live +'live +'live +'live +'live +'live +'live +'live +'live +'live +'live +'live +'live +'live +'live +'live +'live +'live +'live +'live +5 +7 +9 +) +#lang typed/racket/base + +(define: rat : Exact-Rational 2/3) + +(if (< rat +inf.0) + 'live + 'dead) +(if (< +inf.0 rat) + 'dead + 'live) +(if (< rat -inf.0) + 'dead + 'live) +(if (< -inf.0 rat) + 'live + 'dead) + +(if (> +inf.0 rat) + 'live + 'dead) +(if (> rat +inf.0) + 'dead + 'live) +(if (> -inf.0 rat) + 'dead + 'live) +(if (> rat -inf.0) + 'live + 'dead) + +(if (<= rat +inf.0) + 'live + 'dead) +(if (<= +inf.0 rat) + 'dead + 'live) +(if (<= rat -inf.0) + 'dead + 'live) +(if (<= -inf.0 rat) + 'live + 'dead) + +(if (>= +inf.0 rat) + 'live + 'dead) +(if (>= rat +inf.0) + 'dead + 'live) +(if (>= -inf.0 rat) + 'dead + 'live) +(if (>= rat -inf.0) + 'live + 'dead) + +;; single flonums +(if (< rat +inf.f) + 'live + 'dead) +(if (< +inf.f rat) + 'dead + 'live) +(if (< rat -inf.f) + 'dead + 'live) +(if (< -inf.f rat) + 'live + 'dead) + +(if (> +inf.f rat) + 'live + 'dead) +(if (> rat +inf.f) + 'dead + 'live) +(if (> -inf.f rat) + 'dead + 'live) +(if (> rat -inf.f) + 'live + 'dead) + +(if (<= rat +inf.f) + 'live + 'dead) +(if (<= +inf.f rat) + 'dead + 'live) +(if (<= rat -inf.f) + 'dead + 'live) +(if (<= -inf.f rat) + 'live + 'dead) + +(if (>= +inf.f rat) + 'live + 'dead) +(if (>= rat +inf.f) + 'dead + 'live) +(if (>= -inf.f rat) + 'dead + 'live) +(if (>= rat -inf.f) + 'live + 'dead) + + +(for: ([i (in-range 5 +inf.0 2)] [j 3]) (displayln i)) diff --git a/collects/typed-racket/base-env/base-env-numeric.rkt b/collects/typed-racket/base-env/base-env-numeric.rkt index 429eb35a..dac5e096 100644 --- a/collects/typed-racket/base-env/base-env-numeric.rkt +++ b/collects/typed-racket/base-env/base-env-numeric.rkt @@ -838,6 +838,14 @@ (-> -NegRat -Fixnum B : (-FS -top (-filter -NegFixnum 1))) (-> -NonPosInt -Fixnum B : (-FS -top (-and (-filter -NonPosFixnum 0) (-filter -NonPosFixnum 1)))) (-> -NonPosRat -Fixnum B : (-FS -top (-filter -NonPosFixnum 1))) + (-> -Rat (-val +inf.0) B : (-FS -top (-filter (Un) 0))) ; guaranteed + (-> (-val +inf.0) -Rat B : (-FS (-filter (Un) 0) -top)) ; can't happen + (-> -Rat (-val -inf.0) B : (-FS (-filter (Un) 0) -top)) ; can't happen + (-> (-val -inf.0) -Rat B : (-FS -top (-filter (Un) 0))) ; guaranteed + (-> -Rat (-val +inf.f) B : (-FS -top (-filter (Un) 0))) ; guaranteed + (-> (-val +inf.f) -Rat B : (-FS (-filter (Un) 0) -top)) ; can't happen + (-> -Rat (-val -inf.f) B : (-FS (-filter (Un) 0) -top)) ; can't happen + (-> (-val -inf.f) -Rat B : (-FS -top (-filter (Un) 0))) ; guaranteed ;; If applying filters resulted in the interesection of the filter and the ;; original type, we'd only need the cases for Fixnums and those for Reals. ;; Cases for Integers and co would fall out naturally from the Real cases, @@ -895,6 +903,14 @@ (-> -Fixnum -NegRat B : (-FS -top (-filter -NegFixnum 0))) (-> -Fixnum -NonPosInt B : (-FS -top (-and (-filter -NonPosFixnum 0) (-filter -NonPosFixnum 1)))) (-> -Fixnum -NonPosRat B : (-FS -top (-filter -NonPosFixnum 0))) + (-> (-val +inf.0) -Rat B : (-FS -top (-filter (Un) 0))) ; guaranteed + (-> -Rat (-val +inf.0) B : (-FS (-filter (Un) 0) -top)) ; can't happen + (-> (-val -inf.0) -Rat B : (-FS (-filter (Un) 0) -top)) ; can't happen + (-> -Rat (-val -inf.0) B : (-FS -top (-filter (Un) 0))) ; guaranteed + (-> (-val +inf.f) -Rat B : (-FS -top (-filter (Un) 0))) ; guaranteed + (-> -Rat (-val +inf.f) B : (-FS (-filter (Un) 0) -top)) ; can't happen + (-> (-val -inf.f) -Rat B : (-FS (-filter (Un) 0) -top)) ; can't happen + (-> -Rat (-val -inf.f) B : (-FS -top (-filter (Un) 0))) ; guaranteed (>-type-pattern -Int -PosInt -Nat -NegInt -NonPosInt -Zero) (>-type-pattern -Rat -PosRat -NonNegRat -NegRat -NonPosRat -Zero) (>-type-pattern -Flonum -PosFlonum -NonNegFlonum -NegFlonum -NonPosFlonum) @@ -948,6 +964,14 @@ (-> -Fixnum -NegReal B : (-FS (-filter -NegFixnum 0) -top)) (-> -Fixnum -NonPosInt B : (-FS (-and (-filter -NonPosFixnum 0) (-filter -NonPosFixnum 1)) -top)) (-> -Fixnum -NonPosReal B : (-FS (-filter -NonPosFixnum 0) -top)) + (-> -Rat (-val +inf.0) B : (-FS -top (-filter (Un) 0))) ; guaranteed + (-> (-val +inf.0) -Rat B : (-FS (-filter (Un) 0) -top)) ; can't happen + (-> -Rat (-val -inf.0) B : (-FS (-filter (Un) 0) -top)) ; can't happen + (-> (-val -inf.0) -Rat B : (-FS -top (-filter (Un) 0))) ; guaranteed + (-> -Rat (-val +inf.f) B : (-FS -top (-filter (Un) 0))) ; guaranteed + (-> (-val +inf.f) -Rat B : (-FS (-filter (Un) 0) -top)) ; can't happen + (-> -Rat (-val -inf.f) B : (-FS (-filter (Un) 0) -top)) ; can't happen + (-> (-val -inf.f) -Rat B : (-FS -top (-filter (Un) 0))) ; guaranteed (<=-type-pattern -Int -PosInt -Nat -NegInt -NonPosInt -Zero) (<=-type-pattern -Rat -PosRat -NonNegRat -NegRat -NonPosRat -Zero) (<=-type-pattern -Flonum -PosFlonum -NonNegFlonum -NegFlonum -NonPosFlonum) @@ -1001,6 +1025,14 @@ (-> -NegReal -Fixnum B : (-FS (-filter -NegFixnum 1) -top)) (-> -NonPosInt -Fixnum B : (-FS (-and (-filter -NonPosFixnum 0) (-filter -NonPosFixnum 1)) -top)) (-> -NonPosReal -Fixnum B : (-FS (-filter -NonPosFixnum 1) -top)) + (-> (-val +inf.0) -Rat B : (-FS -top (-filter (Un) 0))) ; guaranteed + (-> -Rat (-val +inf.0) B : (-FS (-filter (Un) 0) -top)) ; can't happen + (-> (-val -inf.0) -Rat B : (-FS (-filter (Un) 0) -top)) ; can't happen + (-> -Rat (-val -inf.0) B : (-FS -top (-filter (Un) 0))) ; guaranteed + (-> (-val +inf.f) -Rat B : (-FS -top (-filter (Un) 0))) ; guaranteed + (-> -Rat (-val +inf.f) B : (-FS (-filter (Un) 0) -top)) ; can't happen + (-> (-val -inf.f) -Rat B : (-FS (-filter (Un) 0) -top)) ; can't happen + (-> -Rat (-val -inf.f) B : (-FS -top (-filter (Un) 0))) ; guaranteed (>=-type-pattern -Int -PosInt -Nat -NegInt -NonPosInt -Zero) (>=-type-pattern -Rat -PosRat -NonNegRat -NegRat -NonPosRat -Zero) (>=-type-pattern -Flonum -PosFlonum -NonNegFlonum -NegFlonum -NonPosFlonum) diff --git a/collects/typed-racket/typecheck/tc-expr-unit.rkt b/collects/typed-racket/typecheck/tc-expr-unit.rkt index b59ccd9d..6a962912 100644 --- a/collects/typed-racket/typecheck/tc-expr-unit.rkt +++ b/collects/typed-racket/typecheck/tc-expr-unit.rkt @@ -51,12 +51,16 @@ [(~var i (3d (lambda (x) (eqv? x 0.0)))) -FlonumPosZero] [(~var i (3d (lambda (x) (eqv? x -0.0)))) -FlonumNegZero] [(~var i (3d (lambda (x) (eqv? x +nan.0)))) -FlonumNan] + [(~var i (3d (lambda (x) (eqv? x +inf.0)))) (-val +inf.0)] + [(~var i (3d (lambda (x) (eqv? x -inf.0)))) (-val -inf.0)] [(~var i (3d (conjoin flonum? positive?))) -PosFlonum] [(~var i (3d (conjoin flonum? negative?))) -NegFlonum] [(~var i (3d flonum?)) -Flonum] ; for nan [(~var i (3d (lambda (x) (eqv? x 0.0f0)))) -SingleFlonumPosZero] [(~var i (3d (lambda (x) (eqv? x -0.0f0)))) -SingleFlonumNegZero] [(~var i (3d (lambda (x) (eqv? x +nan.f)))) -SingleFlonumNan] + [(~var i (3d (lambda (x) (eqv? x +inf.f)))) (-val +inf.f)] + [(~var i (3d (lambda (x) (eqv? x -inf.f)))) (-val -inf.f)] [(~var i (3d (conjoin single-flonum? positive?))) -PosSingleFlonum] [(~var i (3d (conjoin single-flonum? negative?))) -NegSingleFlonum] [(~var i (3d single-flonum?)) -SingleFlonum] ; for nan