fixes to compile with -O0
authorMatthias Braun <matze@braunis.de>
Wed, 13 Sep 2006 16:27:53 +0000 (16:27 +0000)
committerMatthias Braun <matze@braunis.de>
Wed, 13 Sep 2006 16:27:53 +0000 (16:27 +0000)
ir/be/ia32/bearch_ia32.c
ir/be/ia32/ia32_finish.c
ir/be/ia32/ia32_new_nodes.c

index 1692900..7cef37a 100644 (file)
@@ -864,9 +864,9 @@ static void ia32_before_sched(void *self) {
 }
 
 static void remove_unused_nodes(ir_node *irn, bitset_t *already_visited) {
-       int i;
+       int i, arity;
        ir_mode *mode;
-       ir_node *mem_proj;
+       ir_node *mem_proj = NULL;
 
        if (is_Block(irn))
                return;
@@ -887,16 +887,22 @@ static void remove_unused_nodes(ir_node *irn, bitset_t *already_visited) {
        /* tuple node has one user which is not the mem proj-> ok */
        if (mode == mode_T && get_irn_n_edges(irn) == 1) {
                mem_proj = ia32_get_proj_for_mode(irn, mode_M);
-               if (! mem_proj)
+               if (mem_proj == NULL)
                        return;
        }
 
-       for (i = get_irn_arity(irn) - 1; i >= 0; i--) {
+       arity = get_irn_arity(irn);
+       for (i = 0; i < arity; ++i) {
                ir_node *pred = get_irn_n(irn, i);
 
                /* do not follow memory edges or we will accidentally remove stores */
-               if (is_Proj(pred) && get_irn_mode(pred) == mode_M)
+               if (get_irn_mode(pred) == mode_M) {
+                       if(mem_proj != NULL) {
+                               edges_reroute(mem_proj, pred, get_irn_irg(mem_proj));
+                               mem_proj = NULL;
+                       }
                        continue;
+               }
 
                set_irn_n(irn, i, new_Bad());
 
@@ -908,10 +914,13 @@ static void remove_unused_nodes(ir_node *irn, bitset_t *already_visited) {
                        remove_unused_nodes(pred, already_visited);
        }
 
+       // we need to set the presd to Bad again to also get the memory edges
+       arity = get_irn_arity(irn);
+       for (i = 0; i < arity; ++i) {
+               set_irn_n(irn, i, new_Bad());
+       }
+
        if (sched_is_scheduled(irn)) {
-               set_irn_n(irn, 0, new_Bad());
-               set_irn_n(irn, 1, new_Bad());
-               set_irn_n(irn, 2, new_Bad());
                sched_remove(irn);
        }
 }
@@ -929,7 +938,7 @@ static void remove_unused_loads_walker(ir_node *irn, void *env) {
  */
 static void ia32_before_ra(void *self) {
        ia32_code_gen_t *cg              = self;
-       bitset_t        *already_visited = bitset_irg_malloc(cg->irg);
+       bitset_t        *already_visited = bitset_irg_alloca(cg->irg);
 
        /*
                Handle special case:
@@ -938,7 +947,6 @@ static void ia32_before_ra(void *self) {
                after removing the Load from schedule.
        */
        irg_walk_graph(cg->irg, remove_unused_loads_walker, NULL, already_visited);
-       bitset_free(already_visited);
 }
 
 
index 848e40d..be3ac08 100644 (file)
@@ -101,9 +101,10 @@ static void ia32_transform_lea_to_add(ir_node *irn, ia32_code_gen_t *cg) {
        int               imm = 0;
        ir_node          *res = NULL;
        ir_node          *nomem, *noreg, *base, *index, *op1, *op2;
-       char             *offs;
+       const char       *offs;
        ia32_transform_env_t tenv;
        const arch_register_t *out_reg, *base_reg, *index_reg;
+       int              imm_tp = ia32_ImmConst;
 
        /* must be a LEA */
        if (! is_ia32_Lea(irn))
@@ -125,11 +126,20 @@ static void ia32_transform_lea_to_add(ir_node *irn, ia32_code_gen_t *cg) {
        base  = get_irn_n(irn, 0);
        index = get_irn_n(irn,1);
 
-       offs  = get_ia32_am_offs(irn);
+       if (am_flav & ia32_O) {
+               offs  = get_ia32_am_offs(irn);
 
-       /* offset has a explicit sign -> we need to skip + */
-       if (offs && offs[0] == '+')
-               offs++;
+               if (! offs) {
+                       ident *id = get_ia32_am_sc(irn);
+
+                       assert(id != NULL);
+                       offs   = get_id_str(id);
+                       imm_tp = ia32_ImmSymConst;
+               }
+               /* offset has a explicit sign -> we need to skip + */
+               else if (offs[0] == '+')
+                       offs++;
+       }
 
        out_reg   = arch_get_irn_register(cg->arch_env, irn);
        base_reg  = arch_get_irn_register(cg->arch_env, base);
@@ -193,7 +203,7 @@ static void ia32_transform_lea_to_add(ir_node *irn, ia32_code_gen_t *cg) {
 
        if (imm) {
                set_ia32_cnst(res, offs);
-               set_ia32_immop_type(res, ia32_ImmConst);
+               set_ia32_immop_type(res, imm_tp);
        }
 
        SET_IA32_ORIG_NODE(res, ia32_get_old_node_name(cg, irn));
index f100c24..9d00a3d 100644 (file)
@@ -544,10 +544,6 @@ char *get_ia32_am_offs(const ir_node *node) {
        ia32_attr_t *attr = get_ia32_attr(node);
        static char res[64];
 
-       if (! attr->am_offs) {
-               return NULL;
-       }
-
        snprintf(res, sizeof(res), "%+ld", attr->am_offs);
 
        return res;