From 60bfce14bc0166742fed7675b81d8c5c0dcec2d4 Mon Sep 17 00:00:00 2001 From: Vincent St-Amour Date: Fri, 16 Jul 2010 15:23:48 -0400 Subject: [PATCH] Fixed unsafe optimization that considered floats as complexes. --- .../optimizer/generic/sqrt-segfault.rkt | 14 ++++++++++++++ .../optimizer/hand-optimized/sqrt-segfault.rkt | 14 ++++++++++++++ .../optimizer/non-optimized/sqrt-segfault.rkt | 14 ++++++++++++++ collects/typed-scheme/types/subtype.rkt | 1 - 4 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 collects/tests/typed-scheme/optimizer/generic/sqrt-segfault.rkt create mode 100644 collects/tests/typed-scheme/optimizer/hand-optimized/sqrt-segfault.rkt create mode 100644 collects/tests/typed-scheme/optimizer/non-optimized/sqrt-segfault.rkt diff --git a/collects/tests/typed-scheme/optimizer/generic/sqrt-segfault.rkt b/collects/tests/typed-scheme/optimizer/generic/sqrt-segfault.rkt new file mode 100644 index 0000000000..887eb62975 --- /dev/null +++ b/collects/tests/typed-scheme/optimizer/generic/sqrt-segfault.rkt @@ -0,0 +1,14 @@ +#lang typed/scheme #:optimize + +(require racket/unsafe/ops) + +;; from the nbody-generic benchmark. +;; the result of sqrt was an Inexact-Complex, so inexact complex opts kicked +;; in but they resulted in segfaulting code. +;; the problem was that having Float be a subtype of Inexact-Complex was wrong +;; since you can't do unsafe-flreal-part of a float + +(let* ([dx (- 0.0 0.0)] + [dist2 (* dx dx)] + [mag (assert (* dist2 (sqrt dist2)) inexact-real?)]) + (void)) diff --git a/collects/tests/typed-scheme/optimizer/hand-optimized/sqrt-segfault.rkt b/collects/tests/typed-scheme/optimizer/hand-optimized/sqrt-segfault.rkt new file mode 100644 index 0000000000..3039e0be83 --- /dev/null +++ b/collects/tests/typed-scheme/optimizer/hand-optimized/sqrt-segfault.rkt @@ -0,0 +1,14 @@ +#lang typed/scheme #:optimize + +(require racket/unsafe/ops) + +;; from the nbody-generic benchmark. +;; the result of sqrt was an Inexact-Complex, so inexact complex opts kicked +;; in but they resulted in segfaulting code. +;; the problem was that having Float be a subtype of Inexact-Complex was wrong +;; since you can't do unsafe-flreal-part of a float + +(let* ([dx (unsafe-fl- 0.0 0.0)] + [dist2 (unsafe-fl* dx dx)] + [mag (assert (* dist2 (sqrt dist2)) inexact-real?)]) + (void)) diff --git a/collects/tests/typed-scheme/optimizer/non-optimized/sqrt-segfault.rkt b/collects/tests/typed-scheme/optimizer/non-optimized/sqrt-segfault.rkt new file mode 100644 index 0000000000..675b4dd474 --- /dev/null +++ b/collects/tests/typed-scheme/optimizer/non-optimized/sqrt-segfault.rkt @@ -0,0 +1,14 @@ +#lang typed/scheme + +(require racket/unsafe/ops) + +;; from the nbody-generic benchmark. +;; the result of sqrt was an Inexact-Complex, so inexact complex opts kicked +;; in but they resulted in segfaulting code. +;; the problem was that having Float be a subtype of Inexact-Complex was wrong +;; since you can't do unsafe-flreal-part of a float + +(let* ([dx (- 0.0 0.0)] + [dist2 (* dx dx)] + [mag (assert (* dist2 (sqrt dist2)) inexact-real?)]) + (void)) diff --git a/collects/typed-scheme/types/subtype.rkt b/collects/typed-scheme/types/subtype.rkt index 6fa2969c8c..6f946a89b9 100644 --- a/collects/typed-scheme/types/subtype.rkt +++ b/collects/typed-scheme/types/subtype.rkt @@ -237,7 +237,6 @@ [((Base: 'Integer _) (Base: 'Number _)) A0] [((Base: 'Flonum _) (== -Real =t)) A0] [((Base: 'Integer _) (== -Real =t)) A0] - [((Base: 'Flonum _) (Base: 'InexactComplex _)) A0] [((Base: 'Flonum _) (Base: 'Number _)) A0] [((Base: 'Exact-Rational _) (Base: 'Number _)) A0] [((Base: 'Integer _) (Base: 'Exact-Rational _)) A0]