diff --git a/pkgs/racket-test-core/tests/racket/optimize.rktl b/pkgs/racket-test-core/tests/racket/optimize.rktl index ef985a25ca..2cb9b635cf 100644 --- a/pkgs/racket-test-core/tests/racket/optimize.rktl +++ b/pkgs/racket-test-core/tests/racket/optimize.rktl @@ -5691,6 +5691,20 @@ (let-values (((_1 _2) (make-sequence (string>)))) (void)))) +;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Check that optimizer-clock tracking is ok +;; when a `let-values` split is allowed due to +;; a detected error condition + +(let () + (define (binop a b) + 'binop) + (define (bar p) + (let ([a (car p)]) + (let-values ([(val1 val2) (binop a)]) + 'bar))) + bar) + ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (report-errs) diff --git a/racket/src/racket/src/optimize.c b/racket/src/racket/src/optimize.c index 86242f75ce..05875d20f1 100644 --- a/racket/src/racket/src/optimize.c +++ b/racket/src/racket/src/optimize.c @@ -7426,10 +7426,11 @@ static Scheme_Object *optimize_lets(Scheme_Object *form, Optimize_Info *info, in we can conservatively assume the clock before the whole group for the purpose of registering once-used variables, but we can also conservatively advance the clock: */ - advance_clocks_for_optimized(value, - &pre_vclock, &pre_aclock, &pre_kclock, &pre_sclock, - rhs_info, - ADVANCE_CLOCKS_INIT_FUEL); + if (!found_escapes) + advance_clocks_for_optimized(value, + &pre_vclock, &pre_aclock, &pre_kclock, &pre_sclock, + rhs_info, + ADVANCE_CLOCKS_INIT_FUEL); once_vclock = pre_vclock; once_aclock = pre_aclock; once_kclock = pre_kclock; @@ -7527,10 +7528,11 @@ static Scheme_Object *optimize_lets(Scheme_Object *form, Optimize_Info *info, in if (skip_opts) { /* Use "pre" clocks: */ - advance_clocks_for_optimized(value, - &pre_vclock, &pre_aclock, &pre_kclock, &pre_sclock, - rhs_info, - ADVANCE_CLOCKS_INIT_FUEL); + if (!found_escapes) + advance_clocks_for_optimized(value, + &pre_vclock, &pre_aclock, &pre_kclock, &pre_sclock, + rhs_info, + ADVANCE_CLOCKS_INIT_FUEL); once_vclock = pre_vclock; once_aclock = pre_aclock; once_kclock = pre_kclock;