From 5a840be89d3e0a2af317626671bf1c8974a40da7 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Christian=20W=C3=BCrdig?= Date: Fri, 23 Jun 2006 10:39:17 +0000 Subject: [PATCH] fixed handling of unused load results fixed indents respect dump flag settings --- ir/be/ia32/bearch_ia32.c | 37 +++++++++++++++++++++++++++++++++---- ir/be/ia32/bearch_ia32_t.h | 1 + ir/be/ia32/ia32_gen_decls.c | 2 +- ir/be/ia32/ia32_transform.c | 22 ++++++++++++++++------ 4 files changed, 51 insertions(+), 11 deletions(-) diff --git a/ir/be/ia32/bearch_ia32.c b/ir/be/ia32/bearch_ia32.c index 5f87b3eff..a2e86b49a 100644 --- a/ir/be/ia32/bearch_ia32.c +++ b/ir/be/ia32/bearch_ia32.c @@ -697,12 +697,17 @@ static void ia32_prepare_graph(void *self) { dom = be_compute_dominance_frontiers(cg->irg); irg_walk_blkwise_graph(cg->irg, NULL, ia32_transform_node, cg); be_free_dominance_frontiers(dom); - be_dump(cg->irg, "-transformed", dump_ir_block_graph_sched); + + if (cg->dump) + be_dump(cg->irg, "-transformed", dump_ir_block_graph_sched); /* 3rd: optimize address mode */ FIRM_DBG_REGISTER(cg->mod, "firm.be.ia32.am"); ia32_optimize_addressmode(cg); - be_dump(cg->irg, "-am", dump_ir_block_graph_sched); + + if (cg->dump) + be_dump(cg->irg, "-am", dump_ir_block_graph_sched); + DEBUG_ONLY(cg->mod = old_mod;) } @@ -1049,7 +1054,8 @@ static void ia32_codegen(void *self) { ir_graph *irg = cg->irg; ia32_finish_irg(irg, cg); - be_dump(irg, "-finished", dump_ir_block_graph_sched); + if (cg->dump) + be_dump(irg, "-finished", dump_ir_block_graph_sched); ia32_gen_routine(cg->isa->out, irg, cg); cur_reg_set = NULL; @@ -1093,6 +1099,7 @@ static void *ia32_cg_init(const be_irg_t *birg) { cg->gp_to_fp = NULL; cg->fp_kind = isa->fp_kind; cg->used_fp = fp_none; + cg->dump = (birg->main_env->options->dump_flags & DUMP_BE) ? 1 : 0; FIRM_DBG_REGISTER(cg->mod, "firm.be.ia32.cg"); @@ -1399,8 +1406,30 @@ const arch_irn_handler_t *ia32_get_irn_handler(const void *self) { return &ia32_irn_handler; } +/* returns the first Proj with given mode from mode_T node */ +static ir_node *get_proj_for_mode(ir_node *node, ir_mode *mode) { + const ir_edge_t *edge; + + assert(get_irn_mode(node) == mode_T && "Need mode_T node."); + + foreach_out_edge(node, edge) { + ir_node *proj = get_edge_src_irn(edge); + if (get_irn_mode(proj) == mode) + return proj; + } + + return NULL; +} + int ia32_to_appear_in_schedule(void *block_env, const ir_node *irn) { - return is_ia32_irn(irn); +#if 0 + /* Loads with no user do not need to appear in schedule */ + if (is_ia32_Ld(irn) && get_irn_n_edges(irn) == 1) { + /* only one user && user is not memory -> schedule */ + return get_proj_for_mode(irn, mode_M) == NULL; + } +#endif + return is_ia32_irn(irn) ? 1 : -1; } /** diff --git a/ir/be/ia32/bearch_ia32_t.h b/ir/be/ia32/bearch_ia32_t.h index fa8f997f2..2234f821a 100644 --- a/ir/be/ia32/bearch_ia32_t.h +++ b/ir/be/ia32/bearch_ia32_t.h @@ -103,6 +103,7 @@ typedef struct _ia32_code_gen_t { char fp_kind; /**< floating point kind */ char used_fp; /**< which floating point unit used in this graph */ char force_sim; /**< set to 1 if x87 simulation should be enforced */ + char dump; /**< set to 1 if graphs should be dumped */ DEBUG_ONLY(firm_dbg_module_t *mod;) /**< debugging module */ } ia32_code_gen_t; diff --git a/ir/be/ia32/ia32_gen_decls.c b/ir/be/ia32/ia32_gen_decls.c index ccb911f44..45430af2d 100644 --- a/ir/be/ia32/ia32_gen_decls.c +++ b/ir/be/ia32/ia32_gen_decls.c @@ -141,7 +141,7 @@ static void do_dump_atomic_init(struct obstack *obst, ir_node *init) tv = get_Const_tarval(init); /* beware of old stuff */ - assert(! mode_is_reference(mode)); + //assert(! mode_is_reference(mode)); /* it's a arithmetic value */ dump_arith_tarval(obst, tv, bytes); diff --git a/ir/be/ia32/ia32_transform.c b/ir/be/ia32/ia32_transform.c index e127a76e3..9ce22742d 100644 --- a/ir/be/ia32/ia32_transform.c +++ b/ir/be/ia32/ia32_transform.c @@ -1305,12 +1305,12 @@ static ir_node *gen_Abs(ia32_transform_env_t *env) { * @return the created ia32 Load node */ static ir_node *gen_Load(ia32_transform_env_t *env) { - ir_node *node = env->irn; - ir_node *noreg = ia32_new_NoReg_gp(env->cg); - ir_node *ptr = get_Load_ptr(node); - ir_node *lptr = ptr; - ir_mode *mode = get_Load_mode(node); - int is_imm = 0; + ir_node *node = env->irn; + ir_node *noreg = ia32_new_NoReg_gp(env->cg); + ir_node *ptr = get_Load_ptr(node); + ir_node *lptr = ptr; + ir_mode *mode = get_Load_mode(node); + int is_imm = 0; ir_node *new_op; ia32_am_flavour_t am_flav = ia32_B; @@ -1348,6 +1348,16 @@ static ir_node *gen_Load(ia32_transform_env_t *env) { set_ia32_am_flavour(new_op, am_flav); set_ia32_ls_mode(new_op, mode); + /* + check for special case: the loaded value might not be used (optimized, volatile, ...) + we add a Proj + Keep for volatile loads and ignore all other cases + */ + if (! get_proj_for_pn(node, pn_Load_res) && get_Load_volatility(node) == volatility_is_volatile) { + /* add a result proj and a Keep to produce a pseudo use */ + ir_node *proj = new_r_Proj(env->irg, env->block, new_op, mode, pn_ia32_Load_res); + be_new_Keep(arch_get_irn_reg_class(env->cg->arch_env, proj, -1), env->irg, env->block, 1, &proj); + } + SET_IA32_ORIG_NODE(new_op, ia32_get_old_node_name(env->cg, env->irn)); return new_op; -- 2.20.1