From: Matthias Braun Date: Fri, 8 Jun 2007 18:15:33 +0000 (+0000) Subject: we temporarily need registers for reloaded values X-Git-Url: http://nsz.repo.hu/git/?a=commitdiff_plain;h=d6ed605231ff34715990fa8f164ebbfb5f03fe7f;p=libfirm we temporarily need registers for reloaded values [r14384] --- diff --git a/ir/be/bespilldaemel.c b/ir/be/bespilldaemel.c index 48dfa6119..eecc35748 100644 --- a/ir/be/bespilldaemel.c +++ b/ir/be/bespilldaemel.c @@ -143,6 +143,7 @@ void do_spilling(daemel_env_t *env, ir_nodeset_t *nodes, ir_node *node) { size_t node_count = ir_nodeset_size(nodes); size_t additional_defines = 0; + size_t reload_values = 0; int registers = env->n_regs; const arch_env_t *arch_env = env->arch_env; const arch_register_class_t *cls = env->cls; @@ -152,6 +153,7 @@ void do_spilling(daemel_env_t *env, ir_nodeset_t *nodes, ir_node *node) int spills_needed; size_t cand_idx; ir_node *n; + const bitset_t *spilled_nodes = env->spilled_nodes; /* mode_T nodes define several values at once. Count them */ if(get_irn_mode(node) == mode_T) { @@ -165,6 +167,17 @@ void do_spilling(daemel_env_t *env, ir_nodeset_t *nodes, ir_node *node) } } + /* we might temporarily need registers for reloaded values */ + arity = get_irn_arity(node); + for(i = 0; i < arity; ++i) { + ir_node *pred = get_irn_n(node, i); + if(bitset_is_set(spilled_nodes, get_irn_idx(pred))) + ++reload_values; + } + + if(reload_values > additional_defines) + additional_defines = reload_values; + spills_needed = (node_count + additional_defines) - registers; if(spills_needed <= 0) return; @@ -189,7 +202,6 @@ void do_spilling(daemel_env_t *env, ir_nodeset_t *nodes, ir_node *node) /* spill cheapest ones */ cand_idx = 0; - arity = get_irn_arity(node); while(spills_needed > 0) { spill_candidate_t *candidate = &candidates[cand_idx]; ir_node *cand_node = candidate->node;