fixed handling of unused load results
authorChristian Würdig <chriswue@ipd.info.uni-karlsruhe.de>
Fri, 23 Jun 2006 10:39:17 +0000 (10:39 +0000)
committerChristian Würdig <chriswue@ipd.info.uni-karlsruhe.de>
Fri, 23 Jun 2006 10:39:17 +0000 (10:39 +0000)
fixed indents
respect dump flag settings

ir/be/ia32/bearch_ia32.c
ir/be/ia32/bearch_ia32_t.h
ir/be/ia32/ia32_gen_decls.c
ir/be/ia32/ia32_transform.c

index 5f87b3e..a2e86b4 100644 (file)
@@ -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;
 }
 
 /**
index fa8f997..2234f82 100644 (file)
@@ -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;
 
index ccb911f..45430af 100644 (file)
@@ -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);
index e127a76..9ce2274 100644 (file)
@@ -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;