Replaced set_irn_n(*, -1, *) and get_irn_n(*, -1) by new get_nodes_block()/set_nodes_...
[libfirm] / ir / ir / irnode.c
index d42d3b6..f4d51d8 100644 (file)
@@ -1,15 +1,28 @@
 /*
- * Project:     libFIRM
- * File name:   ir/ir/irnode.c
- * Purpose:     Representation of an intermediate operation.
- * Author:      Martin Trapp, Christian Schaefer
- * Modified by: Goetz Lindenmaier, Michael Beck
- * Created:
- * CVS-ID:      $Id$
- * Copyright:   (c) 1998-2006 Universität Karlsruhe
- * Licence:     This file protected by GPL -  GNU GENERAL PUBLIC LICENSE.
+ * Copyright (C) 1995-2007 University of Karlsruhe.  All right reserved.
+ *
+ * This file is part of libFirm.
+ *
+ * This file may be distributed and/or modified under the terms of the
+ * GNU General Public License version 2 as published by the Free Software
+ * Foundation and appearing in the file LICENSE.GPL included in the
+ * packaging of this file.
+ *
+ * Licensees holding valid libFirm Professional Edition licenses may use
+ * this file in accordance with the libFirm Commercial License.
+ * Agreement provided with the Software.
+ *
+ * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+ * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE.
  */
 
+/**
+ * @file
+ * @brief   Representation of an intermediate operation.
+ * @author  Martin Trapp, Christian Schaefer, Goetz Lindenmaier, Michael Beck
+ * @version $Id$
+ */
 #ifdef HAVE_CONFIG_H
 # include "config.h"
 #endif
@@ -22,7 +35,6 @@
 #include "irnode_t.h"
 #include "irgraph_t.h"
 #include "irmode_t.h"
-#include "typegmod.h"
 #include "irbackedge_t.h"
 #include "irdump.h"
 #include "irop_t.h"
@@ -52,6 +64,8 @@ static const char *pnc_name_arr [] = {
  * returns the pnc name from an pnc constant
  */
 const char *get_pnc_string(int pnc) {
+       assert(pnc >= 0 && pnc <
+                       (int) (sizeof(pnc_name_arr)/sizeof(pnc_name_arr[0])));
        return pnc_name_arr[pnc];
 }
 
@@ -94,7 +108,7 @@ unsigned firm_add_node_size = 0;
 
 
 /* register new space for every node */
-unsigned register_additional_node_data(unsigned size) {
+unsigned firm_register_additional_node_data(unsigned size) {
        assert(!forbid_new_data && "Too late to register additional node data");
 
        if (forbid_new_data)
@@ -117,18 +131,18 @@ init_irnode(void) {
  * If arity is negative, a node with a dynamic array is created.
  */
 ir_node *
-new_ir_node (dbg_info *db, ir_graph *irg, ir_node *block, ir_op *op, ir_mode *mode,
-         int arity, ir_node **in)
+new_ir_node(dbg_info *db, ir_graph *irg, ir_node *block, ir_op *op, ir_mode *mode,
+            int arity, ir_node **in)
 {
        ir_node *res;
        size_t node_size = offsetof(ir_node, attr) + op->attr_size + firm_add_node_size;
        char *p;
-       int i, is_bl;
+       int i;
 
        assert(irg && op && mode);
-       p = obstack_alloc (irg->obst, node_size);
+       p = obstack_alloc(irg->obst, node_size);
        memset(p, 0, node_size);
-       res = (ir_node *) (p + firm_add_node_size);
+       res = (ir_node *)(p + firm_add_node_size);
 
        res->kind     = k_ir_node;
        res->op       = op;
@@ -139,10 +153,10 @@ new_ir_node (dbg_info *db, ir_graph *irg, ir_node *block, ir_op *op, ir_mode *mo
        res->deps     = NULL;
 
        if (arity < 0) {
-               res->in = NEW_ARR_F (ir_node *, 1);  /* 1: space for block */
+               res->in = NEW_ARR_F(ir_node *, 1);  /* 1: space for block */
        } else {
-               res->in = NEW_ARR_D (ir_node *, irg->obst, (arity+1));
-               memcpy (&res->in[1], in, sizeof (ir_node *) * arity);
+               res->in = NEW_ARR_D(ir_node *, irg->obst, (arity+1));
+               memcpy(&res->in[1], in, sizeof(ir_node *) * arity);
        }
 
        res->in[0] = block;
@@ -153,11 +167,12 @@ 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
 
-       for(i = 0; i < EDGE_KIND_LAST; ++i)
+       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)
+       /* don't put this into the for loop, arity is -1 for some nodes! */
+       edges_notify_edge(res, -1, res->in[0], NULL, irg);
+       for (i = 1; i <= arity; ++i)
                edges_notify_edge(res, i - 1, res->in[i], NULL, irg);
 
        hook_new_node(irg, res);
@@ -267,7 +282,7 @@ ir_node *
 }
 
 void
-set_irn_n (ir_node *node, int n, ir_node *in) {
+set_irn_n(ir_node *node, int n, ir_node *in) {
        assert(node && node->kind == k_ir_node);
        assert(-1 <= n);
        assert(n < get_irn_arity(node));
@@ -301,26 +316,37 @@ set_irn_n (ir_node *node, int n, ir_node *in) {
        node->in[n + 1] = in;
 }
 
+int add_irn_n(ir_node *node, ir_node *in) {
+       int pos;
+       ir_graph *irg = get_irn_irg(node);
+
+       assert(node->op->opar == oparity_dynamic);
+       pos = ARR_LEN(node->in) - 1;
+       ARR_APP1(ir_node *, node->in, in);
+       edges_notify_edge(node, pos, node->in[pos + 1], NULL, irg);
+
+       /* Call the hook */
+       hook_set_irn_n(node, pos, node->in[pos + 1], NULL);
+
+       return pos;
+}
+
 int
-(get_irn_deps)(const ir_node *node)
-{
+(get_irn_deps)(const ir_node *node) {
        return _get_irn_deps(node);
 }
 
 ir_node *
-(get_irn_dep)(const ir_node *node, int pos)
-{
+(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)(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 add_irn_dep(ir_node *node, ir_node *dep) {
        int res = 0;
 
        if (node->deps == NULL) {
@@ -352,11 +378,10 @@ int add_irn_dep(ir_node *node, ir_node *dep)
        return res;
 }
 
-void add_irn_deps(ir_node *tgt, ir_node *src)
-{
+void add_irn_deps(ir_node *tgt, ir_node *src) {
        int i, n;
 
-       for(i = 0, n = get_irn_deps(src); i < n; ++i)
+       for (i = 0, n = get_irn_deps(src); i < n; ++i)
                add_irn_dep(tgt, get_irn_dep(src, i));
 }
 
@@ -401,7 +426,7 @@ void
        _set_irn_op(node, op);
 }
 
-ir_opcode
+unsigned
 (get_irn_opcode)(const ir_node *node) {
        return _get_irn_opcode(node);
 }
@@ -409,9 +434,7 @@ ir_opcode
 const char *
 get_irn_opname(const ir_node *node) {
        assert(node);
-       if ((get_irn_op((ir_node *)node) == op_Phi) &&
-               (get_irg_phase_state(get_irn_irg((ir_node *)node)) == phase_building) &&
-               (get_irn_arity((ir_node *)node) == 0)) return "Phi0";
+       if (is_Phi0(node)) return "Phi0";
        return get_id_str(node->op->name);
 }
 
@@ -495,10 +518,22 @@ void firm_set_irn_section(ir_node *n, struct section *s) {
 }
 #else
 /* Dummies needed for firmjni. */
-struct abstval *get_irn_abst_value(ir_node *n) { return NULL; }
-void set_irn_abst_value(ir_node *n, struct abstval *os) {}
-struct section *firm_get_irn_section(ir_node *n) { return NULL; }
-void firm_set_irn_section(ir_node *n, struct section *s) {}
+struct abstval *get_irn_abst_value(ir_node *n) {
+       (void) n;
+       return NULL;
+}
+void set_irn_abst_value(ir_node *n, struct abstval *os) {
+       (void) n;
+       (void) os;
+}
+struct section *firm_get_irn_section(ir_node *n) {
+       (void) n;
+       return NULL;
+}
+void firm_set_irn_section(ir_node *n, struct section *s) {
+       (void) n;
+       (void) s;
+}
 #endif /* DO_HEAPANALYSIS */
 
 
@@ -512,10 +547,10 @@ long get_irn_node_nr(const ir_node *node) {
 #endif
 }
 
-const_attr
+const_attr *
 get_irn_const_attr(ir_node *node) {
        assert(node->op == op_Const);
-       return node->attr.con;
+       return &node->attr.con;
 }
 
 long
@@ -524,22 +559,22 @@ get_irn_proj_attr(ir_node *node) {
        return node->attr.proj;
 }
 
-alloc_attr
+alloc_attr *
 get_irn_alloc_attr(ir_node *node) {
        assert(node->op == op_Alloc);
-       return node->attr.alloc;
+       return &node->attr.alloc;
 }
 
-free_attr
+free_attr *
 get_irn_free_attr(ir_node *node) {
        assert(node->op == op_Free);
-       return node->attr.free;
+       return &node->attr.free;
 }
 
-symconst_attr
+symconst_attr *
 get_irn_symconst_attr(ir_node *node) {
        assert(node->op == op_SymConst);
-       return node->attr.symc;
+       return &node->attr.symc;
 }
 
 ir_type *
@@ -548,48 +583,51 @@ get_irn_call_attr(ir_node *node) {
        return node->attr.call.cld_tp = skip_tid(node->attr.call.cld_tp);
 }
 
-sel_attr
+sel_attr *
 get_irn_sel_attr(ir_node *node) {
        assert(node->op == op_Sel);
-       return node->attr.sel;
+       return &node->attr.sel;
 }
 
 int
-get_irn_phi_attr(ir_node *node) {
-       assert(node->op == op_Phi);
-       return node->attr.phi0_pos;
+get_irn_phi0_attr(ir_node *node) {
+       assert(is_Phi0(node));
+       return node->attr.phi0.pos;
 }
 
-block_attr
+block_attr *
 get_irn_block_attr(ir_node *node) {
        assert(node->op == op_Block);
-       return node->attr.block;
+       return &node->attr.block;
 }
 
-load_attr
-get_irn_load_attr(ir_node *node)
-{
-  assert(node->op == op_Load);
-  return node->attr.load;
+load_attr *
+get_irn_load_attr(ir_node *node) {
+       assert(node->op == op_Load);
+       return &node->attr.load;
 }
 
-store_attr
-get_irn_store_attr(ir_node *node)
-{
-  assert(node->op == op_Store);
-  return node->attr.store;
+store_attr *
+get_irn_store_attr(ir_node *node) {
+       assert(node->op == op_Store);
+       return &node->attr.store;
 }
 
-except_attr
+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);
-       return node->attr.except;
+       return &node->attr.except;
 }
 
-void *
-get_irn_generic_attr(ir_node *node) {
-       return &node->attr;
+void *(get_irn_generic_attr)(ir_node *node) {
+       assert(is_ir_node(node));
+       return _get_irn_generic_attr(node);
+}
+
+const void *(get_irn_generic_attr_const)(const ir_node *node) {
+       assert(is_ir_node(node));
+       return _get_irn_generic_attr_const(node);
 }
 
 unsigned (get_irn_idx)(const ir_node *node) {
@@ -608,18 +646,14 @@ int get_irn_pred_pos(ir_node *node, ir_node *arg) {
 
 /** manipulate fields of individual nodes **/
 
-/* this works for all except Block */
 ir_node *
-get_nodes_block(const ir_node *node) {
-       assert(node->op != op_Block);
-       assert(is_irn_pinned_in_irg(node) && "block info may be incorrect");
-       return get_irn_n(node, -1);
+(get_nodes_block)(const ir_node *node) {
+       return _get_nodes_block(node);
 }
 
 void
 set_nodes_block(ir_node *node, ir_node *block) {
-       assert(node->op != op_Block);
-       set_irn_n(node, -1, block);
+       node->op->ops.set_block(node, block);
 }
 
 /* Test whether arbitrary node is frame pointer, i.e. Proj(pn_Start_P_frame_base)
@@ -702,17 +736,17 @@ ir_node  *
 int
 get_Block_matured(ir_node *node) {
        assert(node->op == op_Block);
-       return (int)node->attr.block.matured;
+       return (int)node->attr.block.is_matured;
 }
 
 void
 set_Block_matured(ir_node *node, int matured) {
        assert(node->op == op_Block);
-       node->attr.block.matured = matured;
+       node->attr.block.is_matured = matured;
 }
 
 unsigned long
-(get_Block_block_visited)(ir_node *node) {
+(get_Block_block_visited)(const ir_node *node) {
        return _get_Block_block_visited(node);
 }
 
@@ -728,10 +762,15 @@ void
 }
 
 int
-(Block_not_block_visited)(ir_node *node) {
+(Block_not_block_visited)(const ir_node *node) {
        return _Block_not_block_visited(node);
 }
 
+int
+(Block_block_visited)(const ir_node *node) {
+       return _Block_block_visited(node);
+}
+
 ir_node *
 get_Block_graph_arr (ir_node *node, int pos) {
        assert(node->op == op_Block);
@@ -744,7 +783,7 @@ set_Block_graph_arr (ir_node *node, int pos, ir_node *value) {
        node->attr.block.graph_arr[pos+1] = value;
 }
 
-void set_Block_cg_cfgpred_arr(ir_node * node, int arity, ir_node ** in) {
+void set_Block_cg_cfgpred_arr(ir_node *node, int arity, ir_node *in[]) {
        assert(node->op == op_Block);
        if (node->attr.block.in_cg == NULL || arity != ARR_LEN(node->attr.block.in_cg) - 1) {
                node->attr.block.in_cg = NEW_ARR_D(ir_node *, current_ir_graph->obst, arity + 1);
@@ -762,29 +801,29 @@ void set_Block_cg_cfgpred_arr(ir_node * node, int arity, ir_node ** in) {
        memcpy(node->attr.block.in_cg + 1, in, sizeof(ir_node *) * arity);
 }
 
-void set_Block_cg_cfgpred(ir_node * node, int pos, ir_node * pred) {
+void set_Block_cg_cfgpred(ir_node *node, int pos, ir_node *pred) {
        assert(node->op == op_Block &&
               node->attr.block.in_cg &&
               0 <= pos && pos < ARR_LEN(node->attr.block.in_cg) - 1);
        node->attr.block.in_cg[pos + 1] = pred;
 }
 
-ir_node **get_Block_cg_cfgpred_arr(ir_node * node) {
+ir_node **get_Block_cg_cfgpred_arr(ir_node *node) {
        assert(node->op == op_Block);
        return node->attr.block.in_cg == NULL ? NULL : node->attr.block.in_cg  + 1;
 }
 
-int get_Block_cg_n_cfgpreds(ir_node * node) {
+int get_Block_cg_n_cfgpreds(ir_node *node) {
        assert(node->op == op_Block);
        return node->attr.block.in_cg == NULL ? 0 : ARR_LEN(node->attr.block.in_cg) - 1;
 }
 
-ir_node *get_Block_cg_cfgpred(ir_node * node, int pos) {
+ir_node *get_Block_cg_cfgpred(ir_node *node, int pos) {
        assert(node->op == op_Block && node->attr.block.in_cg);
        return node->attr.block.in_cg[pos + 1];
 }
 
-void remove_Block_cg_cfgpred_arr(ir_node * node) {
+void remove_Block_cg_cfgpred_arr(ir_node *node) {
        assert(node->op == op_Block);
        node->attr.block.in_cg = NULL;
 }
@@ -811,6 +850,18 @@ void set_Block_extbb(ir_node *block, ir_extblk *extblk) {
        block->attr.block.extblk = extblk;
 }
 
+/* returns the macro block header of a block. */
+ir_node *get_Block_MacroBlock(const ir_node *block) {
+       assert(is_Block(block));
+       return get_irn_n(block, -1);
+}
+
+/* returns the graph of a Block. */
+ir_graph *get_Block_irg(const ir_node *block) {
+       assert(is_Block(block));
+       return block->attr.block.irg;
+}
+
 int
 get_End_n_keepalives(ir_node *end) {
        assert(end->op == op_End);
@@ -824,14 +875,10 @@ get_End_keepalive(ir_node *end, int pos) {
 }
 
 void
-add_End_keepalive (ir_node *end, ir_node *ka) {
-       int l;
-       ir_graph *irg = get_irn_irg(end);
-
+add_End_keepalive(ir_node *end, ir_node *ka) {
        assert(end->op == op_End);
-       l = ARR_LEN(end->in);
-       ARR_APP1(ir_node *, end->in, ka);
-       edges_notify_edge(end, l - 1, end->in[l], NULL, irg);
+       assert((is_Phi(ka) || is_Proj(ka) || is_Block(ka) || is_irn_keep(ka)) && "Only Phi, Block or Keep nodes can be kept alive!");
+       add_irn_n(end, ka);
 }
 
 void
@@ -846,14 +893,14 @@ void set_End_keepalives(ir_node *end, int n, ir_node *in[]) {
        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);
+       for (i = END_KEEPALIVE_OFFSET; i < ARR_LEN(end->in) - 1; ++i) {
+               edges_notify_edge(end, i, NULL, end->in[i + 1], 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, END_KEEPALIVE_OFFSET + i, NULL, end->in[1 + END_KEEPALIVE_OFFSET + i], irg);
+               edges_notify_edge(end, END_KEEPALIVE_OFFSET + i, end->in[1 + END_KEEPALIVE_OFFSET + i], NULL, irg);
        }
 }
 
@@ -1006,7 +1053,7 @@ set_Return_res(ir_node *node, int pos, ir_node *res){
        set_irn_n(node, pos + RETURN_RESULT_OFFSET, res);
 }
 
-tarval *(get_Const_tarval)(ir_node *node) {
+tarval *(get_Const_tarval)(const ir_node *node) {
        return _get_Const_tarval(node);
 }
 
@@ -1068,7 +1115,7 @@ set_SymConst_type(ir_node *node, ir_type *tp) {
 }
 
 ident *
-get_SymConst_name(ir_node *node) {
+get_SymConst_name(const ir_node *node) {
        assert(node->op == op_SymConst && SYMCONST_HAS_ID(get_SymConst_kind(node)));
        return node->attr.symc.sym.ident_p;
 }
@@ -1081,7 +1128,7 @@ set_SymConst_name(ir_node *node, ident *name) {
 
 
 /* Only to access SymConst of kind symconst_addr_ent.  Else assertion: */
-ir_entity *get_SymConst_entity(ir_node *node) {
+ir_entity *get_SymConst_entity(const ir_node *node) {
        assert(node->op == op_SymConst && SYMCONST_HAS_ENT(get_SymConst_kind(node)));
        return node->attr.symc.sym.entity_p;
 }
@@ -1091,7 +1138,7 @@ void set_SymConst_entity(ir_node *node, ir_entity *ent) {
        node->attr.symc.sym.entity_p  = ent;
 }
 
-ir_enum_const *get_SymConst_enum(ir_node *node) {
+ir_enum_const *get_SymConst_enum(const ir_node *node) {
        assert(node->op == op_SymConst && SYMCONST_HAS_ENUM(get_SymConst_kind(node)));
        return node->attr.symc.sym.enum_p;
 }
@@ -1102,7 +1149,7 @@ void set_SymConst_enum(ir_node *node, ir_enum_const *ec) {
 }
 
 union symconst_symbol
-get_SymConst_symbol(ir_node *node) {
+get_SymConst_symbol(const ir_node *node) {
        assert(node->op == op_SymConst);
        return node->attr.symc.sym;
 }
@@ -1322,7 +1369,7 @@ void  set_CallBegin_call(ir_node *node, ir_node *call) {
 
 
 #define BINOP(OP)                                      \
-ir_node * get_##OP##_left(ir_node *node) {             \
+ir_node * get_##OP##_left(const ir_node *node) {       \
   assert(node->op == op_##OP);                         \
   return get_irn_n(node, node->op->op_index);          \
 }                                                      \
@@ -1330,7 +1377,7 @@ void set_##OP##_left(ir_node *node, ir_node *left) {   \
   assert(node->op == op_##OP);                         \
   set_irn_n(node, node->op->op_index, left);           \
 }                                                      \
-ir_node *get_##OP##_right(ir_node *node) {             \
+ir_node *get_##OP##_right(const ir_node *node) {       \
   assert(node->op == op_##OP);                         \
   return get_irn_n(node, node->op->op_index + 1);      \
 }                                                      \
@@ -1340,7 +1387,7 @@ void set_##OP##_right(ir_node *node, ir_node *right) { \
 }
 
 #define UNOP(OP)                                  \
-ir_node *get_##OP##_op(ir_node *node) {           \
+ir_node *get_##OP##_op(const ir_node *node) {     \
   assert(node->op == op_##OP);                    \
   return get_irn_n(node, node->op->op_index);     \
 }                                                 \
@@ -1364,14 +1411,28 @@ set_##OP##_mem(ir_node *node, ir_node *mem) { \
   set_irn_n(node, 0, mem);                    \
 }
 
+#define DIVOP(OP)                                       \
+BINOP_MEM(OP)                                           \
+                                                        \
+ir_mode *get_##OP##_resmode(const ir_node *node) {      \
+  assert(node->op == op_##OP);                          \
+  return node->attr.divmod.res_mode;                    \
+}                                                       \
+                                                        \
+void set_##OP##_resmode(ir_node *node, ir_mode *mode) { \
+  assert(node->op == op_##OP);                          \
+  node->attr.divmod.res_mode = mode;                    \
+}
+
+
 BINOP(Add)
 BINOP(Sub)
 UNOP(Minus)
 BINOP(Mul)
-BINOP_MEM(Quot)
-BINOP_MEM(DivMod)
-BINOP_MEM(Div)
-BINOP_MEM(Mod)
+DIVOP(Quot)
+DIVOP(DivMod)
+DIVOP(Div)
+DIVOP(Mod)
 UNOP(Abs)
 BINOP(And)
 BINOP(Or)
@@ -1459,7 +1520,7 @@ int
 }
 
 ir_node *
-get_unop_op(ir_node *node) {
+get_unop_op(const ir_node *node) {
        if (node->op->opar == oparity_unary)
                return get_irn_n(node, node->op->op_index);
 
@@ -1481,7 +1542,7 @@ int
 }
 
 ir_node *
-get_binop_left(ir_node *node) {
+get_binop_left(const ir_node *node) {
        assert(node->op->opar == oparity_binary);
        return get_irn_n(node, node->op->op_index);
 }
@@ -1493,7 +1554,7 @@ set_binop_left(ir_node *node, ir_node *left) {
 }
 
 ir_node *
-get_binop_right(ir_node *node) {
+get_binop_right(const ir_node *node) {
        assert(node->op->opar == oparity_binary);
        return get_irn_n(node, node->op->op_index + 1);
 }
@@ -1534,7 +1595,7 @@ get_Phi_preds_arr(ir_node *node) {
 }
 
 int
-get_Phi_n_preds(ir_node *node) {
+get_Phi_n_preds(const ir_node *node) {
        assert(is_Phi(node) || is_Phi0(node));
        return (get_irn_arity(node));
 }
@@ -1546,7 +1607,7 @@ void set_Phi_n_preds(ir_node *node, int n_preds) {
 */
 
 ir_node *
-get_Phi_pred(ir_node *node, int pos) {
+get_Phi_pred(const ir_node *node, int pos) {
        assert(is_Phi(node) || is_Phi0(node));
        return get_irn_n(node, pos);
 }
@@ -1817,13 +1878,8 @@ void set_Sync_pred(ir_node *node, int pos, ir_node *pred) {
 
 /* Add a new Sync predecessor */
 void add_Sync_pred(ir_node *node, ir_node *pred) {
-       int l;
-       ir_graph *irg = get_irn_irg(node);
-
        assert(node->op == op_Sync);
-       l = ARR_LEN(node->in);
-       ARR_APP1(ir_node *, node->in, pred);
-       edges_notify_edge(node, l, node->in[l], NULL, irg);
+       add_irn_n(node, pred);
 }
 
 /* Returns the source language type of a Proj node. */
@@ -1950,17 +2006,16 @@ void set_Confirm_bound(ir_node *node, ir_node *bound) {
        set_irn_n(node, 0, bound);
 }
 
-pn_Cmp get_Confirm_cmp(ir_node *node) {
+pn_Cmp get_Confirm_cmp(const ir_node *node) {
        assert(node->op == op_Confirm);
-       return node->attr.confirm_cmp;
+       return node->attr.confirm.cmp;
 }
 
 void set_Confirm_cmp(ir_node *node, pn_Cmp cmp) {
        assert(node->op == op_Confirm);
-       node->attr.confirm_cmp = cmp;
+       node->attr.confirm.cmp = cmp;
 }
 
-
 ir_node *
 get_Filter_pred(ir_node *node) {
        assert(node->op == op_Filter);
@@ -2271,7 +2326,7 @@ void set_Bound_upper(ir_node *bound, ir_node *upper) {
 }
 
 /* Return the operand of a Pin node. */
-ir_node *get_Pin_op(ir_node *pin) {
+ir_node *get_Pin_op(const ir_node *pin) {
        assert(pin->op == op_Pin);
        return get_irn_n(pin, 0);
 }
@@ -2281,6 +2336,47 @@ void set_Pin_op(ir_node *pin, ir_node *node) {
        set_irn_n(pin, 0, node);
 }
 
+/* Return the assembler text of an ASM pseudo node. */
+ident *get_ASM_text(const ir_node *node) {
+       assert(node->op == op_ASM);
+       return node->attr.assem.asm_text;
+}
+
+/* Return the number of input constraints for an ASM node. */
+int get_ASM_n_input_constraints(const ir_node *node) {
+       assert(node->op == op_ASM);
+       return ARR_LEN(node->attr.assem.inputs);
+}
+
+/* Return the input constraints for an ASM node. This is a flexible array. */
+const ir_asm_constraint *get_ASM_input_constraints(const ir_node *node) {
+       assert(node->op == op_ASM);
+       return node->attr.assem.inputs;
+}
+
+/* Return the number of output constraints for an ASM node.  */
+int get_ASM_n_output_constraints(const ir_node *node) {
+       assert(node->op == op_ASM);
+       return ARR_LEN(node->attr.assem.outputs);
+}
+
+/* Return the output constraints for an ASM node. */
+const ir_asm_constraint *get_ASM_output_constraints(const ir_node *node) {
+       assert(node->op == op_ASM);
+       return node->attr.assem.outputs;
+}
+
+/* Return the number of clobbered registers for an ASM node.  */
+int get_ASM_n_clobbers(const ir_node *node) {
+       assert(node->op == op_ASM);
+       return ARR_LEN(node->attr.assem.clobber);
+}
+
+/* Return the list of clobbered registers for an ASM node. */
+ident **get_ASM_clobbers(const ir_node *node) {
+       assert(node->op == op_ASM);
+       return node->attr.assem.clobber;
+}
 
 /* returns the graph of a node */
 ir_graph *
@@ -2292,9 +2388,9 @@ get_irn_irg(const ir_node *node) {
         * irg.
         */
        if (! is_Block(node))
-               node = get_irn_n(node, -1);
+               node = get_nodes_block(node);
        if (is_Bad(node))  /* sometimes bad is predecessor of nodes instead of block: in case of optimization */
-               node = get_irn_n(node, -1);
+               node = get_nodes_block(node);
        assert(get_irn_op(node) == op_Block);
        return node->attr.block.irg;
 }
@@ -2443,6 +2539,11 @@ int
        return _is_NoMem(node);
 }
 
+int
+(is_Minus)(const ir_node *node) {
+       return _is_Minus(node);
+}
+
 int
 (is_Mod)(const ir_node *node) {
        return _is_Mod(node);
@@ -2463,6 +2564,46 @@ int
        return _is_Quot(node);
 }
 
+int
+(is_Add)(const ir_node *node) {
+       return _is_Add(node);
+}
+
+int
+(is_And)(const ir_node *node) {
+       return _is_And(node);
+}
+
+int
+(is_Or)(const ir_node *node) {
+       return _is_Or(node);
+}
+
+int
+(is_Eor)(const ir_node *node) {
+       return _is_Eor(node);
+}
+
+int
+(is_Sub)(const ir_node *node) {
+       return _is_Sub(node);
+}
+
+int
+(is_Not)(const ir_node *node) {
+       return _is_Not(node);
+}
+
+int
+(is_Psi)(const ir_node *node) {
+       return _is_Psi(node);
+}
+
+int
+(is_Tuple)(const ir_node *node) {
+       return _is_Tuple(node);
+}
+
 int
 (is_Start)(const ir_node *node) {
   return _is_Start(node);
@@ -2478,6 +2619,11 @@ int
        return _is_Const(node);
 }
 
+int
+(is_Conv)(const ir_node *node) {
+       return _is_Conv(node);
+}
+
 int
 (is_no_Block)(const ir_node *node) {
        return _is_no_Block(node);
@@ -2589,6 +2735,12 @@ int
        return _is_Raise(node);
 }
 
+/* returns true if a node is an ASM node. */
+int
+(is_ASM)(const ir_node *node) {
+       return _is_ASM(node);
+}
+
 int
 is_Proj(const ir_node *node) {
        assert(node);
@@ -2619,7 +2771,7 @@ is_fragile_op(const ir_node *node) {
 ir_node *get_fragile_op_mem(ir_node *node) {
        assert(node && is_fragile_op(node));
 
-       switch (get_irn_opcode (node)) {
+       switch (get_irn_opcode(node)) {
        case iro_Call  :
        case iro_Quot  :
        case iro_DivMod:
@@ -2639,6 +2791,19 @@ ir_node *get_fragile_op_mem(ir_node *node) {
        }
 }
 
+/* Returns the result mode of a Div operation. */
+ir_mode *get_divop_resmod(const ir_node *node) {
+       switch (get_irn_opcode(node)) {
+       case iro_Quot  : return get_Quot_resmode(node);
+       case iro_DivMod: return get_DivMod_resmode(node);
+       case iro_Div   : return get_Div_resmode(node);
+       case iro_Mod   : return get_Mod_resmode(node);
+       default: ;
+               assert(0 && "should not be reached");
+               return NULL;
+       }
+}
+
 /* Returns true if the operation is a forking control flow operation. */
 int (is_irn_forking)(const ir_node *node) {
        return _is_irn_forking(node);
@@ -2709,7 +2874,7 @@ const char *get_cond_jmp_predicate_name(cond_jmp_predicate pred) {
 }
 
 /* Returns the conditional jump prediction of a Cond node. */
-cond_jmp_predicate (get_Cond_jmp_pred)(ir_node *cond) {
+cond_jmp_predicate (get_Cond_jmp_pred)(const ir_node *cond) {
        return _get_Cond_jmp_pred(cond);
 }
 
@@ -2720,6 +2885,7 @@ void (set_Cond_jmp_pred)(ir_node *cond, cond_jmp_predicate pred) {
 
 /** the get_type operation must be always implemented and return a firm type */
 static ir_type *get_Default_type(ir_node *n) {
+       (void) n;
        return get_unknown_type();
 }
 
@@ -2757,6 +2923,7 @@ static ir_entity *get_SymConst_attr_entity(ir_node *self) {
 
 /** the get_type_attr operation must be always implemented */
 static ir_type *get_Null_type(ir_node *n) {
+       (void) n;
        return firm_unknown_type;
 }
 
@@ -2779,6 +2946,7 @@ ir_op_ops *firm_set_default_get_type_attr(ir_opcode code, ir_op_ops *ops) {
 
 /** the get_entity_attr operation must be always implemented */
 static ir_entity *get_Null_ent(ir_node *n) {
+       (void) n;
        return NULL;
 }
 
@@ -2796,12 +2964,28 @@ ir_op_ops *firm_set_default_get_entity_attr(ir_opcode code, ir_op_ops *ops) {
        return ops;
 }
 
+/* Sets the debug information of a node. */
+void (set_irn_dbg_info)(ir_node *n, dbg_info *db) {
+       _set_irn_dbg_info(n, db);
+}
+
+/**
+ * Returns the debug information of an node.
+ *
+ * @param n   The node.
+ */
+dbg_info *(get_irn_dbg_info)(const ir_node *n) {
+       return _get_irn_dbg_info(n);
+}
+
+
+
 #ifdef DEBUG_libfirm
 void dump_irn(ir_node *n) {
        int i, arity = get_irn_arity(n);
        printf("%s%s: %ld (%p)\n", get_irn_opname(n), get_mode_name(get_irn_mode(n)), get_irn_node_nr(n), (void *)n);
        if (!is_Block(n)) {
-               ir_node *pred = get_irn_n(n, -1);
+               ir_node *pred = get_nodes_block(n);
                printf("  block: %s%s: %ld (%p)\n", get_irn_opname(pred), get_mode_name(get_irn_mode(pred)),
                        get_irn_node_nr(pred), (void *)pred);
        }