X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firnode.c;h=d98b1dec749488fddce38e83c5c9daf54da75c41;hb=672b5c243e900427b5dcae01441d4fa3327d692c;hp=a1d88cd8a0b7478cb4a4df4fc547f7d9828037ac;hpb=4c4b3674a0bb1e220028087f41634ca27accee99;p=libfirm diff --git a/ir/ir/irnode.c b/ir/ir/irnode.c index a1d88cd8a..d98b1dec7 100644 --- a/ir/ir/irnode.c +++ b/ir/ir/irnode.c @@ -154,7 +154,11 @@ new_ir_node(dbg_info *db, ir_graph *irg, ir_node *block, ir_op *op, ir_mode *mod if (arity < 0) { res->in = NEW_ARR_F(ir_node *, 1); /* 1: space for block */ } else { - res->in = NEW_ARR_D(ir_node *, irg->obst, (arity+1)); + /* not nice but necessary: End and Sync must always have a flexible array */ + if (op == op_End || op == op_Sync) + res->in = NEW_ARR_F(ir_node *, (arity+1)); + else + res->in = NEW_ARR_D(ir_node *, irg->obst, (arity+1)); memcpy(&res->in[1], in, sizeof(ir_node *) * arity); } @@ -321,6 +325,15 @@ int add_irn_n(ir_node *node, ir_node *in) { return pos; } +void del_Sync_n(ir_node *n, int i) +{ + int arity = get_Sync_n_preds(n); + ir_node *last_pred = get_Sync_pred(n, arity - 1); + set_Sync_pred(n, i, last_pred); + edges_notify_edge(n, arity - 1, NULL, last_pred, get_irn_irg(n)); + ARR_SHRINKLEN(get_irn_in(n), arity); +} + int (get_irn_deps)(const ir_node *node) { return _get_irn_deps(node); } @@ -571,10 +584,16 @@ store_attr *get_irn_store_attr(ir_node *node) { except_attr *get_irn_except_attr(ir_node *node) { assert(node->op == op_Div || node->op == op_Quot || - node->op == op_DivMod || node->op == op_Mod || node->op == op_Call || node->op == op_Alloc); + node->op == op_DivMod || node->op == op_Mod || node->op == op_Call || node->op == op_Alloc || node->op == op_Bound); return &node->attr.except; } +divmod_attr *get_irn_divmod_attr(ir_node *node) { + assert(node->op == op_Div || node->op == op_Quot || + node->op == op_DivMod || node->op == op_Mod); + return &node->attr.divmod; +} + void *(get_irn_generic_attr)(ir_node *node) { assert(is_ir_node(node)); return _get_irn_generic_attr(node); @@ -630,22 +649,10 @@ ir_type *is_frame_pointer(const ir_node *n) { return NULL; } -/* Test whether arbitrary node is globals pointer, i.e. Proj(pn_Start_P_globals) - * from Start. If so returns global type, else Null. */ -ir_type *is_globals_pointer(const ir_node *n) { - if (is_Proj(n) && (get_Proj_proj(n) == pn_Start_P_globals)) { - ir_node *start = get_Proj_pred(n); - if (is_Start(start)) { - return get_glob_type(); - } - } - return NULL; -} - /* Test whether arbitrary node is tls pointer, i.e. Proj(pn_Start_P_tls) * from Start. If so returns tls type, else Null. */ ir_type *is_tls_pointer(const ir_node *n) { - if (is_Proj(n) && (get_Proj_proj(n) == pn_Start_P_globals)) { + if (is_Proj(n) && (get_Proj_proj(n) == pn_Start_P_tls)) { ir_node *start = get_Proj_pred(n); if (is_Start(start)) { return get_tls_type(); @@ -800,7 +807,7 @@ void set_Block_extbb(ir_node *block, ir_extblk *extblk) { block->attr.block.extblk = extblk; } -/* returns the macro block header of a block. */ +/* Returns the macro block header of a block.*/ ir_node *get_Block_MacroBlock(const ir_node *block) { ir_node *mbh; assert(is_Block(block)); @@ -811,6 +818,13 @@ ir_node *get_Block_MacroBlock(const ir_node *block) { return mbh; } +/* Sets the macro block header of a block. */ +void set_Block_MacroBlock(ir_node *block, ir_node *mbh) { + assert(is_Block(block)); + assert(is_Block(mbh)); + set_irn_n(block, -1, mbh); +} + /* returns the macro block header of a node. */ ir_node *get_irn_MacroBlock(const ir_node *n) { if (! is_Block(n)) { @@ -1086,13 +1100,13 @@ set_Const_type(ir_node *node, ir_type *tp) { symconst_kind get_SymConst_kind(const ir_node *node) { assert(node->op == op_SymConst); - return node->attr.symc.num; + return node->attr.symc.kind; } void -set_SymConst_kind(ir_node *node, symconst_kind num) { +set_SymConst_kind(ir_node *node, symconst_kind kind) { assert(node->op == op_SymConst); - node->attr.symc.num = num; + node->attr.symc.kind = kind; } ir_type * @@ -1456,6 +1470,11 @@ BINOP(Cmp) UNOP(Conv) UNOP(Cast) +int is_Div_remainderless(const ir_node *node) { + assert(node->op == op_Div); + return node->attr.divmod.no_remainder; +} + int get_Conv_strict(const ir_node *node) { assert(node->op == op_Conv); return node->attr.conv.strict; @@ -2573,6 +2592,11 @@ int return _is_Minus(node); } +int +(is_Abs)(const ir_node *node) { + return _is_Abs(node); +} + int (is_Mod)(const ir_node *node) { return _is_Mod(node); @@ -3048,7 +3072,40 @@ dbg_info *(get_irn_dbg_info)(const ir_node *n) { return _get_irn_dbg_info(n); } +#if 0 /* allow the global pointer */ + +/* checks whether a node represents a global address */ +int is_Global(const ir_node *node) { + ir_node *ptr; + + if (is_SymConst_addr_ent(node)) + return 1; + if (! is_Sel(node)) + return 0; + + ptr = get_Sel_ptr(node); + return is_globals_pointer(ptr) != NULL; +} + +/* returns the entity of a global address */ +ir_entity *get_Global_entity(const ir_node *node) { + if (is_SymConst(node)) + return get_SymConst_entity(node); + else + return get_Sel_entity(node); +} +#else +/* checks whether a node represents a global address */ +int is_Global(const ir_node *node) { + return is_SymConst_addr_ent(node); +} + +/* returns the entity of a global address */ +ir_entity *get_Global_entity(const ir_node *node) { + return get_SymConst_entity(node); +} +#endif #ifdef DEBUG_libfirm void dump_irn(const ir_node *n) {