fix interference of unboxing inference for different arguments

This commit is contained in:
Matthew Flatt 2013-04-04 11:28:22 -06:00
parent 77163fe8d1
commit f24b91a1cc
2 changed files with 40 additions and 3 deletions

View File

@ -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)))
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

View File

@ -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 {