Dump calling conventions for entities
[libfirm] / ir / ir / ircons.c
index 7d619a2..e0b2c97 100644 (file)
@@ -25,6 +25,7 @@
 #include <string.h>
 #endif
 
 #include <string.h>
 #endif
 
+# include "irprog_t.h"
 # include "irgraph_t.h"
 # include "irnode_t.h"
 # include "irmode_t.h"
 # include "irgraph_t.h"
 # include "irnode_t.h"
 # include "irmode_t.h"
@@ -37,6 +38,7 @@
 # include "array.h"
 # include "irbackedge_t.h"
 # include "irflag_t.h"
 # include "array.h"
 # include "irbackedge_t.h"
 # include "irflag_t.h"
+# include "iredges_t.h"
 
 #if USE_EXPLICIT_PHI_IN_STACK
 /* A stack needed for the automatic Phi node construction in constructor
 
 #if USE_EXPLICIT_PHI_IN_STACK
 /* A stack needed for the automatic Phi node construction in constructor
@@ -53,24 +55,22 @@ 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 dependant initialization variable
+/**
+ * Language dependent variable initialization callback.
  */
 static uninitialized_local_variable_func_t *default_initialize_local_variable = NULL;
 
  */
 static uninitialized_local_variable_func_t *default_initialize_local_variable = NULL;
 
-/* -------------------------------------------- */
-/* privat 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. */
 
 /* 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)
+static ir_node *
+new_bd_Block (dbg_info *db,  int arity, ir_node **in)
 {
 {
-  ir_node *res;
+  ir_node  *res;
+  ir_graph *irg = current_ir_graph;
 
   res = new_ir_node (db, irg, NULL, op_Block, mode_BB, arity, in);
   set_Block_matured(res, 1);
 
   res = new_ir_node (db, irg, NULL, op_Block, mode_BB, arity, in);
   set_Block_matured(res, 1);
@@ -83,15 +83,17 @@ new_rd_Block (dbg_info* db, ir_graph *irg,  int arity, ir_node **in)
   res->attr.block.backedge    = new_backedge_arr(irg->obst, arity);
   res->attr.block.in_cg       = NULL;
   res->attr.block.cg_backedge = NULL;
   res->attr.block.backedge    = new_backedge_arr(irg->obst, arity);
   res->attr.block.in_cg       = NULL;
   res->attr.block.cg_backedge = NULL;
+  res->attr.block.extblk      = NULL;
 
   IRN_VRFY_IRG(res, irg);
   return res;
 }
 
 
   IRN_VRFY_IRG(res, irg);
   return res;
 }
 
-ir_node *
-new_rd_Start (dbg_info* db, ir_graph *irg, ir_node *block)
+static ir_node *
+new_bd_Start (dbg_info *db, ir_node *block)
 {
 {
-  ir_node *res;
+  ir_node  *res;
+  ir_graph *irg = current_ir_graph;
 
   res = new_ir_node(db, irg, block, op_Start, mode_T, 0, NULL);
   /* res->attr.start.irg = irg; */
 
   res = new_ir_node(db, irg, block, op_Start, mode_T, 0, NULL);
   /* res->attr.start.irg = irg; */
@@ -100,10 +102,11 @@ new_rd_Start (dbg_info* db, ir_graph *irg, ir_node *block)
   return res;
 }
 
   return res;
 }
 
-ir_node *
-new_rd_End (dbg_info* db, ir_graph *irg, ir_node *block)
+static ir_node *
+new_bd_End (dbg_info *db, ir_node *block)
 {
 {
-  ir_node *res;
+  ir_node  *res;
+  ir_graph *irg = current_ir_graph;
 
   res = new_ir_node(db, irg, block, op_End, mode_X, -1, NULL);
 
 
   res = new_ir_node(db, irg, block, op_End, mode_X, -1, NULL);
 
@@ -113,10 +116,11 @@ new_rd_End (dbg_info* db, ir_graph *irg, ir_node *block)
 
 /* Creates a Phi node with all predecessors.  Calling this constructor
    is only allowed if the corresponding block is mature.  */
 
 /* 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)
+static ir_node *
+new_bd_Phi (dbg_info *db, ir_node *block, int arity, ir_node **in, ir_mode *mode)
 {
 {
-  ir_node *res;
+  ir_node  *res;
+  ir_graph *irg = current_ir_graph;
   int i;
   bool has_unknown = false;
 
   int i;
   bool has_unknown = false;
 
@@ -145,10 +149,11 @@ new_rd_Phi (dbg_info* db, ir_graph *irg, ir_node *block, int arity, ir_node **in
   return res;
 }
 
   return res;
 }
 
-ir_node *
-new_rd_Const_type (dbg_info* db, ir_graph *irg, ir_node *block, ir_mode *mode, tarval *con, type *tp)
+static ir_node *
+new_bd_Const_type (dbg_info *db, ir_node *block, ir_mode *mode, tarval *con, type *tp)
 {
 {
-  ir_node *res;
+  ir_node  *res;
+  ir_graph *irg = current_ir_graph;
 
   res = new_ir_node (db, irg, irg->start_block, op_Const, mode, 0, NULL);
   res->attr.con.tv = con;
 
   res = new_ir_node (db, irg, irg->start_block, op_Const, mode, 0, NULL);
   res->attr.con.tv = con;
@@ -160,16 +165,27 @@ new_rd_Const_type (dbg_info* db, ir_graph *irg, ir_node *block, ir_mode *mode, t
   return res;
 }
 
   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_Const (dbg_info *db, ir_node *block, ir_mode *mode, tarval *con)
 {
 {
+  ir_graph *irg = current_ir_graph;
+
   return new_rd_Const_type (db, irg, block, mode, con, firm_unknown_type);
 }
 
   return new_rd_Const_type (db, irg, block, mode, con, firm_unknown_type);
 }
 
-ir_node *
-new_rd_Id (dbg_info* db, ir_graph *irg, ir_node *block, ir_node *val, ir_mode *mode)
+static ir_node *
+new_bd_Const_long (dbg_info *db, ir_node *block, ir_mode *mode, long value)
 {
 {
-  ir_node *res;
+  ir_graph *irg = current_ir_graph;
+
+  return new_rd_Const(db, irg, block, mode, new_tarval_from_long(value, mode));
+}
+
+static ir_node *
+new_bd_Id (dbg_info *db, ir_node *block, ir_node *val, ir_mode *mode)
+{
+  ir_node  *res;
+  ir_graph *irg = current_ir_graph;
 
   res = new_ir_node(db, irg, block, op_Id, mode, 1, &val);
   res = optimize_node(res);
 
   res = new_ir_node(db, irg, block, op_Id, mode, 1, &val);
   res = optimize_node(res);
@@ -177,11 +193,12 @@ new_rd_Id (dbg_info* db, ir_graph *irg, ir_node *block, ir_node *val, ir_mode *m
   return res;
 }
 
   return res;
 }
 
-ir_node *
-new_rd_Proj (dbg_info* db, ir_graph *irg, ir_node *block, ir_node *arg, ir_mode *mode,
+static ir_node *
+new_bd_Proj (dbg_info *db, ir_node *block, ir_node *arg, ir_mode *mode,
         long proj)
 {
         long proj)
 {
-  ir_node *res;
+  ir_node  *res;
+  ir_graph *irg = current_ir_graph;
 
   res = new_ir_node (db, irg, block, op_Proj, mode, 1, &arg);
   res->attr.proj = proj;
 
   res = new_ir_node (db, irg, block, op_Proj, mode, 1, &arg);
   res->attr.proj = proj;
@@ -197,11 +214,13 @@ new_rd_Proj (dbg_info* db, ir_graph *irg, ir_node *block, ir_node *arg, ir_mode
 
 }
 
 
 }
 
-ir_node *
-new_rd_defaultProj (dbg_info* db, ir_graph *irg, ir_node *block, ir_node *arg,
+static ir_node *
+new_bd_defaultProj (dbg_info *db, ir_node *block, ir_node *arg,
            long max_proj)
 {
            long max_proj)
 {
-  ir_node *res;
+  ir_node  *res;
+  ir_graph *irg = current_ir_graph;
+
   assert(arg->op == op_Cond);
   arg->attr.c.kind = fragmentary;
   arg->attr.c.default_proj = max_proj;
   assert(arg->op == op_Cond);
   arg->attr.c.kind = fragmentary;
   arg->attr.c.default_proj = max_proj;
@@ -209,10 +228,11 @@ new_rd_defaultProj (dbg_info* db, ir_graph *irg, ir_node *block, ir_node *arg,
   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_Conv (dbg_info *db, ir_node *block, ir_node *op, ir_mode *mode)
 {
 {
-  ir_node *res;
+  ir_node  *res;
+  ir_graph *irg = current_ir_graph;
 
   res = new_ir_node(db, irg, block, op_Conv, mode, 1, &op);
   res = optimize_node(res);
 
   res = new_ir_node(db, irg, block, op_Conv, mode, 1, &op);
   res = optimize_node(res);
@@ -220,10 +240,11 @@ new_rd_Conv (dbg_info* db, ir_graph *irg, ir_node *block, ir_node *op, ir_mode *
   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_Cast (dbg_info *db, ir_node *block, ir_node *op, type *to_tp)
 {
 {
-  ir_node *res;
+  ir_node  *res;
+  ir_graph *irg = current_ir_graph;
 
   assert(is_atomic_type(to_tp));
 
 
   assert(is_atomic_type(to_tp));
 
@@ -234,10 +255,11 @@ new_rd_Cast (dbg_info* db, ir_graph *irg, ir_node *block, ir_node *op, type *to_
   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_Tuple (dbg_info *db, ir_node *block, int arity, ir_node **in)
 {
 {
-  ir_node *res;
+  ir_node  *res;
+  ir_graph *irg = current_ir_graph;
 
   res = new_ir_node(db, irg, block, op_Tuple, mode_T, arity, in);
   res = optimize_node (res);
 
   res = new_ir_node(db, irg, block, op_Tuple, mode_T, arity, in);
   res = optimize_node (res);
@@ -245,12 +267,13 @@ new_rd_Tuple (dbg_info* db, ir_graph *irg, ir_node *block, int arity, ir_node **
   return res;
 }
 
   return res;
 }
 
-ir_node *
-new_rd_Add (dbg_info* db, ir_graph *irg, ir_node *block,
+static ir_node *
+new_bd_Add (dbg_info *db, ir_node *block,
        ir_node *op1, ir_node *op2, ir_mode *mode)
 {
        ir_node *op1, ir_node *op2, ir_mode *mode)
 {
-  ir_node *in[2];
-  ir_node *res;
+  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;
@@ -260,26 +283,29 @@ new_rd_Add (dbg_info* db, ir_graph *irg, ir_node *block,
   return res;
 }
 
   return res;
 }
 
-ir_node *
-new_rd_Sub (dbg_info* db, ir_graph *irg, ir_node *block,
+static ir_node *
+new_bd_Sub (dbg_info *db, ir_node *block,
        ir_node *op1, ir_node *op2, ir_mode *mode)
 {
        ir_node *op1, ir_node *op2, ir_mode *mode)
 {
-  ir_node *in[2];
-  ir_node *res;
+  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);
 
   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;
 }
 
   return res;
 }
 
-ir_node *
-new_rd_Minus (dbg_info* db, ir_graph *irg, ir_node *block,
-         ir_node *op, ir_mode *mode)
+static ir_node *
+new_bd_Minus (dbg_info *db, ir_node *block,
+              ir_node *op, ir_mode *mode)
 {
 {
-  ir_node *res;
+  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);
 
   res = new_ir_node(db, irg, block, op_Minus, mode, 1, &op);
   res = optimize_node(res);
@@ -287,12 +313,13 @@ new_rd_Minus (dbg_info* db, ir_graph *irg, ir_node *block,
   return res;
 }
 
   return res;
 }
 
-ir_node *
-new_rd_Mul (dbg_info* db, ir_graph *irg, ir_node *block,
+static ir_node *
+new_bd_Mul (dbg_info *db, ir_node *block,
        ir_node *op1, ir_node *op2, ir_mode *mode)
 {
        ir_node *op1, ir_node *op2, ir_mode *mode)
 {
-  ir_node *in[2];
-  ir_node *res;
+  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;
@@ -302,12 +329,13 @@ new_rd_Mul (dbg_info* db, ir_graph *irg, ir_node *block,
   return res;
 }
 
   return res;
 }
 
-ir_node *
-new_rd_Quot (dbg_info* db, ir_graph *irg, ir_node *block,
+static ir_node *
+new_bd_Quot (dbg_info *db, ir_node *block,
             ir_node *memop, ir_node *op1, ir_node *op2)
 {
             ir_node *memop, ir_node *op1, ir_node *op2)
 {
-  ir_node *in[3];
-  ir_node *res;
+  ir_node  *in[3];
+  ir_node  *res;
+  ir_graph *irg = current_ir_graph;
 
   in[0] = memop;
   in[1] = op1;
 
   in[0] = memop;
   in[1] = op1;
@@ -318,12 +346,13 @@ new_rd_Quot (dbg_info* db, ir_graph *irg, ir_node *block,
   return res;
 }
 
   return res;
 }
 
-ir_node *
-new_rd_DivMod (dbg_info* db, ir_graph *irg, ir_node *block,
+static ir_node *
+new_bd_DivMod (dbg_info *db, ir_node *block,
           ir_node *memop, ir_node *op1, ir_node *op2)
 {
           ir_node *memop, ir_node *op1, ir_node *op2)
 {
-  ir_node *in[3];
-  ir_node *res;
+  ir_node  *in[3];
+  ir_node  *res;
+  ir_graph *irg = current_ir_graph;
 
   in[0] = memop;
   in[1] = op1;
 
   in[0] = memop;
   in[1] = op1;
@@ -334,12 +363,13 @@ new_rd_DivMod (dbg_info* db, ir_graph *irg, ir_node *block,
   return res;
 }
 
   return res;
 }
 
-ir_node *
-new_rd_Div (dbg_info* db, ir_graph *irg, ir_node *block,
+static ir_node *
+new_bd_Div (dbg_info *db, ir_node *block,
            ir_node *memop, ir_node *op1, ir_node *op2)
 {
            ir_node *memop, ir_node *op1, ir_node *op2)
 {
-  ir_node *in[3];
-  ir_node *res;
+  ir_node  *in[3];
+  ir_node  *res;
+  ir_graph *irg = current_ir_graph;
 
   in[0] = memop;
   in[1] = op1;
 
   in[0] = memop;
   in[1] = op1;
@@ -350,12 +380,13 @@ new_rd_Div (dbg_info* db, ir_graph *irg, ir_node *block,
   return res;
 }
 
   return res;
 }
 
-ir_node *
-new_rd_Mod (dbg_info* db, ir_graph *irg, ir_node *block,
+static ir_node *
+new_bd_Mod (dbg_info *db, ir_node *block,
            ir_node *memop, ir_node *op1, ir_node *op2)
 {
            ir_node *memop, ir_node *op1, ir_node *op2)
 {
-  ir_node *in[3];
-  ir_node *res;
+  ir_node  *in[3];
+  ir_node  *res;
+  ir_graph *irg = current_ir_graph;
 
   in[0] = memop;
   in[1] = op1;
 
   in[0] = memop;
   in[1] = op1;
@@ -366,12 +397,13 @@ new_rd_Mod (dbg_info* db, ir_graph *irg, ir_node *block,
   return res;
 }
 
   return res;
 }
 
-ir_node *
-new_rd_And (dbg_info* db, ir_graph *irg, ir_node *block,
+static ir_node *
+new_bd_And (dbg_info *db, ir_node *block,
            ir_node *op1, ir_node *op2, ir_mode *mode)
 {
            ir_node *op1, ir_node *op2, ir_mode *mode)
 {
-  ir_node *in[2];
-  ir_node *res;
+  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;
@@ -381,12 +413,13 @@ new_rd_And (dbg_info* db, ir_graph *irg, ir_node *block,
   return res;
 }
 
   return res;
 }
 
-ir_node *
-new_rd_Or (dbg_info* db, ir_graph *irg, ir_node *block,
+static ir_node *
+new_bd_Or (dbg_info *db, ir_node *block,
           ir_node *op1, ir_node *op2, ir_mode *mode)
 {
           ir_node *op1, ir_node *op2, ir_mode *mode)
 {
-  ir_node *in[2];
-  ir_node *res;
+  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;
@@ -396,12 +429,13 @@ new_rd_Or (dbg_info* db, ir_graph *irg, ir_node *block,
   return res;
 }
 
   return res;
 }
 
-ir_node *
-new_rd_Eor (dbg_info* db, ir_graph *irg, ir_node *block,
+static ir_node *
+new_bd_Eor (dbg_info *db, ir_node *block,
           ir_node *op1, ir_node *op2, ir_mode *mode)
 {
           ir_node *op1, ir_node *op2, ir_mode *mode)
 {
-  ir_node *in[2];
-  ir_node *res;
+  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;
@@ -411,11 +445,12 @@ new_rd_Eor (dbg_info* db, ir_graph *irg, ir_node *block,
   return res;
 }
 
   return res;
 }
 
-ir_node *
-new_rd_Not    (dbg_info* db, ir_graph *irg, ir_node *block,
+static ir_node *
+new_bd_Not    (dbg_info *db, ir_node *block,
           ir_node *op, ir_mode *mode)
 {
           ir_node *op, ir_mode *mode)
 {
-  ir_node *res;
+  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);
 
   res = new_ir_node(db, irg, block, op_Not, mode, 1, &op);
   res = optimize_node(res);
@@ -423,12 +458,13 @@ new_rd_Not    (dbg_info* db, ir_graph *irg, ir_node *block,
   return res;
 }
 
   return res;
 }
 
-ir_node *
-new_rd_Shl (dbg_info* db, ir_graph *irg, ir_node *block,
+static ir_node *
+new_bd_Shl (dbg_info *db, ir_node *block,
           ir_node *op, ir_node *k, ir_mode *mode)
 {
           ir_node *op, ir_node *k, ir_mode *mode)
 {
-  ir_node *in[2];
-  ir_node *res;
+  ir_node  *in[2];
+  ir_node  *res;
+  ir_graph *irg = current_ir_graph;
 
   in[0] = op;
   in[1] = k;
 
   in[0] = op;
   in[1] = k;
@@ -438,250 +474,1068 @@ new_rd_Shl (dbg_info* db, ir_graph *irg, ir_node *block,
   return res;
 }
 
   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;
+}
+
+static ir_node *
+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;
+
+  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);
+  return res;
+}
+
+static ir_node *
+new_bd_Jmp (dbg_info *db, ir_node *block)
+{
+  ir_node  *res;
+  ir_graph *irg = current_ir_graph;
+
+  res = new_ir_node (db, irg, block, op_Jmp, mode_X, 0, NULL);
+  res = optimize_node (res);
+  IRN_VRFY_IRG (res, irg);
+  return res;
+}
+
+static ir_node *
+new_bd_IJmp (dbg_info *db, ir_node *block, ir_node *tgt)
+{
+  ir_node  *res;
+  ir_graph *irg = current_ir_graph;
+
+  res = new_ir_node (db, irg, block, op_IJmp, mode_X, 1, &tgt);
+  res = optimize_node (res);
+  IRN_VRFY_IRG (res, irg);
+
+  if (get_irn_op(res) == op_IJmp) /* still an IJmp */
+    keep_alive(res);
+  return res;
+}
+
+static ir_node *
+new_bd_Cond (dbg_info *db, ir_node *block, ir_node *c)
+{
+  ir_node  *res;
+  ir_graph *irg = current_ir_graph;
+
+  res = new_ir_node (db, irg, block, op_Cond, mode_T, 1, &c);
+  res->attr.c.kind         = dense;
+  res->attr.c.default_proj = 0;
+  res->attr.c.pred         = COND_JMP_PRED_NONE;
+  res = optimize_node (res);
+  IRN_VRFY_IRG(res, irg);
+  return res;
+}
+
+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  **r_in;
+  ir_node  *res;
+  int      r_arity;
+  ir_graph *irg = current_ir_graph;
+
+  r_arity = arity+2;
+  NEW_ARR_A(ir_node *, r_in, r_arity);
+  r_in[0] = store;
+  r_in[1] = callee;
+  memcpy(&r_in[2], in, sizeof(ir_node *) * arity);
+
+  res = new_ir_node(db, irg, block, op_Call, mode_T, r_arity, r_in);
+
+  assert((get_unknown_type() == tp) || is_Method_type(tp));
+  set_Call_type(res, tp);
+  res->attr.call.exc.pin_state = op_pin_state_pinned;
+  res->attr.call.callee_arr    = NULL;
+  res = optimize_node(res);
+  IRN_VRFY_IRG(res, irg);
+  return res;
+}
+
+static ir_node *
+new_bd_Return (dbg_info *db, ir_node *block,
+              ir_node *store, int arity, ir_node **in)
+{
+  ir_node  **r_in;
+  ir_node  *res;
+  int      r_arity;
+  ir_graph *irg = current_ir_graph;
+
+  r_arity = arity+1;
+  NEW_ARR_A (ir_node *, r_in, r_arity);
+  r_in[0] = store;
+  memcpy(&r_in[1], in, sizeof(ir_node *) * arity);
+  res = new_ir_node(db, irg, block, op_Return, mode_X, r_arity, r_in);
+  res = optimize_node(res);
+  IRN_VRFY_IRG(res, irg);
+  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)
+{
+  ir_node  *in[2];
+  ir_node  *res;
+  ir_graph *irg = current_ir_graph;
+
+  in[0] = store;
+  in[1] = adr;
+  res = new_ir_node(db, irg, block, op_Load, mode_T, 2, in);
+  res->attr.load.exc.pin_state = op_pin_state_pinned;
+  res->attr.load.load_mode     = mode;
+  res->attr.load.volatility    = volatility_non_volatile;
+  res = optimize_node(res);
+  IRN_VRFY_IRG(res, irg);
+  return res;
+}
+
+static ir_node *
+new_bd_Store (dbg_info *db, ir_node *block,
+         ir_node *store, ir_node *adr, ir_node *val)
+{
+  ir_node  *in[3];
+  ir_node  *res;
+  ir_graph *irg = current_ir_graph;
+
+  in[0] = store;
+  in[1] = adr;
+  in[2] = val;
+  res = new_ir_node(db, irg, block, op_Store, mode_T, 3, in);
+  res->attr.store.exc.pin_state = op_pin_state_pinned;
+  res->attr.store.volatility    = volatility_non_volatile;
+  res = optimize_node(res);
+  IRN_VRFY_IRG(res, irg);
+  return res;
+}
+
+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  *in[2];
+  ir_node  *res;
+  ir_graph *irg = current_ir_graph;
+
+  in[0] = store;
+  in[1] = size;
+  res = new_ir_node(db, irg, block, op_Alloc, mode_T, 2, in);
+  res->attr.a.exc.pin_state = op_pin_state_pinned;
+  res->attr.a.where         = where;
+  res->attr.a.type          = alloc_type;
+  res = optimize_node(res);
+  IRN_VRFY_IRG(res, irg);
+  return res;
+}
+
+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  *in[3];
+  ir_node  *res;
+  ir_graph *irg = current_ir_graph;
+
+  in[0] = store;
+  in[1] = ptr;
+  in[2] = size;
+  res = new_ir_node (db, irg, block, op_Free, mode_M, 3, in);
+  res->attr.f.where = where;
+  res->attr.f.type  = free_type;
+  res = optimize_node(res);
+  IRN_VRFY_IRG(res, irg);
+  return res;
+}
+
+static ir_node *
+new_bd_Sel (dbg_info *db, ir_node *block, ir_node *store, ir_node *objptr,
+           int arity, ir_node **in, entity *ent)
+{
+  ir_node  **r_in;
+  ir_node  *res;
+  int      r_arity;
+  ir_graph *irg = current_ir_graph;
+
+  assert(ent != NULL && is_entity(ent) && "entity expected in Sel construction");
+
+  r_arity = arity + 2;
+  NEW_ARR_A(ir_node *, r_in, r_arity);  /* uses alloca */
+  r_in[0] = store;
+  r_in[1] = objptr;
+  memcpy(&r_in[2], in, sizeof(ir_node *) * arity);
+  /*
+   * FIXM: Sel's can select functions which should be of mode mode_P_code.
+   */
+  res = new_ir_node(db, irg, block, op_Sel, mode_P_data, r_arity, r_in);
+  res->attr.s.ent = ent;
+  res = optimize_node(res);
+  IRN_VRFY_IRG(res, irg);
+  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,
+              symconst_kind symkind, type *tp) {
+  ir_node  *res;
+  ir_mode  *mode;
+  ir_graph *irg = current_ir_graph;
+
+  if ((symkind == symconst_addr_name) || (symkind == symconst_addr_ent))
+    mode = mode_P_data;   /* FIXME: can be mode_P_code */
+  else
+    mode = mode_Iu;
+
+  res = new_ir_node(db, irg, block, op_SymConst, mode, 0, NULL);
+
+  res->attr.i.num = symkind;
+  res->attr.i.sym = value;
+  res->attr.i.tp  = tp;
+
+  res = optimize_node(res);
+  IRN_VRFY_IRG(res, irg);
+  return res;
+}
+
+static ir_node *
+new_bd_SymConst (dbg_info *db, ir_node *block, symconst_symbol value,
+         symconst_kind symkind)
+{
+  ir_graph *irg = current_ir_graph;
+
+  ir_node *res = new_rd_SymConst_type(db, irg, block, value, symkind, firm_unknown_type);
+  return res;
+}
+
+static ir_node *
+new_bd_Sync (dbg_info *db, ir_node *block, int arity, ir_node **in)
+{
+  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);
+  IRN_VRFY_IRG(res, irg);
+  return res;
+}
+
+static ir_node *
+new_bd_Confirm (dbg_info *db, ir_node *block, ir_node *val, ir_node *bound, pn_Cmp cmp)
+{
+  ir_node  *in[2], *res;
+  ir_graph *irg = current_ir_graph;
+
+  in[0] = val;
+  in[1] = bound;
+  res = new_ir_node (db, irg, block, op_Confirm, get_irn_mode(val), 2, in);
+  res->attr.confirm_cmp = cmp;
+  res = optimize_node (res);
+  IRN_VRFY_IRG(res, irg);
+  return res;
+}
+
+/* this function is often called with current_ir_graph unset */
+static ir_node *
+new_bd_Unknown (ir_mode *m)
+{
+  ir_node  *res;
+  ir_graph *irg = current_ir_graph;
+
+  res = new_ir_node(NULL, irg, irg->start_block, op_Unknown, m, 0, NULL);
+  res = optimize_node(res);
+  return res;
+}
+
+static ir_node *
+new_bd_CallBegin (dbg_info *db, ir_node *block, ir_node *call)
+{
+  ir_node  *in[1];
+  ir_node  *res;
+  ir_graph *irg = current_ir_graph;
+
+  in[0] = get_Call_ptr(call);
+  res = new_ir_node(db, irg, block, op_CallBegin, mode_T, 1, in);
+  /* res->attr.callbegin.irg = irg; */
+  res->attr.callbegin.call = call;
+  res = optimize_node(res);
+  IRN_VRFY_IRG(res, irg);
+  return res;
+}
+
+static ir_node *
+new_bd_EndReg (dbg_info *db, ir_node *block)
+{
+  ir_node  *res;
+  ir_graph *irg = current_ir_graph;
+
+  res = new_ir_node(db, irg, block, op_EndReg, mode_T, -1, NULL);
+  irg->end_reg = res;
+  IRN_VRFY_IRG(res, irg);
+  return res;
+}
+
+static ir_node *
+new_bd_EndExcept (dbg_info *db, ir_node *block)
+{
+  ir_node  *res;
+  ir_graph *irg = current_ir_graph;
+
+  res = new_ir_node(db, irg, block, op_EndExcept, mode_T, -1, NULL);
+  irg->end_except = res;
+  IRN_VRFY_IRG (res, irg);
+  return res;
+}
+
+static ir_node *
+new_bd_Break (dbg_info *db, ir_node *block)
+{
+  ir_node  *res;
+  ir_graph *irg = current_ir_graph;
+
+  res = new_ir_node(db, irg, block, op_Break, mode_X, 0, NULL);
+  res = optimize_node(res);
+  IRN_VRFY_IRG(res, irg);
+  return res;
+}
+
+static ir_node *
+new_bd_Filter (dbg_info *db, ir_node *block, ir_node *arg, ir_mode *mode,
+           long proj)
+{
+  ir_node  *res;
+  ir_graph *irg = current_ir_graph;
+
+  res = new_ir_node(db, irg, block, op_Filter, mode, 1, &arg);
+  res->attr.filter.proj = proj;
+  res->attr.filter.in_cg = NULL;
+  res->attr.filter.backedge = NULL;
+
+  assert(res);
+  assert(get_Proj_pred(res));
+  assert(get_nodes_block(get_Proj_pred(res)));
+
+  res = optimize_node(res);
+  IRN_VRFY_IRG(res, irg);
+  return res;
+}
+
+static ir_node *
+new_bd_Mux  (dbg_info *db, ir_node *block,
+    ir_node *sel, ir_node *ir_false, ir_node *ir_true, ir_mode *mode)
+{
+  ir_node  *in[3];
+  ir_node  *res;
+  ir_graph *irg = current_ir_graph;
+
+  in[0] = sel;
+  in[1] = ir_false;
+  in[2] = ir_true;
+
+  res = new_ir_node(db, irg, block, op_Mux, mode, 3, in);
+  assert(res);
+
+  res = optimize_node(res);
+  IRN_VRFY_IRG(res, irg);
+  return res;
+}
+
+static ir_node *
+new_bd_CopyB  (dbg_info *db, ir_node *block,
+    ir_node *store, ir_node *dst, ir_node *src, type *data_type)
+{
+  ir_node  *in[3];
+  ir_node  *res;
+  ir_graph *irg = current_ir_graph;
+
+  in[0] = store;
+  in[1] = dst;
+  in[2] = src;
+
+  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;
+}
+
+/* --------------------------------------------- */
+/* 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)
+{
+  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;
+
+  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 *
+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;
+  res = new_bd_Id(db, block, val, mode);
+  current_ir_graph = rem;
+
+  return res;
+}
+
+ir_node *
+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;
+  res = new_bd_Proj(db, block, arg, mode, proj);
+  current_ir_graph = rem;
+
+  return res;
+}
+
+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;
+
+  return res;
+}
+
+ir_node *
+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;
+  res = new_bd_Conv(db, block, op, mode);
+  current_ir_graph = rem;
+
+  return res;
+}
+
+ir_node *
+new_rd_Cast (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *op, type *to_tp)
+{
+  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;
+
+  return res;
+}
+
+ir_node *
+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;
+  res = new_bd_Tuple(db, block, arity, in);
+  current_ir_graph = rem;
+
+  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;
+}
+
+ir_node *
+new_rd_Sub (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_Sub(db, block, op1, op2, mode);
+  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)
+{
+  ir_node  *res;
+  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_graph *rem = current_ir_graph;
+
+  current_ir_graph = irg;
+  res = new_bd_Mul(db, block, op1, op2, mode);
+  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)
+{
+  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;
+
+  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);
+  current_ir_graph = rem;
+
+  return res;
+}
+
+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)
+{
+  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 = 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)
+{
+  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 = 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)
+{
+  ir_node  *res;
+  ir_graph *rem = current_ir_graph;
+
+  current_ir_graph = irg;
+  res = new_bd_Or(db, block, op1, op2, mode);
+  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_Not (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_Not(db, block, op, mode);
+  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)
+{
+  ir_node  *res;
+  ir_graph *rem = current_ir_graph;
+
+  current_ir_graph = irg;
+  res = new_bd_Shl (db, block, op, k, mode);
+  current_ir_graph = rem;
+
+  return res;
+}
+
 ir_node *
 ir_node *
-new_rd_Shr (dbg_infodb, ir_graph *irg, ir_node *block,
+new_rd_Shr (dbg_info *db, ir_graph *irg, ir_node *block,
        ir_node *op, ir_node *k, ir_mode *mode)
 {
        ir_node *op, ir_node *k, ir_mode *mode)
 {
-  ir_node *in[2];
-  ir_node *res;
+  ir_node  *res;
+  ir_graph *rem = current_ir_graph;
+
+  current_ir_graph = irg;
+  res = new_bd_Shr(db, block, op, k, mode);
+  current_ir_graph = rem;
 
 
-  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;
 }
 
 ir_node *
   return res;
 }
 
 ir_node *
-new_rd_Shrs (dbg_infodb, ir_graph *irg, ir_node *block,
+new_rd_Shrs (dbg_info *db, ir_graph *irg, ir_node *block,
        ir_node *op, ir_node *k, ir_mode *mode)
 {
        ir_node *op, ir_node *k, ir_mode *mode)
 {
-  ir_node *in[2];
-  ir_node *res;
+  ir_node  *res;
+  ir_graph *rem = current_ir_graph;
+
+  current_ir_graph = irg;
+  res = new_bd_Shrs(db, block, op, k, mode);
+  current_ir_graph = rem;
 
 
-  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;
 }
 
 ir_node *
   return res;
 }
 
 ir_node *
-new_rd_Rot (dbg_infodb, ir_graph *irg, ir_node *block,
+new_rd_Rot (dbg_info *db, ir_graph *irg, ir_node *block,
        ir_node *op, ir_node *k, ir_mode *mode)
 {
        ir_node *op, ir_node *k, ir_mode *mode)
 {
-  ir_node *in[2];
-  ir_node *res;
+  ir_node  *res;
+  ir_graph *rem = current_ir_graph;
+
+  current_ir_graph = irg;
+  res = new_bd_Rot(db, block, op, k, mode);
+  current_ir_graph = rem;
 
 
-  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;
 }
 
 ir_node *
   return res;
 }
 
 ir_node *
-new_rd_Abs (dbg_infodb, ir_graph *irg, ir_node *block,
+new_rd_Abs (dbg_info *db, ir_graph *irg, ir_node *block,
        ir_node *op, ir_mode *mode)
 {
        ir_node *op, ir_mode *mode)
 {
-  ir_node *res;
+  ir_node  *res;
+  ir_graph *rem = current_ir_graph;
+
+  current_ir_graph = irg;
+  res = new_bd_Abs(db, block, op, mode);
+  current_ir_graph = rem;
 
 
-  res = new_ir_node(db, irg, block, op_Abs, mode, 1, &op);
-  res = optimize_node (res);
-  IRN_VRFY_IRG(res, irg);
   return res;
 }
 
 ir_node *
   return res;
 }
 
 ir_node *
-new_rd_Cmp (dbg_infodb, ir_graph *irg, ir_node *block,
+new_rd_Cmp (dbg_info *db, ir_graph *irg, ir_node *block,
        ir_node *op1, ir_node *op2)
 {
        ir_node *op1, ir_node *op2)
 {
-  ir_node *in[2];
-  ir_node *res;
-  in[0] = op1;
-  in[1] = op2;
+  ir_node  *res;
+  ir_graph *rem = current_ir_graph;
+
+  current_ir_graph = irg;
+  res = new_bd_Cmp(db, block, op1, op2);
+  current_ir_graph = rem;
 
 
-  res = new_ir_node(db, irg, block, op_Cmp, mode_T, 2, in);
-  res = optimize_node(res);
-  IRN_VRFY_IRG(res, irg);
   return res;
 }
 
 ir_node *
   return res;
 }
 
 ir_node *
-new_rd_Jmp (dbg_infodb, ir_graph *irg, ir_node *block)
+new_rd_Jmp (dbg_info *db, ir_graph *irg, ir_node *block)
 {
 {
-  ir_node *res;
+  ir_node  *res;
+  ir_graph *rem = current_ir_graph;
+
+  current_ir_graph = irg;
+  res = new_bd_Jmp(db, block);
+  current_ir_graph = rem;
 
 
-  res = new_ir_node (db, irg, block, op_Jmp, mode_X, 0, NULL);
-  res = optimize_node (res);
-  IRN_VRFY_IRG (res, irg);
   return res;
 }
 
 ir_node *
   return res;
 }
 
 ir_node *
-new_rd_Cond (dbg_info* db, ir_graph *irg, ir_node *block, ir_node *c)
+new_rd_IJmp (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *tgt)
 {
 {
-  ir_node *res;
+  ir_node  *res;
+  ir_graph *rem = current_ir_graph;
+
+  current_ir_graph = irg;
+  res = new_bd_IJmp(db, block, tgt);
+  current_ir_graph = rem;
 
 
-  res = new_ir_node (db, irg, block, op_Cond, mode_T, 1, &c);
-  res->attr.c.kind         = dense;
-  res->attr.c.default_proj = 0;
-  res = optimize_node (res);
-  IRN_VRFY_IRG(res, irg);
   return res;
 }
 
 ir_node *
   return res;
 }
 
 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)
+new_rd_Cond (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *c)
 {
 {
-  ir_node **r_in;
-  ir_node *res;
-  int r_arity;
+  ir_node  *res;
+  ir_graph *rem = current_ir_graph;
 
 
-  r_arity = arity+2;
-  NEW_ARR_A(ir_node *, r_in, r_arity);
-  r_in[0] = store;
-  r_in[1] = callee;
-  memcpy(&r_in[2], in, sizeof(ir_node *) * arity);
+  current_ir_graph = irg;
+  res = new_bd_Cond(db, block, c);
+  current_ir_graph = rem;
 
 
-  res = new_ir_node(db, irg, block, op_Call, mode_T, r_arity, r_in);
+  return res;
+}
+
+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  *res;
+  ir_graph *rem = current_ir_graph;
+
+  current_ir_graph = irg;
+  res = new_bd_Call(db, block, store, callee, arity, in, tp);
+  current_ir_graph = rem;
 
 
-  assert((get_unknown_type() == tp) || is_Method_type(tp));
-  set_Call_type(res, tp);
-  res->attr.call.exc.pin_state = op_pin_state_pinned;
-  res->attr.call.callee_arr    = NULL;
-  res = optimize_node(res);
-  IRN_VRFY_IRG(res, irg);
   return res;
 }
 
 ir_node *
   return res;
 }
 
 ir_node *
-new_rd_Return (dbg_infodb, ir_graph *irg, ir_node *block,
+new_rd_Return (dbg_info *db, ir_graph *irg, ir_node *block,
               ir_node *store, int arity, ir_node **in)
 {
               ir_node *store, int arity, ir_node **in)
 {
-  ir_node **r_in;
-  ir_node *res;
-  int r_arity;
+  ir_node  *res;
+  ir_graph *rem = current_ir_graph;
+
+  current_ir_graph = irg;
+  res = new_bd_Return(db, block, store, arity, in);
+  current_ir_graph = rem;
 
 
-  r_arity = arity+1;
-  NEW_ARR_A (ir_node *, r_in, r_arity);
-  r_in[0] = store;
-  memcpy(&r_in[1], in, sizeof(ir_node *) * arity);
-  res = new_ir_node(db, irg, block, op_Return, mode_X, r_arity, r_in);
-  res = optimize_node(res);
-  IRN_VRFY_IRG(res, irg);
   return res;
 }
 
 ir_node *
   return res;
 }
 
 ir_node *
-new_rd_Raise (dbg_infodb, ir_graph *irg, ir_node *block, ir_node *store, ir_node *obj)
+new_rd_Raise (dbg_info *db, ir_graph *irg, 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_Raise(db, block, store, obj);
+  current_ir_graph = rem;
 
 
-  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;
 }
 
 ir_node *
   return res;
 }
 
 ir_node *
-new_rd_Load (dbg_infodb, ir_graph *irg, ir_node *block,
+new_rd_Load (dbg_info *db, ir_graph *irg, ir_node *block,
         ir_node *store, ir_node *adr, ir_mode *mode)
 {
         ir_node *store, ir_node *adr, ir_mode *mode)
 {
-  ir_node *in[2];
-  ir_node *res;
+  ir_node  *res;
+  ir_graph *rem = current_ir_graph;
+
+  current_ir_graph = irg;
+  res = new_bd_Load(db, block, store, adr, mode);
+  current_ir_graph = rem;
 
 
-  in[0] = store;
-  in[1] = adr;
-  res = new_ir_node(db, irg, block, op_Load, mode_T, 2, in);
-  res->attr.load.exc.pin_state = op_pin_state_pinned;
-  res->attr.load.load_mode     = mode;
-  res->attr.load.volatility    = volatility_non_volatile;
-  res = optimize_node(res);
-  IRN_VRFY_IRG(res, irg);
   return res;
 }
 
 ir_node *
   return res;
 }
 
 ir_node *
-new_rd_Store (dbg_infodb, ir_graph *irg, ir_node *block,
+new_rd_Store (dbg_info *db, ir_graph *irg, ir_node *block,
          ir_node *store, ir_node *adr, ir_node *val)
 {
          ir_node *store, ir_node *adr, ir_node *val)
 {
-  ir_node *in[3];
-  ir_node *res;
+  ir_node  *res;
+  ir_graph *rem = current_ir_graph;
+
+  current_ir_graph = irg;
+  res = new_bd_Store(db, block, store, adr, val);
+  current_ir_graph = rem;
 
 
-  in[0] = store;
-  in[1] = adr;
-  in[2] = val;
-  res = new_ir_node(db, irg, block, op_Store, mode_T, 3, in);
-  res->attr.store.exc.pin_state = op_pin_state_pinned;
-  res->attr.store.volatility    = volatility_non_volatile;
-  res = optimize_node(res);
-  IRN_VRFY_IRG(res, irg);
   return res;
 }
 
 ir_node *
   return res;
 }
 
 ir_node *
-new_rd_Alloc (dbg_infodb, ir_graph *irg, ir_node *block, ir_node *store,
+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, type *alloc_type, where_alloc where)
 {
-  ir_node *in[2];
-  ir_node *res;
+  ir_node  *res;
+  ir_graph *rem = current_ir_graph;
+
+  current_ir_graph = irg;
+  res = new_bd_Alloc (db, block, store, size, alloc_type, where);
+  current_ir_graph = rem;
 
 
-  in[0] = store;
-  in[1] = size;
-  res = new_ir_node(db, irg, block, op_Alloc, mode_T, 2, in);
-  res->attr.a.exc.pin_state = op_pin_state_pinned;
-  res->attr.a.where         = where;
-  res->attr.a.type          = alloc_type;
-  res = optimize_node(res);
-  IRN_VRFY_IRG(res, irg);
   return res;
 }
 
 ir_node *
   return res;
 }
 
 ir_node *
-new_rd_Free (dbg_infodb, ir_graph *irg, ir_node *block, ir_node *store,
+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, type *free_type, where_alloc where)
 {
-  ir_node *in[3];
-  ir_node *res;
+  ir_node  *res;
+  ir_graph *rem = current_ir_graph;
+
+  current_ir_graph = irg;
+  res = new_bd_Free(db, block, store, ptr, size, free_type, where);
+  current_ir_graph = rem;
 
 
-  in[0] = store;
-  in[1] = ptr;
-  in[2] = size;
-  res = new_ir_node (db, irg, block, op_Free, mode_M, 3, in);
-  res->attr.f.where = where;
-  res->attr.f.type  = free_type;
-  res = optimize_node(res);
-  IRN_VRFY_IRG(res, irg);
   return res;
 }
 
 ir_node *
   return res;
 }
 
 ir_node *
-new_rd_Sel (dbg_infodb, ir_graph *irg, ir_node *block, ir_node *store, ir_node *objptr,
+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)
 {
            int arity, ir_node **in, entity *ent)
 {
-  ir_node **r_in;
-  ir_node *res;
-  int r_arity;
+  ir_node  *res;
+  ir_graph *rem = current_ir_graph;
 
 
-  assert(ent != NULL && is_entity(ent) && "entity expected in Sel construction");
+  current_ir_graph = irg;
+  res = new_bd_Sel(db, block, store, objptr, arity, in, ent);
+  current_ir_graph = rem;
 
 
-  r_arity = arity + 2;
-  NEW_ARR_A(ir_node *, r_in, r_arity);  /* uses alloca */
-  r_in[0] = store;
-  r_in[1] = objptr;
-  memcpy(&r_in[2], in, sizeof(ir_node *) * arity);
-  res = new_ir_node(db, irg, block, op_Sel, mode_P_mach, r_arity, r_in);
-  res->attr.s.ent = ent;
-  res = optimize_node(res);
-  IRN_VRFY_IRG(res, irg);
   return res;
 }
 
   return res;
 }
 
@@ -689,54 +1543,40 @@ ir_node *
 new_rd_InstOf (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *store,
            ir_node *objptr, type *ent)
 {
 new_rd_InstOf (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *store,
            ir_node *objptr, type *ent)
 {
-  ir_node **r_in;
-  ir_node *res;
-  int r_arity;
-
-  r_arity = 2;
-  NEW_ARR_A(ir_node *, r_in, r_arity);
-  r_in[0] = store;
-  r_in[1] = objptr;
+  ir_node  *res;
+  ir_graph *rem = current_ir_graph;
 
 
-  res = new_ir_node(db, irg, block, op_Sel, mode_T, r_arity, r_in);
-  res->attr.io.ent = ent;
+  current_ir_graph = irg;
+  res = new_bd_InstOf(db, block, store, objptr, ent);
+  current_ir_graph = rem;
 
 
-  /* res = optimize(res); */
-  IRN_VRFY_IRG(res, irg);
   return res;
 }
 
 ir_node *
   return res;
 }
 
 ir_node *
-new_rd_SymConst_type (dbg_info* db, ir_graph *irg, ir_node *block, symconst_symbol value,
-                     symconst_kind symkind, type *tp) {
-  ir_node *res;
-  ir_mode *mode;
-
-  if ((symkind == symconst_addr_name) || (symkind == symconst_addr_ent))
-    mode = mode_P_mach;
-  else
-    mode = mode_Iu;
-
-  res = new_ir_node(db, irg, block, op_SymConst, mode, 0, NULL);
+new_rd_SymConst_type (dbg_info *db, ir_graph *irg, ir_node *block, symconst_symbol value,
+              symconst_kind symkind, type *tp)
+{
+  ir_node  *res;
+  ir_graph *rem = current_ir_graph;
 
 
-  res->attr.i.num = symkind;
-  res->attr.i.sym = value;
-  res->attr.i.tp  = tp;
+  current_ir_graph = irg;
+  res = new_bd_SymConst_type(db, block, value, symkind, tp);
+  current_ir_graph = rem;
 
 
-  res = optimize_node(res);
-  IRN_VRFY_IRG(res, irg);
   return res;
 }
 
 ir_node *
   return res;
 }
 
 ir_node *
-new_rd_SymConst (dbg_infodb, ir_graph *irg, ir_node *block, symconst_symbol value,
-                symconst_kind symkind)
+new_rd_SymConst (dbg_info *db, ir_graph *irg, ir_node *block, symconst_symbol value,
+         symconst_kind symkind)
 {
   ir_node *res = new_rd_SymConst_type(db, irg, block, value, symkind, firm_unknown_type);
   return res;
 }
 
 {
   ir_node *res = new_rd_SymConst_type(db, irg, block, value, symkind, firm_unknown_type);
   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, 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 = {(type *)symbol};
   return new_rd_SymConst_type(db, irg, irg->start_block, sym, symconst_addr_ent, tp);
 }
@@ -757,13 +1597,15 @@ ir_node *new_rd_SymConst_size (dbg_info *db, ir_graph *irg, type *symbol, type *
 }
 
 ir_node *
 }
 
 ir_node *
-new_rd_Sync (dbg_infodb, 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_node  *res;
+  ir_graph *rem = current_ir_graph;
+
+  current_ir_graph = irg;
+  res = new_bd_Sync(db, block, arity, in);
+  current_ir_graph = rem;
 
 
-  res = new_ir_node(db, irg, block, op_Sync, mode_M, arity, in);
-  res = optimize_node(res);
-  IRN_VRFY_IRG(res, irg);
   return res;
 }
 
   return res;
 }
 
@@ -776,35 +1618,40 @@ new_rd_Bad (ir_graph *irg)
 ir_node *
 new_rd_Confirm (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *val, ir_node *bound, pn_Cmp cmp)
 {
 ir_node *
 new_rd_Confirm (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *val, ir_node *bound, pn_Cmp cmp)
 {
-  ir_node *in[2], *res;
+  ir_node  *res;
+  ir_graph *rem = current_ir_graph;
+
+  current_ir_graph = irg;
+  res = new_bd_Confirm(db, block, val, bound, cmp);
+  current_ir_graph = rem;
 
 
-  in[0] = val;
-  in[1] = bound;
-  res = new_ir_node (db, irg, block, op_Confirm, get_irn_mode(val), 2, in);
-  res->attr.confirm_cmp = cmp;
-  res = optimize_node (res);
-  IRN_VRFY_IRG(res, irg);
   return res;
 }
 
   return res;
 }
 
+/* this function is often called with current_ir_graph unset */
 ir_node *
 new_rd_Unknown (ir_graph *irg, ir_mode *m)
 {
 ir_node *
 new_rd_Unknown (ir_graph *irg, ir_mode *m)
 {
-  return new_ir_node(NULL, irg, irg->start_block, op_Unknown, m, 0, NULL);
+  ir_node  *res;
+  ir_graph *rem = current_ir_graph;
+
+  current_ir_graph = irg;
+  res = new_bd_Unknown(m);
+  current_ir_graph = rem;
+
+  return res;
 }
 
 ir_node *
 new_rd_CallBegin (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *call)
 {
 }
 
 ir_node *
 new_rd_CallBegin (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *call)
 {
-  ir_node *in[1];
-  ir_node *res;
+  ir_node  *res;
+  ir_graph *rem = current_ir_graph;
+
+  current_ir_graph = irg;
+  res = new_bd_CallBegin(db, block, call);
+  current_ir_graph = rem;
 
 
-  in[0] = get_Call_ptr(call);
-  res = new_ir_node(db, irg, block, op_CallBegin, mode_T, 1, in);
-  /* res->attr.callbegin.irg = irg; */
-  res->attr.callbegin.call = call;
-  res = optimize_node(res);
-  IRN_VRFY_IRG(res, irg);
   return res;
 }
 
   return res;
 }
 
@@ -833,11 +1680,13 @@ new_rd_EndExcept (dbg_info *db, ir_graph *irg, ir_node *block)
 ir_node *
 new_rd_Break (dbg_info *db, ir_graph *irg, ir_node *block)
 {
 ir_node *
 new_rd_Break (dbg_info *db, ir_graph *irg, ir_node *block)
 {
-  ir_node *res;
+  ir_node  *res;
+  ir_graph *rem = current_ir_graph;
+
+  current_ir_graph = irg;
+  res = new_bd_Break(db, block);
+  current_ir_graph = rem;
 
 
-  res = new_ir_node(db, irg, block, op_Break, mode_X, 0, NULL);
-  res = optimize_node(res);
-  IRN_VRFY_IRG(res, irg);
   return res;
 }
 
   return res;
 }
 
@@ -845,19 +1694,13 @@ ir_node *
 new_rd_Filter (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *arg, ir_mode *mode,
            long proj)
 {
 new_rd_Filter (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *arg, ir_mode *mode,
            long proj)
 {
-  ir_node *res;
-
-  res = new_ir_node(db, irg, block, op_Filter, mode, 1, &arg);
-  res->attr.filter.proj = proj;
-  res->attr.filter.in_cg = NULL;
-  res->attr.filter.backedge = NULL;
+  ir_node  *res;
+  ir_graph *rem = current_ir_graph;
 
 
-  assert(res);
-  assert(get_Proj_pred(res));
-  assert(get_nodes_block(get_Proj_pred(res)));
+  current_ir_graph = irg;
+  res = new_bd_Filter(db, block, arg, mode, proj);
+  current_ir_graph = rem;
 
 
-  res = optimize_node(res);
-  IRN_VRFY_IRG(res, irg);
   return res;
 }
 
   return res;
 }
 
@@ -870,21 +1713,28 @@ ir_node *
 new_rd_Mux  (dbg_info *db, ir_graph *irg, ir_node *block,
     ir_node *sel, ir_node *ir_false, ir_node *ir_true, ir_mode *mode)
 {
 new_rd_Mux  (dbg_info *db, ir_graph *irg, ir_node *block,
     ir_node *sel, ir_node *ir_false, ir_node *ir_true, ir_mode *mode)
 {
-  ir_node *in[3];
-  ir_node *res;
-
-  in[0] = sel;
-  in[1] = ir_false;
-  in[2] = ir_true;
+  ir_node  *res;
+  ir_graph *rem = current_ir_graph;
 
 
-  res = new_ir_node(db, irg, block, op_Mux, mode, 3, in);
-  assert(res);
+  current_ir_graph = irg;
+  res = new_bd_Mux(db, block, sel, ir_false, ir_true, mode);
+  current_ir_graph = rem;
 
 
-  res = optimize_node(res);
-  IRN_VRFY_IRG(res, irg);
   return res;
 }
 
   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, 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_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);
@@ -898,6 +1748,9 @@ ir_node *new_r_End    (ir_graph *irg, ir_node *block) {
 ir_node *new_r_Jmp    (ir_graph *irg, ir_node *block) {
   return new_rd_Jmp(NULL, irg, block);
 }
 ir_node *new_r_Jmp    (ir_graph *irg, ir_node *block) {
   return new_rd_Jmp(NULL, irg, block);
 }
+ir_node *new_r_IJmp   (ir_graph *irg, ir_node *block, ir_node *tgt) {
+  return new_rd_IJmp(NULL, irg, block, tgt);
+}
 ir_node *new_r_Cond   (ir_graph *irg, ir_node *block, ir_node *c) {
   return new_rd_Cond(NULL, irg, block, c);
 }
 ir_node *new_r_Cond   (ir_graph *irg, ir_node *block, ir_node *c) {
   return new_rd_Cond(NULL, irg, block, c);
 }
@@ -913,6 +1766,17 @@ 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_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_type(ir_graph *irg, ir_node *block,
+               ir_mode *mode, tarval *con, type *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);
@@ -1082,6 +1946,10 @@ ir_node *new_r_Mux (ir_graph *irg, ir_node *block,
   return new_rd_Mux(NULL, irg, block, sel, ir_false, ir_true, mode);
 }
 
   return new_rd_Mux(NULL, irg, block, sel, ir_false, ir_true, mode);
 }
 
+ir_node *new_r_CopyB(ir_graph *irg, ir_node *block,
+    ir_node *store, ir_node *dst, ir_node *src, type *data_type) {
+  return new_rd_CopyB(NULL, irg, block, store, dst, src, data_type);
+}
 
 /** ********************/
 /** public interfaces  */
 
 /** ********************/
 /** public interfaces  */
@@ -1096,7 +1964,7 @@ ir_node *new_r_Mux (ir_graph *irg, ir_node *block,
  *
  */
 ir_node *
  *
  */
 ir_node *
-new_d_Start (dbg_infodb)
+new_d_Start (dbg_info *db)
 {
   ir_node *res;
 
 {
   ir_node *res;
 
@@ -1110,7 +1978,7 @@ new_d_Start (dbg_info* db)
 }
 
 ir_node *
 }
 
 ir_node *
-new_d_End (dbg_infodb)
+new_d_End (dbg_info *db)
 {
   ir_node *res;
   res = new_ir_node(db, current_ir_graph,  current_ir_graph->current_block,
 {
   ir_node *res;
   res = new_ir_node(db, current_ir_graph,  current_ir_graph->current_block,
@@ -1125,18 +1993,18 @@ new_d_End (dbg_info* db)
    Does set current_block.  Can be used with automatic Phi
    node construction. */
 ir_node *
    Does set current_block.  Can be used with automatic Phi
    node construction. */
 ir_node *
-new_d_Block (dbg_infodb, int arity, ir_node **in)
+new_d_Block (dbg_info *db, int arity, ir_node **in)
 {
   ir_node *res;
   int i;
   bool has_unknown = false;
 
 {
   ir_node *res;
   int i;
   bool has_unknown = false;
 
-  res = new_rd_Block(db, current_ir_graph, arity, in);
+  res = new_bd_Block(db, arity, in);
 
   /* Create and initialize array for Phi-node construction. */
   if (get_irg_phase_state(current_ir_graph) == phase_building) {
     res->attr.block.graph_arr = NEW_ARR_D(ir_node *, current_ir_graph->obst,
 
   /* Create and initialize array for Phi-node construction. */
   if (get_irg_phase_state(current_ir_graph) == phase_building) {
     res->attr.block.graph_arr = NEW_ARR_D(ir_node *, current_ir_graph->obst,
-                                         current_ir_graph->n_loc);
+                      current_ir_graph->n_loc);
     memset(res->attr.block.graph_arr, 0, sizeof(ir_node *)*current_ir_graph->n_loc);
   }
 
     memset(res->attr.block.graph_arr, 0, sizeof(ir_node *)*current_ir_graph->n_loc);
   }
 
@@ -1159,8 +2027,8 @@ new_d_Block (dbg_info* db, int arity, ir_node **in)
 /*
   ir_node *phi_merge            (ir_node *block, int pos, ir_mode *mode, ir_node **nin, int ins)
   ir_node *get_r_value_internal (ir_node *block, int pos, ir_mode *mode);
 /*
   ir_node *phi_merge            (ir_node *block, int pos, ir_mode *mode, ir_node **nin, int ins)
   ir_node *get_r_value_internal (ir_node *block, int pos, ir_mode *mode);
-  ir_node *new_rd_Phi0           (ir_graph *irg, ir_node *block, ir_mode *mode)
-  ir_node *new_rd_Phi_in         (ir_graph *irg, ir_node *block, ir_mode *mode,  ir_node **in, int ins)
+  ir_node *new_rd_Phi0          (ir_graph *irg, ir_node *block, ir_mode *mode)
+  ir_node *new_rd_Phi_in        (ir_graph *irg, ir_node *block, ir_mode *mode, ir_node **in, int ins)
 
   Call Graph:   ( A ---> B == A "calls" B)
 
 
   Call Graph:   ( A ---> B == A "calls" B)
 
@@ -1316,9 +2184,9 @@ new_rd_Phi_in (ir_graph *irg, ir_node *block, ir_mode *mode, ir_node **in, int i
      If so, it is a real Phi node and we break the loop.  Else the Phi
      node merges the same definition on several paths and therefore is
      not needed. */
      If so, it is a real Phi node and we break the loop.  Else the Phi
      node merges the same definition on several paths and therefore is
      not needed. */
-  for (i = 0;  i < ins;  ++i)
-  {
-    if (in[i] == res || in[i] == known) continue;
+  for (i = 0;  i < ins;  ++i) {
+    if (in[i] == res || in[i] == known)
+      continue;
 
     if (known == res)
       known = in[i];
 
     if (known == res)
       known = in[i];
@@ -1331,7 +2199,8 @@ new_rd_Phi_in (ir_graph *irg, ir_node *block, ir_mode *mode, ir_node **in, int i
 #if USE_EXPLICIT_PHI_IN_STACK
     free_to_Phi_in_stack(res);
 #else
 #if USE_EXPLICIT_PHI_IN_STACK
     free_to_Phi_in_stack(res);
 #else
-    obstack_free (current_ir_graph->obst, res);
+    edges_node_deleted(res, current_ir_graph);
+    obstack_free(current_ir_graph->obst, res);
 #endif
     res = known;
   } else {
 #endif
     res = known;
   } else {
@@ -1518,7 +2387,7 @@ void free_Phi_in_stack(Phi_in_stack *s) { }
 
 static INLINE ir_node *
 new_rd_Phi_in (ir_graph *irg, ir_node *block, ir_mode *mode,
 
 static INLINE ir_node *
 new_rd_Phi_in (ir_graph *irg, ir_node *block, ir_mode *mode,
-              ir_node **in, int ins, ir_node *phi0)
+           ir_node **in, int ins, ir_node *phi0)
 {
   int i;
   ir_node *res, *known;
 {
   int i;
   ir_node *res, *known;
@@ -1537,7 +2406,7 @@ new_rd_Phi_in (ir_graph *irg, ir_node *block, ir_mode *mode,
   {
     assert(in[i]);
 
   {
     assert(in[i]);
 
-    in[i] = skip_Id(in[i]);  /* increasses the number of freed Phis. */
+    in[i] = skip_Id(in[i]);  /* increases the number of freed Phis. */
 
     /* Optimize self referencing Phis:  We can't detect them yet properly, as
        they still refer to the Phi0 they will replace.  So replace right now. */
 
     /* Optimize self referencing Phis:  We can't detect them yet properly, as
        they still refer to the Phi0 they will replace.  So replace right now. */
@@ -1554,15 +2423,18 @@ new_rd_Phi_in (ir_graph *irg, ir_node *block, ir_mode *mode,
   /* i==ins: there is at most one predecessor, we don't need a phi node. */
   if (i == ins) {
     if (res != known) {
   /* i==ins: there is at most one predecessor, we don't need a phi node. */
   if (i == ins) {
     if (res != known) {
+      edges_node_deleted(res, current_ir_graph);
       obstack_free (current_ir_graph->obst, res);
       if (is_Phi(known)) {
       obstack_free (current_ir_graph->obst, res);
       if (is_Phi(known)) {
-       /* If pred is a phi node we want to optmize it: If loops are matured in a bad
-          order, an enclosing Phi know may get superfluous. */
-       res = optimize_in_place_2(known);
-       if (res != known) { exchange(known, res); }
-      } else {
-       res = known;
+        /* If pred is a phi node we want to optimize it: If loops are matured in a bad
+           order, an enclosing Phi know may get superfluous. */
+        res = optimize_in_place_2(known);
+        if (res != known)
+          exchange(known, res);
+
       }
       }
+      else
+        res = known;
     } else {
       /* A undefined value, e.g., in unreachable code. */
       res = new_Bad();
     } else {
       /* A undefined value, e.g., in unreachable code. */
       res = new_Bad();
@@ -1610,11 +2482,11 @@ static INLINE ir_node ** new_frag_arr (ir_node *n)
     arr[0] = new_Proj(n, mode_M, pn_Call_M_except);
   else {
     assert((pn_Quot_M == pn_DivMod_M) &&
     arr[0] = new_Proj(n, mode_M, pn_Call_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)  &&
-          (pn_Quot_M == pn_Alloc_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)    );
     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);
@@ -1726,32 +2598,37 @@ phi_merge (ir_node *block, int pos, ir_mode *mode, ir_node **nin, int ins)
     if (block == get_irg_start_block(current_ir_graph)) {
       /* Collapsing to Bad tarvals is no good idea.
          So we call a user-supplied routine here that deals with this case as
     if (block == get_irg_start_block(current_ir_graph)) {
       /* Collapsing to Bad tarvals is no good idea.
          So we call a user-supplied routine here that deals with this case as
-         appropriate for the given language. Sorryly the only help we can give
+         appropriate for the given language. Sorrily the only help we can give
          here is the position.
 
          Even if all variables are defined before use, it can happen that
          here is the position.
 
          Even if all variables are defined before use, it can happen that
-         we get to the start block, if a cond has been replaced by a tuple
+         we get to the start block, if a Cond has been replaced by a tuple
          (bad, jmp).  In this case we call the function needlessly, eventually
          (bad, jmp).  In this case we call the function needlessly, eventually
-         generating an non existant error.
+         generating an non existent error.
          However, this SHOULD NOT HAPPEN, as bad control flow nodes are intercepted
          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.
-        There are none by definition. */
+         There are none by definition. */
       return block->attr.block.graph_arr[pos];
     } else {
       phi0 = new_rd_Phi0(current_ir_graph, block, mode);
       block->attr.block.graph_arr[pos] = phi0;
 #if PRECISE_EXC_CONTEXT
       if (get_opt_precise_exc_context()) {
       return block->attr.block.graph_arr[pos];
     } else {
       phi0 = new_rd_Phi0(current_ir_graph, block, mode);
       block->attr.block.graph_arr[pos] = phi0;
 #if PRECISE_EXC_CONTEXT
       if (get_opt_precise_exc_context()) {
-       /* Set graph_arr for fragile ops.  Also here we should break recursion.
-          We could choose a cyclic path through an cfop.  But the recursion would
-          break at some point. */
-       set_frag_value(block->attr.block.graph_arr, pos, phi0);
+        /* Set graph_arr for fragile ops.  Also here we should break recursion.
+           We could choose a cyclic path through an cfop.  But the recursion would
+           break at some point. */
+        set_frag_value(block->attr.block.graph_arr, pos, phi0);
       }
 #endif
     }
       }
 #endif
     }
@@ -1765,7 +2642,7 @@ phi_merge (ir_node *block, int pos, ir_mode *mode, ir_node **nin, int ins)
     assert (prevCfOp);
     if (is_Bad(prevCfOp)) {
       /* In case a Cond has been optimized we would get right to the start block
     assert (prevCfOp);
     if (is_Bad(prevCfOp)) {
       /* In case a Cond has been optimized we would get right to the start block
-     with an invalid definition. */
+         with an invalid definition. */
       nin[i-1] = new_Bad();
       continue;
     }
       nin[i-1] = new_Bad();
       continue;
     }
@@ -1774,9 +2651,9 @@ phi_merge (ir_node *block, int pos, ir_mode *mode, ir_node **nin, int ins)
     if (!is_Bad(prevBlock)) {
 #if PRECISE_EXC_CONTEXT
       if (get_opt_precise_exc_context() &&
     if (!is_Bad(prevBlock)) {
 #if PRECISE_EXC_CONTEXT
       if (get_opt_precise_exc_context() &&
-         is_fragile_op(prevCfOp) && (get_irn_op (prevCfOp) != op_Bad)) {
-       assert(get_r_frag_value_internal (prevBlock, prevCfOp, pos, mode));
-       nin[i-1] = get_r_frag_value_internal (prevBlock, prevCfOp, pos, mode);
+          is_fragile_op(prevCfOp) && (get_irn_op (prevCfOp) != op_Bad)) {
+        assert(get_r_frag_value_internal (prevBlock, prevCfOp, pos, mode));
+        nin[i-1] = get_r_frag_value_internal (prevBlock, prevCfOp, pos, mode);
       } else
 #endif
       nin[i-1] = get_r_value_internal (prevBlock, pos, mode);
       } else
 #endif
       nin[i-1] = get_r_value_internal (prevBlock, pos, mode);
@@ -1793,8 +2670,8 @@ phi_merge (ir_node *block, int pos, ir_mode *mode, ir_node **nin, int ins)
   if (!phi0) {
     phi0_all = block->attr.block.graph_arr[pos];
     if (!((get_irn_op(phi0_all) == op_Phi) &&
   if (!phi0) {
     phi0_all = block->attr.block.graph_arr[pos];
     if (!((get_irn_op(phi0_all) == op_Phi) &&
-         (get_irn_arity(phi0_all) == 0)   &&
-         (get_nodes_block(phi0_all) == block)))
+      (get_irn_arity(phi0_all) == 0)   &&
+      (get_nodes_block(phi0_all) == block)))
       phi0_all = NULL;
   } else {
     phi0_all = phi0;
       phi0_all = NULL;
   } else {
     phi0_all = phi0;
@@ -1832,7 +2709,7 @@ get_r_value_internal (ir_node *block, int pos, ir_mode *mode)
         create a proper Phi node, therefore a Phi0, i.e., a Phi without
         predecessors is returned.  This node is added to the linked list (field
         "link") of the containing block to be completed when this block is
         create a proper Phi node, therefore a Phi0, i.e., a Phi without
         predecessors is returned.  This node is added to the linked list (field
         "link") of the containing block to be completed when this block is
-        matured. (Comlpletion will add a new Phi and turn the Phi0 into an Id
+        matured. (Completion will add a new Phi and turn the Phi0 into an Id
         node.)
 
      2. The value is already known in this block, graph_arr[pos] is set and we
         node.)
 
      2. The value is already known in this block, graph_arr[pos] is set and we
@@ -1902,7 +2779,7 @@ get_r_value_internal (ir_node *block, int pos, ir_mode *mode)
     printf("Error: no value set.  Use of undefined variable.  Initializing to zero.\n");
     assert (mode->code >= irm_F && mode->code <= irm_P);
     res = new_rd_Const (NULL, current_ir_graph, block, mode,
     printf("Error: no value set.  Use of undefined variable.  Initializing to zero.\n");
     assert (mode->code >= irm_F && mode->code <= irm_P);
     res = new_rd_Const (NULL, current_ir_graph, block, mode,
-                       get_mode_null(mode));
+            get_mode_null(mode));
   }
 
   /* The local valid value is available now. */
   }
 
   /* The local valid value is available now. */
@@ -1915,12 +2792,13 @@ get_r_value_internal (ir_node *block, int pos, ir_mode *mode)
 
 /* ************************************************************************** */
 
 
 /* ************************************************************************** */
 
-/** Finalize a Block node, when all control flows are known.  */
-/** Acceptable parameters are only Block nodes.               */
+/*
+ * Finalize a Block node, when all control flows are known.
+ * Acceptable parameters are only Block nodes.
+ */
 void
 mature_immBlock (ir_node *block)
 {
 void
 mature_immBlock (ir_node *block)
 {
-
   int ins;
   ir_node *n, **nin;
   ir_node *next;
   int ins;
   ir_node *n, **nin;
   ir_node *next;
@@ -1960,43 +2838,49 @@ mature_immBlock (ir_node *block)
 }
 
 ir_node *
 }
 
 ir_node *
-new_d_Phi (dbg_infodb, int arity, ir_node **in, ir_mode *mode)
+new_d_Phi (dbg_info *db, int arity, ir_node **in, ir_mode *mode)
 {
 {
-  return new_rd_Phi(db, current_ir_graph, current_ir_graph->current_block,
+  return new_bd_Phi(db, current_ir_graph->current_block,
             arity, in, mode);
 }
 
 ir_node *
             arity, in, mode);
 }
 
 ir_node *
-new_d_Const (dbg_infodb, ir_mode *mode, tarval *con)
+new_d_Const (dbg_info *db, ir_mode *mode, tarval *con)
 {
 {
-  return new_rd_Const(db, current_ir_graph, current_ir_graph->start_block,
+  return new_bd_Const(db, current_ir_graph->start_block,
               mode, con);
 }
 
 ir_node *
               mode, con);
 }
 
 ir_node *
-new_d_Const_type (dbg_info* db, ir_mode *mode, tarval *con, type *tp)
+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);
+}
+
+ir_node *
+new_d_Const_type (dbg_info *db, ir_mode *mode, tarval *con, type *tp)
 {
 {
-  return new_rd_Const_type(db, current_ir_graph, current_ir_graph->start_block,
+  return new_bd_Const_type(db, current_ir_graph->start_block,
                 mode, con, tp);
 }
 
 
 ir_node *
                 mode, con, tp);
 }
 
 
 ir_node *
-new_d_Id (dbg_infodb, ir_node *val, ir_mode *mode)
+new_d_Id (dbg_info *db, ir_node *val, ir_mode *mode)
 {
 {
-  return new_rd_Id(db, current_ir_graph, current_ir_graph->current_block,
+  return new_bd_Id(db, current_ir_graph->current_block,
            val, mode);
 }
 
 ir_node *
            val, mode);
 }
 
 ir_node *
-new_d_Proj (dbg_infodb, ir_node *arg, ir_mode *mode, long proj)
+new_d_Proj (dbg_info *db, ir_node *arg, ir_mode *mode, long proj)
 {
 {
-  return new_rd_Proj(db, current_ir_graph, current_ir_graph->current_block,
+  return new_bd_Proj(db, current_ir_graph->current_block,
              arg, mode, proj);
 }
 
 ir_node *
              arg, mode, proj);
 }
 
 ir_node *
-new_d_defaultProj (dbg_infodb, ir_node *arg, long max_proj)
+new_d_defaultProj (dbg_info *db, ir_node *arg, long max_proj)
 {
   ir_node *res;
   assert(arg->op == op_Cond);
 {
   ir_node *res;
   assert(arg->op == op_Cond);
@@ -2007,51 +2891,51 @@ new_d_defaultProj (dbg_info* db, ir_node *arg, long max_proj)
 }
 
 ir_node *
 }
 
 ir_node *
-new_d_Conv (dbg_infodb, ir_node *op, ir_mode *mode)
+new_d_Conv (dbg_info *db, ir_node *op, ir_mode *mode)
 {
 {
-  return new_rd_Conv(db, current_ir_graph, current_ir_graph->current_block,
+  return new_bd_Conv(db, current_ir_graph->current_block,
              op, mode);
 }
 
 ir_node *
              op, mode);
 }
 
 ir_node *
-new_d_Cast (dbg_infodb, ir_node *op, type *to_tp)
+new_d_Cast (dbg_info *db, ir_node *op, type *to_tp)
 {
 {
-  return new_rd_Cast(db, current_ir_graph, current_ir_graph->current_block, op, to_tp);
+  return new_bd_Cast(db, current_ir_graph->current_block, op, to_tp);
 }
 
 ir_node *
 }
 
 ir_node *
-new_d_Tuple (dbg_infodb, int arity, ir_node **in)
+new_d_Tuple (dbg_info *db, int arity, ir_node **in)
 {
 {
-  return new_rd_Tuple(db, current_ir_graph, current_ir_graph->current_block,
+  return new_bd_Tuple(db, current_ir_graph->current_block,
               arity, in);
 }
 
 ir_node *
               arity, in);
 }
 
 ir_node *
-new_d_Add (dbg_infodb, ir_node *op1, ir_node *op2, ir_mode *mode)
+new_d_Add (dbg_info *db, ir_node *op1, ir_node *op2, ir_mode *mode)
 {
 {
-  return new_rd_Add(db, current_ir_graph, current_ir_graph->current_block,
+  return new_bd_Add(db, current_ir_graph->current_block,
             op1, op2, mode);
 }
 
 ir_node *
             op1, op2, mode);
 }
 
 ir_node *
-new_d_Sub (dbg_infodb, ir_node *op1, ir_node *op2, ir_mode *mode)
+new_d_Sub (dbg_info *db, ir_node *op1, ir_node *op2, ir_mode *mode)
 {
 {
-  return new_rd_Sub(db, current_ir_graph, current_ir_graph->current_block,
+  return new_bd_Sub(db, current_ir_graph->current_block,
             op1, op2, mode);
 }
 
 
 ir_node *
             op1, op2, mode);
 }
 
 
 ir_node *
-new_d_Minus (dbg_infodb, ir_node *op,  ir_mode *mode)
+new_d_Minus (dbg_info *db, ir_node *op,  ir_mode *mode)
 {
 {
-  return new_rd_Minus(db, current_ir_graph, current_ir_graph->current_block,
+  return new_bd_Minus(db, current_ir_graph->current_block,
               op, mode);
 }
 
 ir_node *
               op, mode);
 }
 
 ir_node *
-new_d_Mul (dbg_infodb, ir_node *op1, ir_node *op2, ir_mode *mode)
+new_d_Mul (dbg_info *db, ir_node *op1, ir_node *op2, ir_mode *mode)
 {
 {
-  return new_rd_Mul(db, current_ir_graph, current_ir_graph->current_block,
+  return new_bd_Mul(db, current_ir_graph->current_block,
             op1, op2, mode);
 }
 
             op1, op2, mode);
 }
 
@@ -2061,8 +2945,8 @@ new_d_Mul (dbg_info* db, ir_node *op1, ir_node *op2, ir_mode *mode)
 static void allocate_frag_arr(ir_node *res, ir_op *op, ir_node ***frag_store) {
   if (get_opt_precise_exc_context()) {
     if ((current_ir_graph->phase_state == phase_building) &&
 static void allocate_frag_arr(ir_node *res, ir_op *op, ir_node ***frag_store) {
   if (get_opt_precise_exc_context()) {
     if ((current_ir_graph->phase_state == phase_building) &&
-       (get_irn_op(res) == op) && /* Could be optimized away. */
-       !*frag_store)    /* Could be a cse where the arr is already set. */ {
+        (get_irn_op(res) == op) && /* Could be optimized away. */
+        !*frag_store)    /* Could be a cse where the arr is already set. */ {
       *frag_store = new_frag_arr(res);
     }
   }
       *frag_store = new_frag_arr(res);
     }
   }
@@ -2070,10 +2954,10 @@ static void allocate_frag_arr(ir_node *res, ir_op *op, ir_node ***frag_store) {
 
 
 ir_node *
 
 
 ir_node *
-new_d_Quot (dbg_infodb, ir_node *memop, ir_node *op1, ir_node *op2)
+new_d_Quot (dbg_info *db, ir_node *memop, ir_node *op1, ir_node *op2)
 {
   ir_node *res;
 {
   ir_node *res;
-  res = new_rd_Quot (db, current_ir_graph, current_ir_graph->current_block,
+  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
              memop, op1, op2);
   res->attr.except.pin_state = op_pin_state_pinned;
 #if PRECISE_EXC_CONTEXT
@@ -2084,10 +2968,10 @@ new_d_Quot (dbg_info* db, ir_node *memop, ir_node *op1, ir_node *op2)
 }
 
 ir_node *
 }
 
 ir_node *
-new_d_DivMod (dbg_infodb, ir_node *memop, ir_node *op1, ir_node *op2)
+new_d_DivMod (dbg_info *db, ir_node *memop, ir_node *op1, ir_node *op2)
 {
   ir_node *res;
 {
   ir_node *res;
-  res = new_rd_DivMod (db, current_ir_graph, current_ir_graph->current_block,
+  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
                memop, op1, op2);
   res->attr.except.pin_state = op_pin_state_pinned;
 #if PRECISE_EXC_CONTEXT
@@ -2098,10 +2982,10 @@ new_d_DivMod (dbg_info* db, ir_node *memop, ir_node *op1, ir_node *op2)
 }
 
 ir_node *
 }
 
 ir_node *
-new_d_Div (dbg_infodb, ir_node *memop, ir_node *op1, ir_node *op2)
+new_d_Div (dbg_info *db, ir_node *memop, ir_node *op1, ir_node *op2)
 {
   ir_node *res;
 {
   ir_node *res;
-  res = new_rd_Div (db, current_ir_graph, current_ir_graph->current_block,
+  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
             memop, op1, op2);
   res->attr.except.pin_state = op_pin_state_pinned;
 #if PRECISE_EXC_CONTEXT
@@ -2112,10 +2996,10 @@ new_d_Div (dbg_info* db, ir_node *memop, ir_node *op1, ir_node *op2)
 }
 
 ir_node *
 }
 
 ir_node *
-new_d_Mod (dbg_infodb, ir_node *memop, ir_node *op1, ir_node *op2)
+new_d_Mod (dbg_info *db, ir_node *memop, ir_node *op1, ir_node *op2)
 {
   ir_node *res;
 {
   ir_node *res;
-  res = new_rd_Mod (db, current_ir_graph, current_ir_graph->current_block,
+  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
             memop, op1, op2);
   res->attr.except.pin_state = op_pin_state_pinned;
 #if PRECISE_EXC_CONTEXT
@@ -2126,93 +3010,99 @@ new_d_Mod (dbg_info* db, ir_node *memop, ir_node *op1, ir_node *op2)
 }
 
 ir_node *
 }
 
 ir_node *
-new_d_And (dbg_infodb, ir_node *op1, ir_node *op2, ir_mode *mode)
+new_d_And (dbg_info *db, ir_node *op1, ir_node *op2, ir_mode *mode)
 {
 {
-  return new_rd_And (db, current_ir_graph, current_ir_graph->current_block,
+  return new_bd_And (db, current_ir_graph->current_block,
             op1, op2, mode);
 }
 
 ir_node *
             op1, op2, mode);
 }
 
 ir_node *
-new_d_Or (dbg_infodb, ir_node *op1, ir_node *op2, ir_mode *mode)
+new_d_Or (dbg_info *db, ir_node *op1, ir_node *op2, ir_mode *mode)
 {
 {
-  return new_rd_Or (db, current_ir_graph, current_ir_graph->current_block,
+  return new_bd_Or (db, current_ir_graph->current_block,
            op1, op2, mode);
 }
 
 ir_node *
            op1, op2, mode);
 }
 
 ir_node *
-new_d_Eor (dbg_infodb, ir_node *op1, ir_node *op2, ir_mode *mode)
+new_d_Eor (dbg_info *db, ir_node *op1, ir_node *op2, ir_mode *mode)
 {
 {
-  return new_rd_Eor (db, current_ir_graph, current_ir_graph->current_block,
+  return new_bd_Eor (db, current_ir_graph->current_block,
             op1, op2, mode);
 }
 
 ir_node *
             op1, op2, mode);
 }
 
 ir_node *
-new_d_Not (dbg_infodb, ir_node *op, ir_mode *mode)
+new_d_Not (dbg_info *db, ir_node *op, ir_mode *mode)
 {
 {
-  return new_rd_Not (db, current_ir_graph, current_ir_graph->current_block,
+  return new_bd_Not (db, current_ir_graph->current_block,
             op, mode);
 }
 
 ir_node *
             op, mode);
 }
 
 ir_node *
-new_d_Shl (dbg_infodb, ir_node *op, ir_node *k, ir_mode *mode)
+new_d_Shl (dbg_info *db, ir_node *op, ir_node *k, ir_mode *mode)
 {
 {
-  return new_rd_Shl (db, current_ir_graph, current_ir_graph->current_block,
+  return new_bd_Shl (db, current_ir_graph->current_block,
             op, k, mode);
 }
 
 ir_node *
             op, k, mode);
 }
 
 ir_node *
-new_d_Shr (dbg_infodb, ir_node *op, ir_node *k, ir_mode *mode)
+new_d_Shr (dbg_info *db, ir_node *op, ir_node *k, ir_mode *mode)
 {
 {
-  return new_rd_Shr (db, current_ir_graph, current_ir_graph->current_block,
+  return new_bd_Shr (db, current_ir_graph->current_block,
             op, k, mode);
 }
 
 ir_node *
             op, k, mode);
 }
 
 ir_node *
-new_d_Shrs (dbg_infodb, ir_node *op, ir_node *k, ir_mode *mode)
+new_d_Shrs (dbg_info *db, ir_node *op, ir_node *k, ir_mode *mode)
 {
 {
-  return new_rd_Shrs (db, current_ir_graph, current_ir_graph->current_block,
+  return new_bd_Shrs (db, current_ir_graph->current_block,
              op, k, mode);
 }
 
 ir_node *
              op, k, mode);
 }
 
 ir_node *
-new_d_Rot (dbg_infodb, ir_node *op, ir_node *k, ir_mode *mode)
+new_d_Rot (dbg_info *db, ir_node *op, ir_node *k, ir_mode *mode)
 {
 {
-  return new_rd_Rot (db, current_ir_graph, current_ir_graph->current_block,
+  return new_bd_Rot (db, current_ir_graph->current_block,
              op, k, mode);
 }
 
 ir_node *
              op, k, mode);
 }
 
 ir_node *
-new_d_Abs (dbg_infodb, ir_node *op, ir_mode *mode)
+new_d_Abs (dbg_info *db, ir_node *op, ir_mode *mode)
 {
 {
-  return new_rd_Abs (db, current_ir_graph, current_ir_graph->current_block,
+  return new_bd_Abs (db, current_ir_graph->current_block,
             op, mode);
 }
 
 ir_node *
             op, mode);
 }
 
 ir_node *
-new_d_Cmp (dbg_infodb, ir_node *op1, ir_node *op2)
+new_d_Cmp (dbg_info *db, ir_node *op1, ir_node *op2)
 {
 {
-  return new_rd_Cmp (db, current_ir_graph, current_ir_graph->current_block,
+  return new_bd_Cmp (db, current_ir_graph->current_block,
             op1, op2);
 }
 
 ir_node *
             op1, op2);
 }
 
 ir_node *
-new_d_Jmp (dbg_infodb)
+new_d_Jmp (dbg_info *db)
 {
 {
-  return new_rd_Jmp (db, current_ir_graph, current_ir_graph->current_block);
+  return new_bd_Jmp (db, current_ir_graph->current_block);
 }
 
 ir_node *
 }
 
 ir_node *
-new_d_Cond (dbg_info* db, ir_node *c)
+new_d_IJmp (dbg_info *db, ir_node *tgt)
 {
 {
-  return new_rd_Cond (db, current_ir_graph, current_ir_graph->current_block, c);
+  return new_bd_IJmp (db, current_ir_graph->current_block, tgt);
 }
 
 ir_node *
 }
 
 ir_node *
-new_d_Call (dbg_info* db, ir_node *store, ir_node *callee, int arity, ir_node **in,
+new_d_Cond (dbg_info *db, ir_node *c)
+{
+  return new_bd_Cond (db, current_ir_graph->current_block, c);
+}
+
+ir_node *
+new_d_Call (dbg_info *db, ir_node *store, ir_node *callee, int arity, ir_node **in,
       type *tp)
 {
   ir_node *res;
       type *tp)
 {
   ir_node *res;
-  res = new_rd_Call (db, current_ir_graph, current_ir_graph->current_block,
+  res = new_bd_Call (db, current_ir_graph->current_block,
              store, callee, arity, in, tp);
 #if PRECISE_EXC_CONTEXT
   allocate_frag_arr(res, op_Call, &res->attr.call.exc.frag_arr);  /* Could be optimized away. */
              store, callee, arity, in, tp);
 #if PRECISE_EXC_CONTEXT
   allocate_frag_arr(res, op_Call, &res->attr.call.exc.frag_arr);  /* Could be optimized away. */
@@ -2222,24 +3112,24 @@ new_d_Call (dbg_info* db, ir_node *store, ir_node *callee, int arity, ir_node **
 }
 
 ir_node *
 }
 
 ir_node *
-new_d_Return (dbg_infodb, ir_node* store, int arity, ir_node **in)
+new_d_Return (dbg_info *db, ir_node* store, int arity, ir_node **in)
 {
 {
-  return new_rd_Return (db, current_ir_graph, current_ir_graph->current_block,
+  return new_bd_Return (db, current_ir_graph->current_block,
                store, arity, in);
 }
 
 ir_node *
                store, arity, in);
 }
 
 ir_node *
-new_d_Raise (dbg_infodb, ir_node *store, ir_node *obj)
+new_d_Raise (dbg_info *db, ir_node *store, ir_node *obj)
 {
 {
-  return new_rd_Raise (db, current_ir_graph, current_ir_graph->current_block,
+  return new_bd_Raise (db, current_ir_graph->current_block,
               store, obj);
 }
 
 ir_node *
               store, obj);
 }
 
 ir_node *
-new_d_Load (dbg_infodb, ir_node *store, ir_node *addr, ir_mode *mode)
+new_d_Load (dbg_info *db, ir_node *store, ir_node *addr, ir_mode *mode)
 {
   ir_node *res;
 {
   ir_node *res;
-  res = new_rd_Load (db, current_ir_graph, current_ir_graph->current_block,
+  res = new_bd_Load (db, current_ir_graph->current_block,
              store, addr, mode);
 #if PRECISE_EXC_CONTEXT
   allocate_frag_arr(res, op_Load, &res->attr.load.exc.frag_arr);  /* Could be optimized away. */
              store, addr, mode);
 #if PRECISE_EXC_CONTEXT
   allocate_frag_arr(res, op_Load, &res->attr.load.exc.frag_arr);  /* Could be optimized away. */
@@ -2249,10 +3139,10 @@ new_d_Load (dbg_info* db, ir_node *store, ir_node *addr, ir_mode *mode)
 }
 
 ir_node *
 }
 
 ir_node *
-new_d_Store (dbg_infodb, ir_node *store, ir_node *addr, ir_node *val)
+new_d_Store (dbg_info *db, ir_node *store, ir_node *addr, ir_node *val)
 {
   ir_node *res;
 {
   ir_node *res;
-  res = new_rd_Store (db, current_ir_graph, current_ir_graph->current_block,
+  res = new_bd_Store (db, current_ir_graph->current_block,
               store, addr, val);
 #if PRECISE_EXC_CONTEXT
   allocate_frag_arr(res, op_Store, &res->attr.store.exc.frag_arr);  /* Could be optimized away. */
               store, addr, val);
 #if PRECISE_EXC_CONTEXT
   allocate_frag_arr(res, op_Store, &res->attr.store.exc.frag_arr);  /* Could be optimized away. */
@@ -2262,11 +3152,11 @@ new_d_Store (dbg_info* db, ir_node *store, ir_node *addr, ir_node *val)
 }
 
 ir_node *
 }
 
 ir_node *
-new_d_Alloc (dbg_infodb, ir_node *store, ir_node *size, type *alloc_type,
+new_d_Alloc (dbg_info *db, ir_node *store, ir_node *size, type *alloc_type,
            where_alloc where)
 {
   ir_node *res;
            where_alloc where)
 {
   ir_node *res;
-  res = new_rd_Alloc (db, current_ir_graph, current_ir_graph->current_block,
+  res = new_bd_Alloc (db, current_ir_graph->current_block,
               store, size, alloc_type, where);
 #if PRECISE_EXC_CONTEXT
   allocate_frag_arr(res, op_Alloc, &res->attr.a.exc.frag_arr);  /* Could be optimized away. */
               store, size, alloc_type, where);
 #if PRECISE_EXC_CONTEXT
   allocate_frag_arr(res, op_Alloc, &res->attr.a.exc.frag_arr);  /* Could be optimized away. */
@@ -2276,82 +3166,81 @@ new_d_Alloc (dbg_info* db, ir_node *store, ir_node *size, type *alloc_type,
 }
 
 ir_node *
 }
 
 ir_node *
-new_d_Free (dbg_infodb, ir_node *store, ir_node *ptr,
+new_d_Free (dbg_info *db, ir_node *store, ir_node *ptr,
     ir_node *size, type *free_type, where_alloc where)
 {
     ir_node *size, type *free_type, where_alloc where)
 {
-  return new_rd_Free (db, current_ir_graph, current_ir_graph->current_block,
+  return new_bd_Free (db, current_ir_graph->current_block,
              store, ptr, size, free_type, where);
 }
 
 ir_node *
              store, ptr, size, free_type, where);
 }
 
 ir_node *
-new_d_simpleSel (dbg_infodb, ir_node *store, ir_node *objptr, entity *ent)
+new_d_simpleSel (dbg_info *db, ir_node *store, ir_node *objptr, entity *ent)
 /* GL: objptr was called frame before.  Frame was a bad choice for the name
    as the operand could as well be a pointer to a dynamic object. */
 {
 /* GL: objptr was called frame before.  Frame was a bad choice for the name
    as the operand could as well be a pointer to a dynamic object. */
 {
-  return new_rd_Sel (db, current_ir_graph, current_ir_graph->current_block,
+  return new_bd_Sel (db, current_ir_graph->current_block,
             store, objptr, 0, NULL, ent);
 }
 
 ir_node *
             store, objptr, 0, NULL, ent);
 }
 
 ir_node *
-new_d_Sel (dbg_infodb, ir_node *store, ir_node *objptr, int n_index, ir_node **index, entity *sel)
+new_d_Sel (dbg_info *db, ir_node *store, ir_node *objptr, int n_index, ir_node **index, entity *sel)
 {
 {
-  return new_rd_Sel (db, current_ir_graph, current_ir_graph->current_block,
+  return new_bd_Sel (db, current_ir_graph->current_block,
             store, objptr, n_index, index, sel);
 }
 
 ir_node *
 new_d_InstOf (dbg_info *db, ir_node *store, ir_node *objptr, type *ent)
 {
             store, objptr, n_index, index, sel);
 }
 
 ir_node *
 new_d_InstOf (dbg_info *db, ir_node *store, ir_node *objptr, type *ent)
 {
-  return (new_rd_InstOf (db, current_ir_graph, current_ir_graph->current_block,
+  return (new_bd_InstOf (db, current_ir_graph->current_block,
                          store, objptr, ent));
 }
 
 ir_node *
                          store, objptr, ent));
 }
 
 ir_node *
-new_d_SymConst_type (dbg_infodb, symconst_symbol value, symconst_kind kind, type *tp)
+new_d_SymConst_type (dbg_info *db, symconst_symbol value, symconst_kind kind, type *tp)
 {
 {
-  return new_rd_SymConst_type (db, current_ir_graph, current_ir_graph->start_block,
+  return new_bd_SymConst_type (db, current_ir_graph->start_block,
                          value, kind, tp);
 }
 
 ir_node *
                          value, kind, tp);
 }
 
 ir_node *
-new_d_SymConst (dbg_infodb, symconst_symbol value, symconst_kind kind)
+new_d_SymConst (dbg_info *db, symconst_symbol value, symconst_kind kind)
 {
 {
-  return new_rd_SymConst (db, current_ir_graph, current_ir_graph->start_block,
+  return new_bd_SymConst (db, current_ir_graph->start_block,
                          value, kind);
 }
 
 ir_node *
                          value, kind);
 }
 
 ir_node *
-new_d_Sync (dbg_infodb, int arity, ir_node** in)
+new_d_Sync (dbg_info *db, int arity, ir_node** in)
 {
 {
-  return new_rd_Sync (db, current_ir_graph, current_ir_graph->current_block,
+  return new_bd_Sync (db, current_ir_graph->current_block,
               arity, in);
 }
 
 
 ir_node *
               arity, in);
 }
 
 
 ir_node *
-(new_d_Bad)(void)
-{
+(new_d_Bad)(void) {
   return _new_d_Bad();
 }
 
 ir_node *
 new_d_Confirm (dbg_info *db, ir_node *val, ir_node *bound, pn_Cmp cmp)
 {
   return _new_d_Bad();
 }
 
 ir_node *
 new_d_Confirm (dbg_info *db, ir_node *val, ir_node *bound, pn_Cmp cmp)
 {
-  return new_rd_Confirm (db, current_ir_graph, current_ir_graph->current_block,
+  return new_bd_Confirm (db, current_ir_graph->current_block,
              val, bound, cmp);
 }
 
 ir_node *
 new_d_Unknown (ir_mode *m)
 {
              val, bound, cmp);
 }
 
 ir_node *
 new_d_Unknown (ir_mode *m)
 {
-  return new_rd_Unknown(current_ir_graph, m);
+  return new_bd_Unknown(m);
 }
 
 ir_node *
 new_d_CallBegin (dbg_info *db, ir_node *call)
 {
   ir_node *res;
 }
 
 ir_node *
 new_d_CallBegin (dbg_info *db, ir_node *call)
 {
   ir_node *res;
-  res = new_rd_CallBegin (db, current_ir_graph, current_ir_graph->current_block, call);
+  res = new_bd_CallBegin (db, current_ir_graph->current_block, call);
   return res;
 }
 
   return res;
 }
 
@@ -2359,7 +3248,7 @@ ir_node *
 new_d_EndReg (dbg_info *db)
 {
   ir_node *res;
 new_d_EndReg (dbg_info *db)
 {
   ir_node *res;
-  res = new_rd_EndReg(db, current_ir_graph, current_ir_graph->current_block);
+  res = new_bd_EndReg(db, current_ir_graph->current_block);
   return res;
 }
 
   return res;
 }
 
@@ -2367,20 +3256,20 @@ ir_node *
 new_d_EndExcept (dbg_info *db)
 {
   ir_node *res;
 new_d_EndExcept (dbg_info *db)
 {
   ir_node *res;
-  res = new_rd_EndExcept(db, current_ir_graph, current_ir_graph->current_block);
+  res = new_bd_EndExcept(db, current_ir_graph->current_block);
   return res;
 }
 
 ir_node *
 new_d_Break (dbg_info *db)
 {
   return res;
 }
 
 ir_node *
 new_d_Break (dbg_info *db)
 {
-  return new_rd_Break (db, current_ir_graph, current_ir_graph->current_block);
+  return new_bd_Break (db, current_ir_graph->current_block);
 }
 
 ir_node *
 new_d_Filter (dbg_info *db, ir_node *arg, ir_mode *mode, long proj)
 {
 }
 
 ir_node *
 new_d_Filter (dbg_info *db, ir_node *arg, ir_mode *mode, long proj)
 {
-  return new_rd_Filter (db, current_ir_graph, current_ir_graph->current_block,
+  return new_bd_Filter (db, current_ir_graph->current_block,
             arg, mode, proj);
 }
 
             arg, mode, proj);
 }
 
@@ -2393,18 +3282,29 @@ ir_node *
 ir_node *
 new_d_Mux (dbg_info *db, ir_node *sel, ir_node *ir_false,
     ir_node *ir_true, ir_mode *mode) {
 ir_node *
 new_d_Mux (dbg_info *db, ir_node *sel, ir_node *ir_false,
     ir_node *ir_true, ir_mode *mode) {
-  return new_rd_Mux (db, current_ir_graph, current_ir_graph->current_block,
+  return new_bd_Mux (db, current_ir_graph->current_block,
       sel, ir_false, ir_true, mode);
 }
 
       sel, ir_false, ir_true, mode);
 }
 
+ir_node *new_d_CopyB(dbg_info *db,ir_node *store,
+    ir_node *dst, ir_node *src, 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;
+}
+
 /* ********************************************************************* */
 /* 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.            */
 /* ********************************************************************* */
 
-/* * Block construction **/
+/*  Block construction */
 /* immature Block without predecessors */
 /* immature Block without predecessors */
-ir_node *new_d_immBlock (dbg_infodb) {
+ir_node *new_d_immBlock (dbg_info *db) {
   ir_node *res;
 
   assert(get_irg_phase_state (current_ir_graph) == phase_building);
   ir_node *res;
 
   assert(get_irg_phase_state (current_ir_graph) == phase_building);
@@ -2437,7 +3337,7 @@ new_immBlock (void) {
   return new_d_immBlock(NULL);
 }
 
   return new_d_immBlock(NULL);
 }
 
-/* add an adge to a jmp/control flow node */
+/* add an edge to a jmp/control flow node */
 void
 add_immBlock_pred (ir_node *block, ir_node *jmp)
 {
 void
 add_immBlock_pred (ir_node *block, ir_node *jmp)
 {
@@ -2452,8 +3352,7 @@ add_immBlock_pred (ir_node *block, ir_node *jmp)
 
 /* changing the current block */
 void
 
 /* changing the current block */
 void
-set_cur_block (ir_node *target)
-{
+set_cur_block (ir_node *target) {
   current_ir_graph->current_block = target;
 }
 
   current_ir_graph->current_block = target;
 }
 
@@ -2462,7 +3361,7 @@ set_cur_block (ir_node *target)
 
 /* get a value from the parameter array from the current block by its index */
 ir_node *
 
 /* get a value from the parameter array from the current block by its index */
 ir_node *
-get_d_value (dbg_infodb, int pos, ir_mode *mode)
+get_d_value (dbg_info *db, int pos, ir_mode *mode)
 {
   assert(get_irg_phase_state (current_ir_graph) == phase_building);
   inc_irg_visited(current_ir_graph);
 {
   assert(get_irg_phase_state (current_ir_graph) == phase_building);
   inc_irg_visited(current_ir_graph);
@@ -2505,20 +3404,19 @@ set_store (ir_node *store)
 }
 
 void
 }
 
 void
-keep_alive (ir_node *ka)
-{
+keep_alive (ir_node *ka) {
   add_End_keepalive(current_ir_graph->end, ka);
 }
 
   add_End_keepalive(current_ir_graph->end, ka);
 }
 
-/** Useful access routines **/
+/* --- Useful access routines --- */
 /* Returns the current block of the current graph.  To set the current
    block use set_cur_block. */
 /* Returns the current block of the current graph.  To set the current
    block use set_cur_block. */
-ir_node *get_cur_block() {
+ir_node *get_cur_block(void) {
   return get_irg_current_block(current_ir_graph);
 }
 
 /* Returns the frame type of the current graph */
   return get_irg_current_block(current_ir_graph);
 }
 
 /* Returns the frame type of the current graph */
-type *get_cur_frame_type() {
+type *get_cur_frame_type(void) {
   return get_irg_frame_type(current_ir_graph);
 }
 
   return get_irg_frame_type(current_ir_graph);
 }
 
@@ -2535,10 +3433,21 @@ init_cons(uninitialized_local_variable_func_t *func)
 
 /* call for each graph */
 void
 
 /* call for each graph */
 void
-finalize_cons (ir_graph *irg) {
+irg_finalize_cons (ir_graph *irg) {
   irg->phase_state = phase_high;
 }
 
   irg->phase_state = phase_high;
 }
 
+void
+irp_finalize_cons (void) {
+  int i, n_irgs = get_irp_n_irgs();
+  for (i = 0; i < n_irgs; i++) {
+    irg_finalize_cons(get_irp_irg(i));
+  }
+  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);
@@ -2552,6 +3461,9 @@ ir_node *new_End    (void) {
 ir_node *new_Jmp    (void) {
   return new_d_Jmp(NULL);
 }
 ir_node *new_Jmp    (void) {
   return new_d_Jmp(NULL);
 }
+ir_node *new_IJmp   (ir_node *tgt) {
+  return new_d_IJmp(NULL, tgt);
+}
 ir_node *new_Cond   (ir_node *c) {
   return new_d_Cond(NULL, c);
 }
 ir_node *new_Cond   (ir_node *c) {
   return new_d_Cond(NULL, c);
 }
@@ -2565,6 +3477,11 @@ ir_node *new_Const  (ir_mode *mode, tarval *con) {
   return new_d_Const(NULL, mode, con);
 }
 
   return new_d_Const(NULL, mode, con);
 }
 
+ir_node *new_Const_long(ir_mode *mode, long value)
+{
+    return new_d_Const_long(NULL, mode, value);
+}
+
 ir_node *new_Const_type(tarval *con, type *tp) {
   return new_d_Const_type(NULL, get_type_mode(tp), con, tp);
 }
 ir_node *new_Const_type(tarval *con, type *tp) {
   return new_d_Const_type(NULL, get_type_mode(tp), con, tp);
 }
@@ -2634,7 +3551,6 @@ ir_node *new_Shr    (ir_node *op,  ir_node *k,   ir_mode *mode) {
 ir_node *new_Shrs   (ir_node *op,  ir_node *k,   ir_mode *mode) {
   return new_d_Shrs(NULL, op, k, mode);
 }
 ir_node *new_Shrs   (ir_node *op,  ir_node *k,   ir_mode *mode) {
   return new_d_Shrs(NULL, op, k, mode);
 }
-#define new_Rotate new_Rot
 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);
 }
@@ -2709,3 +3625,6 @@ 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_CopyB(ir_node *store, ir_node *dst, ir_node *src, type *data_type) {
+  return new_d_CopyB(NULL, store, dst, src, data_type);
+}