extra '((lambda' check in bytecode optimizer

svn: r12724
This commit is contained in:
Matthew Flatt 2008-12-07 23:15:28 +00:00
parent d8c28545ea
commit bd48d376aa

View File

@ -1077,7 +1077,7 @@ static Scheme_Object *make_application(Scheme_Object *v)
app->rator = SCHEME_CAR(v); app->rator = SCHEME_CAR(v);
v = SCHEME_CDR(v); v = SCHEME_CDR(v);
app->rand = SCHEME_CAR(v); app->rand = SCHEME_CAR(v);
return (Scheme_Object *)app; return (Scheme_Object *)app;
} else if (n == 3) { } else if (n == 3) {
Scheme_App3_Rec *app; Scheme_App3_Rec *app;
@ -1351,7 +1351,7 @@ static Scheme_Object *resolve_application2(Scheme_Object *o, Resolve_Info *orig_
orig_info->max_let_depth = info->max_let_depth; orig_info->max_let_depth = info->max_let_depth;
set_app2_eval_type(app); set_app2_eval_type(app);
return (Scheme_Object *)app; return (Scheme_Object *)app;
} }
@ -2219,6 +2219,11 @@ Scheme_Object *optimize_for_inline(Optimize_Info *info, Scheme_Object *le, int a
if (info->inline_fuel < 0) if (info->inline_fuel < 0)
return NULL; return NULL;
if (SAME_TYPE(SCHEME_TYPE(le), scheme_compiled_unclosed_procedure_type)) {
/* Found a `((lambda' */
single_use = 1;
}
if (SAME_TYPE(SCHEME_TYPE(le), scheme_local_type)) { if (SAME_TYPE(SCHEME_TYPE(le), scheme_local_type)) {
/* Check for inlining: */ /* Check for inlining: */
@ -2458,6 +2463,16 @@ static Scheme_Object *optimize_application(Scheme_Object *o, Optimize_Info *info
le = scheme_optimize_expr(app->args[i], info); le = scheme_optimize_expr(app->args[i], info);
app->args[i] = le; app->args[i] = le;
if (!i) {
if (SAME_TYPE(SCHEME_TYPE(app->args[0]),scheme_compiled_unclosed_procedure_type)) {
/* Found "((lambda" after optimizing; try again */
le = optimize_for_inline(info, app->args[i], n - 1, app, NULL, NULL, &rator_flags);
if (le)
return le;
}
}
if (i && (SCHEME_TYPE(le) < _scheme_compiled_values_types_)) if (i && (SCHEME_TYPE(le) < _scheme_compiled_values_types_))
all_vals = 0; all_vals = 0;
} }
@ -2501,6 +2516,13 @@ static Scheme_Object *optimize_application2(Scheme_Object *o, Optimize_Info *inf
le = scheme_optimize_expr(app->rator, info); le = scheme_optimize_expr(app->rator, info);
app->rator = le; app->rator = le;
if (SAME_TYPE(SCHEME_TYPE(app->rator),scheme_compiled_unclosed_procedure_type)) {
/* Found "((lambda" after optimizing; try again */
le = optimize_for_inline(info, app->rator, 1, NULL, app, NULL, &rator_flags);
if (le)
return le;
}
le = scheme_optimize_expr(app->rand, info); le = scheme_optimize_expr(app->rand, info);
app->rand = le; app->rand = le;
if (SCHEME_TYPE(le) > _scheme_compiled_values_types_) { if (SCHEME_TYPE(le) > _scheme_compiled_values_types_) {
@ -2564,6 +2586,13 @@ static Scheme_Object *optimize_application3(Scheme_Object *o, Optimize_Info *inf
le = scheme_optimize_expr(app->rator, info); le = scheme_optimize_expr(app->rator, info);
app->rator = le; app->rator = le;
if (SAME_TYPE(SCHEME_TYPE(app->rator),scheme_compiled_unclosed_procedure_type)) {
/* Found "((lambda" after optimizing; try again */
le = optimize_for_inline(info, app->rator, 2, NULL, NULL, app, &rator_flags);
if (le)
return le;
}
/* 1st arg */ /* 1st arg */
le = scheme_optimize_expr(app->rand1, info); le = scheme_optimize_expr(app->rand1, info);