From 9099772ee965a8265d45a7fdade433606ccc5bb3 Mon Sep 17 00:00:00 2001 From: Matthias Braun Date: Tue, 27 Jul 2010 17:57:56 +0000 Subject: [PATCH] use custom spillslot coalescer so int->float and float->int gets proper spillslots [r27824] --- ir/be/sparc/bearch_sparc.c | 50 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 48 insertions(+), 2 deletions(-) diff --git a/ir/be/sparc/bearch_sparc.c b/ir/be/sparc/bearch_sparc.c index b6f568017..e1cd752a1 100644 --- a/ir/be/sparc/bearch_sparc.c +++ b/ir/be/sparc/bearch_sparc.c @@ -230,11 +230,57 @@ static void sparc_after_ra_walker(ir_node *block, void *data) } } +static void sparc_collect_frame_entity_nodes(ir_node *node, void *data) +{ + be_fec_env_t *env = data; + const ir_mode *mode; + int align; + ir_entity *entity; + const sparc_load_store_attr_t *attr; + + if (be_is_Reload(node) && be_get_frame_entity(node) == NULL) { + mode = get_irn_mode(node); + align = get_mode_size_bytes(mode); + be_node_needs_frame_entity(env, node, mode, align); + return; + } + + if (!is_sparc_Ld(node) && !is_sparc_Ldf(node)) + return; + + attr = get_sparc_load_store_attr_const(node); + entity = attr->entity; + mode = attr->load_store_mode; + align = get_mode_size_bytes(mode); + if (entity != NULL) + return; + if (!attr->is_frame_entity) + return; + be_node_needs_frame_entity(env, node, mode, align); +} + +static void sparc_set_frame_entity(ir_node *node, ir_entity *entity) +{ + if (is_be_node(node)) { + be_node_set_frame_entity(node, entity); + } else { + /* we only say be_node_needs_frame_entity on nodes with load_store + * attributes, so this should be fine */ + sparc_load_store_attr_t *attr = get_sparc_load_store_attr(node); + attr->entity = entity; + } +} + static void sparc_after_ra(void *self) { - sparc_code_gen_t *cg = self; - be_coalesce_spillslots(cg->irg); + sparc_code_gen_t *cg = self; + ir_graph *irg = cg->irg; + be_fec_env_t *fec_env = be_new_frame_entity_coalescer(irg); + + irg_walk_graph(irg, NULL, sparc_collect_frame_entity_nodes, fec_env); + be_assign_entities(fec_env, sparc_set_frame_entity); + be_free_frame_entity_coalescer(fec_env); irg_block_walk_graph(cg->irg, NULL, sparc_after_ra_walker, NULL); } -- 2.20.1