fix optimizer bug related to detected arity errors

When multiple-binding `let-values` form is split into a single-binding
form on the grounds that the right-hand side will definitely error,
the optimizer's effect clocks were advance incorrectly.

Closes #1552
This commit is contained in:
Matthew Flatt 2017-01-02 06:58:02 -07:00
parent fc194d7337
commit e041d0f32f
2 changed files with 24 additions and 8 deletions

View File

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

View File

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