X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;ds=sidebyside;f=ir%2Fir%2Firnode.c;h=37f320e4388e9b283e90730d5ec991230b21dfa4;hb=6708a4bc2bbc035dcc84752a1e34c2edeef07c2d;hp=5db3b33c8be9b5092d1372ebe1fee61dff87439c;hpb=4b7fd8907ceb5c5255814d2578450cddc4ae8048;p=libfirm diff --git a/ir/ir/irnode.c b/ir/ir/irnode.c index 5db3b33c8..37f320e43 100644 --- a/ir/ir/irnode.c +++ b/ir/ir/irnode.c @@ -130,18 +130,20 @@ new_ir_node (dbg_info *db, ir_graph *irg, ir_node *block, ir_op *op, ir_mode *mo { ir_node *res; size_t node_size = offsetof(ir_node, attr) + op->attr_size + firm_add_node_size; - char *p; + char *p; + int i, is_bl; assert(irg && op && mode); p = obstack_alloc (irg->obst, node_size); memset(p, 0, node_size); - res = (ir_node *) (p + firm_add_node_size); - - res->kind = k_ir_node; - res->op = op; - res->mode = mode; - res->visited = 0; - res->link = NULL; + res = (ir_node *) (p + firm_add_node_size); + + res->kind = k_ir_node; + res->op = op; + res->mode = mode; + res->visited = 0; + res->node_idx = irg_register_node_idx(irg, res); + res->link = NULL; if (arity < 0) { res->in = NEW_ARR_F (ir_node *, 1); /* 1: space for block */ } else { @@ -157,20 +159,14 @@ 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 -#if FIRM_EDGES_INPLACE - { - int i; - int is_bl = is_Block(res); - - INIT_LIST_HEAD(&res->edge_info.outs_head); - if(is_bl) - INIT_LIST_HEAD(&res->attr.block.succ_head); + 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 = is_bl; i <= arity; ++i) - edges_notify_edge(res, i - 1, res->in[i], NULL, irg); - } -#endif + for (i = is_bl; i <= arity; ++i) + edges_notify_edge(res, i - 1, res->in[i], NULL, irg); hook_new_node(irg, res); @@ -241,17 +237,17 @@ set_irn_in (ir_node *node, int arity, ir_node **in) { arr = &node->in; } - for (i = 0; i < arity; i++) { - if (i < ARR_LEN(*arr)-1) - edges_notify_edge(node, i, in[i], (*arr)[i+1], irg); - else - edges_notify_edge(node, i, in[i], NULL, irg); + for (i = 0; i < arity; i++) { + if (i < ARR_LEN(*arr)-1) + edges_notify_edge(node, i, in[i], (*arr)[i+1], irg); + else + edges_notify_edge(node, i, in[i], NULL, irg); + } + for(;i < ARR_LEN(*arr)-1; i++) { + edges_notify_edge(node, i, NULL, (*arr)[i+1], irg); } - for(;i < ARR_LEN(*arr)-1; i++) { - edges_notify_edge(node, i, NULL, (*arr)[i+1], irg); - } - if (arity != ARR_LEN(*arr) - 1) { + if (arity != ARR_LEN(*arr) - 1) { ir_node * block = (*arr)[0]; *arr = NEW_ARR_D(ir_node *, irg->obst, arity + 1); (*arr)[0] = block; @@ -563,6 +559,20 @@ get_irn_generic_attr (ir_node *node) { return &node->attr; } +unsigned (get_irn_idx)(const ir_node *node) { + assert(is_ir_node(node)); + return _get_irn_idx(node); +} + +int get_irn_pred_pos(ir_node *node, ir_node *arg) { + int i; + for (i = get_irn_arity(node) - 1; i >= 0; i--) { + if (get_irn_n(node, i) == arg) + return i; + } + return -1; +} + /** manipulate fields of individual nodes **/ /* this works for all except Block */ @@ -783,11 +793,28 @@ set_End_keepalive(ir_node *end, int pos, ir_node *ka) { set_irn_n(end, pos + END_KEEPALIVE_OFFSET, ka); } +/* Set new keep-alives */ +void set_End_keepalives(ir_node *end, int n, ir_node *in[]) { + int i; + ir_graph *irg = get_irn_irg(end); + + /* notify that edges are deleted */ + for (i = 1 + END_KEEPALIVE_OFFSET; i < ARR_LEN(end->in); ++i) { + edges_notify_edge(end, i, end->in[i], NULL, irg); + } + ARR_RESIZE(ir_node *, end->in, n + 1 + END_KEEPALIVE_OFFSET); + + for (i = 0; i < n; ++i) { + end->in[1 + END_KEEPALIVE_OFFSET + i] = in[i]; + edges_notify_edge(end, 1 + END_KEEPALIVE_OFFSET + i, NULL, end->in[1 + END_KEEPALIVE_OFFSET + i], irg); + } +} + void free_End (ir_node *end) { assert (end->op == op_End); end->kind = k_BAD; - DEL_ARR_F(end->in); /* GL @@@ tut nicht ! */ + DEL_ARR_F(end->in); end->in = NULL; /* @@@ make sure we get an error if we use the in array afterwards ... */ } @@ -2005,40 +2032,40 @@ ir_node *get_Psi_cond (ir_node *node, int pos) { int num_conds = get_Psi_n_conds(node); assert(node->op == op_Psi); assert(pos < num_conds); - return node->in[1 + 2 * pos]; + return get_irn_n(node, 2 * pos); } void set_Psi_cond (ir_node *node, int pos, ir_node *cond) { int num_conds = get_Psi_n_conds(node); assert(node->op == op_Psi); assert(pos < num_conds); - node->in[1 + 2 * pos] = cond; + set_irn_n(node, 2 * pos, cond); } ir_node *get_Psi_val (ir_node *node, int pos) { int num_vals = get_Psi_n_conds(node); assert(node->op == op_Psi); assert(pos < num_vals); - return node->in[1 + 2 * pos + 1]; + return get_irn_n(node, 2 * pos + 1); } void set_Psi_val (ir_node *node, int pos, ir_node *val) { int num_vals = get_Psi_n_conds(node); assert(node->op == op_Psi); assert(pos < num_vals); - node->in[1 + 2 * pos + 1] = val; + set_irn_n(node, 2 * pos + 1, val); } ir_node *get_Psi_default(ir_node *node) { - int def_pos = get_irn_arity(node); + int def_pos = get_irn_arity(node) - 1; assert(node->op == op_Psi); - return node->in[def_pos]; + return get_irn_n(node, def_pos); } void set_Psi_default(ir_node *node, ir_node *val) { int def_pos = get_irn_arity(node); assert(node->op == op_Psi); - node->in[def_pos] = node; + set_irn_n(node, def_pos, val); } int (get_Psi_n_conds)(ir_node *node) { @@ -2498,6 +2525,22 @@ int (is_irn_keep)(const ir_node *node) { return _is_irn_keep(node); } +/* Returns non-zero for nodes that are machine operations. */ +int (is_irn_machine_op)(const ir_node *node) { + return _is_irn_machine_op(node); +} + +/* Returns non-zero for nodes that are machine operands. */ +int (is_irn_machine_operand)(const ir_node *node) { + return _is_irn_machine_operand(node); +} + +/* Returns non-zero for nodes that have the n'th user machine flag set. */ +int (is_irn_machine_user)(const ir_node *node, unsigned n) { + return _is_irn_machine_user(node, n); +} + + /* Gets the string representation of the jump prediction .*/ const char *get_cond_jmp_predicate_name(cond_jmp_predicate pred) {