From e79de9d4b569e708f34f98253b9bbaf2163b0ff0 Mon Sep 17 00:00:00 2001 From: Andy Wingo Date: Wed, 22 Nov 2017 10:44:34 +0100 Subject: [PATCH] Fix inference of generic < on NaN values * module/language/cps/types.scm (<): Don't infer anything if either number could be a flonum. --- module/language/cps/types.scm | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/module/language/cps/types.scm b/module/language/cps/types.scm index 852109fd8..20a648fd9 100644 --- a/module/language/cps/types.scm +++ b/module/language/cps/types.scm @@ -1051,16 +1051,18 @@ minimum, and maximum." (restrict! b &bignum -inf.0 (1- (target-most-negative-fixnum))))) (else (infer-integer-< a b true?)))) - (else + ;; Can't include &flonum because of NaN. Perhaps we should model + ;; NaN with a separate type bit. + ((type<=? types &exact-number) (let ((min0 (&min a)) (max0 (&max a)) (min1 (&min b)) (max1 (&max b))) (cond (true? - (restrict! a &real min0 (min max0 max1)) - (restrict! b &real (max min0 min1) max1)) + (restrict! a &exact-number min0 (min max0 max1)) + (restrict! b &exact-number (max min0 min1) max1)) (else - (restrict! a &real (max min0 min1) max0) - (restrict! b &real min1 (min max0 max1))))))))) + (restrict! a &exact-number (max min0 min1) max0) + (restrict! b &exact-number min1 (min max0 max1))))))))) (define-=-inferrer (u64-= &u64)) (define-predicate-inferrer (u64-< a b true?)