X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firnode.c;h=84d149ecb25ec54e9239bb705cbe1460b5816d35;hb=62038ec14e9c072a91b13270058bb18958027aa8;hp=f1174b9decdaa993b16d1c6dbbf4a96987af19a6;hpb=31d36dd3e8a2b7b513958f005cc555e01b9c3d5b;p=libfirm diff --git a/ir/ir/irnode.c b/ir/ir/irnode.c index f1174b9de..84d149ecb 100644 --- a/ir/ir/irnode.c +++ b/ir/ir/irnode.c @@ -304,44 +304,50 @@ 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) +void set_irn_dep(ir_node *node, int pos, ir_node *dep) { - set_irn_dep_(node, pos, dep); + ir_node *old; + ir_graph *irg; + + assert(node->deps && "dependency array node yet allocated. use add_irn_dep()"); + assert(pos >= 0 && pos < (int)ARR_LEN(node->deps) && "dependency index out of range"); + assert(dep != NULL); + old = node->deps[pos]; + node->deps[pos] = dep; + irg = get_irn_irg(node); + if (edges_activated_kind(irg, EDGE_KIND_DEP)) + edges_notify_edge_kind(node, pos, dep, old, EDGE_KIND_DEP, irg); } -int add_irn_dep(ir_node *node, ir_node *dep) +void add_irn_dep(ir_node *node, ir_node *dep) { - int res = 0; - - /* DEP edges are only allowed in backend phase */ - assert(get_irg_phase_state(get_irn_irg(node)) == phase_backend); + ir_graph *irg; + assert(dep != NULL); 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; + node->deps = NEW_ARR_F(ir_node *, 0); + } + ARR_APP1(ir_node*, node->deps, dep); + irg = get_irn_irg(node); + if (edges_activated_kind(irg, EDGE_KIND_DEP)) + edges_notify_edge_kind(node, ARR_LEN(node->deps)-1, dep, NULL, EDGE_KIND_DEP, irg); +} - if (node->deps[i] == dep) - return i; - } +void delete_irn_dep(ir_node *node, ir_node *dep) +{ + size_t i; + size_t n_deps; + if (node->deps == NULL) + return; - if (first_zero >= 0) { - node->deps[first_zero] = dep; - res = first_zero; - } else { - ARR_APP1(ir_node *, node->deps, dep); - res = n; + n_deps = ARR_LEN(node->deps); + for (i = 0; i < n_deps; ++i) { + if (node->deps[i] == dep) { + set_irn_dep(node, i, node->deps[n_deps-1]); + edges_notify_edge(node, i, NULL, dep, get_irn_irg(node)); + ARR_SHRINKLEN(node->deps, n_deps-1); + break; } } - - 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)