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:
parent
fc194d7337
commit
e041d0f32f
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue
Block a user