avoid optimizer imprecision for inlining

svn: r18474
This commit is contained in:
Matthew Flatt 2010-03-05 13:50:40 +00:00
parent e03a56995d
commit 1cbb303594

View File

@ -5543,19 +5543,29 @@ module_optimize(Scheme_Object *data, Optimize_Info *info, int context)
e = (Scheme_Object *)SCHEME_IPTR_VAL(e); e = (Scheme_Object *)SCHEME_IPTR_VAL(e);
e = SCHEME_CDR(e); e = SCHEME_CDR(e);
if (!scheme_compiled_propagate_ok(e, info) if (!scheme_compiled_propagate_ok(e, info)
&& scheme_is_statically_proc(e, info)) && scheme_is_statically_proc(e, info)) {
e = scheme_make_noninline_proc(e); /* If we previously installed a procedure for inlining,
don't replace that with a worse approximation. */
if (OPT_LIMIT_FUNCTION_RESIZE) { Scheme_Object *old_e;
if (SAME_TYPE(SCHEME_TYPE(e), scheme_compiled_unclosed_procedure_type)) old_e = scheme_hash_get(info->top_level_consts, rpos);
new_sz = scheme_closure_body_size((Scheme_Closure_Data *)e, 0, NULL); if (SAME_TYPE(SCHEME_TYPE(old_e), scheme_compiled_unclosed_procedure_type))
e = NULL;
else else
new_sz = 0; e = scheme_make_noninline_proc(e);
} else }
new_sz = 0;
if (!new_sz || !old_sz || (new_sz < 4 * old_sz)) if (e) {
scheme_hash_set(info->top_level_consts, rpos, e); if (OPT_LIMIT_FUNCTION_RESIZE) {
if (SAME_TYPE(SCHEME_TYPE(e), scheme_compiled_unclosed_procedure_type))
new_sz = scheme_closure_body_size((Scheme_Closure_Data *)e, 0, NULL);
else
new_sz = 0;
} else
new_sz = 0;
if (!new_sz || !old_sz || (new_sz < 4 * old_sz))
scheme_hash_set(info->top_level_consts, rpos, e);
}
} }
} }