fix optimizer bug, again

Corrects ef824351a1.
This commit is contained in:
Matthew Flatt 2012-12-16 15:48:18 -07:00
parent ef824351a1
commit 22f9c8509f
2 changed files with 19 additions and 6 deletions

View File

@ -1603,6 +1603,21 @@
(+ p m (- p p) t))
'ok))))
(test-comp '(lambda (n)
(let ([p (fx+ n n)])
(if n
(let ([m (unsafe-fx- p 1)]
[t (- p p)])
(let ([q (- p p)]
[s m])
(+ p s q t)))
'ok)))
'(lambda (n)
(let ([p (fx+ n n)])
(if n
(let ([t (- p p)])
(+ p (unsafe-fx- p 1) (- p p) t))
'ok))))
;; simple cross-module inlining
(test-comp `(module m racket/base

View File

@ -6660,15 +6660,13 @@ static Scheme_Object *do_optimize_info_lookup(Optimize_Info *info, int pos, int
o->cross_lambda = (j != orig_j);
return (Scheme_Object *)o;
} else if (SAME_TYPE(SCHEME_TYPE(n), scheme_local_type)) {
int pos, cross_lambda = (j != orig_j), extra_delta = 0;
int pos, cross_lambda = (j != orig_j);
pos = SCHEME_LOCAL_POS(n);
if (info->flags & SCHEME_LAMBDA_FRAME)
j--; /* because it will get re-added on recur */
else if (info->flags & SCHEME_POST_BIND_FRAME) {
extra_delta = info->new_frame;
else if (info->flags & SCHEME_POST_BIND_FRAME)
info = info->next; /* bindings are relative to next frame */
}
/* Marks local as used; we don't expect to get back
a value, because chaining would normally happen on the
@ -6693,8 +6691,8 @@ static Scheme_Object *do_optimize_info_lookup(Optimize_Info *info, int pos, int
n = scheme_make_local(scheme_local_type, pos + delta, 0);
} else if (SAME_TYPE(SCHEME_TYPE(n), scheme_once_used_type)) {
/* Need to adjust delta: */
delta = optimize_info_get_shift(info, pos);
((Scheme_Once_Used *)n)->delta += delta + extra_delta;
delta += optimize_info_get_shift(info, pos);
((Scheme_Once_Used *)n)->delta += delta;
if (cross_lambda) ((Scheme_Once_Used *)n)->cross_lambda = 1;
}
}