Commit 29c77ce9 authored by Matthias Braun's avatar Matthias Braun
Browse files

benewalloc: fix enforce_constraints sometimes looking at the original value...

benewalloc: fix enforce_constraints sometimes looking at the original value instead of the current copy of a value

[r26365]
parent eba9656a
...@@ -580,7 +580,7 @@ static void permutate_values(ir_nodeset_t *live_nodes, ir_node *before, ...@@ -580,7 +580,7 @@ static void permutate_values(ir_nodeset_t *live_nodes, ir_node *before,
ir_node *block; ir_node *block;
unsigned r; unsigned r;
/* create a list of permutations. Leave out fix points. */ /* determine how often each source register needs to be read */
for (r = 0; r < n_regs; ++r) { for (r = 0; r < n_regs; ++r) {
unsigned old_reg = permutation[r]; unsigned old_reg = permutation[r];
ir_node *value; ir_node *value;
...@@ -594,15 +594,6 @@ static void permutate_values(ir_nodeset_t *live_nodes, ir_node *before, ...@@ -594,15 +594,6 @@ static void permutate_values(ir_nodeset_t *live_nodes, ir_node *before,
} }
++n_used[old_reg]; ++n_used[old_reg];
/* no need to do anything for a fixpoint */
if (old_reg == r)
continue;
/* free occupation infos, we'll add the values back later */
if (live_nodes != NULL) {
ir_nodeset_remove(live_nodes, value);
}
} }
block = get_nodes_block(before); block = get_nodes_block(before);
...@@ -642,6 +633,9 @@ static void permutate_values(ir_nodeset_t *live_nodes, ir_node *before, ...@@ -642,6 +633,9 @@ static void permutate_values(ir_nodeset_t *live_nodes, ir_node *before,
assert(n_used[old_r] > 0); assert(n_used[old_r] > 0);
--n_used[old_r]; --n_used[old_r];
if (n_used[old_r] == 0) { if (n_used[old_r] == 0) {
if (live_nodes != NULL) {
ir_nodeset_remove(live_nodes, src);
}
free_reg_of_value(src); free_reg_of_value(src);
} }
...@@ -692,9 +686,6 @@ static void permutate_values(ir_nodeset_t *live_nodes, ir_node *before, ...@@ -692,9 +686,6 @@ static void permutate_values(ir_nodeset_t *live_nodes, ir_node *before,
mark_as_copy_of(proj0, in[0]); mark_as_copy_of(proj0, in[0]);
reg = arch_register_for_index(cls, old_r); reg = arch_register_for_index(cls, old_r);
use_reg(proj0, reg); use_reg(proj0, reg);
if (live_nodes != NULL) {
ir_nodeset_insert(live_nodes, proj0);
}
proj1 = new_r_Proj(block, perm, get_irn_mode(in[1]), 1); proj1 = new_r_Proj(block, perm, get_irn_mode(in[1]), 1);
mark_as_copy_of(proj1, in[1]); mark_as_copy_of(proj1, in[1]);
...@@ -707,7 +698,10 @@ static void permutate_values(ir_nodeset_t *live_nodes, ir_node *before, ...@@ -707,7 +698,10 @@ static void permutate_values(ir_nodeset_t *live_nodes, ir_node *before,
permutation[r] = r2; permutation[r] = r2;
/* if we have reached a fixpoint update data structures */ /* if we have reached a fixpoint update data structures */
if (live_nodes != NULL && r == r2) { if (live_nodes != NULL) {
ir_nodeset_remove(live_nodes, in[0]);
ir_nodeset_remove(live_nodes, in[1]);
ir_nodeset_remove(live_nodes, proj0);
ir_nodeset_insert(live_nodes, proj1); ir_nodeset_insert(live_nodes, proj1);
} }
} }
...@@ -745,6 +739,28 @@ static void free_last_uses(ir_nodeset_t *live_nodes, ir_node *node) ...@@ -745,6 +739,28 @@ static void free_last_uses(ir_nodeset_t *live_nodes, ir_node *node)
} }
} }
/**
* change inputs of a node to the current value (copies/perms)
*/
static void rewire_inputs(ir_node *node)
{
int i;
int arity = get_irn_arity(node);
for (i = 0; i < arity; ++i) {
ir_node *op = get_irn_n(node, i);
allocation_info_t *info;
if (!arch_irn_consider_in_reg_alloc(cls, op))
continue;
info = get_allocation_info(op);
if (info->current_value != op) {
set_irn_n(node, i, info->current_value);
}
}
}
/** /**
* Create a bitset of registers occupied with value living through an * Create a bitset of registers occupied with value living through an
* instruction * instruction
...@@ -761,6 +777,8 @@ static void determine_live_through_regs(unsigned *bitset, ir_node *node) ...@@ -761,6 +777,8 @@ static void determine_live_through_regs(unsigned *bitset, ir_node *node)
const assignment_t *assignment = &assignments[r]; const assignment_t *assignment = &assignments[r];
if (assignment->value == NULL) if (assignment->value == NULL)
continue; continue;
if (!rbitset_is_set(normal_regs, r))
continue;
rbitset_set(bitset, r); rbitset_set(bitset, r);
} }
...@@ -775,6 +793,7 @@ static void determine_live_through_regs(unsigned *bitset, ir_node *node) ...@@ -775,6 +793,7 @@ static void determine_live_through_regs(unsigned *bitset, ir_node *node)
continue; continue;
op = get_irn_n(node, i); op = get_irn_n(node, i);
op = get_allocation_info(op)->current_value;
reg = arch_get_irn_register(op); reg = arch_get_irn_register(op);
rbitset_clear(bitset, arch_register_get_index(reg)); rbitset_clear(bitset, arch_register_get_index(reg));
} }
...@@ -880,7 +899,11 @@ static void enforce_constraints(ir_nodeset_t *live_nodes, ir_node *node) ...@@ -880,7 +899,11 @@ static void enforce_constraints(ir_nodeset_t *live_nodes, ir_node *node)
} }
/* at this point we have to construct a bipartite matching problem to see /* at this point we have to construct a bipartite matching problem to see
which values should go to which registers */ * which values should go to which registers
* Note: We're building the matrix in "reverse" - source registers are
* right, destinations at l because this will produce the solution
* in the format required for permutate_values.
*/
bp = hungarian_new(n_regs, n_regs, HUNGARIAN_MATCH_PERFECT); bp = hungarian_new(n_regs, n_regs, HUNGARIAN_MATCH_PERFECT);
/* add all combinations, then remove not allowed ones */ /* add all combinations, then remove not allowed ones */
...@@ -917,6 +940,7 @@ static void enforce_constraints(ir_nodeset_t *live_nodes, ir_node *node) ...@@ -917,6 +940,7 @@ static void enforce_constraints(ir_nodeset_t *live_nodes, ir_node *node)
continue; continue;
limited = req->limited; limited = req->limited;
op = get_allocation_info(op)->current_value;
reg = arch_get_irn_register(op); reg = arch_get_irn_register(op);
current_reg = arch_register_get_index(reg); current_reg = arch_register_get_index(reg);
for (r = 0; r < n_regs; ++r) { for (r = 0; r < n_regs; ++r) {
...@@ -934,11 +958,11 @@ static void enforce_constraints(ir_nodeset_t *live_nodes, ir_node *node) ...@@ -934,11 +958,11 @@ static void enforce_constraints(ir_nodeset_t *live_nodes, ir_node *node)
assert(res == 0); assert(res == 0);
#if 0 #if 0
printf("Swap result:"); fprintf(stderr, "Swap result:");
for (i = 0; i < (int) n_regs; ++i) { for (i = 0; i < (int) n_regs; ++i) {
printf(" %d", assignment[i]); fprintf(stderr, " %d", assignment[i]);
} }
printf("\n"); fprintf(stderr, "\n");
#endif #endif
hungarian_free(bp); hungarian_free(bp);
...@@ -1082,28 +1106,6 @@ static void handle_phi_prefs(ir_node *phi) ...@@ -1082,28 +1106,6 @@ static void handle_phi_prefs(ir_node *phi)
} }
} }
/**
* change inputs of a node to the current value (copies/perms)
*/
static void rewire_inputs(ir_node *node)
{
int i;
int arity = get_irn_arity(node);
for (i = 0; i < arity; ++i) {
ir_node *op = get_irn_n(node, i);
allocation_info_t *info;
if (!arch_irn_consider_in_reg_alloc(cls, op))
continue;
info = get_allocation_info(op);
if (info->current_value != op) {
set_irn_n(node, i, info->current_value);
}
}
}
/** /**
* Walker: assign registers to all nodes of a block that * Walker: assign registers to all nodes of a block that
* need registers from the currently considered register class. * need registers from the currently considered register class.
...@@ -1399,12 +1401,11 @@ static void be_straight_alloc(be_irg_t *new_birg) ...@@ -1399,12 +1401,11 @@ static void be_straight_alloc(be_irg_t *new_birg)
* now */ * now */
/* TODO: test liveness_introduce */ /* TODO: test liveness_introduce */
be_liveness_invalidate(lv); be_liveness_invalidate(lv);
free(normal_regs);
stat_ev_ctx_pop("regcls"); stat_ev_ctx_pop("regcls");
} }
free(normal_regs);
BE_TIMER_PUSH(t_ra_spill_apply); BE_TIMER_PUSH(t_ra_spill_apply);
be_abi_fix_stack_nodes(birg->abi); be_abi_fix_stack_nodes(birg->abi);
BE_TIMER_POP(t_ra_spill_apply); BE_TIMER_POP(t_ra_spill_apply);
......
Supports Markdown
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