differntiate entity kinds
[libfirm] / ir / ir / iredges.c
index e54cfa1..ae086ec 100644 (file)
@@ -22,7 +22,6 @@
  * @brief   Always available outs.
  * @author  Sebastian Hack, Michael Beck, Andreas Schoesser
  * @date    14.1.2005
- * @version $Id$
  * @brief
  *   This are out-edges (also called def-use edges) that are dynamically
  *   updated as the graph changes.
@@ -112,10 +111,17 @@ static ir_node *get_block_n(const ir_node *block, int pos)
        return NULL;
 }
 
+static ir_node *get_irn_safe_n(const ir_node *node, int n)
+{
+       if (n == -1 && is_Block(node))
+               return NULL;
+       return get_irn_n(node, n);
+}
+
 static const ir_edge_kind_info_t edge_kind_info[EDGE_KIND_LAST] = {
-       { "normal"     , set_irn_n,   -1, get_irn_arity,  get_irn_n   },
-       { "block succs", NULL,         0, get_irn_arity,  get_block_n },
-       { "dependency",  set_irn_dep,  0, get_irn_deps,   get_irn_dep }
+       { "normal"     , set_irn_n,   -1, get_irn_arity,  get_irn_safe_n },
+       { "block succs", NULL,         0, get_irn_arity,  get_block_n    },
+       { "dependency",  set_irn_dep,  0, get_irn_deps,   get_irn_dep    }
 };
 
 #define foreach_tgt(irn, i, n, kind) for (i = edge_kind_info[kind].first_idx, n = edge_kind_info[kind].get_arity(irn); i < n; ++i)
@@ -178,7 +184,7 @@ size_t edges_register_private_data(size_t n)
  */
 void edges_reset_private_data(ir_graph *irg, int offset, unsigned size)
 {
-       irg_edge_info_t       *info = _get_irg_edge_info(irg, EDGE_KIND_NORMAL);
+       irg_edge_info_t       *info = get_irg_edge_info(irg, EDGE_KIND_NORMAL);
        ir_edge_t             *edge;
        ir_edgeset_iterator_t  iter;
 
@@ -200,7 +206,7 @@ void edges_reset_private_data(ir_graph *irg, int offset, unsigned size)
 void edges_init_graph_kind(ir_graph *irg, ir_edge_kind_t kind)
 {
        if (edges_activated_kind(irg, kind)) {
-               irg_edge_info_t *info = _get_irg_edge_info(irg, kind);
+               irg_edge_info_t *info = get_irg_edge_info(irg, kind);
                size_t amount = irg->estimated_node_count * 2;
 
                edges_used = 1;
@@ -229,7 +235,7 @@ const ir_edge_t *get_irn_edge_kind(const ir_node *src, int pos, ir_edge_kind_t k
 {
        ir_graph *irg = get_irn_irg(src);
        if (edges_activated_kind(irg, kind)) {
-               irg_edge_info_t *info = _get_irg_edge_info(irg, kind);
+               irg_edge_info_t *info = get_irg_edge_info(irg, kind);
                ir_edge_t       key;
 
                key.src = (ir_node *)src;
@@ -249,7 +255,7 @@ const ir_edge_t *get_irn_edge_kind(const ir_node *src, int pos, ir_edge_kind_t k
  */
 static inline void edge_change_cnt(ir_node *tgt, ir_edge_kind_t kind, int ofs)
 {
-       irn_edge_info_t *info = _get_irn_edge_info(tgt, kind);
+       irn_edge_info_t *info = get_irn_edge_info(tgt, kind);
        info->out_count += ofs;
 }
 
@@ -259,10 +265,10 @@ static inline void edge_change_cnt(ir_node *tgt, ir_edge_kind_t kind, int ofs)
  */
 static inline void verify_list_head(ir_node *irn, ir_edge_kind_t kind)
 {
-       int                    err       = 0;
-       int                    num       = 0;
-       pset                   *lh_set   = pset_new_ptr(16);
-       const struct list_head *head     = _get_irn_outs_head(irn, kind);
+       int                    err     = 0;
+       int                    num     = 0;
+       pset                   *lh_set = pset_new_ptr(16);
+       const struct list_head *head   = &get_irn_edge_info(irn, kind)->outs_head;
        const struct list_head *pos;
 
        list_for_each(pos, head) {
@@ -297,7 +303,7 @@ void edges_dump_kind(ir_graph *irg, ir_edge_kind_t kind)
        if (!edges_activated_kind(irg, kind))
                return;
 
-       info  = _get_irg_edge_info(irg, kind);
+       info  = get_irg_edge_info(irg, kind);
        edges = &info->edges;
        foreach_ir_edgeset(edges, e, iter) {
                ir_printf("%+F %d %d\n", e->src, e->pos, e->invalid);
@@ -313,7 +319,6 @@ void edges_notify_edge_kind(ir_node *src, int pos, ir_node *tgt,
        irg_edge_info_t *info;
        ir_edgeset_t    *edges;
        ir_edge_t        templ;
-       ir_edge_t       *edge;
 
        assert(edges_activated_kind(irg, kind));
 
@@ -323,7 +328,7 @@ void edges_notify_edge_kind(ir_node *src, int pos, ir_node *tgt,
        if (tgt == old_tgt)
                return;
 
-       info  = _get_irg_edge_info(irg, kind);
+       info  = get_irg_edge_info(irg, kind);
        edges = &info->edges;
 
        /* Initialize the edge template to search in the set. */
@@ -335,7 +340,7 @@ void edges_notify_edge_kind(ir_node *src, int pos, ir_node *tgt,
         */
        if (tgt == NULL) {
                /* search the edge in the set. */
-               edge = ir_edgeset_find(edges, &templ);
+               ir_edge_t *edge = ir_edgeset_find(edges, &templ);
 
                /* mark the edge invalid if it was found */
                if (edge) {
@@ -358,14 +363,14 @@ void edges_notify_edge_kind(ir_node *src, int pos, ir_node *tgt,
                 * old target was != NULL) or added (if the old target was
                 * NULL).
                 */
-               struct list_head *head = _get_irn_outs_head(tgt, kind);
+               struct list_head *head = &get_irn_edge_info(tgt, kind)->outs_head;
 
                assert(head->next && head->prev &&
                                "target list head must have been initialized");
 
                /* If the old target is not null, the edge is moved. */
                if (old_tgt) {
-                       edge = ir_edgeset_find(edges, &templ);
+                       ir_edge_t *edge = ir_edgeset_find(edges, &templ);
                        assert(edge && "edge to redirect not found!");
                        assert(! edge->invalid && "Invalid edge encountered");
 
@@ -404,7 +409,7 @@ void edges_notify_edge_kind(ir_node *src, int pos, ir_node *tgt,
                }
 
                edge_change_cnt(tgt, kind, +1);
-       } /* else */
+       }
 
 #ifndef DEBUG_libfirm
        /* verify list heads */
@@ -441,11 +446,11 @@ void edges_notify_edge(ir_node *src, int pos, ir_node *tgt, ir_node *old_tgt,
                        const ir_edge_t *next;
                        foreach_out_edge_kind_safe(old_tgt, edge, next, EDGE_KIND_BLOCK) {
                                ir_node *succ       = get_edge_src_irn(edge);
-                               int      pos        = get_edge_src_pos(edge);
-                               ir_node *block_pred = get_Block_cfgpred(succ, pos);
+                               int      succ_pos   = get_edge_src_pos(edge);
+                               ir_node *block_pred = get_Block_cfgpred(succ, succ_pos);
                                if (block_pred != src)
                                        continue;
-                               edges_notify_edge_kind(succ, pos, tgt, old_tgt,
+                               edges_notify_edge_kind(succ, succ_pos, tgt, old_tgt,
                                                       EDGE_KIND_BLOCK, irg);
                        }
                }
@@ -491,7 +496,7 @@ static void edges_node_revival_kind(ir_node *irn, ir_edge_kind_t kind)
        if (!edges_activated_kind(irg, kind))
                return;
 
-       info = _get_irn_edge_info(irn, kind);
+       info = get_irn_edge_info(irn, kind);
        if (info->edges_built)
                return;
 
@@ -519,14 +524,12 @@ static void build_edges_walker(ir_node *irn, void *data)
        int                   i, n;
        ir_edge_kind_t        kind = w->kind;
        ir_graph              *irg = get_irn_irg(irn);
-       get_edge_src_n_func_t *get_n;
 
-       get_n = edge_kind_info[kind].get_n;
        foreach_tgt(irn, i, n, kind) {
                ir_node *pred = get_n(irn, i, kind);
                edges_notify_edge_kind(irn, i, pred, NULL, kind, irg);
        }
-       _get_irn_edge_info(irn, kind)->edges_built = 1;
+       get_irn_edge_info(irn, kind)->edges_built = 1;
 }
 
 /**
@@ -537,10 +540,10 @@ static void init_lh_walker(ir_node *irn, void *data)
 {
        build_walker   *w    = (build_walker*)data;
        ir_edge_kind_t  kind = w->kind;
-       list_head      *head = _get_irn_outs_head(irn, kind);
+       list_head      *head = &get_irn_edge_info(irn, kind)->outs_head;
        INIT_LIST_HEAD(head);
-       _get_irn_edge_info(irn, kind)->edges_built = 0;
-       _get_irn_edge_info(irn, kind)->out_count   = 0;
+       get_irn_edge_info(irn, kind)->edges_built = 0;
+       get_irn_edge_info(irn, kind)->out_count   = 0;
 }
 
 /**
@@ -558,21 +561,21 @@ static void init_lh_walker_dep(ir_node *irn, void *data)
 {
        build_walker   *w    = (build_walker*)data;
        ir_edge_kind_t  kind = w->kind;
-       list_head      *head = _get_irn_outs_head(irn, kind);
+       list_head      *head = &get_irn_edge_info(irn, kind)->outs_head;
        int             i;
 
        INIT_LIST_HEAD(head);
-       _get_irn_edge_info(irn, kind)->edges_built = 0;
-       _get_irn_edge_info(irn, kind)->out_count   = 0;
+       get_irn_edge_info(irn, kind)->edges_built = 0;
+       get_irn_edge_info(irn, kind)->out_count   = 0;
 
        for (i = get_irn_deps(irn) - 1; i >= 0; --i) {
                ir_node *dep = get_irn_dep(irn, i);
 
-               head = _get_irn_outs_head(dep, kind);
+               head = &get_irn_edge_info(dep, kind)->outs_head;
 
                INIT_LIST_HEAD(head);
-               _get_irn_edge_info(dep, kind)->edges_built = 0;
-               _get_irn_edge_info(dep, kind)->out_count   = 0;
+               get_irn_edge_info(dep, kind)->edges_built = 0;
+               get_irn_edge_info(dep, kind)->out_count   = 0;
        }
 }
 
@@ -591,6 +594,8 @@ static void visitor(ir_node *irn, void *data)
 
        if (is_Deleted(irn))
                return;
+       if (!is_Block(irn) && is_Deleted(get_nodes_block(irn)))
+               return;
 
        if (!irn_visited_else_mark(irn)) {
                info->visit(irn, info->data);
@@ -622,7 +627,7 @@ static void visitor(ir_node *irn, void *data)
 void edges_activate_kind(ir_graph *irg, ir_edge_kind_t kind)
 {
        struct build_walker w;
-       irg_edge_info_t     *info = _get_irg_edge_info(irg, kind);
+       irg_edge_info_t     *info = get_irg_edge_info(irg, kind);
        visitor_info_t      visit;
 
        w.kind = kind;
@@ -648,7 +653,7 @@ void edges_activate_kind(ir_graph *irg, ir_edge_kind_t kind)
 
 void edges_deactivate_kind(ir_graph *irg, ir_edge_kind_t kind)
 {
-       irg_edge_info_t *info = _get_irg_edge_info(irg, kind);
+       irg_edge_info_t *info = get_irg_edge_info(irg, kind);
 
        info->activated = 0;
        if (info->allocated) {
@@ -660,7 +665,7 @@ void edges_deactivate_kind(ir_graph *irg, ir_edge_kind_t kind)
 
 int (edges_activated_kind)(const ir_graph *irg, ir_edge_kind_t kind)
 {
-       return _edges_activated_kind(irg, kind);
+       return edges_activated_kind_(irg, kind);
 }
 
 
@@ -677,7 +682,7 @@ void edges_reroute_kind(ir_node *from, ir_node *to, ir_edge_kind_t kind)
        set_edge_func_t *set_edge = edge_kind_info[kind].set_edge;
 
        if (set_edge && edges_activated_kind(irg, kind)) {
-               struct list_head *head = _get_irn_outs_head(from, kind);
+               struct list_head *head = &get_irn_edge_info(from, kind)->outs_head;
 
                DBG((dbg, LEVEL_5, "reroute from %+F to %+F\n", from, to));
 
@@ -693,7 +698,7 @@ static void verify_set_presence(ir_node *irn, void *data)
 {
        build_walker *w     = (build_walker*)data;
        ir_graph     *irg   = get_irn_irg(irn);
-       ir_edgeset_t *edges = &_get_irg_edge_info(irg, w->kind)->edges;
+       ir_edgeset_t *edges = &get_irg_edge_info(irg, w->kind)->edges;
        int i, n;
 
        foreach_tgt(irn, i, n, w->kind) {
@@ -740,7 +745,7 @@ static void verify_list_presence(ir_node *irn, void *data)
 int edges_verify_kind(ir_graph *irg, ir_edge_kind_t kind)
 {
        struct build_walker w;
-       ir_edgeset_t        *edges = &_get_irg_edge_info(irg, kind)->edges;
+       ir_edgeset_t        *edges = &get_irg_edge_info(irg, kind)->edges;
        ir_edge_t           *e;
        ir_edgeset_iterator_t  iter;
 
@@ -831,8 +836,8 @@ static void verify_edge_counter(ir_node *irn, void *env)
        bs       = (bitset_t*)get_irn_link(irn);
        list_cnt = 0;
        ref_cnt  = 0;
-       edge_cnt = _get_irn_edge_info(irn, EDGE_KIND_NORMAL)->out_count;
-       head     = _get_irn_outs_head(irn, EDGE_KIND_NORMAL);
+       edge_cnt = get_irn_edge_info(irn, EDGE_KIND_NORMAL)->out_count;
+       head     = &get_irn_edge_info(irn, EDGE_KIND_NORMAL)->outs_head;
 
        /* We can iterate safely here, list heads have already been verified. */
        list_for_each(pos, head) {
@@ -992,27 +997,27 @@ void edges_node_revival(ir_node *irn)
 
 const ir_edge_t *(get_irn_out_edge_first_kind)(const ir_node *irn, ir_edge_kind_t kind)
 {
-       return _get_irn_out_edge_first_kind(irn, kind);
+       return get_irn_out_edge_first_kind_(irn, kind);
 }
 
 const ir_edge_t *(get_irn_out_edge_next)(const ir_node *irn, const ir_edge_t *last)
 {
-       return _get_irn_out_edge_next(irn, last);
+       return get_irn_out_edge_next_(irn, last);
 }
 
 ir_node *(get_edge_src_irn)(const ir_edge_t *edge)
 {
-       return _get_edge_src_irn(edge);
+       return get_edge_src_irn_(edge);
 }
 
 int (get_edge_src_pos)(const ir_edge_t *edge)
 {
-       return _get_edge_src_pos(edge);
+       return get_edge_src_pos_(edge);
 }
 
 int (get_irn_n_edges_kind)(const ir_node *irn, ir_edge_kind_t kind)
 {
-       return _get_irn_n_edges_kind(irn, kind);
+       return get_irn_n_edges_kind_(irn, kind);
 }
 
 static void irg_walk_edges2(ir_node *node, irg_walk_func *pre,