Fixed memory leaks
[libfirm] / ir / opt / scalar_replace.c
index fb24faf..881d199 100644 (file)
 #include "irgwalk.h"
 #include "irgmod.h"
 #include "irnode_t.h"
+#include "irtools.h"
 
-#define SET_VNUM(node, vnum) set_irn_link(node, (void *)vnum)
-#define GET_VNUM(node)       (unsigned)get_irn_link(node)
+#define SET_VNUM(node, vnum) set_irn_link(node, INT_TO_PTR(vnum))
+#define GET_VNUM(node)       (unsigned)PTR_TO_INT(get_irn_link(node))
 
 /**
  * A path element entry: it is either an entity
@@ -63,7 +64,7 @@ typedef struct _path_t {
 
 typedef struct _scalars_t {
   entity *ent;                 /**< A entity for scalar replacement. */
-  type *ent_owner;             /**< The owner of this entity. */
+  ir_type *ent_owner;          /**< The owner of this entity. */
 } scalars_t;
 
 
@@ -103,7 +104,7 @@ static unsigned path_hash(const path_t *path)
   unsigned i;
 
   for (i = 0; i < path->path_len; ++i)
-    hash ^= (unsigned)path->path[i].ent;
+    hash ^= (unsigned)PTR_TO_INT(path->path[i].ent);
 
   return hash >> 4;
 }
@@ -125,21 +126,18 @@ static int is_const_sel(ir_node *sel) {
   return 1;
 }
 
-/**
+/*
  * Returns non-zero, if the address of an entity
  * represented by a Sel node (or it's successor Sels) is taken.
- *
- * @param sel  the Sel node
  */
-static int is_address_taken(ir_node *sel)
+int is_address_taken(ir_node *sel)
 {
-  int i, n;
+  int i;
 
   if (! is_const_sel(sel))
     return 1;
 
-  n = get_irn_n_outs(sel);
-  for (i = 0; i < n; ++i) {
+  for (i = get_irn_n_outs(sel) - 1; i >= 0; --i) {
     ir_node *succ = get_irn_out(sel, i);
 
     switch (get_irn_opcode(succ)) {
@@ -191,7 +189,7 @@ static void link_all_leave_sels(entity *ent, ir_node *sel)
   for (i = 0; i < n; ++i) {
     ir_node *succ = get_irn_out(sel, i);
 
-    if (get_irn_op(succ) == op_Sel) {
+    if (is_Sel(succ)) {
       link_all_leave_sels(ent, succ);
       flag = 0;
     }
@@ -254,7 +252,7 @@ static int find_possible_replacements(ir_graph *irg)
   for (i = 0; i < n; ++i) {
     ir_node *succ = get_irn_out(irg_frame, i);
 
-    if (get_irn_op(succ) == op_Sel) {
+    if (is_Sel(succ)) {
       entity *ent = get_Sel_entity(succ);
       set_entity_link(ent, NULL);
     }
@@ -268,9 +266,9 @@ static int find_possible_replacements(ir_graph *irg)
   for (i = 0; i < n; ++i) {
     ir_node *succ = get_irn_out(irg_frame, i);
 
-    if (get_irn_op(succ) == op_Sel) {
+    if (is_Sel(succ)) {
       entity *ent = get_Sel_entity(succ);
-      type *ent_type;
+      ir_type *ent_type;
 
       if (get_entity_link(ent) == ADDRESS_TAKEN)
         continue;
@@ -313,7 +311,7 @@ static path_t *find_path(ir_node *sel, unsigned len)
   n    = get_Sel_n_indexs(sel);
   len += n + 1;
 
-  if (get_irn_op(pred) != op_Sel) {
+  if (! is_Sel(pred)) {
     /* we found the root */
 
     res = xmalloc(sizeof(*res) + (len - 1) * sizeof(res->path));
@@ -388,7 +386,7 @@ static unsigned allocate_value_numbers(pset *sels, entity *ent, unsigned vnum, i
           else
             printf("[%ld]", get_tarval_long(key->path[i].tv));
         }
-        printf(" = %u (%s)\n", (int)get_irn_link(sel), get_mode_name((*modes)[key->vnum]));
+        printf(" = %u (%s)\n", PTR_TO_INT(get_irn_link(sel)), get_mode_name((*modes)[key->vnum]));
       }
 #endif /* DEBUG_libfirm */
     }
@@ -436,7 +434,7 @@ static void handle_first(ir_node *node, void *ctx)
     /* a load, check if we can resolve it */
     adr = get_Load_ptr(node);
 
-    if (get_irn_op(adr) != op_Sel)
+    if (! is_Sel(adr))
       return;
 
     if (! pset_find_ptr(env->sels, adr))
@@ -472,7 +470,7 @@ static void handle_first(ir_node *node, void *ctx)
     /* a Store always can be replaced */
     adr = get_Store_ptr(node);
 
-    if (get_irn_op(adr) != op_Sel)
+    if (! is_Sel(adr))
       return;
 
     if (! pset_find_ptr(env->sels, adr))
@@ -676,7 +674,7 @@ void scalar_replacement_opt(ir_graph *irg)
   ir_mode   **modes;
   set       *set_ent;
   pset      *sels;
-  type      *ent_type;
+  ir_type   *ent_type;
   ir_graph  *rem;
 
   if (! get_opt_scalar_replacement())
@@ -705,7 +703,7 @@ void scalar_replacement_opt(ir_graph *irg)
     for (i = 0 ; i < get_irn_n_outs(irg_frame); i++) {
       ir_node *succ = get_irn_out(irg_frame, i);
 
-      if (get_irn_op(succ) == op_Sel) {
+      if (is_Sel(succ)) {
         entity *ent = get_Sel_entity(succ);
 
         if (get_entity_link(ent) == NULL || get_entity_link(ent) == ADDRESS_TAKEN)