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);
|
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 Scheme_Object *optimize_info_mutated_lookup(Optimize_Info *info, int pos, int *is_mutated);
|
||||||
static void optimize_info_used_top(Optimize_Info *info);
|
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 Scheme_Object *optimize_get_predicate(int pos, Optimize_Info *info);
|
||||||
static void add_type(Optimize_Info *info, int pos, Scheme_Object *pred);
|
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);
|
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)
|
static void add_type(Optimize_Info *info, int pos, Scheme_Object *pred)
|
||||||
{
|
{
|
||||||
Scheme_Hash_Tree *new_types;
|
Scheme_Hash_Tree *new_types = info->types;
|
||||||
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)
|
if (!new_types)
|
||||||
new_types = scheme_make_hash_tree(0);
|
new_types = scheme_make_hash_tree(0);
|
||||||
new_types = scheme_hash_tree_set(new_types,
|
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,
|
static void intersect_and_merge_types(Optimize_Info *t_info, Optimize_Info *f_info,
|
||||||
Optimize_Info *base_info)
|
Optimize_Info *base_info)
|
||||||
/* Save in base_info->types the result of
|
/* Add to base_info the intersection of the types of t_info and f_info */
|
||||||
(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 */
|
|
||||||
{
|
{
|
||||||
Scheme_Hash_Tree *t_types = t_info->types, *f_types = f_info->types,
|
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;
|
||||||
Scheme_Object *pos, *t_pred, *f_pred, *base_pred;
|
|
||||||
intptr_t i;
|
intptr_t i;
|
||||||
|
|
||||||
if (!t_types || !f_types)
|
if (!t_types || !f_types)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (base_types && (SAME_OBJ(f_types, base_types) || SAME_OBJ(t_types, base_types)))
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (f_types->count > t_types->count) {
|
if (f_types->count > t_types->count) {
|
||||||
Scheme_Hash_Tree *swap = f_types;
|
Scheme_Hash_Tree *swap = f_types;
|
||||||
f_types = t_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) {
|
while (i != -1) {
|
||||||
scheme_hash_tree_index(f_types, i, &pos, &f_pred);
|
scheme_hash_tree_index(f_types, i, &pos, &f_pred);
|
||||||
t_pred = scheme_hash_tree_get(t_types, pos);
|
t_pred = scheme_hash_tree_get(t_types, pos);
|
||||||
if (t_pred && SAME_OBJ(t_pred, f_pred)) {
|
if (t_pred && SAME_OBJ(t_pred, f_pred))
|
||||||
if (base_types)
|
add_type(base_info, SCHEME_INT_VAL(pos), f_pred);
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
i = scheme_hash_tree_next(f_types, i);
|
i = scheme_hash_tree_next(f_types, i);
|
||||||
}
|
}
|
||||||
base_info->types = base_types;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int relevant_predicate(Scheme_Object *pred)
|
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) {
|
if (tst) {
|
||||||
Scheme_Object *n;
|
Scheme_Object *n;
|
||||||
|
|
||||||
n = equivalent_exprs(naya->value, e, info, info, 0);
|
n = equivalent_exprs(naya->value, e, NULL, NULL, 0);
|
||||||
if (!n) {
|
if (!n) {
|
||||||
Scheme_Branch_Rec *b;
|
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);
|
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 */
|
/* pos is in new-frame counts */
|
||||||
{
|
{
|
||||||
Scheme_Object *pred;
|
Scheme_Object *pred;
|
||||||
|
|
||||||
if (info->no_types) return NULL;
|
if (info->no_types && !ignore_no_types) return NULL;
|
||||||
|
|
||||||
while (info) {
|
while (info) {
|
||||||
if (info->types) {
|
if (info->types) {
|
||||||
|
@ -9185,6 +9178,12 @@ Scheme_Object *optimize_get_predicate(int pos, Optimize_Info *info)
|
||||||
return NULL;
|
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)
|
static Optimize_Info *optimize_info_add_frame(Optimize_Info *info, int orig, int current, int flags)
|
||||||
{
|
{
|
||||||
Optimize_Info *naya;
|
Optimize_Info *naya;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user