From 6aa46484be1dc63021ade76137a88ad8281e049f Mon Sep 17 00:00:00 2001 From: =?utf8?q?Christian=20W=C3=BCrdig?= Date: Wed, 25 Jan 2006 13:20:25 +0000 Subject: [PATCH] splittet be lowering into two phases (before and after regalloc) --- ir/be/bechordal_main.c | 7 ++++-- ir/be/belower.c | 55 ++++++++++++++++++++++++++++++++++-------- ir/be/belower.h | 3 ++- 3 files changed, 52 insertions(+), 13 deletions(-) diff --git a/ir/be/bechordal_main.c b/ir/be/bechordal_main.c index 592bfa6bb..3ace53564 100644 --- a/ir/be/bechordal_main.c +++ b/ir/be/bechordal_main.c @@ -241,6 +241,9 @@ static void be_ra_chordal_main(const be_main_env_t *main_env, ir_graph *irg) obstack_init(&chordal_env.obst); + lower_nodes_before_ra(&chordal_env, 0); + dump(BE_CH_DUMP_LOWER, irg, NULL, "-belower-before-ra", dump_ir_block_graph_sched); + /* Perform the following for each register class. */ for(j = 0, m = arch_isa_get_n_reg_class(isa); j < m; ++j) { chordal_env.border_heads = pmap_create(); @@ -305,8 +308,8 @@ static void be_ra_chordal_main(const be_main_env_t *main_env, ir_graph *irg) dump(BE_CH_DUMP_LOWER, irg, NULL, "-spilloff", dump_ir_block_graph_sched); - lower_nodes(&chordal_env, options.lower_perm_method == BE_CH_LOWER_PERM_COPY ? 1 : 0); - dump(BE_CH_DUMP_LOWER, irg, NULL, "-belower", dump_ir_block_graph_sched); + lower_nodes_after_ra(&chordal_env, options.lower_perm_method == BE_CH_LOWER_PERM_COPY ? 1 : 0); + dump(BE_CH_DUMP_LOWER, irg, NULL, "-belower-after-ra", dump_ir_block_graph_sched); be_free_dominance_frontiers(chordal_env.dom_front); obstack_free(&chordal_env.obst, NULL); diff --git a/ir/be/belower.c b/ir/be/belower.c index f4bfd78c7..1acdc0ad2 100644 --- a/ir/be/belower.c +++ b/ir/be/belower.c @@ -162,7 +162,7 @@ static perm_cycle_t *get_perm_cycle(perm_cycle_t *cycle, reg_pair_t *pairs, int int head = pairs[start].in_reg->index; int cur_idx = pairs[start].out_reg->index; int cur_pair_idx = start; - int n_pairs_done = get_n_checked_pairs(pairs, n) + 1; + int n_pairs_done = get_n_checked_pairs(pairs, n); int idx; /* assume worst case: all remaining pairs build a cycle or chain */ @@ -174,6 +174,7 @@ static perm_cycle_t *get_perm_cycle(perm_cycle_t *cycle, reg_pair_t *pairs, int /* mark the first pair as checked */ pairs[start].checked = 1; + n_pairs_done++; idx = 2; /* check for cycle or end of a chain */ @@ -315,8 +316,8 @@ static void lower_perm_node(ir_node *irn, void *walk_env) { //TODO: - iff PERM_CYCLE && do_copy -> determine free temp reg and insert copy to/from it before/after // the copy cascade (this reduces the cycle into a chain) - /* build copy/swap nodes from back to front */ - for (i = cycle->n_elems - 2; i >= 0; i--) { + /* build copy/swap nodes */ + for (i = 0; i < cycle->n_elems - 1; i++) { arg1 = get_node_for_register(pairs, n, cycle->elems[i], 0); arg2 = get_node_for_register(pairs, n, cycle->elems[i + 1], 0); @@ -530,6 +531,25 @@ static void lower_spill_reload(ir_node *irn, void *walk_env) { } +/** + * Calls the corresponding lowering function for the node. + * + * @param irn The node to be checked for lowering + * @param walk_env The walker environment + */ +static void lower_nodes_before_ra_walker(ir_node *irn, void *walk_env) { + lower_env_t *env = walk_env; + const arch_env_t *arch_env = env->chord_env->main_env->arch_env; + + if (!is_Block(irn) && !is_Proj(irn)) { + if (is_Call(arch_env, irn)) { + lower_call_node(irn, walk_env); + } + } + + return; +} + /** * Calls the corresponding lowering function for the node. @@ -537,7 +557,7 @@ static void lower_spill_reload(ir_node *irn, void *walk_env) { * @param irn The node to be checked for lowering * @param walk_env The walker environment */ -static void lower_nodes_walker(ir_node *irn, void *walk_env) { +static void lower_nodes_after_ra_walker(ir_node *irn, void *walk_env) { lower_env_t *env = walk_env; const arch_env_t *arch_env = env->chord_env->main_env->arch_env; @@ -545,9 +565,6 @@ static void lower_nodes_walker(ir_node *irn, void *walk_env) { if (is_Perm(arch_env, irn)) { lower_perm_node(irn, walk_env); } - else if (is_Call(arch_env, irn)) { - lower_call_node(irn, walk_env); - } else if (be_is_Spill(irn) || be_is_Reload(irn)) { lower_spill_reload(irn, walk_env); } @@ -557,19 +574,37 @@ static void lower_nodes_walker(ir_node *irn, void *walk_env) { } /** - * Walks over all blocks in an irg and performs some lowering. + * Walks over all blocks in an irg and performs lowering need + * to be done before register allocation (e.g. call lowering). + * + * @param chord_env The chordal environment containing the irg + * @param do_copy 1 == resolve cycles with a free reg if available + */ +void lower_nodes_before_ra(be_chordal_env_t *chord_env, int do_copy) { + lower_env_t env; + + env.chord_env = chord_env; + env.do_copy = do_copy; + env.dbg_module = firm_dbg_register("ir.be.lower"); + + irg_walk_blkwise_graph(chord_env->irg, NULL, lower_nodes_before_ra_walker, &env); +} + +/** + * Walks over all blocks in an irg and performs lowering need to be + * done after register allocation (e.g. perm and spill/reload lowering). * * @param chord_env The chordal environment containing the irg * @param do_copy 1 == resolve cycles with a free reg if available */ -void lower_nodes(be_chordal_env_t *chord_env, int do_copy) { +void lower_nodes_after_ra(be_chordal_env_t *chord_env, int do_copy) { lower_env_t env; env.chord_env = chord_env; env.do_copy = do_copy; env.dbg_module = firm_dbg_register("ir.be.lower"); - irg_walk_blkwise_graph(chord_env->irg, NULL, lower_nodes_walker, &env); + irg_walk_blkwise_graph(chord_env->irg, NULL, lower_nodes_after_ra_walker, &env); } #undef is_Perm diff --git a/ir/be/belower.h b/ir/be/belower.h index e6c1e4fc8..bfbc15bdb 100644 --- a/ir/be/belower.h +++ b/ir/be/belower.h @@ -10,6 +10,7 @@ #include "bechordal.h" -void lower_nodes(be_chordal_env_t *chord_env, int do_copy); +void lower_nodes_before_ra(be_chordal_env_t *chord_env, int do_copy); +void lower_nodes_after_ra(be_chordal_env_t *chord_env, int do_copy); #endif /* _BELOWER_H_ */ -- 2.20.1