fix optimizer problems with mutability checking, inlining
The inlining adjustment can sometimes trigger different inlining than before. (One common benchmark wins; one loses.)
This commit is contained in:
parent
8eefaba187
commit
8291fef9de
|
@ -100,7 +100,7 @@ static void env_make_closure_map(Optimize_Info *frame, mzshort *size, mzshort **
|
||||||
|
|
||||||
static Optimize_Info *optimize_info_add_frame(Optimize_Info *info, int orig, int current, int flags);
|
static Optimize_Info *optimize_info_add_frame(Optimize_Info *info, int orig, int current, int flags);
|
||||||
static int optimize_info_get_shift(Optimize_Info *info, int pos);
|
static int optimize_info_get_shift(Optimize_Info *info, int pos);
|
||||||
static void optimize_info_done(Optimize_Info *info);
|
static void optimize_info_done(Optimize_Info *info, Optimize_Info *parent);
|
||||||
|
|
||||||
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);
|
||||||
|
@ -817,7 +817,7 @@ static Scheme_Object *apply_inlined(Scheme_Object *p, Scheme_Closure_Data *data,
|
||||||
p = scheme_optimize_expr(p, info, context);
|
p = scheme_optimize_expr(p, info, context);
|
||||||
info->next->single_result = info->single_result;
|
info->next->single_result = info->single_result;
|
||||||
info->next->preserves_marks = info->preserves_marks;
|
info->next->preserves_marks = info->preserves_marks;
|
||||||
optimize_info_done(info);
|
optimize_info_done(info, NULL);
|
||||||
|
|
||||||
if (le_prev) {
|
if (le_prev) {
|
||||||
*((Scheme_Object **)(((char *)le_prev) + prev_offset)) = p;
|
*((Scheme_Object **)(((char *)le_prev) + prev_offset)) = p;
|
||||||
|
@ -891,7 +891,7 @@ static Scheme_Object *apply_inlined(Scheme_Object *p, Scheme_Closure_Data *data,
|
||||||
|
|
||||||
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;
|
||||||
optimize_info_done(sub_info);
|
optimize_info_done(sub_info, NULL);
|
||||||
|
|
||||||
if (le_prev) {
|
if (le_prev) {
|
||||||
*((Scheme_Object **)(((char *)le_prev) + prev_offset)) = p;
|
*((Scheme_Object **)(((char *)le_prev) + prev_offset)) = p;
|
||||||
|
@ -1041,18 +1041,18 @@ Scheme_Object *optimize_for_inline(Optimize_Info *info, Scheme_Object *le, int a
|
||||||
|
|
||||||
if (le) {
|
if (le) {
|
||||||
LOG_INLINE(fprintf(stderr, "Inline %d[%d]<=%d@%d %d %s\n", sz, is_leaf, threshold, info->inline_fuel,
|
LOG_INLINE(fprintf(stderr, "Inline %d[%d]<=%d@%d %d %s\n", sz, is_leaf, threshold, info->inline_fuel,
|
||||||
single_use, data->name ? scheme_write_to_string(data->name, NULL) : "???"));
|
single_use, scheme_write_to_string(data->name ? data->name : scheme_false, NULL)));
|
||||||
le = apply_inlined(le, data, sub_info, argc, app, app2, app3, context,
|
le = apply_inlined(le, data, sub_info, argc, app, app2, app3, context,
|
||||||
nested_count, orig_le, prev, prev_offset);
|
nested_count, orig_le, prev, prev_offset);
|
||||||
if (nested_count)
|
if (nested_count)
|
||||||
optimize_info_done(sub_info);
|
optimize_info_done(sub_info, NULL);
|
||||||
return le;
|
return le;
|
||||||
} else {
|
} else {
|
||||||
LOG_INLINE(fprintf(stderr, "No inline %s\n", data->name ? scheme_write_to_string(data->name, NULL) : "???"));
|
LOG_INLINE(fprintf(stderr, "No inline %s\n", scheme_write_to_string(data->name ? data->name : scheme_false, NULL)));
|
||||||
info->has_nonleaf = 1;
|
info->has_nonleaf = 1;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
LOG_INLINE(fprintf(stderr, "No fuel %s %d[%d]>%d@%d %d\n", data->name ? scheme_write_to_string(data->name, NULL) : "???",
|
LOG_INLINE(fprintf(stderr, "No fuel %s %d[%d]>%d@%d %d\n", scheme_write_to_string(data->name ? data->name : scheme_false, NULL),
|
||||||
sz, is_leaf, threshold,
|
sz, is_leaf, threshold,
|
||||||
info->inline_fuel, info->use_psize));
|
info->inline_fuel, info->use_psize));
|
||||||
info->has_nonleaf = 1;
|
info->has_nonleaf = 1;
|
||||||
|
@ -3460,7 +3460,7 @@ scheme_optimize_lets(Scheme_Object *form, Optimize_Info *info, int for_inline, i
|
||||||
if (!post_bind) {
|
if (!post_bind) {
|
||||||
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;
|
||||||
optimize_info_done(sub_info);
|
optimize_info_done(sub_info, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
return form;
|
return form;
|
||||||
|
@ -3485,7 +3485,7 @@ scheme_optimize_lets(Scheme_Object *form, Optimize_Info *info, int for_inline, i
|
||||||
body = scheme_optimize_expr(clv->value, info, context);
|
body = scheme_optimize_expr(clv->value, info, context);
|
||||||
info->next->single_result = info->single_result;
|
info->next->single_result = info->single_result;
|
||||||
info->next->preserves_marks = info->preserves_marks;
|
info->next->preserves_marks = info->preserves_marks;
|
||||||
optimize_info_done(info);
|
optimize_info_done(info, NULL);
|
||||||
return body;
|
return body;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4078,14 +4078,10 @@ scheme_optimize_lets(Scheme_Object *form, Optimize_Info *info, int for_inline, i
|
||||||
body = pre_body->body;
|
body = pre_body->body;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (post_bind) {
|
if (post_bind)
|
||||||
body_info->size = rhs_info->size;
|
optimize_info_done(rhs_info, body_info);
|
||||||
body_info->vclock = rhs_info->vclock;
|
else if (split_shift)
|
||||||
}
|
optimize_info_done(rhs_info, body_info);
|
||||||
|
|
||||||
if (split_shift) {
|
|
||||||
optimize_info_done(rhs_info);
|
|
||||||
}
|
|
||||||
|
|
||||||
body = scheme_optimize_expr(body, body_info, scheme_optimize_tail_context(context));
|
body = scheme_optimize_expr(body, body_info, scheme_optimize_tail_context(context));
|
||||||
if (head->num_clauses)
|
if (head->num_clauses)
|
||||||
|
@ -4154,7 +4150,7 @@ scheme_optimize_lets(Scheme_Object *form, Optimize_Info *info, int for_inline, i
|
||||||
|
|
||||||
/* Optimized away all clauses? */
|
/* Optimized away all clauses? */
|
||||||
if (!head->num_clauses) {
|
if (!head->num_clauses) {
|
||||||
optimize_info_done(body_info);
|
optimize_info_done(body_info, NULL);
|
||||||
return head->body;
|
return head->body;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4213,13 +4209,13 @@ scheme_optimize_lets(Scheme_Object *form, Optimize_Info *info, int for_inline, i
|
||||||
value = scheme_optimize_expr(value, sub_info, context);
|
value = scheme_optimize_expr(value, 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;
|
||||||
optimize_info_done(sub_info);
|
optimize_info_done(sub_info, NULL);
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
optimize_info_done(body_info);
|
optimize_info_done(body_info, NULL);
|
||||||
|
|
||||||
return form;
|
return form;
|
||||||
}
|
}
|
||||||
|
@ -4319,7 +4315,7 @@ optimize_closure_compilation(Scheme_Object *_data, Optimize_Info *info, int cont
|
||||||
data->closure_size = (cl->base_closure_size
|
data->closure_size = (cl->base_closure_size
|
||||||
+ (cl->has_tl ? 1 : 0));
|
+ (cl->has_tl ? 1 : 0));
|
||||||
|
|
||||||
optimize_info_done(info);
|
optimize_info_done(info, NULL);
|
||||||
|
|
||||||
return (Scheme_Object *)data;
|
return (Scheme_Object *)data;
|
||||||
}
|
}
|
||||||
|
@ -4890,7 +4886,7 @@ Scheme_Object *scheme_optimize_expr(Scheme_Object *expr, Optimize_Info *info, in
|
||||||
case scheme_local_type:
|
case scheme_local_type:
|
||||||
{
|
{
|
||||||
Scheme_Object *val;
|
Scheme_Object *val;
|
||||||
int pos, delta, is_mutated;
|
int pos, delta, is_mutated = 0;
|
||||||
|
|
||||||
info->size += 1;
|
info->size += 1;
|
||||||
|
|
||||||
|
@ -5983,13 +5979,15 @@ static int optimize_info_get_shift(Optimize_Info *info, int pos)
|
||||||
return delta;
|
return delta;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void optimize_info_done(Optimize_Info *info)
|
static void optimize_info_done(Optimize_Info *info, Optimize_Info *parent)
|
||||||
{
|
{
|
||||||
info->next->size += info->size;
|
if (!parent) parent = info->next;
|
||||||
info->next->psize += info->psize;
|
|
||||||
info->next->vclock = info->vclock;
|
parent->size += info->size;
|
||||||
|
parent->vclock = info->vclock;
|
||||||
|
parent->psize += info->psize;
|
||||||
if (info->has_nonleaf)
|
if (info->has_nonleaf)
|
||||||
info->next->has_nonleaf = 1;
|
parent->has_nonleaf = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*========================================================================*/
|
/*========================================================================*/
|
||||||
|
|
Loading…
Reference in New Issue
Block a user