X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firnode.c;h=7e7a4d5dd2ddf82cff4d0a41adf1bd0d8c7c39ad;hb=014643c20bee2345c928105e06c815d4f083753a;hp=b6ca127e5985a0f56170bb01062335bed1148c6a;hpb=cf41605f799d1781407c56be66ec475ed2114dc1;p=libfirm diff --git a/ir/ir/irnode.c b/ir/ir/irnode.c index b6ca127e5..7e7a4d5dd 100644 --- a/ir/ir/irnode.c +++ b/ir/ir/irnode.c @@ -27,6 +27,7 @@ #include "irdump.h" #include "irop_t.h" #include "irprog_t.h" +#include "iredgekinds.h" #include "iredges_t.h" #include "irhooks.h" @@ -144,6 +145,8 @@ new_ir_node (dbg_info *db, ir_graph *irg, ir_node *block, ir_op *op, ir_mode *mo res->visited = 0; res->node_idx = irg_register_node_idx(irg, res); res->link = NULL; + res->deps = NULL; + if (arity < 0) { res->in = NEW_ARR_F (ir_node *, 1); /* 1: space for block */ } else { @@ -159,12 +162,10 @@ new_ir_node (dbg_info *db, ir_graph *irg, ir_node *block, ir_op *op, ir_mode *mo res->node_nr = get_irp_new_node_nr(); #endif - INIT_LIST_HEAD(&res->edge_info.outs_head); - is_bl = is_Block(res); - if (is_bl) - INIT_LIST_HEAD(&res->attr.block.succ_head); - + for(i = 0; i < EDGE_KIND_LAST; ++i) + INIT_LIST_HEAD(&res->edge_info[i].outs_head); + is_bl = is_Block(res); for (i = is_bl; i <= arity; ++i) edges_notify_edge(res, i - 1, res->in[i], NULL, irg); @@ -309,6 +310,69 @@ set_irn_n (ir_node *node, int n, ir_node *in) { node->in[n + 1] = in; } +int +(get_irn_deps)(const ir_node *node) +{ + return _get_irn_deps(node); +} + +ir_node * +(get_irn_dep)(const ir_node *node, int pos) +{ + return _get_irn_dep(node, pos); +} + +void +(set_irn_dep)(ir_node *node, int pos, ir_node *dep) +{ + _set_irn_dep(node, pos, dep); +} + +int add_irn_dep(ir_node *node, ir_node *dep) +{ + int res = 0; + + if (node->deps == NULL) { + node->deps = NEW_ARR_F(ir_node *, 1); + node->deps[0] = dep; + } + else { + int i, n; + int first_zero = -1; + + for(i = 0, n = ARR_LEN(node->deps); i < n; ++i) { + if(node->deps[i] == NULL) + first_zero = i; + + if(node->deps[i] == dep) + return i; + } + + if(first_zero >= 0) { + node->deps[first_zero] = dep; + res = first_zero; + } + + else { + ARR_APP1(ir_node *, node->deps, dep); + res = n; + } + } + + edges_notify_edge_kind(node, res, dep, NULL, EDGE_KIND_DEP, get_irn_irg(node)); + + return res; +} + +void add_irn_deps(ir_node *tgt, ir_node *src) +{ + int i, n; + + for(i = 0, n = get_irn_deps(src); i < n; ++i) + add_irn_dep(tgt, get_irn_dep(src, i)); +} + + ir_mode * (get_irn_mode)(const ir_node *node) { return _get_irn_mode(node); @@ -2535,6 +2599,12 @@ int return _is_Alloc(node); } +/* returns true if a node is a Jmp node. */ +int +(is_Jmp)(const ir_node *node) { + return _is_Jmp(node); +} + int is_Proj (const ir_node *node) { assert(node); @@ -2574,6 +2644,7 @@ ir_node *get_fragile_op_mem(ir_node *node) { case iro_Load : case iro_Store : case iro_Alloc : + case iro_Bound : return get_irn_n(node, 0); case iro_Bad : case iro_Unknown: