- BugFix of the last fix ...
[libfirm] / ir / ir / irnode.c
index a1d88cd..d98b1de 100644 (file)
@@ -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) {