diff --git a/collects/tests/racket/optimize.rktl b/collects/tests/racket/optimize.rktl index 8430cd12ec..b6bb9a37cd 100644 --- a/collects/tests/racket/optimize.rktl +++ b/collects/tests/racket/optimize.rktl @@ -872,6 +872,7 @@ [t2 (get-output-bytes s2)]) (or (bytes=? t1 t2) (begin + #; (printf "~s\n~s\n" (zo-parse (open-input-bytes t1)) (zo-parse (open-input-bytes t2))) @@ -3015,6 +3016,33 @@ #f "") ) + +;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Make sure the compiler unboxes the `v' +;; argument in the loop below: + +(let () + (define l '(module m racket/base + (require racket/flonum) + (define (f) + (let loop ([n 1000][v 0.0]) + (if (zero? n) + v + (loop (- n 1) + (fl+ v 2.0))))))) + (define b + (let ([o (open-output-bytes)]) + (write (compile l) o) + (parameterize ([read-accept-compiled #t]) + (zo-parse (open-input-bytes (get-output-bytes o)))))) + (let* ([m (compilation-top-code b)] + [d (car (mod-body m))] + [b (closure-code (def-values-rhs d))] + [c (application-rator (lam-body b))] + [l (closure-code c)] + [ts (lam-param-types l)]) + (test 'flonum cadr ts))) + ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/src/racket/src/optimize.c b/src/racket/src/optimize.c index b797fd1180..79fa952a5a 100644 --- a/src/racket/src/optimize.c +++ b/src/racket/src/optimize.c @@ -4925,12 +4925,21 @@ static void merge_closure_local_type_map(Scheme_Closure_Data *data1, Scheme_Clos cl2->has_tymap = 1; cl2->local_type_map = cl1->local_type_map; } else if (cl2->local_type_map) { - int i; + int i, recheck = 0; for (i = data1->num_params; i--; ) { if (cl1->local_type_map[i] != cl2->local_type_map[i]) { - cl2->local_type_map = NULL; + cl1->local_type_map[i] = 0; + cl2->local_type_map[i] = 0; + recheck = 1; + } + } + if (recheck) { + for (i = data1->num_params; i--; ) { + if (cl1->local_type_map[i]) break; + } + if (i < 0) { cl1->local_type_map = NULL; - break; + cl2->local_type_map = NULL; } } } else {