Don't add type information twice
In some cases, for example while using no_types, the optimizer can try to add again the type information of a local variable. This creates unnecessary internal storage to save the repeated information.
This commit is contained in:
parent
65838bd3c8
commit
9cb0637f95
|
@ -127,6 +127,7 @@ static Scheme_Object *optimize_info_lookup(Optimize_Info *info, int pos, int *cl
|
|||
int once_used_ok, int context, int *potential_size, int *_mutated);
|
||||
static Scheme_Object *optimize_info_mutated_lookup(Optimize_Info *info, int pos, int *is_mutated);
|
||||
static void optimize_info_used_top(Optimize_Info *info);
|
||||
static Scheme_Object *do_optimize_get_predicate(int pos, Optimize_Info *info, int ignore_no_types);
|
||||
static Scheme_Object *optimize_get_predicate(int pos, Optimize_Info *info);
|
||||
static void add_type(Optimize_Info *info, int pos, Scheme_Object *pred);
|
||||
static void merge_types(Optimize_Info *src_info, Optimize_Info *info, int delta);
|
||||
|
@ -4237,8 +4238,17 @@ static Scheme_Object *equivalent_exprs(Scheme_Object *a, Scheme_Object *b,
|
|||
|
||||
static void add_type(Optimize_Info *info, int pos, Scheme_Object *pred)
|
||||
{
|
||||
Scheme_Hash_Tree *new_types;
|
||||
new_types = info->types;
|
||||
Scheme_Hash_Tree *new_types = info->types;
|
||||
|
||||
if (optimize_is_mutated(info, pos))
|
||||
return;
|
||||
|
||||
/* Don't add the type if something is already there, this may happen when no_types. */
|
||||
if (do_optimize_get_predicate(pos, info, 1)
|
||||
|| optimize_is_local_type_valued(info, pos)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!new_types)
|
||||
new_types = scheme_make_hash_tree(0);
|
||||
new_types = scheme_hash_tree_set(new_types,
|
||||
|
@ -4267,21 +4277,15 @@ static void merge_types(Optimize_Info *src_info, Optimize_Info *info, int delta)
|
|||
|
||||
static void intersect_and_merge_types(Optimize_Info *t_info, Optimize_Info *f_info,
|
||||
Optimize_Info *base_info)
|
||||
/* Save in base_info->types the result of
|
||||
(union (intersection t_info->type f_info->types) base_info->types)
|
||||
in case a key is already in base_info->types, the value is not modified */
|
||||
/* Add to base_info the intersection of the types of t_info and f_info */
|
||||
{
|
||||
Scheme_Hash_Tree *t_types = t_info->types, *f_types = f_info->types,
|
||||
*base_types = base_info->types;
|
||||
Scheme_Object *pos, *t_pred, *f_pred, *base_pred;
|
||||
Scheme_Hash_Tree *t_types = t_info->types, *f_types = f_info->types;
|
||||
Scheme_Object *pos, *t_pred, *f_pred;
|
||||
intptr_t i;
|
||||
|
||||
if (!t_types || !f_types)
|
||||
return;
|
||||
|
||||
if (base_types && (SAME_OBJ(f_types, base_types) || SAME_OBJ(t_types, base_types)))
|
||||
return;
|
||||
|
||||
if (f_types->count > t_types->count) {
|
||||
Scheme_Hash_Tree *swap = f_types;
|
||||
f_types = t_types;
|
||||
|
@ -4292,21 +4296,10 @@ static void intersect_and_merge_types(Optimize_Info *t_info, Optimize_Info *f_in
|
|||
while (i != -1) {
|
||||
scheme_hash_tree_index(f_types, i, &pos, &f_pred);
|
||||
t_pred = scheme_hash_tree_get(t_types, pos);
|
||||
if (t_pred && SAME_OBJ(t_pred, f_pred)) {
|
||||
if (base_types)
|
||||
base_pred = scheme_hash_tree_get(base_types, pos);
|
||||
else
|
||||
base_pred = NULL;
|
||||
|
||||
if (!base_pred) {
|
||||
if (!base_types)
|
||||
base_types = scheme_make_hash_tree(0);
|
||||
base_types = scheme_hash_tree_set(base_types, pos, f_pred);
|
||||
}
|
||||
}
|
||||
if (t_pred && SAME_OBJ(t_pred, f_pred))
|
||||
add_type(base_info, SCHEME_INT_VAL(pos), f_pred);
|
||||
i = scheme_hash_tree_next(f_types, i);
|
||||
}
|
||||
base_info->types = base_types;
|
||||
}
|
||||
|
||||
static int relevant_predicate(Scheme_Object *pred)
|
||||
|
@ -5660,7 +5653,7 @@ static void update_rhs_value(Scheme_Compiled_Let_Value *naya, Scheme_Object *e,
|
|||
if (tst) {
|
||||
Scheme_Object *n;
|
||||
|
||||
n = equivalent_exprs(naya->value, e, info, info, 0);
|
||||
n = equivalent_exprs(naya->value, e, NULL, NULL, 0);
|
||||
if (!n) {
|
||||
Scheme_Branch_Rec *b;
|
||||
|
||||
|
@ -9163,12 +9156,12 @@ static Scheme_Object *optimize_info_mutated_lookup(Optimize_Info *info, int pos,
|
|||
return do_optimize_info_lookup(info, pos, 0, NULL, NULL, NULL, 0, 0, NULL, 0, is_mutated, 1);
|
||||
}
|
||||
|
||||
Scheme_Object *optimize_get_predicate(int pos, Optimize_Info *info)
|
||||
Scheme_Object *do_optimize_get_predicate(int pos, Optimize_Info *info, int ignore_no_types)
|
||||
/* pos is in new-frame counts */
|
||||
{
|
||||
Scheme_Object *pred;
|
||||
|
||||
if (info->no_types) return NULL;
|
||||
if (info->no_types && !ignore_no_types) return NULL;
|
||||
|
||||
while (info) {
|
||||
if (info->types) {
|
||||
|
@ -9185,6 +9178,12 @@ Scheme_Object *optimize_get_predicate(int pos, Optimize_Info *info)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
Scheme_Object *optimize_get_predicate(int pos, Optimize_Info *info)
|
||||
/* pos is in new-frame counts */
|
||||
{
|
||||
return do_optimize_get_predicate(pos, info, 0);
|
||||
}
|
||||
|
||||
static Optimize_Info *optimize_info_add_frame(Optimize_Info *info, int orig, int current, int flags)
|
||||
{
|
||||
Optimize_Info *naya;
|
||||
|
|
Loading…
Reference in New Issue
Block a user