removed pn_Bound_M_except, Bound now have only one memory output
[libfirm] / ir / ir / ircons.c
index 769d7b3..6fe6589 100644 (file)
@@ -55,13 +55,118 @@ typedef struct Phi_in_stack Phi_in_stack;
 # define IRN_VRFY_IRG(res, irg)
 #else
 # define IRN_VRFY_IRG(res, irg)  irn_vrfy_irg(res, irg)
 # define IRN_VRFY_IRG(res, irg)
 #else
 # define IRN_VRFY_IRG(res, irg)  irn_vrfy_irg(res, irg)
-#endif
+#endif /* NDEBUG */
 
 /**
  * Language dependent variable initialization callback.
  */
 static uninitialized_local_variable_func_t *default_initialize_local_variable = NULL;
 
 
 /**
  * Language dependent variable initialization callback.
  */
 static uninitialized_local_variable_func_t *default_initialize_local_variable = NULL;
 
+/* creates a bd constructor for a binop */
+#define NEW_BD_BINOP(instr)                                     \
+static ir_node *                                                \
+new_bd_##instr (dbg_info *db, ir_node *block,                   \
+       ir_node *op1, ir_node *op2, ir_mode *mode)               \
+{                                                               \
+  ir_node  *in[2];                                              \
+  ir_node  *res;                                                \
+  ir_graph *irg = current_ir_graph;                             \
+  in[0] = op1;                                                  \
+  in[1] = op2;                                                  \
+  res = new_ir_node(db, irg, block, op_##instr, mode, 2, in);   \
+  res = optimize_node(res);                                     \
+  IRN_VRFY_IRG(res, irg);                                       \
+  return res;                                                   \
+}
+
+/* creates a bd constructor for an unop */
+#define NEW_BD_UNOP(instr)                                      \
+static ir_node *                                                \
+new_bd_##instr (dbg_info *db, ir_node *block,                   \
+              ir_node *op, ir_mode *mode)                       \
+{                                                               \
+  ir_node  *res;                                                \
+  ir_graph *irg = current_ir_graph;                             \
+  res = new_ir_node(db, irg, block, op_##instr, mode, 1, &op);  \
+  res = optimize_node(res);                                     \
+  IRN_VRFY_IRG(res, irg);                                       \
+  return res;                                                   \
+}
+
+/* creates a bd constructor for an divop */
+#define NEW_BD_DIVOP(instr)                                     \
+static ir_node *                                                \
+new_bd_##instr (dbg_info *db, ir_node *block,                   \
+            ir_node *memop, ir_node *op1, ir_node *op2)         \
+{                                                               \
+  ir_node  *in[3];                                              \
+  ir_node  *res;                                                \
+  ir_graph *irg = current_ir_graph;                             \
+  in[0] = memop;                                                \
+  in[1] = op1;                                                  \
+  in[2] = op2;                                                  \
+  res = new_ir_node(db, irg, block, op_##instr, mode_T, 3, in); \
+  res = optimize_node(res);                                     \
+  IRN_VRFY_IRG(res, irg);                                       \
+  return res;                                                   \
+}
+
+/* creates a rd constructor for a binop */
+#define NEW_RD_BINOP(instr)                                     \
+ir_node *                                                       \
+new_rd_##instr (dbg_info *db, ir_graph *irg, ir_node *block,    \
+       ir_node *op1, ir_node *op2, ir_mode *mode)               \
+{                                                               \
+  ir_node  *res;                                                \
+  ir_graph *rem = current_ir_graph;                             \
+  current_ir_graph = irg;                                       \
+  res = new_bd_##instr(db, block, op1, op2, mode);              \
+  current_ir_graph = rem;                                       \
+  return res;                                                   \
+}
+
+/* creates a rd constructor for an unop */
+#define NEW_RD_UNOP(instr)                                      \
+ir_node *                                                       \
+new_rd_##instr (dbg_info *db, ir_graph *irg, ir_node *block,    \
+              ir_node *op, ir_mode *mode)                       \
+{                                                               \
+  ir_node  *res;                                                \
+  ir_graph *rem = current_ir_graph;                             \
+  current_ir_graph = irg;                                       \
+  res = new_bd_##instr(db, block, op, mode);                    \
+  current_ir_graph = rem;                                       \
+  return res;                                                   \
+}
+
+/* creates a rd constructor for an divop */
+#define NEW_RD_DIVOP(instr)                                     \
+ir_node *                                                       \
+new_rd_##instr (dbg_info *db, ir_graph *irg, ir_node *block,    \
+            ir_node *memop, ir_node *op1, ir_node *op2)         \
+{                                                               \
+  ir_node  *res;                                                \
+  ir_graph *rem = current_ir_graph;                             \
+  current_ir_graph = irg;                                       \
+  res = new_bd_##instr(db, block, memop, op1, op2);             \
+  current_ir_graph = rem;                                       \
+  return res;                                                   \
+}
+
+/* creates a d constructor for an binop */
+#define NEW_D_BINOP(instr)                                                    \
+ir_node *                                                                     \
+new_d_##instr (dbg_info *db, ir_node *op1, ir_node *op2, ir_mode *mode) {     \
+  return new_bd_##instr(db, current_ir_graph->current_block, op1, op2, mode); \
+}
+
+/* creates a d constructor for an unop */
+#define NEW_D_UNOP(instr)                                                     \
+ir_node *                                                                     \
+new_d_##instr (dbg_info *db, ir_node *op, ir_mode *mode) {                    \
+  return new_bd_##instr(db, current_ir_graph->current_block, op, mode);         \
+}
+
 
 /* Constructs a Block with a fixed number of predecessors.
    Does not set current_block.  Can not be used with automatic
 
 /* Constructs a Block with a fixed number of predecessors.
    Does not set current_block.  Can not be used with automatic
@@ -122,7 +227,7 @@ new_bd_Phi (dbg_info *db, ir_node *block, int arity, ir_node **in, ir_mode *mode
   ir_node  *res;
   ir_graph *irg = current_ir_graph;
   int i;
   ir_node  *res;
   ir_graph *irg = current_ir_graph;
   int i;
-  bool has_unknown = false;
+  int has_unknown = 0;
 
   /* Don't assert that block matured: the use of this constructor is strongly
      restricted ... */
 
   /* Don't assert that block matured: the use of this constructor is strongly
      restricted ... */
@@ -135,7 +240,7 @@ new_bd_Phi (dbg_info *db, ir_node *block, int arity, ir_node **in, ir_mode *mode
 
   for (i = arity-1; i >= 0; i--)
     if (get_irn_op(in[i]) == op_Unknown) {
 
   for (i = arity-1; i >= 0; i--)
     if (get_irn_op(in[i]) == op_Unknown) {
-      has_unknown = true;
+      has_unknown = 1;
       break;
     }
 
       break;
     }
 
@@ -145,17 +250,17 @@ new_bd_Phi (dbg_info *db, ir_node *block, int arity, ir_node **in, ir_mode *mode
   /* Memory Phis in endless loops must be kept alive.
      As we can't distinguish these easily we keep all of them alive. */
   if ((res->op == op_Phi) && (mode == mode_M))
   /* Memory Phis in endless loops must be kept alive.
      As we can't distinguish these easily we keep all of them alive. */
   if ((res->op == op_Phi) && (mode == mode_M))
-    add_End_keepalive(irg->end, res);
+    add_End_keepalive(get_irg_end(irg), res);
   return res;
 }
 
 static ir_node *
   return res;
 }
 
 static ir_node *
-new_bd_Const_type (dbg_info *db, ir_node *block, ir_mode *mode, tarval *con, type *tp)
+new_bd_Const_type (dbg_info *db, ir_node *block, ir_mode *mode, tarval *con, ir_type *tp)
 {
   ir_node  *res;
   ir_graph *irg = current_ir_graph;
 
 {
   ir_node  *res;
   ir_graph *irg = current_ir_graph;
 
-  res = new_ir_node (db, irg, irg->start_block, op_Const, mode, 0, NULL);
+  res = new_ir_node (db, irg, get_irg_start_block(irg), op_Const, mode, 0, NULL);
   res->attr.con.tv = con;
   set_Const_type(res, tp);  /* Call method because of complex assertion. */
   res = optimize_node (res);
   res->attr.con.tv = con;
   set_Const_type(res, tp);  /* Call method because of complex assertion. */
   res = optimize_node (res);
@@ -241,7 +346,7 @@ new_bd_Conv (dbg_info *db, ir_node *block, ir_node *op, ir_mode *mode)
 }
 
 static ir_node *
 }
 
 static ir_node *
-new_bd_Cast (dbg_info *db, ir_node *block, ir_node *op, type *to_tp)
+new_bd_Cast (dbg_info *db, ir_node *block, ir_node *op, ir_type *to_tp)
 {
   ir_node  *res;
   ir_graph *irg = current_ir_graph;
 {
   ir_node  *res;
   ir_graph *irg = current_ir_graph;
@@ -267,284 +372,34 @@ new_bd_Tuple (dbg_info *db, ir_node *block, int arity, ir_node **in)
   return res;
 }
 
   return res;
 }
 
-static ir_node *
-new_bd_Add (dbg_info *db, ir_node *block,
-       ir_node *op1, ir_node *op2, ir_mode *mode)
-{
-  ir_node  *in[2];
-  ir_node  *res;
-  ir_graph *irg = current_ir_graph;
-
-  in[0] = op1;
-  in[1] = op2;
-  res = new_ir_node(db, irg, block, op_Add, mode, 2, in);
-  res = optimize_node(res);
-  IRN_VRFY_IRG(res, irg);
-  return res;
-}
-
-static ir_node *
-new_bd_Sub (dbg_info *db, ir_node *block,
-       ir_node *op1, ir_node *op2, ir_mode *mode)
-{
-  ir_node  *in[2];
-  ir_node  *res;
-  ir_graph *irg = current_ir_graph;
-
-  in[0] = op1;
-  in[1] = op2;
-  res = new_ir_node (db, irg, block, op_Sub, mode, 2, in);
-  res = optimize_node (res);
-  IRN_VRFY_IRG(res, irg);
-  return res;
-}
-
-static ir_node *
-new_bd_Minus (dbg_info *db, ir_node *block,
-              ir_node *op, ir_mode *mode)
-{
-  ir_node  *res;
-  ir_graph *irg = current_ir_graph;
-
-  res = new_ir_node(db, irg, block, op_Minus, mode, 1, &op);
-  res = optimize_node(res);
-  IRN_VRFY_IRG(res, irg);
-  return res;
-}
-
-static ir_node *
-new_bd_Mul (dbg_info *db, ir_node *block,
-       ir_node *op1, ir_node *op2, ir_mode *mode)
-{
-  ir_node  *in[2];
-  ir_node  *res;
-  ir_graph *irg = current_ir_graph;
-
-  in[0] = op1;
-  in[1] = op2;
-  res = new_ir_node(db, irg, block, op_Mul, mode, 2, in);
-  res = optimize_node(res);
-  IRN_VRFY_IRG(res, irg);
-  return res;
-}
-
-static ir_node *
-new_bd_Quot (dbg_info *db, ir_node *block,
-            ir_node *memop, ir_node *op1, ir_node *op2)
-{
-  ir_node  *in[3];
-  ir_node  *res;
-  ir_graph *irg = current_ir_graph;
-
-  in[0] = memop;
-  in[1] = op1;
-  in[2] = op2;
-  res = new_ir_node(db, irg, block, op_Quot, mode_T, 3, in);
-  res = optimize_node(res);
-  IRN_VRFY_IRG(res, irg);
-  return res;
-}
-
-static ir_node *
-new_bd_DivMod (dbg_info *db, ir_node *block,
-          ir_node *memop, ir_node *op1, ir_node *op2)
-{
-  ir_node  *in[3];
-  ir_node  *res;
-  ir_graph *irg = current_ir_graph;
-
-  in[0] = memop;
-  in[1] = op1;
-  in[2] = op2;
-  res = new_ir_node(db, irg, block, op_DivMod, mode_T, 3, in);
-  res = optimize_node(res);
-  IRN_VRFY_IRG(res, irg);
-  return res;
-}
-
-static ir_node *
-new_bd_Div (dbg_info *db, ir_node *block,
-           ir_node *memop, ir_node *op1, ir_node *op2)
-{
-  ir_node  *in[3];
-  ir_node  *res;
-  ir_graph *irg = current_ir_graph;
-
-  in[0] = memop;
-  in[1] = op1;
-  in[2] = op2;
-  res = new_ir_node(db, irg, block, op_Div, mode_T, 3, in);
-  res = optimize_node(res);
-  IRN_VRFY_IRG(res, irg);
-  return res;
-}
-
-static ir_node *
-new_bd_Mod (dbg_info *db, ir_node *block,
-           ir_node *memop, ir_node *op1, ir_node *op2)
-{
-  ir_node  *in[3];
-  ir_node  *res;
-  ir_graph *irg = current_ir_graph;
-
-  in[0] = memop;
-  in[1] = op1;
-  in[2] = op2;
-  res = new_ir_node(db, irg, block, op_Mod, mode_T, 3, in);
-  res = optimize_node(res);
-  IRN_VRFY_IRG(res, irg);
-  return res;
-}
-
-static ir_node *
-new_bd_And (dbg_info *db, ir_node *block,
-           ir_node *op1, ir_node *op2, ir_mode *mode)
-{
-  ir_node  *in[2];
-  ir_node  *res;
-  ir_graph *irg = current_ir_graph;
-
-  in[0] = op1;
-  in[1] = op2;
-  res = new_ir_node(db, irg, block, op_And, mode, 2, in);
-  res = optimize_node(res);
-  IRN_VRFY_IRG(res, irg);
-  return res;
-}
-
-static ir_node *
-new_bd_Or (dbg_info *db, ir_node *block,
-          ir_node *op1, ir_node *op2, ir_mode *mode)
-{
-  ir_node  *in[2];
-  ir_node  *res;
-  ir_graph *irg = current_ir_graph;
-
-  in[0] = op1;
-  in[1] = op2;
-  res = new_ir_node(db, irg, block, op_Or, mode, 2, in);
-  res = optimize_node(res);
-  IRN_VRFY_IRG(res, irg);
-  return res;
-}
-
-static ir_node *
-new_bd_Eor (dbg_info *db, ir_node *block,
-          ir_node *op1, ir_node *op2, ir_mode *mode)
-{
-  ir_node  *in[2];
-  ir_node  *res;
-  ir_graph *irg = current_ir_graph;
-
-  in[0] = op1;
-  in[1] = op2;
-  res = new_ir_node (db, irg, block, op_Eor, mode, 2, in);
-  res = optimize_node (res);
-  IRN_VRFY_IRG(res, irg);
-  return res;
-}
-
-static ir_node *
-new_bd_Not    (dbg_info *db, ir_node *block,
-          ir_node *op, ir_mode *mode)
-{
-  ir_node  *res;
-  ir_graph *irg = current_ir_graph;
-
-  res = new_ir_node(db, irg, block, op_Not, mode, 1, &op);
-  res = optimize_node(res);
-  IRN_VRFY_IRG(res, irg);
-  return res;
-}
-
-static ir_node *
-new_bd_Shl (dbg_info *db, ir_node *block,
-          ir_node *op, ir_node *k, ir_mode *mode)
-{
-  ir_node  *in[2];
-  ir_node  *res;
-  ir_graph *irg = current_ir_graph;
-
-  in[0] = op;
-  in[1] = k;
-  res = new_ir_node(db, irg, block, op_Shl, mode, 2, in);
-  res = optimize_node(res);
-  IRN_VRFY_IRG(res, irg);
-  return res;
-}
-
-static ir_node *
-new_bd_Shr (dbg_info *db, ir_node *block,
-       ir_node *op, ir_node *k, ir_mode *mode)
-{
-  ir_node  *in[2];
-  ir_node  *res;
-  ir_graph *irg = current_ir_graph;
-
-  in[0] = op;
-  in[1] = k;
-  res = new_ir_node(db, irg, block, op_Shr, mode, 2, in);
-  res = optimize_node(res);
-  IRN_VRFY_IRG(res, irg);
-  return res;
-}
-
-static ir_node *
-new_bd_Shrs (dbg_info *db, ir_node *block,
-       ir_node *op, ir_node *k, ir_mode *mode)
-{
-  ir_node  *in[2];
-  ir_node  *res;
-  ir_graph *irg = current_ir_graph;
-
-  in[0] = op;
-  in[1] = k;
-  res = new_ir_node(db, irg, block, op_Shrs, mode, 2, in);
-  res = optimize_node(res);
-  IRN_VRFY_IRG(res, irg);
-  return res;
-}
-
-static ir_node *
-new_bd_Rot (dbg_info *db, ir_node *block,
-       ir_node *op, ir_node *k, ir_mode *mode)
-{
-  ir_node  *in[2];
-  ir_node  *res;
-  ir_graph *irg = current_ir_graph;
-
-  in[0] = op;
-  in[1] = k;
-  res = new_ir_node(db, irg, block, op_Rot, mode, 2, in);
-  res = optimize_node(res);
-  IRN_VRFY_IRG(res, irg);
-  return res;
-}
-
-static ir_node *
-new_bd_Abs (dbg_info *db, ir_node *block,
-       ir_node *op, ir_mode *mode)
-{
-  ir_node  *res;
-  ir_graph *irg = current_ir_graph;
-
-  res = new_ir_node(db, irg, block, op_Abs, mode, 1, &op);
-  res = optimize_node (res);
-  IRN_VRFY_IRG(res, irg);
-  return res;
-}
+NEW_BD_BINOP(Add)
+NEW_BD_BINOP(Sub)
+NEW_BD_UNOP(Minus)
+NEW_BD_BINOP(Mul)
+NEW_BD_DIVOP(Quot)
+NEW_BD_DIVOP(DivMod)
+NEW_BD_DIVOP(Div)
+NEW_BD_DIVOP(Mod)
+NEW_BD_BINOP(And)
+NEW_BD_BINOP(Or)
+NEW_BD_BINOP(Eor)
+NEW_BD_UNOP(Not)
+NEW_BD_BINOP(Shl)
+NEW_BD_BINOP(Shr)
+NEW_BD_BINOP(Shrs)
+NEW_BD_BINOP(Rot)
+NEW_BD_UNOP(Abs)
+NEW_BD_BINOP(Carry)
+NEW_BD_BINOP(Borrow)
 
 static ir_node *
 
 static ir_node *
-new_bd_Cmp (dbg_info *db, ir_node *block,
-       ir_node *op1, ir_node *op2)
+new_bd_Cmp (dbg_info *db, ir_node *block, ir_node *op1, ir_node *op2)
 {
   ir_node  *in[2];
   ir_node  *res;
   ir_graph *irg = current_ir_graph;
 {
   ir_node  *in[2];
   ir_node  *res;
   ir_graph *irg = current_ir_graph;
-
   in[0] = op1;
   in[1] = op2;
   in[0] = op1;
   in[1] = op2;
-
   res = new_ir_node(db, irg, block, op_Cmp, mode_T, 2, in);
   res = optimize_node(res);
   IRN_VRFY_IRG(res, irg);
   res = new_ir_node(db, irg, block, op_Cmp, mode_T, 2, in);
   res = optimize_node(res);
   IRN_VRFY_IRG(res, irg);
@@ -595,7 +450,7 @@ new_bd_Cond (dbg_info *db, ir_node *block, ir_node *c)
 
 static ir_node *
 new_bd_Call (dbg_info *db, ir_node *block, ir_node *store,
 
 static ir_node *
 new_bd_Call (dbg_info *db, ir_node *block, ir_node *store,
-        ir_node *callee, int arity, ir_node **in, type *tp)
+        ir_node *callee, int arity, ir_node **in, ir_type *tp)
 {
   ir_node  **r_in;
   ir_node  *res;
 {
   ir_node  **r_in;
   ir_node  *res;
@@ -638,21 +493,6 @@ new_bd_Return (dbg_info *db, ir_node *block,
   return res;
 }
 
   return res;
 }
 
-static ir_node *
-new_bd_Raise (dbg_info *db, ir_node *block, ir_node *store, ir_node *obj)
-{
-  ir_node  *in[2];
-  ir_node  *res;
-  ir_graph *irg = current_ir_graph;
-
-  in[0] = store;
-  in[1] = obj;
-  res = new_ir_node(db, irg, block, op_Raise, mode_T, 2, in);
-  res = optimize_node(res);
-  IRN_VRFY_IRG(res, irg);
-  return res;
-}
-
 static ir_node *
 new_bd_Load (dbg_info *db, ir_node *block,
         ir_node *store, ir_node *adr, ir_mode *mode)
 static ir_node *
 new_bd_Load (dbg_info *db, ir_node *block,
         ir_node *store, ir_node *adr, ir_mode *mode)
@@ -693,7 +533,7 @@ new_bd_Store (dbg_info *db, ir_node *block,
 
 static ir_node *
 new_bd_Alloc (dbg_info *db, ir_node *block, ir_node *store,
 
 static ir_node *
 new_bd_Alloc (dbg_info *db, ir_node *block, ir_node *store,
-        ir_node *size, type *alloc_type, where_alloc where)
+        ir_node *size, ir_type *alloc_type, where_alloc where)
 {
   ir_node  *in[2];
   ir_node  *res;
 {
   ir_node  *in[2];
   ir_node  *res;
@@ -712,7 +552,7 @@ new_bd_Alloc (dbg_info *db, ir_node *block, ir_node *store,
 
 static ir_node *
 new_bd_Free (dbg_info *db, ir_node *block, ir_node *store,
 
 static ir_node *
 new_bd_Free (dbg_info *db, ir_node *block, ir_node *store,
-        ir_node *ptr, ir_node *size, type *free_type, where_alloc where)
+        ir_node *ptr, ir_node *size, ir_type *free_type, where_alloc where)
 {
   ir_node  *in[3];
   ir_node  *res;
 {
   ir_node  *in[3];
   ir_node  *res;
@@ -755,31 +595,9 @@ new_bd_Sel (dbg_info *db, ir_node *block, ir_node *store, ir_node *objptr,
   return res;
 }
 
   return res;
 }
 
-static ir_node *
-new_bd_InstOf (dbg_info *db, ir_node *block, ir_node *store,
-           ir_node *objptr, type *ent)
-{
-  ir_node  **r_in;
-  ir_node  *res;
-  int      r_arity;
-  ir_graph *irg = current_ir_graph;
-
-  r_arity = 2;
-  NEW_ARR_A(ir_node *, r_in, r_arity);
-  r_in[0] = store;
-  r_in[1] = objptr;
-
-  res = new_ir_node(db, irg, block, op_Sel, mode_T, r_arity, r_in);
-  res->attr.io.ent = ent;
-
-  /* res = optimize(res); */
-  IRN_VRFY_IRG(res, irg);
-  return res;
-}
-
 static ir_node *
 new_bd_SymConst_type (dbg_info *db, ir_node *block, symconst_symbol value,
 static ir_node *
 new_bd_SymConst_type (dbg_info *db, ir_node *block, symconst_symbol value,
-              symconst_kind symkind, type *tp) {
+              symconst_kind symkind, ir_type *tp) {
   ir_node  *res;
   ir_mode  *mode;
   ir_graph *irg = current_ir_graph;
   ir_node  *res;
   ir_mode  *mode;
   ir_graph *irg = current_ir_graph;
@@ -811,13 +629,13 @@ new_bd_SymConst (dbg_info *db, ir_node *block, symconst_symbol value,
 }
 
 static ir_node *
 }
 
 static ir_node *
-new_bd_Sync (dbg_info *db, ir_node *block, int arity, ir_node **in)
+new_bd_Sync (dbg_info *db, ir_node *block)
 {
   ir_node  *res;
   ir_graph *irg = current_ir_graph;
 
 {
   ir_node  *res;
   ir_graph *irg = current_ir_graph;
 
-  res = new_ir_node(db, irg, block, op_Sync, mode_M, arity, in);
-  res = optimize_node(res);
+  res = new_ir_node(db, irg, block, op_Sync, mode_M, -1, NULL);
+  /* no need to call optimize node here, Sync are always created with no predecessors */
   IRN_VRFY_IRG(res, irg);
   return res;
 }
   IRN_VRFY_IRG(res, irg);
   return res;
 }
@@ -844,7 +662,7 @@ new_bd_Unknown (ir_mode *m)
   ir_node  *res;
   ir_graph *irg = current_ir_graph;
 
   ir_node  *res;
   ir_graph *irg = current_ir_graph;
 
-  res = new_ir_node(NULL, irg, irg->start_block, op_Unknown, m, 0, NULL);
+  res = new_ir_node(NULL, irg, get_irg_start_block(irg), op_Unknown, m, 0, NULL);
   res = optimize_node(res);
   return res;
 }
   res = optimize_node(res);
   return res;
 }
@@ -872,7 +690,7 @@ new_bd_EndReg (dbg_info *db, ir_node *block)
   ir_graph *irg = current_ir_graph;
 
   res = new_ir_node(db, irg, block, op_EndReg, mode_T, -1, NULL);
   ir_graph *irg = current_ir_graph;
 
   res = new_ir_node(db, irg, block, op_EndReg, mode_T, -1, NULL);
-  irg->end_reg = res;
+  set_irg_end_reg(irg, res);
   IRN_VRFY_IRG(res, irg);
   return res;
 }
   IRN_VRFY_IRG(res, irg);
   return res;
 }
@@ -884,7 +702,7 @@ new_bd_EndExcept (dbg_info *db, ir_node *block)
   ir_graph *irg = current_ir_graph;
 
   res = new_ir_node(db, irg, block, op_EndExcept, mode_T, -1, NULL);
   ir_graph *irg = current_ir_graph;
 
   res = new_ir_node(db, irg, block, op_EndExcept, mode_T, -1, NULL);
-  irg->end_except = res;
+  set_irg_end_except(irg, res);
   IRN_VRFY_IRG (res, irg);
   return res;
 }
   IRN_VRFY_IRG (res, irg);
   return res;
 }
@@ -942,417 +760,296 @@ new_bd_Mux  (dbg_info *db, ir_node *block,
   return res;
 }
 
   return res;
 }
 
-/* --------------------------------------------- */
-/* private interfaces, for professional use only */
-/* --------------------------------------------- */
-
-/* Constructs a Block with a fixed number of predecessors.
-   Does not set current_block.  Can not be used with automatic
-   Phi node construction. */
-ir_node *
-new_rd_Block (dbg_info *db, ir_graph *irg,  int arity, ir_node **in)
-{
-  ir_graph *rem    = current_ir_graph;
-  ir_node  *res;
-
-  current_ir_graph = irg;
-  res = new_bd_Block (db, arity, in);
-  current_ir_graph = rem;
-
-  return res;
-}
-
-ir_node *
-new_rd_Start (dbg_info *db, ir_graph *irg, ir_node *block)
-{
-  ir_graph *rem = current_ir_graph;
-  ir_node  *res;
-
-  current_ir_graph = irg;
-  res = new_bd_Start (db, block);
-  current_ir_graph = rem;
-
-  return res;
-}
-
-ir_node *
-new_rd_End (dbg_info *db, ir_graph *irg, ir_node *block)
-{
-  ir_node  *res;
-  ir_graph *rem = current_ir_graph;
-
-  current_ir_graph = rem;
-  res = new_bd_End (db, block);
-  current_ir_graph = rem;
-
-  return res;
-}
-
-/* Creates a Phi node with all predecessors.  Calling this constructor
-   is only allowed if the corresponding block is mature.  */
-ir_node *
-new_rd_Phi (dbg_info *db, ir_graph *irg, ir_node *block, int arity, ir_node **in, ir_mode *mode)
-{
-  ir_node  *res;
-  ir_graph *rem = current_ir_graph;
-
-  current_ir_graph  = irg;
-  res = new_bd_Phi (db, block,arity, in, mode);
-  current_ir_graph = rem;
-
-  return res;
-}
-
-ir_node *
-new_rd_Const_type (dbg_info *db, ir_graph *irg, ir_node *block, ir_mode *mode, tarval *con, type *tp)
-{
-  ir_node  *res;
-  ir_graph *rem = current_ir_graph;
-
-  current_ir_graph  = irg;
-  res = new_bd_Const_type (db, block, mode, con, tp);
-  current_ir_graph = rem;
-
-  return res;
-}
-
-ir_node *
-new_rd_Const (dbg_info *db, ir_graph *irg, ir_node *block, ir_mode *mode, tarval *con)
+static ir_node *
+new_bd_Psi (dbg_info *db, ir_node *block,
+    int arity, ir_node *cond[], ir_node *vals[], ir_mode *mode)
 {
 {
+  ir_node  **in;
   ir_node  *res;
   ir_node  *res;
-  ir_graph *rem = current_ir_graph;
-
-  current_ir_graph = irg;
-  res = new_bd_Const_type (db, block, mode, con, firm_unknown_type);
-  current_ir_graph = rem;
+  ir_graph *irg = current_ir_graph;
+  int i;
 
 
-  return res;
-}
+  NEW_ARR_A(ir_node *, in, 2 * arity + 1);
 
 
-ir_node *
-new_rd_Const_long (dbg_info *db, ir_graph *irg, ir_node *block, ir_mode *mode, long value)
-{
-    return new_rd_Const(db, irg, block, mode, new_tarval_from_long(value, mode));
-}
-
-ir_node *
-new_rd_Id (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *val, ir_mode *mode)
-{
-  ir_node  *res;
-  ir_graph *rem = current_ir_graph;
+  for (i = 0; i < arity; ++i) {
+    in[2 * i]     = cond[i];
+    in[2 * i + 1] = vals[i];
+  }
+  in[2 * i] = vals[i];
 
 
-  current_ir_graph = irg;
-  res = new_bd_Id(db, block, val, mode);
-  current_ir_graph = rem;
+  res = new_ir_node(db, irg, block, op_Psi, mode, 2 * arity + 1, in);
+  assert(res);
 
 
+  res = optimize_node(res);
+  IRN_VRFY_IRG(res, irg);
   return res;
 }
 
   return res;
 }
 
-ir_node *
-new_rd_Proj (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *arg, ir_mode *mode,
-        long proj)
+static ir_node *
+new_bd_CopyB  (dbg_info *db, ir_node *block,
+    ir_node *store, ir_node *dst, ir_node *src, ir_type *data_type)
 {
 {
+  ir_node  *in[3];
   ir_node  *res;
   ir_node  *res;
-  ir_graph *rem = current_ir_graph;
-
-  current_ir_graph = irg;
-  res = new_bd_Proj(db, block, arg, mode, proj);
-  current_ir_graph = rem;
+  ir_graph *irg = current_ir_graph;
 
 
-  return res;
-}
+  in[0] = store;
+  in[1] = dst;
+  in[2] = src;
 
 
-ir_node *
-new_rd_defaultProj (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *arg,
-           long max_proj)
-{
-  ir_node  *res;
-  ir_graph *rem = current_ir_graph;
-
-  current_ir_graph = irg;
-  res = new_bd_defaultProj(db, block, arg, max_proj);
-  current_ir_graph = rem;
+  res = new_ir_node(db, irg, block, op_CopyB, mode_T, 3, in);
 
 
+  res->attr.copyb.exc.pin_state = op_pin_state_pinned;
+  res->attr.copyb.data_type     = data_type;
+  res = optimize_node(res);
+  IRN_VRFY_IRG(res, irg);
   return res;
 }
 
   return res;
 }
 
-ir_node *
-new_rd_Conv (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *op, ir_mode *mode)
+static ir_node *
+new_bd_InstOf (dbg_info *db, ir_node *block, ir_node *store,
+           ir_node *objptr, ir_type *type)
 {
 {
+  ir_node  *in[2];
   ir_node  *res;
   ir_node  *res;
-  ir_graph *rem = current_ir_graph;
-
-  current_ir_graph = irg;
-  res = new_bd_Conv(db, block, op, mode);
-  current_ir_graph = rem;
+  ir_graph *irg = current_ir_graph;
 
 
+  in[0] = store;
+  in[1] = objptr;
+  res = new_ir_node(db, irg, block, op_Sel, mode_T, 2, in);
+  res->attr.io.type = type;
+  res = optimize_node(res);
+  IRN_VRFY_IRG(res, irg);
   return res;
 }
 
   return res;
 }
 
-ir_node *
-new_rd_Cast (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *op, type *to_tp)
+static ir_node *
+new_bd_Raise (dbg_info *db, ir_node *block, ir_node *store, ir_node *obj)
 {
 {
+  ir_node  *in[2];
   ir_node  *res;
   ir_node  *res;
-  ir_graph *rem = current_ir_graph;
-
-  current_ir_graph = irg;
-  res = new_bd_Cast(db, block, op, to_tp);
-  current_ir_graph = rem;
+  ir_graph *irg = current_ir_graph;
 
 
+  in[0] = store;
+  in[1] = obj;
+  res = new_ir_node(db, irg, block, op_Raise, mode_T, 2, in);
+  res = optimize_node(res);
+  IRN_VRFY_IRG(res, irg);
   return res;
 }
 
   return res;
 }
 
-ir_node *
-new_rd_Tuple (dbg_info *db, ir_graph *irg, ir_node *block, int arity, ir_node **in)
+static ir_node *
+new_bd_Bound (dbg_info *db, ir_node *block,
+    ir_node *store, ir_node *idx, ir_node *lower, ir_node *upper)
 {
 {
+  ir_node  *in[4];
   ir_node  *res;
   ir_node  *res;
-  ir_graph *rem = current_ir_graph;
-
-  current_ir_graph = irg;
-  res = new_bd_Tuple(db, block, arity, in);
-  current_ir_graph = rem;
+  ir_graph *irg = current_ir_graph;
 
 
+  in[0] = store;
+  in[1] = idx;
+  in[2] = lower;
+  in[3] = upper;
+  res = new_ir_node(db, irg, block, op_Bound, mode_T, 4, in);
+  res->attr.bound.exc.pin_state = op_pin_state_pinned;
+  res = optimize_node(res);
+  IRN_VRFY_IRG(res, irg);
   return res;
 }
 
   return res;
 }
 
-ir_node *
-new_rd_Add (dbg_info *db, ir_graph *irg, ir_node *block,
-       ir_node *op1, ir_node *op2, ir_mode *mode)
-{
-  ir_node  *res;
-  ir_graph *rem = current_ir_graph;
-
-  current_ir_graph = irg;
-  res = new_bd_Add(db, block, op1, op2, mode);
-  current_ir_graph = rem;
-
-  return res;
-}
+/* --------------------------------------------- */
+/* private interfaces, for professional use only */
+/* --------------------------------------------- */
 
 
+/* Constructs a Block with a fixed number of predecessors.
+   Does not set current_block.  Can not be used with automatic
+   Phi node construction. */
 ir_node *
 ir_node *
-new_rd_Sub (dbg_info *db, ir_graph *irg, ir_node *block,
-       ir_node *op1, ir_node *op2, ir_mode *mode)
+new_rd_Block (dbg_info *db, ir_graph *irg,  int arity, ir_node **in)
 {
 {
+  ir_graph *rem    = current_ir_graph;
   ir_node  *res;
   ir_node  *res;
-  ir_graph *rem = current_ir_graph;
 
   current_ir_graph = irg;
 
   current_ir_graph = irg;
-  res = new_bd_Sub(db, block, op1, op2, mode);
+  res = new_bd_Block (db, arity, in);
   current_ir_graph = rem;
 
   return res;
 }
 
 ir_node *
   current_ir_graph = rem;
 
   return res;
 }
 
 ir_node *
-new_rd_Minus (dbg_info *db, ir_graph *irg, ir_node *block,
-              ir_node *op, ir_mode *mode)
+new_rd_Start (dbg_info *db, ir_graph *irg, ir_node *block)
 {
 {
-  ir_node  *res;
   ir_graph *rem = current_ir_graph;
   ir_graph *rem = current_ir_graph;
-
-  current_ir_graph = irg;
-  res = new_bd_Minus(db, block, op, mode);
-  current_ir_graph = rem;
-
-  return res;
-}
-
-ir_node *
-new_rd_Mul (dbg_info *db, ir_graph *irg, ir_node *block,
-       ir_node *op1, ir_node *op2, ir_mode *mode)
-{
   ir_node  *res;
   ir_node  *res;
-  ir_graph *rem = current_ir_graph;
 
   current_ir_graph = irg;
 
   current_ir_graph = irg;
-  res = new_bd_Mul(db, block, op1, op2, mode);
+  res = new_bd_Start (db, block);
   current_ir_graph = rem;
 
   return res;
 }
 
 ir_node *
   current_ir_graph = rem;
 
   return res;
 }
 
 ir_node *
-new_rd_Quot (dbg_info *db, ir_graph *irg, ir_node *block,
-            ir_node *memop, ir_node *op1, ir_node *op2)
+new_rd_End (dbg_info *db, ir_graph *irg, ir_node *block)
 {
   ir_node  *res;
   ir_graph *rem = current_ir_graph;
 
 {
   ir_node  *res;
   ir_graph *rem = current_ir_graph;
 
-  current_ir_graph = irg;
-  res = new_bd_Quot(db, block, memop, op1, op2);
   current_ir_graph = rem;
   current_ir_graph = rem;
-
-  return res;
-}
-
-ir_node *
-new_rd_DivMod (dbg_info *db, ir_graph *irg, ir_node *block,
-          ir_node *memop, ir_node *op1, ir_node *op2)
-{
-  ir_node  *res;
-  ir_graph *rem = current_ir_graph;
-
-  current_ir_graph = irg;
-  res = new_bd_DivMod(db, block, memop, op1, op2);
+  res = new_bd_End (db, block);
   current_ir_graph = rem;
 
   return res;
 }
 
   current_ir_graph = rem;
 
   return res;
 }
 
+/* Creates a Phi node with all predecessors.  Calling this constructor
+   is only allowed if the corresponding block is mature.  */
 ir_node *
 ir_node *
-new_rd_Div (dbg_info *db, ir_graph *irg, ir_node *block,
-           ir_node *memop, ir_node *op1, ir_node *op2)
-{
-  ir_node  *res;
-  ir_graph *rem = current_ir_graph;
-
-  current_ir_graph = irg;
-  res = new_bd_Div (db, block, memop, op1, op2);
-  current_ir_graph =rem;
-
-  return res;
-}
-
-ir_node *
-new_rd_Mod (dbg_info *db, ir_graph *irg, ir_node *block,
-           ir_node *memop, ir_node *op1, ir_node *op2)
+new_rd_Phi (dbg_info *db, ir_graph *irg, ir_node *block, int arity, ir_node **in, ir_mode *mode)
 {
   ir_node  *res;
   ir_graph *rem = current_ir_graph;
 
 {
   ir_node  *res;
   ir_graph *rem = current_ir_graph;
 
-  current_ir_graph = irg;
-  res = new_bd_Mod(db, block, memop, op1, op2);
+  current_ir_graph  = irg;
+  res = new_bd_Phi (db, block,arity, in, mode);
   current_ir_graph = rem;
 
   return res;
 }
 
 ir_node *
   current_ir_graph = rem;
 
   return res;
 }
 
 ir_node *
-new_rd_And (dbg_info *db, ir_graph *irg, ir_node *block,
-           ir_node *op1, ir_node *op2, ir_mode *mode)
+new_rd_Const_type (dbg_info *db, ir_graph *irg, ir_node *block, ir_mode *mode, tarval *con, ir_type *tp)
 {
   ir_node  *res;
   ir_graph *rem = current_ir_graph;
 
 {
   ir_node  *res;
   ir_graph *rem = current_ir_graph;
 
-  current_ir_graph = irg;
-  res = new_bd_And(db, block, op1, op2, mode);
+  current_ir_graph  = irg;
+  res = new_bd_Const_type (db, block, mode, con, tp);
   current_ir_graph = rem;
 
   return res;
 }
 
 ir_node *
   current_ir_graph = rem;
 
   return res;
 }
 
 ir_node *
-new_rd_Or (dbg_info *db, ir_graph *irg, ir_node *block,
-          ir_node *op1, ir_node *op2, ir_mode *mode)
+new_rd_Const (dbg_info *db, ir_graph *irg, ir_node *block, ir_mode *mode, tarval *con)
 {
   ir_node  *res;
   ir_graph *rem = current_ir_graph;
 
   current_ir_graph = irg;
 {
   ir_node  *res;
   ir_graph *rem = current_ir_graph;
 
   current_ir_graph = irg;
-  res = new_bd_Or(db, block, op1, op2, mode);
+  res = new_bd_Const_type (db, block, mode, con, firm_unknown_type);
   current_ir_graph = rem;
 
   return res;
 }
 
   current_ir_graph = rem;
 
   return res;
 }
 
-ir_node *
-new_rd_Eor (dbg_info *db, ir_graph *irg, ir_node *block,
-          ir_node *op1, ir_node *op2, ir_mode *mode)
-{
-  ir_node  *res;
-  ir_graph *rem = current_ir_graph;
-
-  current_ir_graph = irg;
-  res = new_bd_Eor(db, block, op1, op2, mode);
-  current_ir_graph = rem;
-
-  return res;
+ir_node *
+new_rd_Const_long (dbg_info *db, ir_graph *irg, ir_node *block, ir_mode *mode, long value)
+{
+    return new_rd_Const(db, irg, block, mode, new_tarval_from_long(value, mode));
 }
 
 ir_node *
 }
 
 ir_node *
-new_rd_Not (dbg_info *db, ir_graph *irg, ir_node *block,
-          ir_node *op, ir_mode *mode)
+new_rd_Id (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *val, ir_mode *mode)
 {
   ir_node  *res;
   ir_graph *rem = current_ir_graph;
 
   current_ir_graph = irg;
 {
   ir_node  *res;
   ir_graph *rem = current_ir_graph;
 
   current_ir_graph = irg;
-  res = new_bd_Not(db, block, op, mode);
+  res = new_bd_Id(db, block, val, mode);
   current_ir_graph = rem;
 
   return res;
 }
 
 ir_node *
   current_ir_graph = rem;
 
   return res;
 }
 
 ir_node *
-new_rd_Shl (dbg_info *db, ir_graph *irg, ir_node *block,
-          ir_node *op, ir_node *k, ir_mode *mode)
+new_rd_Proj (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *arg, ir_mode *mode,
+        long proj)
 {
   ir_node  *res;
   ir_graph *rem = current_ir_graph;
 
   current_ir_graph = irg;
 {
   ir_node  *res;
   ir_graph *rem = current_ir_graph;
 
   current_ir_graph = irg;
-  res = new_bd_Shl (db, block, op, k, mode);
+  res = new_bd_Proj(db, block, arg, mode, proj);
   current_ir_graph = rem;
 
   return res;
 }
 
 ir_node *
   current_ir_graph = rem;
 
   return res;
 }
 
 ir_node *
-new_rd_Shr (dbg_info *db, ir_graph *irg, ir_node *block,
-       ir_node *op, ir_node *k, ir_mode *mode)
+new_rd_defaultProj (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *arg,
+           long max_proj)
 {
   ir_node  *res;
   ir_graph *rem = current_ir_graph;
 
   current_ir_graph = irg;
 {
   ir_node  *res;
   ir_graph *rem = current_ir_graph;
 
   current_ir_graph = irg;
-  res = new_bd_Shr(db, block, op, k, mode);
+  res = new_bd_defaultProj(db, block, arg, max_proj);
   current_ir_graph = rem;
 
   return res;
 }
 
 ir_node *
   current_ir_graph = rem;
 
   return res;
 }
 
 ir_node *
-new_rd_Shrs (dbg_info *db, ir_graph *irg, ir_node *block,
-       ir_node *op, ir_node *k, ir_mode *mode)
+new_rd_Conv (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *op, ir_mode *mode)
 {
   ir_node  *res;
   ir_graph *rem = current_ir_graph;
 
   current_ir_graph = irg;
 {
   ir_node  *res;
   ir_graph *rem = current_ir_graph;
 
   current_ir_graph = irg;
-  res = new_bd_Shrs(db, block, op, k, mode);
+  res = new_bd_Conv(db, block, op, mode);
   current_ir_graph = rem;
 
   return res;
 }
 
 ir_node *
   current_ir_graph = rem;
 
   return res;
 }
 
 ir_node *
-new_rd_Rot (dbg_info *db, ir_graph *irg, ir_node *block,
-       ir_node *op, ir_node *k, ir_mode *mode)
+new_rd_Cast (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *op, ir_type *to_tp)
 {
   ir_node  *res;
   ir_graph *rem = current_ir_graph;
 
   current_ir_graph = irg;
 {
   ir_node  *res;
   ir_graph *rem = current_ir_graph;
 
   current_ir_graph = irg;
-  res = new_bd_Rot(db, block, op, k, mode);
+  res = new_bd_Cast(db, block, op, to_tp);
   current_ir_graph = rem;
 
   return res;
 }
 
 ir_node *
   current_ir_graph = rem;
 
   return res;
 }
 
 ir_node *
-new_rd_Abs (dbg_info *db, ir_graph *irg, ir_node *block,
-       ir_node *op, ir_mode *mode)
+new_rd_Tuple (dbg_info *db, ir_graph *irg, ir_node *block, int arity, ir_node **in)
 {
   ir_node  *res;
   ir_graph *rem = current_ir_graph;
 
   current_ir_graph = irg;
 {
   ir_node  *res;
   ir_graph *rem = current_ir_graph;
 
   current_ir_graph = irg;
-  res = new_bd_Abs(db, block, op, mode);
+  res = new_bd_Tuple(db, block, arity, in);
   current_ir_graph = rem;
 
   return res;
 }
 
   current_ir_graph = rem;
 
   return res;
 }
 
+NEW_RD_BINOP(Add)
+NEW_RD_BINOP(Sub)
+NEW_RD_UNOP(Minus)
+NEW_RD_BINOP(Mul)
+NEW_RD_DIVOP(Quot)
+NEW_RD_DIVOP(DivMod)
+NEW_RD_DIVOP(Div)
+NEW_RD_DIVOP(Mod)
+NEW_RD_BINOP(And)
+NEW_RD_BINOP(Or)
+NEW_RD_BINOP(Eor)
+NEW_RD_UNOP(Not)
+NEW_RD_BINOP(Shl)
+NEW_RD_BINOP(Shr)
+NEW_RD_BINOP(Shrs)
+NEW_RD_BINOP(Rot)
+NEW_RD_UNOP(Abs)
+NEW_RD_BINOP(Carry)
+NEW_RD_BINOP(Borrow)
+
 ir_node *
 new_rd_Cmp (dbg_info *db, ir_graph *irg, ir_node *block,
        ir_node *op1, ir_node *op2)
 ir_node *
 new_rd_Cmp (dbg_info *db, ir_graph *irg, ir_node *block,
        ir_node *op1, ir_node *op2)
@@ -1408,7 +1105,7 @@ new_rd_Cond (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *c)
 
 ir_node *
 new_rd_Call (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *store,
 
 ir_node *
 new_rd_Call (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *store,
-        ir_node *callee, int arity, ir_node **in, type *tp)
+        ir_node *callee, int arity, ir_node **in, ir_type *tp)
 {
   ir_node  *res;
   ir_graph *rem = current_ir_graph;
 {
   ir_node  *res;
   ir_graph *rem = current_ir_graph;
@@ -1434,19 +1131,6 @@ new_rd_Return (dbg_info *db, ir_graph *irg, ir_node *block,
   return res;
 }
 
   return res;
 }
 
-ir_node *
-new_rd_Raise (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *store, ir_node *obj)
-{
-  ir_node  *res;
-  ir_graph *rem = current_ir_graph;
-
-  current_ir_graph = irg;
-  res = new_bd_Raise(db, block, store, obj);
-  current_ir_graph = rem;
-
-  return res;
-}
-
 ir_node *
 new_rd_Load (dbg_info *db, ir_graph *irg, ir_node *block,
         ir_node *store, ir_node *adr, ir_mode *mode)
 ir_node *
 new_rd_Load (dbg_info *db, ir_graph *irg, ir_node *block,
         ir_node *store, ir_node *adr, ir_mode *mode)
@@ -1477,7 +1161,7 @@ new_rd_Store (dbg_info *db, ir_graph *irg, ir_node *block,
 
 ir_node *
 new_rd_Alloc (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *store,
 
 ir_node *
 new_rd_Alloc (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *store,
-        ir_node *size, type *alloc_type, where_alloc where)
+        ir_node *size, ir_type *alloc_type, where_alloc where)
 {
   ir_node  *res;
   ir_graph *rem = current_ir_graph;
 {
   ir_node  *res;
   ir_graph *rem = current_ir_graph;
@@ -1491,7 +1175,7 @@ new_rd_Alloc (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *store,
 
 ir_node *
 new_rd_Free (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *store,
 
 ir_node *
 new_rd_Free (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *store,
-        ir_node *ptr, ir_node *size, type *free_type, where_alloc where)
+        ir_node *ptr, ir_node *size, ir_type *free_type, where_alloc where)
 {
   ir_node  *res;
   ir_graph *rem = current_ir_graph;
 {
   ir_node  *res;
   ir_graph *rem = current_ir_graph;
@@ -1504,28 +1188,28 @@ new_rd_Free (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *store,
 }
 
 ir_node *
 }
 
 ir_node *
-new_rd_Sel (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *store, ir_node *objptr,
-           int arity, ir_node **in, entity *ent)
+new_rd_simpleSel (dbg_info *db, ir_graph *irg, ir_node *block,
+                  ir_node *store, ir_node *objptr, entity *ent)
 {
   ir_node  *res;
   ir_graph *rem = current_ir_graph;
 
   current_ir_graph = irg;
 {
   ir_node  *res;
   ir_graph *rem = current_ir_graph;
 
   current_ir_graph = irg;
-  res = new_bd_Sel(db, block, store, objptr, arity, in, ent);
+  res = new_bd_Sel(db, block, store, objptr, 0, NULL, ent);
   current_ir_graph = rem;
 
   return res;
 }
 
 ir_node *
   current_ir_graph = rem;
 
   return res;
 }
 
 ir_node *
-new_rd_InstOf (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *store,
-           ir_node *objptr, type *ent)
+new_rd_Sel (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *store, ir_node *objptr,
+           int arity, ir_node **in, entity *ent)
 {
   ir_node  *res;
   ir_graph *rem = current_ir_graph;
 
   current_ir_graph = irg;
 {
   ir_node  *res;
   ir_graph *rem = current_ir_graph;
 
   current_ir_graph = irg;
-  res = new_bd_InstOf(db, block, store, objptr, ent);
+  res = new_bd_Sel(db, block, store, objptr, arity, in, ent);
   current_ir_graph = rem;
 
   return res;
   current_ir_graph = rem;
 
   return res;
@@ -1533,7 +1217,7 @@ new_rd_InstOf (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *store,
 
 ir_node *
 new_rd_SymConst_type (dbg_info *db, ir_graph *irg, ir_node *block, symconst_symbol value,
 
 ir_node *
 new_rd_SymConst_type (dbg_info *db, ir_graph *irg, ir_node *block, symconst_symbol value,
-              symconst_kind symkind, type *tp)
+              symconst_kind symkind, ir_type *tp)
 {
   ir_node  *res;
   ir_graph *rem = current_ir_graph;
 {
   ir_node  *res;
   ir_graph *rem = current_ir_graph;
@@ -1553,44 +1237,51 @@ new_rd_SymConst (dbg_info *db, ir_graph *irg, ir_node *block, symconst_symbol va
   return res;
 }
 
   return res;
 }
 
-ir_node *new_rd_SymConst_addr_ent (dbg_info *db, ir_graph *irg, entity *symbol, type *tp)
+ir_node *new_rd_SymConst_addr_ent (dbg_info *db, ir_graph *irg, entity *symbol, ir_type *tp)
 {
 {
-  symconst_symbol sym = {(type *)symbol};
-  return new_rd_SymConst_type(db, irg, irg->start_block, sym, symconst_addr_ent, tp);
+  symconst_symbol sym = {(ir_type *)symbol};
+  return new_rd_SymConst_type(db, irg, get_irg_start_block(irg), sym, symconst_addr_ent, tp);
+}
+
+ir_node *new_rd_SymConst_addr_name (dbg_info *db, ir_graph *irg, ident *symbol, ir_type *tp) {
+  symconst_symbol sym = {(ir_type *)symbol};
+  return new_rd_SymConst_type(db, irg, get_irg_start_block(irg), sym, symconst_addr_name, tp);
 }
 
 }
 
-ir_node *new_rd_SymConst_addr_name (dbg_info *db, ir_graph *irg, ident *symbol, type *tp) {
-  symconst_symbol sym = {(type *)symbol};
-  return new_rd_SymConst_type(db, irg, irg->start_block, sym, symconst_addr_name, tp);
+ir_node *new_rd_SymConst_type_tag (dbg_info *db, ir_graph *irg, ir_type *symbol, ir_type *tp) {
+  symconst_symbol sym = {symbol};
+  return new_rd_SymConst_type(db, irg, get_irg_start_block(irg), sym, symconst_type_tag, tp);
 }
 
 }
 
-ir_node *new_rd_SymConst_type_tag (dbg_info *db, ir_graph *irg, type *symbol, type *tp) {
+ir_node *new_rd_SymConst_size (dbg_info *db, ir_graph *irg, ir_type *symbol, ir_type *tp) {
   symconst_symbol sym = {symbol};
   symconst_symbol sym = {symbol};
-  return new_rd_SymConst_type(db, irg, irg->start_block, sym, symconst_type_tag, tp);
+  return new_rd_SymConst_type(db, irg, get_irg_start_block(irg), sym, symconst_type_size, tp);
 }
 
 }
 
-ir_node *new_rd_SymConst_size (dbg_info *db, ir_graph *irg, type *symbol, type *tp) {
+ir_node *new_rd_SymConst_align (dbg_info *db, ir_graph *irg, ir_type *symbol, ir_type *tp) {
   symconst_symbol sym = {symbol};
   symconst_symbol sym = {symbol};
-  return new_rd_SymConst_type(db, irg, irg->start_block, sym, symconst_size, tp);
+  return new_rd_SymConst_type(db, irg, get_irg_start_block(irg), sym, symconst_type_align, tp);
 }
 
 ir_node *
 }
 
 ir_node *
-new_rd_Sync (dbg_info *db, ir_graph *irg, ir_node *block, int arity, ir_node **in)
+new_rd_Sync (dbg_info *db, ir_graph *irg, ir_node *block, int arity, ir_node *in[])
 {
   ir_node  *res;
   ir_graph *rem = current_ir_graph;
 {
   ir_node  *res;
   ir_graph *rem = current_ir_graph;
+  int      i;
 
   current_ir_graph = irg;
 
   current_ir_graph = irg;
-  res = new_bd_Sync(db, block, arity, in);
+  res = new_bd_Sync(db, block);
   current_ir_graph = rem;
 
   current_ir_graph = rem;
 
+  for (i = 0; i < arity; ++i) add_Sync_pred(res, in[i]);
+
   return res;
 }
 
 ir_node *
   return res;
 }
 
 ir_node *
-new_rd_Bad (ir_graph *irg)
-{
-  return irg->bad;
+new_rd_Bad (ir_graph *irg) {
+  return get_irg_bad(irg);
 }
 
 ir_node *
 }
 
 ir_node *
@@ -1639,7 +1330,7 @@ new_rd_EndReg (dbg_info *db, ir_graph *irg, ir_node *block)
   ir_node *res;
 
   res = new_ir_node(db, irg, block, op_EndReg, mode_T, -1, NULL);
   ir_node *res;
 
   res = new_ir_node(db, irg, block, op_EndReg, mode_T, -1, NULL);
-  irg->end_reg = res;
+  set_irg_end_reg(irg, res);
   IRN_VRFY_IRG(res, irg);
   return res;
 }
   IRN_VRFY_IRG(res, irg);
   return res;
 }
@@ -1650,7 +1341,7 @@ new_rd_EndExcept (dbg_info *db, ir_graph *irg, ir_node *block)
   ir_node *res;
 
   res = new_ir_node(db, irg, block, op_EndExcept, mode_T, -1, NULL);
   ir_node *res;
 
   res = new_ir_node(db, irg, block, op_EndExcept, mode_T, -1, NULL);
-  irg->end_except = res;
+  set_irg_end_except(irg, res);
   IRN_VRFY_IRG (res, irg);
   return res;
 }
   IRN_VRFY_IRG (res, irg);
   return res;
 }
@@ -1684,7 +1375,7 @@ new_rd_Filter (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *arg, ir_mod
 
 ir_node *
 new_rd_NoMem (ir_graph *irg) {
 
 ir_node *
 new_rd_NoMem (ir_graph *irg) {
-  return irg->no_mem;
+  return get_irg_no_mem(irg);
 }
 
 ir_node *
 }
 
 ir_node *
@@ -1701,6 +1392,72 @@ new_rd_Mux  (dbg_info *db, ir_graph *irg, ir_node *block,
   return res;
 }
 
   return res;
 }
 
+ir_node *
+new_rd_Psi (dbg_info *db, ir_graph *irg, ir_node *block,
+    int arity, ir_node *cond[], ir_node *vals[], ir_mode *mode)
+{
+  ir_node  *res;
+  ir_graph *rem = current_ir_graph;
+
+  current_ir_graph = irg;
+  res = new_bd_Psi(db, block, arity, cond, vals, mode);
+  current_ir_graph = rem;
+
+  return res;
+}
+
+ir_node *new_rd_CopyB(dbg_info *db, ir_graph *irg, ir_node *block,
+    ir_node *store, ir_node *dst, ir_node *src, ir_type *data_type)
+{
+  ir_node  *res;
+  ir_graph *rem = current_ir_graph;
+
+  current_ir_graph = irg;
+  res = new_bd_CopyB(db, block, store, dst, src, data_type);
+  current_ir_graph = rem;
+
+  return res;
+}
+
+ir_node *
+new_rd_InstOf (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *store,
+           ir_node *objptr, ir_type *type)
+{
+  ir_node  *res;
+  ir_graph *rem = current_ir_graph;
+
+  current_ir_graph = irg;
+  res = new_bd_InstOf(db, block, store, objptr, type);
+  current_ir_graph = rem;
+
+  return res;
+}
+
+ir_node *
+new_rd_Raise (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *store, ir_node *obj)
+{
+  ir_node  *res;
+  ir_graph *rem = current_ir_graph;
+
+  current_ir_graph = irg;
+  res = new_bd_Raise(db, block, store, obj);
+  current_ir_graph = rem;
+
+  return res;
+}
+
+ir_node *new_rd_Bound(dbg_info *db, ir_graph *irg, ir_node *block,
+    ir_node *store, ir_node *idx, ir_node *lower, ir_node *upper)
+{
+  ir_node  *res;
+  ir_graph *rem = current_ir_graph;
+
+  current_ir_graph = irg;
+  res = new_bd_Bound(db, block, store, idx, lower, upper);
+  current_ir_graph = rem;
+
+  return res;
+}
 
 ir_node *new_r_Block  (ir_graph *irg,  int arity, ir_node **in) {
   return new_rd_Block(NULL, irg, arity, in);
 
 ir_node *new_r_Block  (ir_graph *irg,  int arity, ir_node **in) {
   return new_rd_Block(NULL, irg, arity, in);
@@ -1724,41 +1481,34 @@ ir_node *new_r_Return (ir_graph *irg, ir_node *block,
                ir_node *store, int arity, ir_node **in) {
   return new_rd_Return(NULL, irg, block, store, arity, in);
 }
                ir_node *store, int arity, ir_node **in) {
   return new_rd_Return(NULL, irg, block, store, arity, in);
 }
-ir_node *new_r_Raise  (ir_graph *irg, ir_node *block,
-               ir_node *store, ir_node *obj) {
-  return new_rd_Raise(NULL, irg, block, store, obj);
-}
 ir_node *new_r_Const  (ir_graph *irg, ir_node *block,
                ir_mode *mode, tarval *con) {
   return new_rd_Const(NULL, irg, block, mode, con);
 }
 ir_node *new_r_Const  (ir_graph *irg, ir_node *block,
                ir_mode *mode, tarval *con) {
   return new_rd_Const(NULL, irg, block, mode, con);
 }
-
 ir_node *new_r_Const_long(ir_graph *irg, ir_node *block,
                ir_mode *mode, long value) {
   return new_rd_Const_long(NULL, irg, block, mode, value);
 }
 ir_node *new_r_Const_long(ir_graph *irg, ir_node *block,
                ir_mode *mode, long value) {
   return new_rd_Const_long(NULL, irg, block, mode, value);
 }
-
 ir_node *new_r_Const_type(ir_graph *irg, ir_node *block,
 ir_node *new_r_Const_type(ir_graph *irg, ir_node *block,
-               ir_mode *mode, tarval *con, type *tp) {
+               ir_mode *mode, tarval *con, ir_type *tp) {
   return new_rd_Const_type(NULL, irg, block, mode, con, tp);
 }
   return new_rd_Const_type(NULL, irg, block, mode, con, tp);
 }
-
 ir_node *new_r_SymConst (ir_graph *irg, ir_node *block,
                        symconst_symbol value, symconst_kind symkind) {
   return new_rd_SymConst(NULL, irg, block, value, symkind);
 }
 ir_node *new_r_SymConst (ir_graph *irg, ir_node *block,
                        symconst_symbol value, symconst_kind symkind) {
   return new_rd_SymConst(NULL, irg, block, value, symkind);
 }
+ir_node *new_r_simpleSel(ir_graph *irg, ir_node *block, ir_node *store,
+                         ir_node *objptr, entity *ent) {
+  return new_rd_Sel(NULL, irg, block, store, objptr, 0, NULL, ent);
+}
 ir_node *new_r_Sel    (ir_graph *irg, ir_node *block, ir_node *store,
                   ir_node *objptr, int n_index, ir_node **index,
                   entity *ent) {
   return new_rd_Sel(NULL, irg, block, store, objptr, n_index, index, ent);
 }
 ir_node *new_r_Sel    (ir_graph *irg, ir_node *block, ir_node *store,
                   ir_node *objptr, int n_index, ir_node **index,
                   entity *ent) {
   return new_rd_Sel(NULL, irg, block, store, objptr, n_index, index, ent);
 }
-ir_node *new_r_InstOf (ir_graph *irg, ir_node *block, ir_node *store, ir_node *objptr,
-                  type *ent) {
-  return (new_rd_InstOf (NULL, irg, block, store, objptr, ent));
-}
 ir_node *new_r_Call   (ir_graph *irg, ir_node *block, ir_node *store,
                   ir_node *callee, int arity, ir_node **in,
 ir_node *new_r_Call   (ir_graph *irg, ir_node *block, ir_node *store,
                   ir_node *callee, int arity, ir_node **in,
-                  type *tp) {
+                  ir_type *tp) {
   return new_rd_Call(NULL, irg, block, store, callee, arity, in, tp);
 }
 ir_node *new_r_Add    (ir_graph *irg, ir_node *block,
   return new_rd_Call(NULL, irg, block, store, callee, arity, in, tp);
 }
 ir_node *new_r_Add    (ir_graph *irg, ir_node *block,
@@ -1813,10 +1563,6 @@ ir_node *new_r_Not    (ir_graph *irg, ir_node *block,
                ir_node *op, ir_mode *mode) {
   return new_rd_Not(NULL, irg, block, op, mode);
 }
                ir_node *op, ir_mode *mode) {
   return new_rd_Not(NULL, irg, block, op, mode);
 }
-ir_node *new_r_Cmp    (ir_graph *irg, ir_node *block,
-               ir_node *op1, ir_node *op2) {
-  return new_rd_Cmp(NULL, irg, block, op1, op2);
-}
 ir_node *new_r_Shl    (ir_graph *irg, ir_node *block,
                ir_node *op, ir_node *k, ir_mode *mode) {
   return new_rd_Shl(NULL, irg, block, op, k, mode);
 ir_node *new_r_Shl    (ir_graph *irg, ir_node *block,
                ir_node *op, ir_node *k, ir_mode *mode) {
   return new_rd_Shl(NULL, irg, block, op, k, mode);
@@ -1833,11 +1579,23 @@ ir_node *new_r_Rot    (ir_graph *irg, ir_node *block,
                ir_node *op, ir_node *k, ir_mode *mode) {
   return new_rd_Rot(NULL, irg, block, op, k, mode);
 }
                ir_node *op, ir_node *k, ir_mode *mode) {
   return new_rd_Rot(NULL, irg, block, op, k, mode);
 }
+ir_node *new_r_Carry  (ir_graph *irg, ir_node *block,
+               ir_node *op, ir_node *k, ir_mode *mode) {
+  return new_rd_Carry(NULL, irg, block, op, k, mode);
+}
+ir_node *new_r_Borrow (ir_graph *irg, ir_node *block,
+               ir_node *op, ir_node *k, ir_mode *mode) {
+  return new_rd_Borrow(NULL, irg, block, op, k, mode);
+}
+ir_node *new_r_Cmp    (ir_graph *irg, ir_node *block,
+               ir_node *op1, ir_node *op2) {
+  return new_rd_Cmp(NULL, irg, block, op1, op2);
+}
 ir_node *new_r_Conv   (ir_graph *irg, ir_node *block,
                ir_node *op, ir_mode *mode) {
   return new_rd_Conv(NULL, irg, block, op, mode);
 }
 ir_node *new_r_Conv   (ir_graph *irg, ir_node *block,
                ir_node *op, ir_mode *mode) {
   return new_rd_Conv(NULL, irg, block, op, mode);
 }
-ir_node *new_r_Cast   (ir_graph *irg, ir_node *block, ir_node *op, type *to_tp) {
+ir_node *new_r_Cast   (ir_graph *irg, ir_node *block, ir_node *op, ir_type *to_tp) {
   return new_rd_Cast(NULL, irg, block, op, to_tp);
 }
 ir_node *new_r_Phi    (ir_graph *irg, ir_node *block, int arity,
   return new_rd_Cast(NULL, irg, block, op, to_tp);
 }
 ir_node *new_r_Phi    (ir_graph *irg, ir_node *block, int arity,
@@ -1853,14 +1611,14 @@ ir_node *new_r_Store  (ir_graph *irg, ir_node *block,
   return new_rd_Store(NULL, irg, block, store, adr, val);
 }
 ir_node *new_r_Alloc  (ir_graph *irg, ir_node *block, ir_node *store,
   return new_rd_Store(NULL, irg, block, store, adr, val);
 }
 ir_node *new_r_Alloc  (ir_graph *irg, ir_node *block, ir_node *store,
-               ir_node *size, type *alloc_type, where_alloc where) {
+               ir_node *size, ir_type *alloc_type, where_alloc where) {
   return new_rd_Alloc(NULL, irg, block, store, size, alloc_type, where);
 }
 ir_node *new_r_Free   (ir_graph *irg, ir_node *block, ir_node *store,
   return new_rd_Alloc(NULL, irg, block, store, size, alloc_type, where);
 }
 ir_node *new_r_Free   (ir_graph *irg, ir_node *block, ir_node *store,
-               ir_node *ptr, ir_node *size, type *free_type, where_alloc where) {
+               ir_node *ptr, ir_node *size, ir_type *free_type, where_alloc where) {
   return new_rd_Free(NULL, irg, block, store, ptr, size, free_type, where);
 }
   return new_rd_Free(NULL, irg, block, store, ptr, size, free_type, where);
 }
-ir_node *new_r_Sync   (ir_graph *irg, ir_node *block, int arity, ir_node **in) {
+ir_node *new_r_Sync   (ir_graph *irg, ir_node *block, int arity, ir_node *in[]) {
   return new_rd_Sync(NULL, irg, block, arity, in);
 }
 ir_node *new_r_Proj   (ir_graph *irg, ir_node *block, ir_node *arg,
   return new_rd_Sync(NULL, irg, block, arity, in);
 }
 ir_node *new_r_Proj   (ir_graph *irg, ir_node *block, ir_node *arg,
@@ -1911,7 +1669,26 @@ ir_node *new_r_Mux (ir_graph *irg, ir_node *block,
     ir_node *sel, ir_node *ir_false, ir_node *ir_true, ir_mode *mode) {
   return new_rd_Mux(NULL, irg, block, sel, ir_false, ir_true, mode);
 }
     ir_node *sel, ir_node *ir_false, ir_node *ir_true, ir_mode *mode) {
   return new_rd_Mux(NULL, irg, block, sel, ir_false, ir_true, mode);
 }
-
+ir_node *new_r_Psi (ir_graph *irg, ir_node *block,
+    int arity, ir_node *conds[], ir_node *vals[], ir_mode *mode) {
+  return new_rd_Psi(NULL, irg, block, arity, conds, vals, mode);
+}
+ir_node *new_r_CopyB(ir_graph *irg, ir_node *block,
+    ir_node *store, ir_node *dst, ir_node *src, ir_type *data_type) {
+  return new_rd_CopyB(NULL, irg, block, store, dst, src, data_type);
+}
+ir_node *new_r_InstOf (ir_graph *irg, ir_node *block, ir_node *store, ir_node *objptr,
+                  ir_type *type) {
+  return (new_rd_InstOf (NULL, irg, block, store, objptr, type));
+}
+ir_node *new_r_Raise  (ir_graph *irg, ir_node *block,
+               ir_node *store, ir_node *obj) {
+  return new_rd_Raise(NULL, irg, block, store, obj);
+}
+ir_node *new_r_Bound(ir_graph *irg, ir_node *block,
+    ir_node *store, ir_node *idx, ir_node *lower, ir_node *upper) {
+  return new_rd_Bound(NULL, irg, block, store, idx, lower, upper);
+}
 
 /** ********************/
 /** public interfaces  */
 
 /** ********************/
 /** public interfaces  */
@@ -1959,7 +1736,7 @@ new_d_Block (dbg_info *db, int arity, ir_node **in)
 {
   ir_node *res;
   int i;
 {
   ir_node *res;
   int i;
-  bool has_unknown = false;
+  int has_unknown = 0;
 
   res = new_bd_Block(db, arity, in);
 
 
   res = new_bd_Block(db, arity, in);
 
@@ -1972,7 +1749,7 @@ new_d_Block (dbg_info *db, int arity, ir_node **in)
 
   for (i = arity-1; i >= 0; i--)
     if (get_irn_op(in[i]) == op_Unknown) {
 
   for (i = arity-1; i >= 0; i--)
     if (get_irn_op(in[i]) == op_Unknown) {
-      has_unknown = true;
+      has_unknown = 1;
       break;
     }
 
       break;
     }
 
@@ -2211,8 +1988,8 @@ phi_merge (ir_node *block, int pos, ir_mode *mode, ir_node **nin, int ins)
 
   /* Now we now the value for "pos" and can enter it in the array with
      all known local variables.  Attention: this might be a pointer to
 
   /* Now we now the value for "pos" and can enter it in the array with
      all known local variables.  Attention: this might be a pointer to
-     a node, that later will be allocated!!! See new_rd_Phi_in.
-     If this is called in mature, after some set_value in the same block,
+     a node, that later will be allocated!!! See new_rd_Phi_in().
+     If this is called in mature, after some set_value() in the same block,
      the proper value must not be overwritten:
      The call order
        get_value    (makes Phi0, put's it into graph_arr)
      the proper value must not be overwritten:
      The call order
        get_value    (makes Phi0, put's it into graph_arr)
@@ -2407,7 +2184,7 @@ new_rd_Phi_in (ir_graph *irg, ir_node *block, ir_mode *mode,
     /* Memory Phis in endless loops must be kept alive.
        As we can't distinguish these easily we keep all of them alive. */
     if ((res->op == op_Phi) && (mode == mode_M))
     /* Memory Phis in endless loops must be kept alive.
        As we can't distinguish these easily we keep all of them alive. */
     if ((res->op == op_Phi) && (mode == mode_M))
-      add_End_keepalive(irg->end, res);
+      add_End_keepalive(get_irg_end(irg), res);
   }
 
   return res;
   }
 
   return res;
@@ -2442,13 +2219,16 @@ static INLINE ir_node ** new_frag_arr (ir_node *n)
   /* Here we rely on the fact that all frag ops have Memory as first result! */
   if (get_irn_op(n) == op_Call)
     arr[0] = new_Proj(n, mode_M, pn_Call_M_except);
   /* Here we rely on the fact that all frag ops have Memory as first result! */
   if (get_irn_op(n) == op_Call)
     arr[0] = new_Proj(n, mode_M, pn_Call_M_except);
+  else if (get_irn_op(n) == op_CopyB)
+    arr[0] = new_Proj(n, mode_M, pn_CopyB_M_except);
   else {
     assert((pn_Quot_M == pn_DivMod_M) &&
        (pn_Quot_M == pn_Div_M)    &&
        (pn_Quot_M == pn_Mod_M)    &&
        (pn_Quot_M == pn_Load_M)   &&
        (pn_Quot_M == pn_Store_M)  &&
   else {
     assert((pn_Quot_M == pn_DivMod_M) &&
        (pn_Quot_M == pn_Div_M)    &&
        (pn_Quot_M == pn_Mod_M)    &&
        (pn_Quot_M == pn_Load_M)   &&
        (pn_Quot_M == pn_Store_M)  &&
-       (pn_Quot_M == pn_Alloc_M)    );
+       (pn_Quot_M == pn_Alloc_M)  &&
+       (pn_Quot_M == pn_Bound_M));
     arr[0] = new_Proj(n, mode_M, pn_Alloc_M);
   }
   set_optimize(opt);
     arr[0] = new_Proj(n, mode_M, pn_Alloc_M);
   }
   set_optimize(opt);
@@ -2514,8 +2294,8 @@ get_r_frag_value_internal (ir_node *block, ir_node *cfOp, int pos, ir_mode *mode
   res = frag_arr[pos];
   if (!res) {
     if (block->attr.block.graph_arr[pos]) {
   res = frag_arr[pos];
   if (!res) {
     if (block->attr.block.graph_arr[pos]) {
-      /* There was a set_value after the cfOp and no get_value before that
-         set_value.  We must build a Phi node now. */
+      /* There was a set_value() after the cfOp and no get_value before that
+         set_value().  We must build a Phi node now. */
       if (block->attr.block.matured) {
         int ins = get_irn_arity(block);
         ir_node **nin;
       if (block->attr.block.matured) {
         int ins = get_irn_arity(block);
         ir_node **nin;
@@ -2539,7 +2319,7 @@ get_r_frag_value_internal (ir_node *block, ir_node *cfOp, int pos, ir_mode *mode
   }
   return res;
 }
   }
   return res;
 }
-#endif
+#endif /* PRECISE_EXC_CONTEXT */
 
 /**
     computes the predecessors for the real phi node, and then
 
 /**
     computes the predecessors for the real phi node, and then
@@ -2568,10 +2348,15 @@ phi_merge (ir_node *block, int pos, ir_mode *mode, ir_node **nin, int ins)
          (bad, jmp).  In this case we call the function needlessly, eventually
          generating an non existent error.
          However, this SHOULD NOT HAPPEN, as bad control flow nodes are intercepted
          (bad, jmp).  In this case we call the function needlessly, eventually
          generating an non existent error.
          However, this SHOULD NOT HAPPEN, as bad control flow nodes are intercepted
-         before recuring.
+         before recurring.
       */
       */
-      if (default_initialize_local_variable)
+      if (default_initialize_local_variable) {
+        ir_node *rem = get_cur_block();
+
+        set_cur_block(block);
         block->attr.block.graph_arr[pos] = default_initialize_local_variable(current_ir_graph, mode, pos - 1);
         block->attr.block.graph_arr[pos] = default_initialize_local_variable(current_ir_graph, mode, pos - 1);
+        set_cur_block(rem);
+      }
       else
         block->attr.block.graph_arr[pos] = new_Const(mode, tarval_bad);
       /* We don't need to care about exception ops in the start block.
       else
         block->attr.block.graph_arr[pos] = new_Const(mode, tarval_bad);
       /* We don't need to care about exception ops in the start block.
@@ -2797,43 +2582,38 @@ mature_immBlock (ir_node *block)
 ir_node *
 new_d_Phi (dbg_info *db, int arity, ir_node **in, ir_mode *mode)
 {
 ir_node *
 new_d_Phi (dbg_info *db, int arity, ir_node **in, ir_mode *mode)
 {
-  return new_bd_Phi(db, current_ir_graph->current_block,
-            arity, in, mode);
+  return new_bd_Phi(db, current_ir_graph->current_block, arity, in, mode);
 }
 
 ir_node *
 new_d_Const (dbg_info *db, ir_mode *mode, tarval *con)
 {
 }
 
 ir_node *
 new_d_Const (dbg_info *db, ir_mode *mode, tarval *con)
 {
-  return new_bd_Const(db, current_ir_graph->start_block,
-              mode, con);
+  return new_bd_Const(db, get_irg_start_block(current_ir_graph), mode, con);
 }
 
 ir_node *
 new_d_Const_long(dbg_info *db, ir_mode *mode, long value)
 {
 }
 
 ir_node *
 new_d_Const_long(dbg_info *db, ir_mode *mode, long value)
 {
-  return new_bd_Const_long(db, current_ir_graph->start_block, mode, value);
+  return new_bd_Const_long(db, get_irg_start_block(current_ir_graph), mode, value);
 }
 
 ir_node *
 }
 
 ir_node *
-new_d_Const_type (dbg_info *db, ir_mode *mode, tarval *con, type *tp)
+new_d_Const_type (dbg_info *db, ir_mode *mode, tarval *con, ir_type *tp)
 {
 {
-  return new_bd_Const_type(db, current_ir_graph->start_block,
-                mode, con, tp);
+  return new_bd_Const_type(db, get_irg_start_block(current_ir_graph), mode, con, tp);
 }
 
 
 ir_node *
 new_d_Id (dbg_info *db, ir_node *val, ir_mode *mode)
 {
 }
 
 
 ir_node *
 new_d_Id (dbg_info *db, ir_node *val, ir_mode *mode)
 {
-  return new_bd_Id(db, current_ir_graph->current_block,
-           val, mode);
+  return new_bd_Id(db, current_ir_graph->current_block, val, mode);
 }
 
 ir_node *
 new_d_Proj (dbg_info *db, ir_node *arg, ir_mode *mode, long proj)
 {
 }
 
 ir_node *
 new_d_Proj (dbg_info *db, ir_node *arg, ir_mode *mode, long proj)
 {
-  return new_bd_Proj(db, current_ir_graph->current_block,
-             arg, mode, proj);
+  return new_bd_Proj(db, current_ir_graph->current_block, arg, mode, proj);
 }
 
 ir_node *
 }
 
 ir_node *
@@ -2850,12 +2630,11 @@ new_d_defaultProj (dbg_info *db, ir_node *arg, long max_proj)
 ir_node *
 new_d_Conv (dbg_info *db, ir_node *op, ir_mode *mode)
 {
 ir_node *
 new_d_Conv (dbg_info *db, ir_node *op, ir_mode *mode)
 {
-  return new_bd_Conv(db, current_ir_graph->current_block,
-             op, mode);
+  return new_bd_Conv(db, current_ir_graph->current_block, op, mode);
 }
 
 ir_node *
 }
 
 ir_node *
-new_d_Cast (dbg_info *db, ir_node *op, type *to_tp)
+new_d_Cast (dbg_info *db, ir_node *op, ir_type *to_tp)
 {
   return new_bd_Cast(db, current_ir_graph->current_block, op, to_tp);
 }
 {
   return new_bd_Cast(db, current_ir_graph->current_block, op, to_tp);
 }
@@ -2863,38 +2642,13 @@ new_d_Cast (dbg_info *db, ir_node *op, type *to_tp)
 ir_node *
 new_d_Tuple (dbg_info *db, int arity, ir_node **in)
 {
 ir_node *
 new_d_Tuple (dbg_info *db, int arity, ir_node **in)
 {
-  return new_bd_Tuple(db, current_ir_graph->current_block,
-              arity, in);
-}
-
-ir_node *
-new_d_Add (dbg_info *db, ir_node *op1, ir_node *op2, ir_mode *mode)
-{
-  return new_bd_Add(db, current_ir_graph->current_block,
-            op1, op2, mode);
-}
-
-ir_node *
-new_d_Sub (dbg_info *db, ir_node *op1, ir_node *op2, ir_mode *mode)
-{
-  return new_bd_Sub(db, current_ir_graph->current_block,
-            op1, op2, mode);
-}
-
-
-ir_node *
-new_d_Minus (dbg_info *db, ir_node *op,  ir_mode *mode)
-{
-  return new_bd_Minus(db, current_ir_graph->current_block,
-              op, mode);
+  return new_bd_Tuple(db, current_ir_graph->current_block, arity, in);
 }
 
 }
 
-ir_node *
-new_d_Mul (dbg_info *db, ir_node *op1, ir_node *op2, ir_mode *mode)
-{
-  return new_bd_Mul(db, current_ir_graph->current_block,
-            op1, op2, mode);
-}
+NEW_D_BINOP(Add)
+NEW_D_BINOP(Sub)
+NEW_D_UNOP(Minus)
+NEW_D_BINOP(Mul)
 
 /**
  * allocate the frag array
 
 /**
  * allocate the frag array
@@ -2909,13 +2663,11 @@ static void allocate_frag_arr(ir_node *res, ir_op *op, ir_node ***frag_store) {
   }
 }
 
   }
 }
 
-
 ir_node *
 new_d_Quot (dbg_info *db, ir_node *memop, ir_node *op1, ir_node *op2)
 {
   ir_node *res;
 ir_node *
 new_d_Quot (dbg_info *db, ir_node *memop, ir_node *op1, ir_node *op2)
 {
   ir_node *res;
-  res = new_bd_Quot (db, current_ir_graph->current_block,
-             memop, op1, op2);
+  res = new_bd_Quot (db, current_ir_graph->current_block, memop, op1, op2);
   res->attr.except.pin_state = op_pin_state_pinned;
 #if PRECISE_EXC_CONTEXT
   allocate_frag_arr(res, op_Quot, &res->attr.except.frag_arr);  /* Could be optimized away. */
   res->attr.except.pin_state = op_pin_state_pinned;
 #if PRECISE_EXC_CONTEXT
   allocate_frag_arr(res, op_Quot, &res->attr.except.frag_arr);  /* Could be optimized away. */
@@ -2928,8 +2680,7 @@ ir_node *
 new_d_DivMod (dbg_info *db, ir_node *memop, ir_node *op1, ir_node *op2)
 {
   ir_node *res;
 new_d_DivMod (dbg_info *db, ir_node *memop, ir_node *op1, ir_node *op2)
 {
   ir_node *res;
-  res = new_bd_DivMod (db, current_ir_graph->current_block,
-               memop, op1, op2);
+  res = new_bd_DivMod (db, current_ir_graph->current_block, memop, op1, op2);
   res->attr.except.pin_state = op_pin_state_pinned;
 #if PRECISE_EXC_CONTEXT
   allocate_frag_arr(res, op_DivMod, &res->attr.except.frag_arr);  /* Could be optimized away. */
   res->attr.except.pin_state = op_pin_state_pinned;
 #if PRECISE_EXC_CONTEXT
   allocate_frag_arr(res, op_DivMod, &res->attr.except.frag_arr);  /* Could be optimized away. */
@@ -2942,8 +2693,7 @@ ir_node *
 new_d_Div (dbg_info *db, ir_node *memop, ir_node *op1, ir_node *op2)
 {
   ir_node *res;
 new_d_Div (dbg_info *db, ir_node *memop, ir_node *op1, ir_node *op2)
 {
   ir_node *res;
-  res = new_bd_Div (db, current_ir_graph->current_block,
-            memop, op1, op2);
+  res = new_bd_Div (db, current_ir_graph->current_block, memop, op1, op2);
   res->attr.except.pin_state = op_pin_state_pinned;
 #if PRECISE_EXC_CONTEXT
   allocate_frag_arr(res, op_Div, &res->attr.except.frag_arr);  /* Could be optimized away. */
   res->attr.except.pin_state = op_pin_state_pinned;
 #if PRECISE_EXC_CONTEXT
   allocate_frag_arr(res, op_Div, &res->attr.except.frag_arr);  /* Could be optimized away. */
@@ -2956,8 +2706,7 @@ ir_node *
 new_d_Mod (dbg_info *db, ir_node *memop, ir_node *op1, ir_node *op2)
 {
   ir_node *res;
 new_d_Mod (dbg_info *db, ir_node *memop, ir_node *op1, ir_node *op2)
 {
   ir_node *res;
-  res = new_bd_Mod (db, current_ir_graph->current_block,
-            memop, op1, op2);
+  res = new_bd_Mod (db, current_ir_graph->current_block, memop, op1, op2);
   res->attr.except.pin_state = op_pin_state_pinned;
 #if PRECISE_EXC_CONTEXT
   allocate_frag_arr(res, op_Mod, &res->attr.except.frag_arr);  /* Could be optimized away. */
   res->attr.except.pin_state = op_pin_state_pinned;
 #if PRECISE_EXC_CONTEXT
   allocate_frag_arr(res, op_Mod, &res->attr.except.frag_arr);  /* Could be optimized away. */
@@ -2966,74 +2715,22 @@ new_d_Mod (dbg_info *db, ir_node *memop, ir_node *op1, ir_node *op2)
   return res;
 }
 
   return res;
 }
 
-ir_node *
-new_d_And (dbg_info *db, ir_node *op1, ir_node *op2, ir_mode *mode)
-{
-  return new_bd_And (db, current_ir_graph->current_block,
-            op1, op2, mode);
-}
-
-ir_node *
-new_d_Or (dbg_info *db, ir_node *op1, ir_node *op2, ir_mode *mode)
-{
-  return new_bd_Or (db, current_ir_graph->current_block,
-           op1, op2, mode);
-}
-
-ir_node *
-new_d_Eor (dbg_info *db, ir_node *op1, ir_node *op2, ir_mode *mode)
-{
-  return new_bd_Eor (db, current_ir_graph->current_block,
-            op1, op2, mode);
-}
-
-ir_node *
-new_d_Not (dbg_info *db, ir_node *op, ir_mode *mode)
-{
-  return new_bd_Not (db, current_ir_graph->current_block,
-            op, mode);
-}
-
-ir_node *
-new_d_Shl (dbg_info *db, ir_node *op, ir_node *k, ir_mode *mode)
-{
-  return new_bd_Shl (db, current_ir_graph->current_block,
-            op, k, mode);
-}
-
-ir_node *
-new_d_Shr (dbg_info *db, ir_node *op, ir_node *k, ir_mode *mode)
-{
-  return new_bd_Shr (db, current_ir_graph->current_block,
-            op, k, mode);
-}
-
-ir_node *
-new_d_Shrs (dbg_info *db, ir_node *op, ir_node *k, ir_mode *mode)
-{
-  return new_bd_Shrs (db, current_ir_graph->current_block,
-             op, k, mode);
-}
-
-ir_node *
-new_d_Rot (dbg_info *db, ir_node *op, ir_node *k, ir_mode *mode)
-{
-  return new_bd_Rot (db, current_ir_graph->current_block,
-             op, k, mode);
-}
-
-ir_node *
-new_d_Abs (dbg_info *db, ir_node *op, ir_mode *mode)
-{
-  return new_bd_Abs (db, current_ir_graph->current_block,
-            op, mode);
-}
+NEW_D_BINOP(And)
+NEW_D_BINOP(Or)
+NEW_D_BINOP(Eor)
+NEW_D_UNOP(Not)
+NEW_D_BINOP(Shl)
+NEW_D_BINOP(Shr)
+NEW_D_BINOP(Shrs)
+NEW_D_BINOP(Rot)
+NEW_D_UNOP(Abs)
+NEW_D_BINOP(Carry)
+NEW_D_BINOP(Borrow)
 
 ir_node *
 new_d_Cmp (dbg_info *db, ir_node *op1, ir_node *op2)
 {
 
 ir_node *
 new_d_Cmp (dbg_info *db, ir_node *op1, ir_node *op2)
 {
-  return new_bd_Cmp (db, current_ir_graph->current_block,
-            op1, op2);
+  return new_bd_Cmp(db, current_ir_graph->current_block, op1, op2);
 }
 
 ir_node *
 }
 
 ir_node *
@@ -3056,7 +2753,7 @@ new_d_Cond (dbg_info *db, ir_node *c)
 
 ir_node *
 new_d_Call (dbg_info *db, ir_node *store, ir_node *callee, int arity, ir_node **in,
 
 ir_node *
 new_d_Call (dbg_info *db, ir_node *store, ir_node *callee, int arity, ir_node **in,
-      type *tp)
+      ir_type *tp)
 {
   ir_node *res;
   res = new_bd_Call (db, current_ir_graph->current_block,
 {
   ir_node *res;
   res = new_bd_Call (db, current_ir_graph->current_block,
@@ -3075,13 +2772,6 @@ new_d_Return (dbg_info *db, ir_node* store, int arity, ir_node **in)
                store, arity, in);
 }
 
                store, arity, in);
 }
 
-ir_node *
-new_d_Raise (dbg_info *db, ir_node *store, ir_node *obj)
-{
-  return new_bd_Raise (db, current_ir_graph->current_block,
-              store, obj);
-}
-
 ir_node *
 new_d_Load (dbg_info *db, ir_node *store, ir_node *addr, ir_mode *mode)
 {
 ir_node *
 new_d_Load (dbg_info *db, ir_node *store, ir_node *addr, ir_mode *mode)
 {
@@ -3109,7 +2799,7 @@ new_d_Store (dbg_info *db, ir_node *store, ir_node *addr, ir_node *val)
 }
 
 ir_node *
 }
 
 ir_node *
-new_d_Alloc (dbg_info *db, ir_node *store, ir_node *size, type *alloc_type,
+new_d_Alloc (dbg_info *db, ir_node *store, ir_node *size, ir_type *alloc_type,
            where_alloc where)
 {
   ir_node *res;
            where_alloc where)
 {
   ir_node *res;
@@ -3124,7 +2814,7 @@ new_d_Alloc (dbg_info *db, ir_node *store, ir_node *size, type *alloc_type,
 
 ir_node *
 new_d_Free (dbg_info *db, ir_node *store, ir_node *ptr,
 
 ir_node *
 new_d_Free (dbg_info *db, ir_node *store, ir_node *ptr,
-    ir_node *size, type *free_type, where_alloc where)
+    ir_node *size, ir_type *free_type, where_alloc where)
 {
   return new_bd_Free (db, current_ir_graph->current_block,
              store, ptr, size, free_type, where);
 {
   return new_bd_Free (db, current_ir_graph->current_block,
              store, ptr, size, free_type, where);
@@ -3147,31 +2837,23 @@ new_d_Sel (dbg_info *db, ir_node *store, ir_node *objptr, int n_index, ir_node *
 }
 
 ir_node *
 }
 
 ir_node *
-new_d_InstOf (dbg_info *db, ir_node *store, ir_node *objptr, type *ent)
-{
-  return (new_bd_InstOf (db, current_ir_graph->current_block,
-                         store, objptr, ent));
-}
-
-ir_node *
-new_d_SymConst_type (dbg_info *db, symconst_symbol value, symconst_kind kind, type *tp)
+new_d_SymConst_type (dbg_info *db, symconst_symbol value, symconst_kind kind, ir_type *tp)
 {
 {
-  return new_bd_SymConst_type (db, current_ir_graph->start_block,
+  return new_bd_SymConst_type (db, get_irg_start_block(current_ir_graph),
                          value, kind, tp);
 }
 
 ir_node *
 new_d_SymConst (dbg_info *db, symconst_symbol value, symconst_kind kind)
 {
                          value, kind, tp);
 }
 
 ir_node *
 new_d_SymConst (dbg_info *db, symconst_symbol value, symconst_kind kind)
 {
-  return new_bd_SymConst (db, current_ir_graph->start_block,
+  return new_bd_SymConst (db, get_irg_start_block(current_ir_graph),
                          value, kind);
 }
 
 ir_node *
                          value, kind);
 }
 
 ir_node *
-new_d_Sync (dbg_info *db, int arity, ir_node** in)
+new_d_Sync (dbg_info *db, int arity, ir_node *in[])
 {
 {
-  return new_bd_Sync (db, current_ir_graph->current_block,
-              arity, in);
+  return new_rd_Sync (db, current_ir_graph, current_ir_graph->current_block, arity, in);
 }
 
 
 }
 
 
@@ -3243,6 +2925,48 @@ new_d_Mux (dbg_info *db, ir_node *sel, ir_node *ir_false,
       sel, ir_false, ir_true, mode);
 }
 
       sel, ir_false, ir_true, mode);
 }
 
+ir_node *
+new_d_Psi (dbg_info *db,int arity, ir_node *conds[], ir_node *vals[], ir_mode *mode) {
+  return new_bd_Psi (db, current_ir_graph->current_block,
+      arity, conds, vals, mode);
+}
+
+ir_node *new_d_CopyB(dbg_info *db,ir_node *store,
+    ir_node *dst, ir_node *src, ir_type *data_type) {
+  ir_node *res;
+  res = new_bd_CopyB(db, current_ir_graph->current_block,
+    store, dst, src, data_type);
+#if PRECISE_EXC_CONTEXT
+  allocate_frag_arr(res, op_CopyB, &res->attr.copyb.exc.frag_arr);
+#endif
+  return res;
+}
+
+ir_node *
+new_d_InstOf (dbg_info *db, ir_node *store, ir_node *objptr, ir_type *type)
+{
+  return new_bd_InstOf (db, current_ir_graph->current_block,
+                        store, objptr, type);
+}
+
+ir_node *
+new_d_Raise (dbg_info *db, ir_node *store, ir_node *obj)
+{
+  return new_bd_Raise (db, current_ir_graph->current_block,
+              store, obj);
+}
+
+ir_node *new_d_Bound(dbg_info *db,ir_node *store,
+    ir_node *idx, ir_node *lower, ir_node *upper) {
+  ir_node *res;
+  res = new_bd_Bound(db, current_ir_graph->current_block,
+    store, idx, lower, upper);
+#if PRECISE_EXC_CONTEXT
+  allocate_frag_arr(res, op_Bound, &res->attr.bound.exc.frag_arr);
+#endif
+  return res;
+}
+
 /* ********************************************************************* */
 /* Comfortable interface with automatic Phi node construction.           */
 /* (Uses also constructors of ?? interface, except new_Block.            */
 /* ********************************************************************* */
 /* Comfortable interface with automatic Phi node construction.           */
 /* (Uses also constructors of ?? interface, except new_Block.            */
@@ -3330,6 +3054,18 @@ set_value (int pos, ir_node *value)
   current_ir_graph->current_block->attr.block.graph_arr[pos + 1] = value;
 }
 
   current_ir_graph->current_block->attr.block.graph_arr[pos + 1] = value;
 }
 
+int
+find_value(ir_node *value)
+{
+  int i;
+  ir_node *bl = current_ir_graph->current_block;
+
+  for (i = 1; i < ARR_LEN(bl->attr.block.graph_arr); ++i)
+    if (bl->attr.block.graph_arr[i] == value)
+      return i - 1;
+  return -1;
+}
+
 /* get the current store */
 ir_node *
 get_store (void)
 /* get the current store */
 ir_node *
 get_store (void)
@@ -3340,18 +3076,42 @@ get_store (void)
   return get_r_value_internal (current_ir_graph->current_block, 0, mode_M);
 }
 
   return get_r_value_internal (current_ir_graph->current_block, 0, mode_M);
 }
 
-/* set the current store */
+/* set the current store: handles automatic Sync construction for Load nodes */
 void
 set_store (ir_node *store)
 {
 void
 set_store (ir_node *store)
 {
-  /* GL: one could call set_value instead */
+  ir_node *load, *pload, *pred, *in[2];
+
   assert(get_irg_phase_state (current_ir_graph) == phase_building);
   assert(get_irg_phase_state (current_ir_graph) == phase_building);
+
+  /* handle non-volatile Load nodes by automatically creating Sync's */
+  load = skip_Proj(store);
+  if (is_Load(load) && get_Load_volatility(load) == volatility_non_volatile) {
+    pred = get_Load_mem(load);
+
+    if (is_Sync(pred)) {
+      /* a Load after a Sync: move it up */
+      set_Load_mem(load, get_Sync_pred(pred, 0));
+      store = pred;
+    }
+    else {
+      pload = skip_Proj(pred);
+      if (is_Load(pload) && get_Load_volatility(pload) == volatility_non_volatile) {
+        /* a Load after a Load: create a new Sync */
+        set_Load_mem(load, get_Load_mem(pload));
+
+        in[0] = pred;
+        in[1] = store;
+        store = new_Sync(2, in);
+      }
+    }
+  }
   current_ir_graph->current_block->attr.block.graph_arr[0] = store;
 }
 
 void
 keep_alive (ir_node *ka) {
   current_ir_graph->current_block->attr.block.graph_arr[0] = store;
 }
 
 void
 keep_alive (ir_node *ka) {
-  add_End_keepalive(current_ir_graph->end, ka);
+  add_End_keepalive(get_irg_end(current_ir_graph), ka);
 }
 
 /* --- Useful access routines --- */
 }
 
 /* --- Useful access routines --- */
@@ -3362,7 +3122,7 @@ ir_node *get_cur_block(void) {
 }
 
 /* Returns the frame type of the current graph */
 }
 
 /* Returns the frame type of the current graph */
-type *get_cur_frame_type(void) {
+ir_type *get_cur_frame_type(void) {
   return get_irg_frame_type(current_ir_graph);
 }
 
   return get_irg_frame_type(current_ir_graph);
 }
 
@@ -3377,24 +3137,16 @@ init_cons(uninitialized_local_variable_func_t *func)
   default_initialize_local_variable = func;
 }
 
   default_initialize_local_variable = func;
 }
 
-/* call for each graph */
-void
-irg_finalize_cons (ir_graph *irg) {
-  irg->phase_state = phase_high;
-}
-
 void
 irp_finalize_cons (void) {
 void
 irp_finalize_cons (void) {
-  int i, n_irgs = get_irp_n_irgs();
-  for (i = 0; i < n_irgs; i++) {
+  int i;
+  for (i = get_irp_n_irgs() - 1; i >= 0; --i) {
     irg_finalize_cons(get_irp_irg(i));
   }
     irg_finalize_cons(get_irp_irg(i));
   }
-  irp->phase_state = phase_high;\
+  irp->phase_state = phase_high;
 }
 
 
 }
 
 
-
-
 ir_node *new_Block(int arity, ir_node **in) {
   return new_d_Block(NULL, arity, in);
 }
 ir_node *new_Block(int arity, ir_node **in) {
   return new_d_Block(NULL, arity, in);
 }
@@ -3416,9 +3168,6 @@ ir_node *new_Cond   (ir_node *c) {
 ir_node *new_Return (ir_node *store, int arity, ir_node *in[]) {
   return new_d_Return(NULL, store, arity, in);
 }
 ir_node *new_Return (ir_node *store, int arity, ir_node *in[]) {
   return new_d_Return(NULL, store, arity, in);
 }
-ir_node *new_Raise  (ir_node *store, ir_node *obj) {
-  return new_d_Raise(NULL, store, obj);
-}
 ir_node *new_Const  (ir_mode *mode, tarval *con) {
   return new_d_Const(NULL, mode, con);
 }
 ir_node *new_Const  (ir_mode *mode, tarval *con) {
   return new_d_Const(NULL, mode, con);
 }
@@ -3428,7 +3177,7 @@ ir_node *new_Const_long(ir_mode *mode, long value)
     return new_d_Const_long(NULL, mode, value);
 }
 
     return new_d_Const_long(NULL, mode, value);
 }
 
-ir_node *new_Const_type(tarval *con, type *tp) {
+ir_node *new_Const_type(tarval *con, ir_type *tp) {
   return new_d_Const_type(NULL, get_type_mode(tp), con, tp);
 }
 
   return new_d_Const_type(NULL, get_type_mode(tp), con, tp);
 }
 
@@ -3442,11 +3191,8 @@ ir_node *new_Sel    (ir_node *store, ir_node *objptr, int arity, ir_node **in,
                      entity *ent) {
   return new_d_Sel(NULL, store, objptr, arity, in, ent);
 }
                      entity *ent) {
   return new_d_Sel(NULL, store, objptr, arity, in, ent);
 }
-ir_node *new_InstOf (ir_node *store, ir_node *objptr, type *ent) {
-  return new_d_InstOf (NULL, store, objptr, ent);
-}
 ir_node *new_Call   (ir_node *store, ir_node *callee, int arity, ir_node **in,
 ir_node *new_Call   (ir_node *store, ir_node *callee, int arity, ir_node **in,
-             type *tp) {
+             ir_type *tp) {
   return new_d_Call(NULL, store, callee, arity, in, tp);
 }
 ir_node *new_Add    (ir_node *op1, ir_node *op2, ir_mode *mode) {
   return new_d_Call(NULL, store, callee, arity, in, tp);
 }
 ir_node *new_Add    (ir_node *op1, ir_node *op2, ir_mode *mode) {
@@ -3500,13 +3246,19 @@ ir_node *new_Shrs   (ir_node *op,  ir_node *k,   ir_mode *mode) {
 ir_node *new_Rot    (ir_node *op,  ir_node *k,   ir_mode *mode) {
   return new_d_Rot(NULL, op, k, mode);
 }
 ir_node *new_Rot    (ir_node *op,  ir_node *k,   ir_mode *mode) {
   return new_d_Rot(NULL, op, k, mode);
 }
+ir_node *new_Carry  (ir_node *op1, ir_node *op2, ir_mode *mode) {
+  return new_d_Carry(NULL, op1, op2, mode);
+}
+ir_node *new_Borrow (ir_node *op1, ir_node *op2, ir_mode *mode) {
+  return new_d_Borrow(NULL, op1, op2, mode);
+}
 ir_node *new_Cmp    (ir_node *op1, ir_node *op2) {
   return new_d_Cmp(NULL, op1, op2);
 }
 ir_node *new_Conv   (ir_node *op, ir_mode *mode) {
   return new_d_Conv(NULL, op, mode);
 }
 ir_node *new_Cmp    (ir_node *op1, ir_node *op2) {
   return new_d_Cmp(NULL, op1, op2);
 }
 ir_node *new_Conv   (ir_node *op, ir_mode *mode) {
   return new_d_Conv(NULL, op, mode);
 }
-ir_node *new_Cast   (ir_node *op, type *to_tp) {
+ir_node *new_Cast   (ir_node *op, ir_type *to_tp) {
   return new_d_Cast(NULL, op, to_tp);
 }
 ir_node *new_Phi    (int arity, ir_node **in, ir_mode *mode) {
   return new_d_Cast(NULL, op, to_tp);
 }
 ir_node *new_Phi    (int arity, ir_node **in, ir_mode *mode) {
@@ -3518,15 +3270,15 @@ ir_node *new_Load   (ir_node *store, ir_node *addr, ir_mode *mode) {
 ir_node *new_Store  (ir_node *store, ir_node *addr, ir_node *val) {
   return new_d_Store(NULL, store, addr, val);
 }
 ir_node *new_Store  (ir_node *store, ir_node *addr, ir_node *val) {
   return new_d_Store(NULL, store, addr, val);
 }
-ir_node *new_Alloc  (ir_node *store, ir_node *size, type *alloc_type,
+ir_node *new_Alloc  (ir_node *store, ir_node *size, ir_type *alloc_type,
                      where_alloc where) {
   return new_d_Alloc(NULL, store, size, alloc_type, where);
 }
 ir_node *new_Free   (ir_node *store, ir_node *ptr, ir_node *size,
                      where_alloc where) {
   return new_d_Alloc(NULL, store, size, alloc_type, where);
 }
 ir_node *new_Free   (ir_node *store, ir_node *ptr, ir_node *size,
-             type *free_type, where_alloc where) {
+             ir_type *free_type, where_alloc where) {
   return new_d_Free(NULL, store, ptr, size, free_type, where);
 }
   return new_d_Free(NULL, store, ptr, size, free_type, where);
 }
-ir_node *new_Sync   (int arity, ir_node **in) {
+ir_node *new_Sync   (int arity, ir_node *in[]) {
   return new_d_Sync(NULL, arity, in);
 }
 ir_node *new_Proj   (ir_node *arg, ir_mode *mode, long proj) {
   return new_d_Sync(NULL, arity, in);
 }
 ir_node *new_Proj   (ir_node *arg, ir_mode *mode, long proj) {
@@ -3571,3 +3323,18 @@ ir_node *new_NoMem  (void) {
 ir_node *new_Mux (ir_node *sel, ir_node *ir_false, ir_node *ir_true, ir_mode *mode) {
   return new_d_Mux(NULL, sel, ir_false, ir_true, mode);
 }
 ir_node *new_Mux (ir_node *sel, ir_node *ir_false, ir_node *ir_true, ir_mode *mode) {
   return new_d_Mux(NULL, sel, ir_false, ir_true, mode);
 }
+ir_node *new_Psi (int arity, ir_node *conds[], ir_node *vals[], ir_mode *mode) {
+  return new_d_Psi(NULL, arity, conds, vals, mode);
+}
+ir_node *new_CopyB(ir_node *store, ir_node *dst, ir_node *src, ir_type *data_type) {
+  return new_d_CopyB(NULL, store, dst, src, data_type);
+}
+ir_node *new_InstOf (ir_node *store, ir_node *objptr, ir_type *ent) {
+  return new_d_InstOf (NULL, store, objptr, ent);
+}
+ir_node *new_Raise  (ir_node *store, ir_node *obj) {
+  return new_d_Raise(NULL, store, obj);
+}
+ir_node *new_Bound(ir_node *store, ir_node *idx, ir_node *lower, ir_node *upper) {
+  return new_d_Bound(NULL, store, idx, lower, upper);
+}