fix a few memory leaks
authorMatthias Braun <matze@braunis.de>
Wed, 7 Jun 2006 09:19:47 +0000 (09:19 +0000)
committerMatthias Braun <matze@braunis.de>
Wed, 7 Jun 2006 09:19:47 +0000 (09:19 +0000)
ir/be/bespill.c
ir/be/bespillmorgan.c
ir/be/beverify.c

index b812541..bb3ec83 100644 (file)
@@ -257,14 +257,16 @@ static ir_node *be_spill_phi(spill_env_t *senv, ir_node *phi, ir_node *ctx_irn,
  */
 static ir_node *be_spill_node(spill_env_t *senv, ir_node *to_spill) {
        ir_graph *irg                  = get_irn_irg(to_spill);
-       set      *already_visited_phis = new_set(cmp_phi_spill_assoc, 10);
        ir_node  *res;
-       bitset_t *bs = bitset_alloca(get_irg_last_idx(irg));
 
-       if (pset_find_ptr(senv->mem_phis, to_spill))
+       if (pset_find_ptr(senv->mem_phis, to_spill)) {
+               set *already_visited_phis = new_set(cmp_phi_spill_assoc, 10);
+               bitset_t *bs = bitset_alloca(get_irg_last_idx(irg));
                res = be_spill_phi(senv, to_spill, to_spill, already_visited_phis, bs);
-       else
+               del_set(already_visited_phis);
+       } else {
                res = be_spill_irn(senv, to_spill, to_spill);
+       }
 
        return res;
 }
@@ -406,7 +408,6 @@ static void phi_walker(ir_node *irn, void *env) {
 
 void be_insert_spills_reloads(spill_env_t *senv) {
        const arch_env_t *aenv = senv->chordal_env->birg->main_env->arch_env;
-       ir_graph *irg          = senv->chordal_env->irg;
        ir_node *irn;
        spill_info_t *si;
 
index b7cf66c..3e923b7 100644 (file)
@@ -139,8 +139,9 @@ static INLINE block_attr_t *get_block_attr(morgan_env_t *env, ir_node *block) {
        return res;
 }
 
-static int is_mem_phi(const ir_node *irn, void *data) {
+static int is_mem_phi(const ir_node *node, void *data) {
        // TODO what is this for?
+
        return 0;
 }
 
@@ -171,6 +172,14 @@ static INLINE void construct_loop_out_edges(ir_node* block, void* e) {
        }
 }
 
+static void free_loop_out_edges(morgan_env_t *env) {
+       loop_attr_t *l_attr;
+
+       for(l_attr = set_first(env->loop_attr_set); l_attr != NULL; l_attr = set_next(env->loop_attr_set)) {
+               del_set(l_attr->out_edges);
+       }
+}
+
 /**
  * Construct the livethrough unused information for a block
  */
@@ -488,6 +497,7 @@ void be_spill_morgan(const be_chordal_env_t *chordal_env) {
        // cleanup
        be_end_uses(env.uses);
        be_dump(env.irg, "-spillmorgan", dump_ir_block_graph_sched);
+       free_loop_out_edges(&env);
        del_set(env.loop_attr_set);
        del_set(env.block_attr_set);
 
index 853f54a..d231248 100644 (file)
@@ -114,7 +114,7 @@ static void verify_schedule_walker(ir_node *block, void *data)
        ir_node *node;
        int non_phi_found  = 0;
        int cfchange_found = 0;
-       // TODO ask ABI about delay branches
+       // TODO ask arch about delay branches
        int delay_branches = 0;
        pset *uses = pset_new_ptr_default();
 
@@ -134,9 +134,9 @@ static void verify_schedule_walker(ir_node *block, void *data)
                                        node, block, get_irg_dump_name(env->irg));
                                env->problem_found = 1;
                        }
-                       continue;
-               }
-               non_phi_found = 1;
+               } else {
+                    non_phi_found = 1;
+                }
 
                // 2. Check for control flow changing nodes
                if (is_cfop(node) && get_irn_opcode(node) != iro_Start) {