extend reductions for expressions like (let ([x (let ([y M]) N)]) P)
=> (let ([y M]) (let ([x N]) P)) to expressions where the outer `let` has more than one clause, for example (let ([x (let ([y M]) N)] [z _]) P)
This commit is contained in:
parent
1582178982
commit
c3595c56b4
|
@ -158,7 +158,7 @@ static void optimize_info_seq_done(Optimize_Info *info, Optimize_Info_Sequence *
|
||||||
static Scheme_Object *estimate_closure_size(Scheme_Object *e);
|
static Scheme_Object *estimate_closure_size(Scheme_Object *e);
|
||||||
static Scheme_Object *no_potential_size(Scheme_Object *value);
|
static Scheme_Object *no_potential_size(Scheme_Object *value);
|
||||||
|
|
||||||
static Scheme_Object *optimize_lets(Scheme_Object *form, Optimize_Info *info, int for_inline, int context);
|
static Scheme_Object *optimize_lets(Scheme_Object *form, Optimize_Info *info, int context);
|
||||||
|
|
||||||
static Scheme_Object *optimize_clone(int single_use, Scheme_Object *obj, Optimize_Info *info, Scheme_Hash_Tree *var_map, int as_rator);
|
static Scheme_Object *optimize_clone(int single_use, Scheme_Object *obj, Optimize_Info *info, Scheme_Hash_Tree *var_map, int as_rator);
|
||||||
|
|
||||||
|
@ -2298,7 +2298,7 @@ static Scheme_Object *apply_inlined(Scheme_Lambda *lam, Optimize_Info *info,
|
||||||
if (!single_use || lam->ir_info->is_dup)
|
if (!single_use || lam->ir_info->is_dup)
|
||||||
sub_info->inline_fuel >>= 1;
|
sub_info->inline_fuel >>= 1;
|
||||||
|
|
||||||
p = optimize_lets((Scheme_Object *)lh, sub_info, 1, context);
|
p = optimize_lets((Scheme_Object *)lh, sub_info, context);
|
||||||
|
|
||||||
info->single_result = sub_info->single_result;
|
info->single_result = sub_info->single_result;
|
||||||
info->preserves_marks = sub_info->preserves_marks;
|
info->preserves_marks = sub_info->preserves_marks;
|
||||||
|
@ -7043,7 +7043,7 @@ static void end_transitive_use_record(Optimize_Info *info)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static Scheme_Object *optimize_lets(Scheme_Object *form, Optimize_Info *info, int for_inline, int context)
|
static Scheme_Object *optimize_lets(Scheme_Object *form, Optimize_Info *info, int context)
|
||||||
/* This is the main entry point for optimizing a `let[rec]-values` form. */
|
/* This is the main entry point for optimizing a `let[rec]-values` form. */
|
||||||
{
|
{
|
||||||
Optimize_Info *body_info, *rhs_info;
|
Optimize_Info *body_info, *rhs_info;
|
||||||
|
@ -7116,7 +7116,7 @@ static Scheme_Object *optimize_lets(Scheme_Object *form, Optimize_Info *info, in
|
||||||
try_again = 0;
|
try_again = 0;
|
||||||
/* (let ([x (let ([y M]) N)]) P) => (let ([y M]) (let ([x N]) P))
|
/* (let ([x (let ([y M]) N)]) P) => (let ([y M]) (let ([x N]) P))
|
||||||
or (let ([x (begin M ... N)]) P) => (begin M ... (let ([x N]) P)) */
|
or (let ([x (begin M ... N)]) P) => (begin M ... (let ([x N]) P)) */
|
||||||
if (head->num_clauses == 1) {
|
if (head->num_clauses) {
|
||||||
irlv = (Scheme_IR_Let_Value *)head->body; /* ([x ...]) */
|
irlv = (Scheme_IR_Let_Value *)head->body; /* ([x ...]) */
|
||||||
if (SAME_TYPE(SCHEME_TYPE(irlv->value), scheme_ir_let_header_type)) {
|
if (SAME_TYPE(SCHEME_TYPE(irlv->value), scheme_ir_let_header_type)) {
|
||||||
Scheme_IR_Let_Header *lh = (Scheme_IR_Let_Header *)irlv->value; /* (let ([y ...]) ...) */
|
Scheme_IR_Let_Header *lh = (Scheme_IR_Let_Header *)irlv->value; /* (let ([y ...]) ...) */
|
||||||
|
@ -9049,7 +9049,7 @@ Scheme_Object *scheme_optimize_expr(Scheme_Object *expr, Optimize_Info *info, in
|
||||||
else
|
else
|
||||||
return optimize_lambda(expr, info, context);
|
return optimize_lambda(expr, info, context);
|
||||||
case scheme_ir_let_header_type:
|
case scheme_ir_let_header_type:
|
||||||
return optimize_lets(expr, info, 0, context);
|
return optimize_lets(expr, info, context);
|
||||||
case scheme_ir_toplevel_type:
|
case scheme_ir_toplevel_type:
|
||||||
info->size += 1;
|
info->size += 1;
|
||||||
if (info->top_level_consts) {
|
if (info->top_level_consts) {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user