From 22f9c8509fa7a0608d8ef4eb9a728f7c93c771d1 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Sun, 16 Dec 2012 15:48:18 -0700 Subject: [PATCH] fix optimizer bug, again Corrects ef824351a1. --- collects/tests/racket/optimize.rktl | 15 +++++++++++++++ src/racket/src/optimize.c | 10 ++++------ 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/collects/tests/racket/optimize.rktl b/collects/tests/racket/optimize.rktl index 5203a37013..c6de5ecf29 100644 --- a/collects/tests/racket/optimize.rktl +++ b/collects/tests/racket/optimize.rktl @@ -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 diff --git a/src/racket/src/optimize.c b/src/racket/src/optimize.c index ae21a0016a..b9bb81033d 100644 --- a/src/racket/src/optimize.c +++ b/src/racket/src/optimize.c @@ -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; } }