* @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.
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)
*/
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;
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;
{
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;
*/
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;
}
*/
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) {
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);
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. */
* 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");
}
edge_change_cnt(tgt, kind, +1);
- } /* else */
+ }
#ifndef DEBUG_libfirm
/* verify list heads */
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;
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;
}
/**
{
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;
}
/**
{
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;
}
}
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;
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) {
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);
}
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));
{
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) {
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;
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) {
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,