Commit 11599d14 by Josef Zlomek Committed by Josef Zlomek

var-tracking.c (vars_copy_1): Cleanup and speedup chain operations.

	* var-tracking.c (vars_copy_1): Cleanup and speedup chain operations.
	(vars_copy): Likewise.
	(variable_union): Likewise.
	(set_variable_part): Likewise.
	(delete_variable_part): Likewise.

From-SVN: r79304
parent 71cc389b
2004-03-11 Josef Zlomek <zlomekj@suse.cz>
* var-tracking.c (vars_copy_1): Cleanup and speedup chain operations.
(vars_copy): Likewise.
(variable_union): Likewise.
(set_variable_part): Likewise.
(delete_variable_part): Likewise.
2004-03-11 Kazu Hirata <kazu@cs.umass.edu> 2004-03-11 Kazu Hirata <kazu@cs.umass.edu>
* c-typeck.c, combine.c, cse.c, dominance.c, et-forest.h, * c-typeck.c, combine.c, cse.c, dominance.c, et-forest.h,
......
...@@ -752,10 +752,11 @@ vars_copy_1 (void **slot, void *data) ...@@ -752,10 +752,11 @@ vars_copy_1 (void **slot, void *data)
for (i = 0; i < var->n_var_parts; i++) for (i = 0; i < var->n_var_parts; i++)
{ {
location_chain last, node; location_chain node;
location_chain *nextp;
var->var_part[i].offset = src->var_part[i].offset; var->var_part[i].offset = src->var_part[i].offset;
last = NULL; nextp = &var->var_part[i].loc_chain;
for (node = src->var_part[i].loc_chain; node; node = node->next) for (node = src->var_part[i].loc_chain; node; node = node->next)
{ {
location_chain new_lc; location_chain new_lc;
...@@ -764,11 +765,8 @@ vars_copy_1 (void **slot, void *data) ...@@ -764,11 +765,8 @@ vars_copy_1 (void **slot, void *data)
new_lc->next = NULL; new_lc->next = NULL;
new_lc->loc = node->loc; new_lc->loc = node->loc;
if (last) *nextp = new_lc;
last->next = new_lc; nextp = &new_lc->next;
else
var->var_part[i].loc_chain = new_lc;
last = new_lc;
} }
/* We are at the basic block boundary when copying variable description /* We are at the basic block boundary when copying variable description
...@@ -798,33 +796,29 @@ vars_copy (htab_t dst, htab_t src) ...@@ -798,33 +796,29 @@ vars_copy (htab_t dst, htab_t src)
static void static void
var_reg_delete_and_set (dataflow_set *set, rtx loc) var_reg_delete_and_set (dataflow_set *set, rtx loc)
{ {
attrs *reg = &set->regs[REGNO (loc)];
tree decl = REG_EXPR (loc); tree decl = REG_EXPR (loc);
HOST_WIDE_INT offset = REG_OFFSET (loc); HOST_WIDE_INT offset = REG_OFFSET (loc);
attrs node, prev, next; attrs node, next;
attrs *nextp;
prev = NULL; nextp = &set->regs[REGNO (loc)];
for (node = *reg; node; node = next) for (node = *nextp; node; node = next)
{ {
next = node->next; next = node->next;
if (node->decl != decl || node->offset != offset) if (node->decl != decl || node->offset != offset)
{ {
delete_variable_part (set, node->loc, node->decl, node->offset); delete_variable_part (set, node->loc, node->decl, node->offset);
if (prev)
prev->next = next;
else
*reg = next;
pool_free (attrs_pool, node); pool_free (attrs_pool, node);
*nextp = next;
} }
else else
{ {
node->loc = loc; node->loc = loc;
prev = node; nextp = &node->next;
} }
} }
if (*reg == NULL) if (set->regs[REGNO (loc)] == NULL)
attrs_list_insert (reg, decl, offset, loc); attrs_list_insert (&set->regs[REGNO (loc)], decl, offset, loc);
set_variable_part (set, loc, decl, offset); set_variable_part (set, loc, decl, offset);
} }
...@@ -1112,9 +1106,10 @@ variable_union (void **slot, void *data) ...@@ -1112,9 +1106,10 @@ variable_union (void **slot, void *data)
&& src->var_part[i].offset > dst->var_part[j].offset) && src->var_part[i].offset > dst->var_part[j].offset)
|| j < 0) || j < 0)
{ {
location_chain last = NULL; location_chain *nextp;
/* Copy the chain from SRC. */ /* Copy the chain from SRC. */
nextp = &dst->var_part[k].loc_chain;
for (node = src->var_part[i].loc_chain; node; node = node->next) for (node = src->var_part[i].loc_chain; node; node = node->next)
{ {
location_chain new_lc; location_chain new_lc;
...@@ -1123,11 +1118,8 @@ variable_union (void **slot, void *data) ...@@ -1123,11 +1118,8 @@ variable_union (void **slot, void *data)
new_lc->next = NULL; new_lc->next = NULL;
new_lc->loc = node->loc; new_lc->loc = node->loc;
if (last) *nextp = new_lc;
last->next = new_lc; nextp = &new_lc->next;
else
dst->var_part[k].loc_chain = new_lc;
last = new_lc;
} }
dst->var_part[k].offset = src->var_part[i].offset; dst->var_part[k].offset = src->var_part[i].offset;
...@@ -1863,7 +1855,8 @@ static void ...@@ -1863,7 +1855,8 @@ static void
set_variable_part (dataflow_set *set, rtx loc, tree decl, HOST_WIDE_INT offset) set_variable_part (dataflow_set *set, rtx loc, tree decl, HOST_WIDE_INT offset)
{ {
int pos, low, high; int pos, low, high;
location_chain node, prev, next; location_chain node, next;
location_chain *nextp;
variable var; variable var;
void **slot; void **slot;
...@@ -1922,7 +1915,7 @@ set_variable_part (dataflow_set *set, rtx loc, tree decl, HOST_WIDE_INT offset) ...@@ -1922,7 +1915,7 @@ set_variable_part (dataflow_set *set, rtx loc, tree decl, HOST_WIDE_INT offset)
} }
/* Delete the location from list. */ /* Delete the location from list. */
prev = NULL; nextp = &var->var_part[pos].loc_chain;
for (node = var->var_part[pos].loc_chain; node; node = next) for (node = var->var_part[pos].loc_chain; node; node = next)
{ {
next = node->next; next = node->next;
...@@ -1930,15 +1923,12 @@ set_variable_part (dataflow_set *set, rtx loc, tree decl, HOST_WIDE_INT offset) ...@@ -1930,15 +1923,12 @@ set_variable_part (dataflow_set *set, rtx loc, tree decl, HOST_WIDE_INT offset)
&& REGNO (node->loc) == REGNO (loc)) && REGNO (node->loc) == REGNO (loc))
|| rtx_equal_p (node->loc, loc)) || rtx_equal_p (node->loc, loc))
{ {
if (prev)
prev->next = next;
else
var->var_part[pos].loc_chain = next;
pool_free (loc_chain_pool, node); pool_free (loc_chain_pool, node);
*nextp = next;
break; break;
} }
else else
prev = node; nextp = &node->next;
} }
/* Add the location to the beginning. */ /* Add the location to the beginning. */
...@@ -1987,27 +1977,25 @@ delete_variable_part (dataflow_set *set, rtx loc, tree decl, ...@@ -1987,27 +1977,25 @@ delete_variable_part (dataflow_set *set, rtx loc, tree decl,
if (pos < var->n_var_parts && var->var_part[pos].offset == offset) if (pos < var->n_var_parts && var->var_part[pos].offset == offset)
{ {
location_chain node, prev, next; location_chain node, next;
location_chain *nextp;
bool changed; bool changed;
/* Delete the location part. */ /* Delete the location part. */
prev = NULL; nextp = &var->var_part[pos].loc_chain;
for (node = var->var_part[pos].loc_chain; node; node = next) for (node = *nextp; node; node = next)
{ {
next = node->next; next = node->next;
if ((GET_CODE (node->loc) == REG && GET_CODE (loc) == REG if ((GET_CODE (node->loc) == REG && GET_CODE (loc) == REG
&& REGNO (node->loc) == REGNO (loc)) && REGNO (node->loc) == REGNO (loc))
|| rtx_equal_p (node->loc, loc)) || rtx_equal_p (node->loc, loc))
{ {
if (prev)
prev->next = next;
else
var->var_part[pos].loc_chain = next;
pool_free (loc_chain_pool, node); pool_free (loc_chain_pool, node);
*nextp = next;
break; break;
} }
else else
prev = node; nextp = &node->next;
} }
/* If we have deleted the location which was last emitted /* If we have deleted the location which was last emitted
......
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