Commit a6590c31 by Richard Guenther Committed by Richard Biener

var-tracking.c (vars_copy_1): Inline ...

2010-05-16  Richard Guenther  <rguenther@suse.de>

	* var-tracking.c (vars_copy_1): Inline ...
	(vars_copy): ... here.  Use FOR_EACH_HTAB_ELEMENT.
	(variable_union): Use FOR_EACH_HTAB_ELEMENT.  Merge asserts.
	(variable_merge_over_cur): Adjust.  Merge asserts.
	(variable_merge_over_src): Likewise.
	(dataflow_set_merge): Use FOR_EACH_HTAB_ELEMENT.
	(variable_post_merge_new_vals): Merge asserts.
	(variable_post_merge_perm_vals): Likewise.
	(find_mem_expr_in_1pdv): Likewise.
	(dataflow_set_different_value): Remove.
	(onepart_variable_different_p): Merge asserts.
	(variable_different_p): Likewise.
	(dataflow_set_different_1): Inline ...
	(dataflow_set_different): ... here.  Use FOR_EACH_HTAB_ELEMENT.
	(emit_notes_for_differences_1): Merge asserts.

From-SVN: r159456
parent 6456e26e
2010-05-16 Richard Guenther <rguenther@suse.de> 2010-05-16 Richard Guenther <rguenther@suse.de>
* var-tracking.c (vars_copy_1): Inline ...
(vars_copy): ... here. Use FOR_EACH_HTAB_ELEMENT.
(variable_union): Use FOR_EACH_HTAB_ELEMENT. Merge asserts.
(variable_merge_over_cur): Adjust. Merge asserts.
(variable_merge_over_src): Likewise.
(dataflow_set_merge): Use FOR_EACH_HTAB_ELEMENT.
(variable_post_merge_new_vals): Merge asserts.
(variable_post_merge_perm_vals): Likewise.
(find_mem_expr_in_1pdv): Likewise.
(dataflow_set_different_value): Remove.
(onepart_variable_different_p): Merge asserts.
(variable_different_p): Likewise.
(dataflow_set_different_1): Inline ...
(dataflow_set_different): ... here. Use FOR_EACH_HTAB_ELEMENT.
(emit_notes_for_differences_1): Merge asserts.
2010-05-16 Richard Guenther <rguenther@suse.de>
* lto-symtab.c (lto_symtab_entry_hash): Use IDENTIFIER_HASH_VALUE. * lto-symtab.c (lto_symtab_entry_hash): Use IDENTIFIER_HASH_VALUE.
* optabs.c (libfunc_decl_hash): Likewise. * optabs.c (libfunc_decl_hash): Likewise.
* varasm.c (emutls_decl): Likewise. * varasm.c (emutls_decl): Likewise.
......
...@@ -421,7 +421,6 @@ static void attrs_list_union (attrs *, attrs); ...@@ -421,7 +421,6 @@ static void attrs_list_union (attrs *, attrs);
static void **unshare_variable (dataflow_set *set, void **slot, variable var, static void **unshare_variable (dataflow_set *set, void **slot, variable var,
enum var_init_status); enum var_init_status);
static int vars_copy_1 (void **, void *);
static void vars_copy (htab_t, htab_t); static void vars_copy (htab_t, htab_t);
static tree var_debug_decl (tree); static tree var_debug_decl (tree);
static void var_reg_set (dataflow_set *, rtx, enum var_init_status, rtx); static void var_reg_set (dataflow_set *, rtx, enum var_init_status, rtx);
...@@ -438,7 +437,6 @@ static void dataflow_set_init (dataflow_set *); ...@@ -438,7 +437,6 @@ static void dataflow_set_init (dataflow_set *);
static void dataflow_set_clear (dataflow_set *); static void dataflow_set_clear (dataflow_set *);
static void dataflow_set_copy (dataflow_set *, dataflow_set *); static void dataflow_set_copy (dataflow_set *, dataflow_set *);
static int variable_union_info_cmp_pos (const void *, const void *); static int variable_union_info_cmp_pos (const void *, const void *);
static int variable_union (void **, void *);
static void dataflow_set_union (dataflow_set *, dataflow_set *); static void dataflow_set_union (dataflow_set *, dataflow_set *);
static location_chain find_loc_in_1pdv (rtx, variable, htab_t); static location_chain find_loc_in_1pdv (rtx, variable, htab_t);
static bool canon_value_cmp (rtx, rtx); static bool canon_value_cmp (rtx, rtx);
...@@ -446,7 +444,6 @@ static int loc_cmp (rtx, rtx); ...@@ -446,7 +444,6 @@ static int loc_cmp (rtx, rtx);
static bool variable_part_different_p (variable_part *, variable_part *); static bool variable_part_different_p (variable_part *, variable_part *);
static bool onepart_variable_different_p (variable, variable); static bool onepart_variable_different_p (variable, variable);
static bool variable_different_p (variable, variable); static bool variable_different_p (variable, variable);
static int dataflow_set_different_1 (void **, void *);
static bool dataflow_set_different (dataflow_set *, dataflow_set *); static bool dataflow_set_different (dataflow_set *, dataflow_set *);
static void dataflow_set_destroy (dataflow_set *); static void dataflow_set_destroy (dataflow_set *);
...@@ -1537,34 +1534,23 @@ unshare_variable (dataflow_set *set, void **slot, variable var, ...@@ -1537,34 +1534,23 @@ unshare_variable (dataflow_set *set, void **slot, variable var,
return slot; return slot;
} }
/* Add a variable from *SLOT to hash table DATA and increase its reference
count. */
static int
vars_copy_1 (void **slot, void *data)
{
htab_t dst = (htab_t) data;
variable src;
void **dstp;
src = (variable) *slot;
src->refcount++;
dstp = htab_find_slot_with_hash (dst, src->dv,
dv_htab_hash (src->dv),
INSERT);
*dstp = src;
/* Continue traversing the hash table. */
return 1;
}
/* Copy all variables from hash table SRC to hash table DST. */ /* Copy all variables from hash table SRC to hash table DST. */
static void static void
vars_copy (htab_t dst, htab_t src) vars_copy (htab_t dst, htab_t src)
{ {
htab_traverse_noresize (src, vars_copy_1, dst); htab_iterator hi;
variable var;
FOR_EACH_HTAB_ELEMENT (src, var, variable, hi)
{
void **dstp;
var->refcount++;
dstp = htab_find_slot_with_hash (dst, var->dv,
dv_htab_hash (var->dv),
INSERT);
*dstp = var;
}
} }
/* Map a decl to its main debug decl. */ /* Map a decl to its main debug decl. */
...@@ -2069,14 +2055,12 @@ variable_union_info_cmp_pos (const void *n1, const void *n2) ...@@ -2069,14 +2055,12 @@ variable_union_info_cmp_pos (const void *n1, const void *n2)
we keep the newest locations in the beginning. */ we keep the newest locations in the beginning. */
static int static int
variable_union (void **slot, void *data) variable_union (variable src, dataflow_set *set)
{ {
variable src, dst; variable dst;
void **dstp; void **dstp;
dataflow_set *set = (dataflow_set *) data;
int i, j, k; int i, j, k;
src = (variable) *slot;
dstp = shared_hash_find_slot (set->vars, src->dv); dstp = shared_hash_find_slot (set->vars, src->dv);
if (!dstp || !*dstp) if (!dstp || !*dstp)
{ {
...@@ -2102,8 +2086,8 @@ variable_union (void **slot, void *data) ...@@ -2102,8 +2086,8 @@ variable_union (void **slot, void *data)
{ {
location_chain *nodep, dnode, snode; location_chain *nodep, dnode, snode;
gcc_assert (src->n_var_parts == 1); gcc_assert (src->n_var_parts == 1
gcc_assert (dst->n_var_parts == 1); && dst->n_var_parts == 1);
snode = src->var_part[0].loc_chain; snode = src->var_part[0].loc_chain;
gcc_assert (snode); gcc_assert (snode);
...@@ -2452,7 +2436,13 @@ dataflow_set_union (dataflow_set *dst, dataflow_set *src) ...@@ -2452,7 +2436,13 @@ dataflow_set_union (dataflow_set *dst, dataflow_set *src)
dst->vars = shared_hash_copy (src->vars); dst->vars = shared_hash_copy (src->vars);
} }
else else
htab_traverse (shared_hash_htab (src->vars), variable_union, dst); {
htab_iterator hi;
variable var;
FOR_EACH_HTAB_ELEMENT (shared_hash_htab (src->vars), var, variable, hi)
variable_union (var, dst);
}
} }
/* Whether the value is currently being expanded. */ /* Whether the value is currently being expanded. */
...@@ -3323,12 +3313,10 @@ canonicalize_vars_star (void **slot, void *data) ...@@ -3323,12 +3313,10 @@ canonicalize_vars_star (void **slot, void *data)
intersection. */ intersection. */
static int static int
variable_merge_over_cur (void **s1slot, void *data) variable_merge_over_cur (variable s1var, struct dfset_merge *dsm)
{ {
struct dfset_merge *dsm = (struct dfset_merge *)data;
dataflow_set *dst = dsm->dst; dataflow_set *dst = dsm->dst;
void **dstslot; void **dstslot;
variable s1var = (variable) *s1slot;
variable s2var, dvar = NULL; variable s2var, dvar = NULL;
decl_or_value dv = s1var->dv; decl_or_value dv = s1var->dv;
bool onepart = dv_onepart_p (dv); bool onepart = dv_onepart_p (dv);
...@@ -3339,14 +3327,14 @@ variable_merge_over_cur (void **s1slot, void *data) ...@@ -3339,14 +3327,14 @@ variable_merge_over_cur (void **s1slot, void *data)
/* If the incoming onepart variable has an empty location list, then /* If the incoming onepart variable has an empty location list, then
the intersection will be just as empty. For other variables, the intersection will be just as empty. For other variables,
it's always union. */ it's always union. */
gcc_assert (s1var->n_var_parts); gcc_assert (s1var->n_var_parts
gcc_assert (s1var->var_part[0].loc_chain); && s1var->var_part[0].loc_chain);
if (!onepart) if (!onepart)
return variable_union (s1slot, dst); return variable_union (s1var, dst);
gcc_assert (s1var->n_var_parts == 1); gcc_assert (s1var->n_var_parts == 1
gcc_assert (s1var->var_part[0].offset == 0); && s1var->var_part[0].offset == 0);
dvhash = dv_htab_hash (dv); dvhash = dv_htab_hash (dv);
if (dv_is_value_p (dv)) if (dv_is_value_p (dv))
...@@ -3362,17 +3350,17 @@ variable_merge_over_cur (void **s1slot, void *data) ...@@ -3362,17 +3350,17 @@ variable_merge_over_cur (void **s1slot, void *data)
} }
dsm->src_onepart_cnt--; dsm->src_onepart_cnt--;
gcc_assert (s2var->var_part[0].loc_chain); gcc_assert (s2var->var_part[0].loc_chain
gcc_assert (s2var->n_var_parts == 1); && s2var->n_var_parts == 1
gcc_assert (s2var->var_part[0].offset == 0); && s2var->var_part[0].offset == 0);
dstslot = shared_hash_find_slot_noinsert_1 (dst->vars, dv, dvhash); dstslot = shared_hash_find_slot_noinsert_1 (dst->vars, dv, dvhash);
if (dstslot) if (dstslot)
{ {
dvar = (variable)*dstslot; dvar = (variable)*dstslot;
gcc_assert (dvar->refcount == 1); gcc_assert (dvar->refcount == 1
gcc_assert (dvar->n_var_parts == 1); && dvar->n_var_parts == 1
gcc_assert (dvar->var_part[0].offset == 0); && dvar->var_part[0].offset == 0);
nodep = &dvar->var_part[0].loc_chain; nodep = &dvar->var_part[0].loc_chain;
} }
else else
...@@ -3586,11 +3574,9 @@ variable_merge_over_cur (void **s1slot, void *data) ...@@ -3586,11 +3574,9 @@ variable_merge_over_cur (void **s1slot, void *data)
variable_merge_over_cur(). */ variable_merge_over_cur(). */
static int static int
variable_merge_over_src (void **s2slot, void *data) variable_merge_over_src (variable s2var, struct dfset_merge *dsm)
{ {
struct dfset_merge *dsm = (struct dfset_merge *)data;
dataflow_set *dst = dsm->dst; dataflow_set *dst = dsm->dst;
variable s2var = (variable) *s2slot;
decl_or_value dv = s2var->dv; decl_or_value dv = s2var->dv;
bool onepart = dv_onepart_p (dv); bool onepart = dv_onepart_p (dv);
...@@ -3617,6 +3603,8 @@ dataflow_set_merge (dataflow_set *dst, dataflow_set *src2) ...@@ -3617,6 +3603,8 @@ dataflow_set_merge (dataflow_set *dst, dataflow_set *src2)
struct dfset_merge dsm; struct dfset_merge dsm;
int i; int i;
size_t src1_elems, src2_elems; size_t src1_elems, src2_elems;
htab_iterator hi;
variable var;
src1_elems = htab_elements (shared_hash_htab (src1->vars)); src1_elems = htab_elements (shared_hash_htab (src1->vars));
src2_elems = htab_elements (shared_hash_htab (src2->vars)); src2_elems = htab_elements (shared_hash_htab (src2->vars));
...@@ -3637,10 +3625,10 @@ dataflow_set_merge (dataflow_set *dst, dataflow_set *src2) ...@@ -3637,10 +3625,10 @@ dataflow_set_merge (dataflow_set *dst, dataflow_set *src2)
dsm.cur = src1; dsm.cur = src1;
dsm.src_onepart_cnt = 0; dsm.src_onepart_cnt = 0;
htab_traverse (shared_hash_htab (dsm.src->vars), variable_merge_over_src, FOR_EACH_HTAB_ELEMENT (shared_hash_htab (dsm.src->vars), var, variable, hi)
&dsm); variable_merge_over_src (var, &dsm);
htab_traverse (shared_hash_htab (dsm.cur->vars), variable_merge_over_cur, FOR_EACH_HTAB_ELEMENT (shared_hash_htab (dsm.cur->vars), var, variable, hi)
&dsm); variable_merge_over_cur (var, &dsm);
if (dsm.src_onepart_cnt) if (dsm.src_onepart_cnt)
dst_can_be_shared = false; dst_can_be_shared = false;
...@@ -3853,8 +3841,8 @@ variable_post_merge_new_vals (void **slot, void *info) ...@@ -3853,8 +3841,8 @@ variable_post_merge_new_vals (void **slot, void *info)
att; att = att->next) att; att = att->next)
if (GET_MODE (att->loc) == GET_MODE (node->loc)) if (GET_MODE (att->loc) == GET_MODE (node->loc))
{ {
gcc_assert (att->offset == 0); gcc_assert (att->offset == 0
gcc_assert (dv_is_value_p (att->dv)); && dv_is_value_p (att->dv));
val_reset (set, att->dv); val_reset (set, att->dv);
break; break;
} }
...@@ -3920,12 +3908,12 @@ variable_post_merge_perm_vals (void **pslot, void *info) ...@@ -3920,12 +3908,12 @@ variable_post_merge_perm_vals (void **pslot, void *info)
decl_or_value dv; decl_or_value dv;
attrs att; attrs att;
gcc_assert (dv_is_value_p (pvar->dv)); gcc_assert (dv_is_value_p (pvar->dv)
gcc_assert (pvar->n_var_parts == 1); && pvar->n_var_parts == 1);
pnode = pvar->var_part[0].loc_chain; pnode = pvar->var_part[0].loc_chain;
gcc_assert (pnode); gcc_assert (pnode
gcc_assert (!pnode->next); && !pnode->next
gcc_assert (REG_P (pnode->loc)); && REG_P (pnode->loc));
dv = pvar->dv; dv = pvar->dv;
...@@ -3956,7 +3944,7 @@ variable_post_merge_perm_vals (void **pslot, void *info) ...@@ -3956,7 +3944,7 @@ variable_post_merge_perm_vals (void **pslot, void *info)
{ {
attrs_list_insert (&set->regs[REGNO (pnode->loc)], attrs_list_insert (&set->regs[REGNO (pnode->loc)],
dv, 0, pnode->loc); dv, 0, pnode->loc);
variable_union (pslot, set); variable_union (pvar, set);
} }
return 1; return 1;
...@@ -3997,9 +3985,8 @@ find_mem_expr_in_1pdv (tree expr, rtx val, htab_t vars) ...@@ -3997,9 +3985,8 @@ find_mem_expr_in_1pdv (tree expr, rtx val, htab_t vars)
if (!val) if (!val)
return NULL; return NULL;
gcc_assert (GET_CODE (val) == VALUE); gcc_assert (GET_CODE (val) == VALUE
&& !VALUE_RECURSED_INTO (val));
gcc_assert (!VALUE_RECURSED_INTO (val));
dv = dv_from_value (val); dv = dv_from_value (val);
var = (variable) htab_find_with_hash (vars, dv, dv_htab_hash (dv)); var = (variable) htab_find_with_hash (vars, dv, dv_htab_hash (dv));
...@@ -4265,10 +4252,6 @@ dataflow_set_clear_at_call (dataflow_set *set) ...@@ -4265,10 +4252,6 @@ dataflow_set_clear_at_call (dataflow_set *set)
} }
} }
/* Flag whether two dataflow sets being compared contain different data. */
static bool
dataflow_set_different_value;
static bool static bool
variable_part_different_p (variable_part *vp1, variable_part *vp2) variable_part_different_p (variable_part *vp1, variable_part *vp2)
{ {
...@@ -4303,14 +4286,13 @@ onepart_variable_different_p (variable var1, variable var2) ...@@ -4303,14 +4286,13 @@ onepart_variable_different_p (variable var1, variable var2)
if (var1 == var2) if (var1 == var2)
return false; return false;
gcc_assert (var1->n_var_parts == 1); gcc_assert (var1->n_var_parts == 1
gcc_assert (var2->n_var_parts == 1); && var2->n_var_parts == 1);
lc1 = var1->var_part[0].loc_chain; lc1 = var1->var_part[0].loc_chain;
lc2 = var2->var_part[0].loc_chain; lc2 = var2->var_part[0].loc_chain;
gcc_assert (lc1); gcc_assert (lc1 && lc2);
gcc_assert (lc2);
while (lc1 && lc2) while (lc1 && lc2)
{ {
...@@ -4343,8 +4325,8 @@ variable_different_p (variable var1, variable var2) ...@@ -4343,8 +4325,8 @@ variable_different_p (variable var1, variable var2)
/* One-part values have locations in a canonical order. */ /* One-part values have locations in a canonical order. */
if (i == 0 && var1->var_part[i].offset == 0 && dv_onepart_p (var1->dv)) if (i == 0 && var1->var_part[i].offset == 0 && dv_onepart_p (var1->dv))
{ {
gcc_assert (var1->n_var_parts == 1); gcc_assert (var1->n_var_parts == 1
gcc_assert (dv_as_opaque (var1->dv) == dv_as_opaque (var2->dv)); && dv_as_opaque (var1->dv) == dv_as_opaque (var2->dv));
return onepart_variable_different_p (var1, var2); return onepart_variable_different_p (var1, var2);
} }
if (variable_part_different_p (&var1->var_part[i], &var2->var_part[i])) if (variable_part_different_p (&var1->var_part[i], &var2->var_part[i]))
...@@ -4355,56 +4337,14 @@ variable_different_p (variable var1, variable var2) ...@@ -4355,56 +4337,14 @@ variable_different_p (variable var1, variable var2)
return false; return false;
} }
/* Compare variable *SLOT with the same variable in hash table DATA
and set DATAFLOW_SET_DIFFERENT_VALUE if they are different. */
static int
dataflow_set_different_1 (void **slot, void *data)
{
htab_t htab = (htab_t) data;
variable var1, var2;
var1 = (variable) *slot;
var2 = (variable) htab_find_with_hash (htab, var1->dv,
dv_htab_hash (var1->dv));
if (!var2)
{
dataflow_set_different_value = true;
if (dump_file && (dump_flags & TDF_DETAILS))
{
fprintf (dump_file, "dataflow difference found: removal of:\n");
dump_var (var1);
}
/* Stop traversing the hash table. */
return 0;
}
if (variable_different_p (var1, var2))
{
dataflow_set_different_value = true;
if (dump_file && (dump_flags & TDF_DETAILS))
{
fprintf (dump_file, "dataflow difference found: old and new follow:\n");
dump_var (var1);
dump_var (var2);
}
/* Stop traversing the hash table. */
return 0;
}
/* Continue traversing the hash table. */
return 1;
}
/* Return true if dataflow sets OLD_SET and NEW_SET differ. */ /* Return true if dataflow sets OLD_SET and NEW_SET differ. */
static bool static bool
dataflow_set_different (dataflow_set *old_set, dataflow_set *new_set) dataflow_set_different (dataflow_set *old_set, dataflow_set *new_set)
{ {
htab_iterator hi;
variable var1;
if (old_set->vars == new_set->vars) if (old_set->vars == new_set->vars)
return false; return false;
...@@ -4412,14 +4352,38 @@ dataflow_set_different (dataflow_set *old_set, dataflow_set *new_set) ...@@ -4412,14 +4352,38 @@ dataflow_set_different (dataflow_set *old_set, dataflow_set *new_set)
!= htab_elements (shared_hash_htab (new_set->vars))) != htab_elements (shared_hash_htab (new_set->vars)))
return true; return true;
dataflow_set_different_value = false; FOR_EACH_HTAB_ELEMENT (shared_hash_htab (old_set->vars), var1, variable, hi)
{
htab_t htab = shared_hash_htab (new_set->vars);
variable var2 = (variable) htab_find_with_hash (htab, var1->dv,
dv_htab_hash (var1->dv));
if (!var2)
{
if (dump_file && (dump_flags & TDF_DETAILS))
{
fprintf (dump_file, "dataflow difference found: removal of:\n");
dump_var (var1);
}
return true;
}
if (variable_different_p (var1, var2))
{
if (dump_file && (dump_flags & TDF_DETAILS))
{
fprintf (dump_file, "dataflow difference found: "
"old and new follow:\n");
dump_var (var1);
dump_var (var2);
}
return true;
}
}
htab_traverse (shared_hash_htab (old_set->vars), dataflow_set_different_1,
shared_hash_htab (new_set->vars));
/* No need to traverse the second hashtab, if both have the same number /* No need to traverse the second hashtab, if both have the same number
of elements and the second one had all entries found in the first one, of elements and the second one had all entries found in the first one,
then it can't have any extra entries. */ then it can't have any extra entries. */
return dataflow_set_different_value; return false;
} }
/* Free the contents of dataflow set SET. */ /* Free the contents of dataflow set SET. */
...@@ -7469,8 +7433,8 @@ emit_notes_for_differences_1 (void **slot, void *data) ...@@ -7469,8 +7433,8 @@ emit_notes_for_differences_1 (void **slot, void *data)
{ {
location_chain lc1, lc2; location_chain lc1, lc2;
gcc_assert (old_var->n_var_parts == 1); gcc_assert (old_var->n_var_parts == 1
gcc_assert (new_var->n_var_parts == 1); && new_var->n_var_parts == 1);
lc1 = old_var->var_part[0].loc_chain; lc1 = old_var->var_part[0].loc_chain;
lc2 = new_var->var_part[0].loc_chain; lc2 = new_var->var_part[0].loc_chain;
while (lc1 while (lc1
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment