group High-Level exception nodes together
[libfirm] / ir / ir / ircons.c
index 769d7b3..fb560ad 100644 (file)
@@ -55,7 +55,7 @@ typedef struct Phi_in_stack Phi_in_stack;
 # define IRN_VRFY_IRG(res, irg)
 #else
 # define IRN_VRFY_IRG(res, irg)  irn_vrfy_irg(res, irg)
 # define IRN_VRFY_IRG(res, irg)
 #else
 # define IRN_VRFY_IRG(res, irg)  irn_vrfy_irg(res, irg)
-#endif
+#endif /* NDEBUG */
 
 /**
  * Language dependent variable initialization callback.
 
 /**
  * Language dependent variable initialization callback.
@@ -122,7 +122,7 @@ new_bd_Phi (dbg_info *db, ir_node *block, int arity, ir_node **in, ir_mode *mode
   ir_node  *res;
   ir_graph *irg = current_ir_graph;
   int i;
   ir_node  *res;
   ir_graph *irg = current_ir_graph;
   int i;
-  bool has_unknown = false;
+  int has_unknown = 0;
 
   /* Don't assert that block matured: the use of this constructor is strongly
      restricted ... */
 
   /* Don't assert that block matured: the use of this constructor is strongly
      restricted ... */
@@ -135,7 +135,7 @@ new_bd_Phi (dbg_info *db, ir_node *block, int arity, ir_node **in, ir_mode *mode
 
   for (i = arity-1; i >= 0; i--)
     if (get_irn_op(in[i]) == op_Unknown) {
 
   for (i = arity-1; i >= 0; i--)
     if (get_irn_op(in[i]) == op_Unknown) {
-      has_unknown = true;
+      has_unknown = 1;
       break;
     }
 
       break;
     }
 
@@ -150,7 +150,7 @@ new_bd_Phi (dbg_info *db, ir_node *block, int arity, ir_node **in, ir_mode *mode
 }
 
 static ir_node *
 }
 
 static ir_node *
-new_bd_Const_type (dbg_info *db, ir_node *block, ir_mode *mode, tarval *con, type *tp)
+new_bd_Const_type (dbg_info *db, ir_node *block, ir_mode *mode, tarval *con, ir_type *tp)
 {
   ir_node  *res;
   ir_graph *irg = current_ir_graph;
 {
   ir_node  *res;
   ir_graph *irg = current_ir_graph;
@@ -241,7 +241,7 @@ new_bd_Conv (dbg_info *db, ir_node *block, ir_node *op, ir_mode *mode)
 }
 
 static ir_node *
 }
 
 static ir_node *
-new_bd_Cast (dbg_info *db, ir_node *block, ir_node *op, type *to_tp)
+new_bd_Cast (dbg_info *db, ir_node *block, ir_node *op, ir_type *to_tp)
 {
   ir_node  *res;
   ir_graph *irg = current_ir_graph;
 {
   ir_node  *res;
   ir_graph *irg = current_ir_graph;
@@ -296,6 +296,7 @@ new_bd_Sub (dbg_info *db, ir_node *block,
   res = new_ir_node (db, irg, block, op_Sub, mode, 2, in);
   res = optimize_node (res);
   IRN_VRFY_IRG(res, irg);
   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;
 }
 
@@ -595,7 +596,7 @@ new_bd_Cond (dbg_info *db, ir_node *block, ir_node *c)
 
 static ir_node *
 new_bd_Call (dbg_info *db, ir_node *block, ir_node *store,
 
 static ir_node *
 new_bd_Call (dbg_info *db, ir_node *block, ir_node *store,
-        ir_node *callee, int arity, ir_node **in, type *tp)
+        ir_node *callee, int arity, ir_node **in, ir_type *tp)
 {
   ir_node  **r_in;
   ir_node  *res;
 {
   ir_node  **r_in;
   ir_node  *res;
@@ -638,21 +639,6 @@ new_bd_Return (dbg_info *db, ir_node *block,
   return res;
 }
 
   return res;
 }
 
-static ir_node *
-new_bd_Raise (dbg_info *db, ir_node *block, ir_node *store, ir_node *obj)
-{
-  ir_node  *in[2];
-  ir_node  *res;
-  ir_graph *irg = current_ir_graph;
-
-  in[0] = store;
-  in[1] = obj;
-  res = new_ir_node(db, irg, block, op_Raise, mode_T, 2, in);
-  res = optimize_node(res);
-  IRN_VRFY_IRG(res, irg);
-  return res;
-}
-
 static ir_node *
 new_bd_Load (dbg_info *db, ir_node *block,
         ir_node *store, ir_node *adr, ir_mode *mode)
 static ir_node *
 new_bd_Load (dbg_info *db, ir_node *block,
         ir_node *store, ir_node *adr, ir_mode *mode)
@@ -693,7 +679,7 @@ new_bd_Store (dbg_info *db, ir_node *block,
 
 static ir_node *
 new_bd_Alloc (dbg_info *db, ir_node *block, ir_node *store,
 
 static ir_node *
 new_bd_Alloc (dbg_info *db, ir_node *block, ir_node *store,
-        ir_node *size, type *alloc_type, where_alloc where)
+        ir_node *size, ir_type *alloc_type, where_alloc where)
 {
   ir_node  *in[2];
   ir_node  *res;
 {
   ir_node  *in[2];
   ir_node  *res;
@@ -712,7 +698,7 @@ new_bd_Alloc (dbg_info *db, ir_node *block, ir_node *store,
 
 static ir_node *
 new_bd_Free (dbg_info *db, ir_node *block, ir_node *store,
 
 static ir_node *
 new_bd_Free (dbg_info *db, ir_node *block, ir_node *store,
-        ir_node *ptr, ir_node *size, type *free_type, where_alloc where)
+        ir_node *ptr, ir_node *size, ir_type *free_type, where_alloc where)
 {
   ir_node  *in[3];
   ir_node  *res;
 {
   ir_node  *in[3];
   ir_node  *res;
@@ -755,31 +741,9 @@ new_bd_Sel (dbg_info *db, ir_node *block, ir_node *store, ir_node *objptr,
   return res;
 }
 
   return res;
 }
 
-static ir_node *
-new_bd_InstOf (dbg_info *db, ir_node *block, ir_node *store,
-           ir_node *objptr, type *ent)
-{
-  ir_node  **r_in;
-  ir_node  *res;
-  int      r_arity;
-  ir_graph *irg = current_ir_graph;
-
-  r_arity = 2;
-  NEW_ARR_A(ir_node *, r_in, r_arity);
-  r_in[0] = store;
-  r_in[1] = objptr;
-
-  res = new_ir_node(db, irg, block, op_Sel, mode_T, r_arity, r_in);
-  res->attr.io.ent = ent;
-
-  /* res = optimize(res); */
-  IRN_VRFY_IRG(res, irg);
-  return res;
-}
-
 static ir_node *
 new_bd_SymConst_type (dbg_info *db, ir_node *block, symconst_symbol value,
 static ir_node *
 new_bd_SymConst_type (dbg_info *db, ir_node *block, symconst_symbol value,
-              symconst_kind symkind, type *tp) {
+              symconst_kind symkind, ir_type *tp) {
   ir_node  *res;
   ir_mode  *mode;
   ir_graph *irg = current_ir_graph;
   ir_node  *res;
   ir_mode  *mode;
   ir_graph *irg = current_ir_graph;
@@ -942,6 +906,78 @@ new_bd_Mux  (dbg_info *db, ir_node *block,
   return res;
 }
 
   return res;
 }
 
+static ir_node *
+new_bd_CopyB  (dbg_info *db, ir_node *block,
+    ir_node *store, ir_node *dst, ir_node *src, ir_type *data_type)
+{
+  ir_node  *in[3];
+  ir_node  *res;
+  ir_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;
+}
+
+static ir_node *
+new_bd_InstOf (dbg_info *db, ir_node *block, ir_node *store,
+           ir_node *objptr, ir_type *type)
+{
+  ir_node  *in[2];
+  ir_node  *res;
+  ir_graph *irg = current_ir_graph;
+
+  in[0] = store;
+  in[1] = objptr;
+  res = new_ir_node(db, irg, block, op_Sel, mode_T, 2, in);
+  res->attr.io.type = type;
+  res = optimize_node(res);
+  IRN_VRFY_IRG(res, irg);
+  return res;
+}
+
+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_Bound (dbg_info *db, ir_node *block,
+    ir_node *store, ir_node *idx, ir_node *lower, ir_node *upper)
+{
+  ir_node  *in[4];
+  ir_node  *res;
+  ir_graph *irg = current_ir_graph;
+
+  in[0] = store;
+  in[1] = idx;
+  in[2] = lower;
+  in[3] = upper;
+  res = new_ir_node(db, irg, block, op_Bound, mode_T, 4, in);
+  res->attr.copyb.exc.pin_state = op_pin_state_pinned;
+  res = optimize_node(res);
+  IRN_VRFY_IRG(res, irg);
+  return res;
+}
+
 /* --------------------------------------------- */
 /* private interfaces, for professional use only */
 /* --------------------------------------------- */
 /* --------------------------------------------- */
 /* private interfaces, for professional use only */
 /* --------------------------------------------- */
@@ -1004,7 +1040,7 @@ new_rd_Phi (dbg_info *db, ir_graph *irg, ir_node *block, int arity, ir_node **in
 }
 
 ir_node *
 }
 
 ir_node *
-new_rd_Const_type (dbg_info *db, ir_graph *irg, ir_node *block, ir_mode *mode, tarval *con, type *tp)
+new_rd_Const_type (dbg_info *db, ir_graph *irg, ir_node *block, ir_mode *mode, tarval *con, ir_type *tp)
 {
   ir_node  *res;
   ir_graph *rem = current_ir_graph;
 {
   ir_node  *res;
   ir_graph *rem = current_ir_graph;
@@ -1090,7 +1126,7 @@ new_rd_Conv (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *op, ir_mode *
 }
 
 ir_node *
 }
 
 ir_node *
-new_rd_Cast (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *op, type *to_tp)
+new_rd_Cast (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *op, ir_type *to_tp)
 {
   ir_node  *res;
   ir_graph *rem = current_ir_graph;
 {
   ir_node  *res;
   ir_graph *rem = current_ir_graph;
@@ -1408,7 +1444,7 @@ new_rd_Cond (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *c)
 
 ir_node *
 new_rd_Call (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *store,
 
 ir_node *
 new_rd_Call (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *store,
-        ir_node *callee, int arity, ir_node **in, type *tp)
+        ir_node *callee, int arity, ir_node **in, ir_type *tp)
 {
   ir_node  *res;
   ir_graph *rem = current_ir_graph;
 {
   ir_node  *res;
   ir_graph *rem = current_ir_graph;
@@ -1434,19 +1470,6 @@ new_rd_Return (dbg_info *db, ir_graph *irg, ir_node *block,
   return res;
 }
 
   return res;
 }
 
-ir_node *
-new_rd_Raise (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *store, ir_node *obj)
-{
-  ir_node  *res;
-  ir_graph *rem = current_ir_graph;
-
-  current_ir_graph = irg;
-  res = new_bd_Raise(db, block, store, obj);
-  current_ir_graph = rem;
-
-  return res;
-}
-
 ir_node *
 new_rd_Load (dbg_info *db, ir_graph *irg, ir_node *block,
         ir_node *store, ir_node *adr, ir_mode *mode)
 ir_node *
 new_rd_Load (dbg_info *db, ir_graph *irg, ir_node *block,
         ir_node *store, ir_node *adr, ir_mode *mode)
@@ -1477,7 +1500,7 @@ new_rd_Store (dbg_info *db, ir_graph *irg, ir_node *block,
 
 ir_node *
 new_rd_Alloc (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *store,
 
 ir_node *
 new_rd_Alloc (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *store,
-        ir_node *size, type *alloc_type, where_alloc where)
+        ir_node *size, ir_type *alloc_type, where_alloc where)
 {
   ir_node  *res;
   ir_graph *rem = current_ir_graph;
 {
   ir_node  *res;
   ir_graph *rem = current_ir_graph;
@@ -1491,7 +1514,7 @@ new_rd_Alloc (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *store,
 
 ir_node *
 new_rd_Free (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *store,
 
 ir_node *
 new_rd_Free (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *store,
-        ir_node *ptr, ir_node *size, type *free_type, where_alloc where)
+        ir_node *ptr, ir_node *size, ir_type *free_type, where_alloc where)
 {
   ir_node  *res;
   ir_graph *rem = current_ir_graph;
 {
   ir_node  *res;
   ir_graph *rem = current_ir_graph;
@@ -1504,28 +1527,28 @@ new_rd_Free (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *store,
 }
 
 ir_node *
 }
 
 ir_node *
-new_rd_Sel (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *store, ir_node *objptr,
-           int arity, ir_node **in, entity *ent)
+new_rd_simpleSel (dbg_info *db, ir_graph *irg, ir_node *block,
+                  ir_node *store, ir_node *objptr, entity *ent)
 {
   ir_node  *res;
   ir_graph *rem = current_ir_graph;
 
   current_ir_graph = irg;
 {
   ir_node  *res;
   ir_graph *rem = current_ir_graph;
 
   current_ir_graph = irg;
-  res = new_bd_Sel(db, block, store, objptr, arity, in, ent);
+  res = new_bd_Sel(db, block, store, objptr, 0, NULL, ent);
   current_ir_graph = rem;
 
   return res;
 }
 
 ir_node *
   current_ir_graph = rem;
 
   return res;
 }
 
 ir_node *
-new_rd_InstOf (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *store,
-           ir_node *objptr, type *ent)
+new_rd_Sel (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *store, ir_node *objptr,
+           int arity, ir_node **in, entity *ent)
 {
   ir_node  *res;
   ir_graph *rem = current_ir_graph;
 
   current_ir_graph = irg;
 {
   ir_node  *res;
   ir_graph *rem = current_ir_graph;
 
   current_ir_graph = irg;
-  res = new_bd_InstOf(db, block, store, objptr, ent);
+  res = new_bd_Sel(db, block, store, objptr, arity, in, ent);
   current_ir_graph = rem;
 
   return res;
   current_ir_graph = rem;
 
   return res;
@@ -1533,7 +1556,7 @@ new_rd_InstOf (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *store,
 
 ir_node *
 new_rd_SymConst_type (dbg_info *db, ir_graph *irg, ir_node *block, symconst_symbol value,
 
 ir_node *
 new_rd_SymConst_type (dbg_info *db, ir_graph *irg, ir_node *block, symconst_symbol value,
-              symconst_kind symkind, type *tp)
+              symconst_kind symkind, ir_type *tp)
 {
   ir_node  *res;
   ir_graph *rem = current_ir_graph;
 {
   ir_node  *res;
   ir_graph *rem = current_ir_graph;
@@ -1553,23 +1576,23 @@ new_rd_SymConst (dbg_info *db, ir_graph *irg, ir_node *block, symconst_symbol va
   return res;
 }
 
   return res;
 }
 
-ir_node *new_rd_SymConst_addr_ent (dbg_info *db, ir_graph *irg, entity *symbol, type *tp)
+ir_node *new_rd_SymConst_addr_ent (dbg_info *db, ir_graph *irg, entity *symbol, ir_type *tp)
 {
 {
-  symconst_symbol sym = {(type *)symbol};
+  symconst_symbol sym = {(ir_type *)symbol};
   return new_rd_SymConst_type(db, irg, irg->start_block, sym, symconst_addr_ent, tp);
 }
 
   return new_rd_SymConst_type(db, irg, irg->start_block, sym, symconst_addr_ent, tp);
 }
 
-ir_node *new_rd_SymConst_addr_name (dbg_info *db, ir_graph *irg, ident *symbol, type *tp) {
-  symconst_symbol sym = {(type *)symbol};
+ir_node *new_rd_SymConst_addr_name (dbg_info *db, ir_graph *irg, ident *symbol, ir_type *tp) {
+  symconst_symbol sym = {(ir_type *)symbol};
   return new_rd_SymConst_type(db, irg, irg->start_block, sym, symconst_addr_name, tp);
 }
 
   return new_rd_SymConst_type(db, irg, irg->start_block, sym, symconst_addr_name, tp);
 }
 
-ir_node *new_rd_SymConst_type_tag (dbg_info *db, ir_graph *irg, type *symbol, type *tp) {
+ir_node *new_rd_SymConst_type_tag (dbg_info *db, ir_graph *irg, ir_type *symbol, ir_type *tp) {
   symconst_symbol sym = {symbol};
   return new_rd_SymConst_type(db, irg, irg->start_block, sym, symconst_type_tag, tp);
 }
 
   symconst_symbol sym = {symbol};
   return new_rd_SymConst_type(db, irg, irg->start_block, sym, symconst_type_tag, tp);
 }
 
-ir_node *new_rd_SymConst_size (dbg_info *db, ir_graph *irg, type *symbol, type *tp) {
+ir_node *new_rd_SymConst_size (dbg_info *db, ir_graph *irg, ir_type *symbol, ir_type *tp) {
   symconst_symbol sym = {symbol};
   return new_rd_SymConst_type(db, irg, irg->start_block, sym, symconst_size, tp);
 }
   symconst_symbol sym = {symbol};
   return new_rd_SymConst_type(db, irg, irg->start_block, sym, symconst_size, tp);
 }
@@ -1701,6 +1724,58 @@ new_rd_Mux  (dbg_info *db, ir_graph *irg, ir_node *block,
   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, ir_type *data_type)
+{
+  ir_node  *res;
+  ir_graph *rem = current_ir_graph;
+
+  current_ir_graph = irg;
+  res = new_bd_CopyB(db, block, store, dst, src, data_type);
+  current_ir_graph = rem;
+
+  return res;
+}
+
+ir_node *
+new_rd_InstOf (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *store,
+           ir_node *objptr, ir_type *type)
+{
+  ir_node  *res;
+  ir_graph *rem = current_ir_graph;
+
+  current_ir_graph = irg;
+  res = new_bd_InstOf(db, block, store, objptr, type);
+  current_ir_graph = rem;
+
+  return res;
+}
+
+ir_node *
+new_rd_Raise (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *store, ir_node *obj)
+{
+  ir_node  *res;
+  ir_graph *rem = current_ir_graph;
+
+  current_ir_graph = irg;
+  res = new_bd_Raise(db, block, store, obj);
+  current_ir_graph = rem;
+
+  return res;
+}
+
+ir_node *new_rd_Bound(dbg_info *db, ir_graph *irg, ir_node *block,
+    ir_node *store, ir_node *idx, ir_node *lower, ir_node *upper)
+{
+  ir_node  *res;
+  ir_graph *rem = current_ir_graph;
+
+  current_ir_graph = irg;
+  res = new_bd_Bound(db, block, store, idx, lower, upper);
+  current_ir_graph = rem;
+
+  return res;
+}
 
 ir_node *new_r_Block  (ir_graph *irg,  int arity, ir_node **in) {
   return new_rd_Block(NULL, irg, arity, in);
 
 ir_node *new_r_Block  (ir_graph *irg,  int arity, ir_node **in) {
   return new_rd_Block(NULL, irg, arity, in);
@@ -1724,10 +1799,6 @@ ir_node *new_r_Return (ir_graph *irg, ir_node *block,
                ir_node *store, int arity, ir_node **in) {
   return new_rd_Return(NULL, irg, block, store, arity, in);
 }
                ir_node *store, int arity, ir_node **in) {
   return new_rd_Return(NULL, irg, block, store, arity, in);
 }
-ir_node *new_r_Raise  (ir_graph *irg, ir_node *block,
-               ir_node *store, ir_node *obj) {
-  return new_rd_Raise(NULL, irg, block, store, obj);
-}
 ir_node *new_r_Const  (ir_graph *irg, ir_node *block,
                ir_mode *mode, tarval *con) {
   return new_rd_Const(NULL, irg, block, mode, con);
 ir_node *new_r_Const  (ir_graph *irg, ir_node *block,
                ir_mode *mode, tarval *con) {
   return new_rd_Const(NULL, irg, block, mode, con);
@@ -1739,7 +1810,7 @@ ir_node *new_r_Const_long(ir_graph *irg, ir_node *block,
 }
 
 ir_node *new_r_Const_type(ir_graph *irg, ir_node *block,
 }
 
 ir_node *new_r_Const_type(ir_graph *irg, ir_node *block,
-               ir_mode *mode, tarval *con, type *tp) {
+               ir_mode *mode, tarval *con, ir_type *tp) {
   return new_rd_Const_type(NULL, irg, block, mode, con, tp);
 }
 
   return new_rd_Const_type(NULL, irg, block, mode, con, tp);
 }
 
@@ -1752,13 +1823,9 @@ ir_node *new_r_Sel    (ir_graph *irg, ir_node *block, ir_node *store,
                   entity *ent) {
   return new_rd_Sel(NULL, irg, block, store, objptr, n_index, index, ent);
 }
                   entity *ent) {
   return new_rd_Sel(NULL, irg, block, store, objptr, n_index, index, ent);
 }
-ir_node *new_r_InstOf (ir_graph *irg, ir_node *block, ir_node *store, ir_node *objptr,
-                  type *ent) {
-  return (new_rd_InstOf (NULL, irg, block, store, objptr, ent));
-}
 ir_node *new_r_Call   (ir_graph *irg, ir_node *block, ir_node *store,
                   ir_node *callee, int arity, ir_node **in,
 ir_node *new_r_Call   (ir_graph *irg, ir_node *block, ir_node *store,
                   ir_node *callee, int arity, ir_node **in,
-                  type *tp) {
+                  ir_type *tp) {
   return new_rd_Call(NULL, irg, block, store, callee, arity, in, tp);
 }
 ir_node *new_r_Add    (ir_graph *irg, ir_node *block,
   return new_rd_Call(NULL, irg, block, store, callee, arity, in, tp);
 }
 ir_node *new_r_Add    (ir_graph *irg, ir_node *block,
@@ -1837,7 +1904,7 @@ ir_node *new_r_Conv   (ir_graph *irg, ir_node *block,
                ir_node *op, ir_mode *mode) {
   return new_rd_Conv(NULL, irg, block, op, mode);
 }
                ir_node *op, ir_mode *mode) {
   return new_rd_Conv(NULL, irg, block, op, mode);
 }
-ir_node *new_r_Cast   (ir_graph *irg, ir_node *block, ir_node *op, type *to_tp) {
+ir_node *new_r_Cast   (ir_graph *irg, ir_node *block, ir_node *op, ir_type *to_tp) {
   return new_rd_Cast(NULL, irg, block, op, to_tp);
 }
 ir_node *new_r_Phi    (ir_graph *irg, ir_node *block, int arity,
   return new_rd_Cast(NULL, irg, block, op, to_tp);
 }
 ir_node *new_r_Phi    (ir_graph *irg, ir_node *block, int arity,
@@ -1853,11 +1920,11 @@ ir_node *new_r_Store  (ir_graph *irg, ir_node *block,
   return new_rd_Store(NULL, irg, block, store, adr, val);
 }
 ir_node *new_r_Alloc  (ir_graph *irg, ir_node *block, ir_node *store,
   return new_rd_Store(NULL, irg, block, store, adr, val);
 }
 ir_node *new_r_Alloc  (ir_graph *irg, ir_node *block, ir_node *store,
-               ir_node *size, type *alloc_type, where_alloc where) {
+               ir_node *size, ir_type *alloc_type, where_alloc where) {
   return new_rd_Alloc(NULL, irg, block, store, size, alloc_type, where);
 }
 ir_node *new_r_Free   (ir_graph *irg, ir_node *block, ir_node *store,
   return new_rd_Alloc(NULL, irg, block, store, size, alloc_type, where);
 }
 ir_node *new_r_Free   (ir_graph *irg, ir_node *block, ir_node *store,
-               ir_node *ptr, ir_node *size, type *free_type, where_alloc where) {
+               ir_node *ptr, ir_node *size, ir_type *free_type, where_alloc where) {
   return new_rd_Free(NULL, irg, block, store, ptr, size, free_type, where);
 }
 ir_node *new_r_Sync   (ir_graph *irg, ir_node *block, int arity, ir_node **in) {
   return new_rd_Free(NULL, irg, block, store, ptr, size, free_type, where);
 }
 ir_node *new_r_Sync   (ir_graph *irg, ir_node *block, int arity, ir_node **in) {
@@ -1911,7 +1978,22 @@ ir_node *new_r_Mux (ir_graph *irg, ir_node *block,
     ir_node *sel, ir_node *ir_false, ir_node *ir_true, ir_mode *mode) {
   return new_rd_Mux(NULL, irg, block, sel, ir_false, ir_true, mode);
 }
     ir_node *sel, ir_node *ir_false, ir_node *ir_true, ir_mode *mode) {
   return new_rd_Mux(NULL, irg, block, sel, ir_false, ir_true, mode);
 }
-
+ir_node *new_r_CopyB(ir_graph *irg, ir_node *block,
+    ir_node *store, ir_node *dst, ir_node *src, ir_type *data_type) {
+  return new_rd_CopyB(NULL, irg, block, store, dst, src, data_type);
+}
+ir_node *new_r_InstOf (ir_graph *irg, ir_node *block, ir_node *store, ir_node *objptr,
+                  ir_type *type) {
+  return (new_rd_InstOf (NULL, irg, block, store, objptr, type));
+}
+ir_node *new_r_Raise  (ir_graph *irg, ir_node *block,
+               ir_node *store, ir_node *obj) {
+  return new_rd_Raise(NULL, irg, block, store, obj);
+}
+ir_node *new_r_Bound(ir_graph *irg, ir_node *block,
+    ir_node *store, ir_node *idx, ir_node *lower, ir_node *upper) {
+  return new_rd_Bound(NULL, irg, block, store, idx, lower, upper);
+}
 
 /** ********************/
 /** public interfaces  */
 
 /** ********************/
 /** public interfaces  */
@@ -1959,7 +2041,7 @@ new_d_Block (dbg_info *db, int arity, ir_node **in)
 {
   ir_node *res;
   int i;
 {
   ir_node *res;
   int i;
-  bool has_unknown = false;
+  int has_unknown = 0;
 
   res = new_bd_Block(db, arity, in);
 
 
   res = new_bd_Block(db, arity, in);
 
@@ -1972,7 +2054,7 @@ new_d_Block (dbg_info *db, int arity, ir_node **in)
 
   for (i = arity-1; i >= 0; i--)
     if (get_irn_op(in[i]) == op_Unknown) {
 
   for (i = arity-1; i >= 0; i--)
     if (get_irn_op(in[i]) == op_Unknown) {
-      has_unknown = true;
+      has_unknown = 1;
       break;
     }
 
       break;
     }
 
@@ -2539,7 +2621,7 @@ get_r_frag_value_internal (ir_node *block, ir_node *cfOp, int pos, ir_mode *mode
   }
   return res;
 }
   }
   return res;
 }
-#endif
+#endif /* PRECISE_EXC_CONTEXT */
 
 /**
     computes the predecessors for the real phi node, and then
 
 /**
     computes the predecessors for the real phi node, and then
@@ -2568,10 +2650,15 @@ phi_merge (ir_node *block, int pos, ir_mode *mode, ir_node **nin, int ins)
          (bad, jmp).  In this case we call the function needlessly, eventually
          generating an non existent error.
          However, this SHOULD NOT HAPPEN, as bad control flow nodes are intercepted
          (bad, jmp).  In this case we call the function needlessly, eventually
          generating an non existent error.
          However, this SHOULD NOT HAPPEN, as bad control flow nodes are intercepted
-         before recuring.
+         before recurring.
       */
       */
-      if (default_initialize_local_variable)
+      if (default_initialize_local_variable) {
+        ir_node *rem = get_cur_block();
+
+        set_cur_block(block);
         block->attr.block.graph_arr[pos] = default_initialize_local_variable(current_ir_graph, mode, pos - 1);
         block->attr.block.graph_arr[pos] = default_initialize_local_variable(current_ir_graph, mode, pos - 1);
+        set_cur_block(rem);
+      }
       else
         block->attr.block.graph_arr[pos] = new_Const(mode, tarval_bad);
       /* We don't need to care about exception ops in the start block.
       else
         block->attr.block.graph_arr[pos] = new_Const(mode, tarval_bad);
       /* We don't need to care about exception ops in the start block.
@@ -2815,7 +2902,7 @@ new_d_Const_long(dbg_info *db, ir_mode *mode, long value)
 }
 
 ir_node *
 }
 
 ir_node *
-new_d_Const_type (dbg_info *db, ir_mode *mode, tarval *con, type *tp)
+new_d_Const_type (dbg_info *db, ir_mode *mode, tarval *con, ir_type *tp)
 {
   return new_bd_Const_type(db, current_ir_graph->start_block,
                 mode, con, tp);
 {
   return new_bd_Const_type(db, current_ir_graph->start_block,
                 mode, con, tp);
@@ -2855,7 +2942,7 @@ new_d_Conv (dbg_info *db, ir_node *op, ir_mode *mode)
 }
 
 ir_node *
 }
 
 ir_node *
-new_d_Cast (dbg_info *db, ir_node *op, type *to_tp)
+new_d_Cast (dbg_info *db, ir_node *op, ir_type *to_tp)
 {
   return new_bd_Cast(db, current_ir_graph->current_block, op, to_tp);
 }
 {
   return new_bd_Cast(db, current_ir_graph->current_block, op, to_tp);
 }
@@ -3056,7 +3143,7 @@ new_d_Cond (dbg_info *db, ir_node *c)
 
 ir_node *
 new_d_Call (dbg_info *db, ir_node *store, ir_node *callee, int arity, ir_node **in,
 
 ir_node *
 new_d_Call (dbg_info *db, ir_node *store, ir_node *callee, int arity, ir_node **in,
-      type *tp)
+      ir_type *tp)
 {
   ir_node *res;
   res = new_bd_Call (db, current_ir_graph->current_block,
 {
   ir_node *res;
   res = new_bd_Call (db, current_ir_graph->current_block,
@@ -3075,13 +3162,6 @@ new_d_Return (dbg_info *db, ir_node* store, int arity, ir_node **in)
                store, arity, in);
 }
 
                store, arity, in);
 }
 
-ir_node *
-new_d_Raise (dbg_info *db, ir_node *store, ir_node *obj)
-{
-  return new_bd_Raise (db, current_ir_graph->current_block,
-              store, obj);
-}
-
 ir_node *
 new_d_Load (dbg_info *db, ir_node *store, ir_node *addr, ir_mode *mode)
 {
 ir_node *
 new_d_Load (dbg_info *db, ir_node *store, ir_node *addr, ir_mode *mode)
 {
@@ -3109,7 +3189,7 @@ new_d_Store (dbg_info *db, ir_node *store, ir_node *addr, ir_node *val)
 }
 
 ir_node *
 }
 
 ir_node *
-new_d_Alloc (dbg_info *db, ir_node *store, ir_node *size, type *alloc_type,
+new_d_Alloc (dbg_info *db, ir_node *store, ir_node *size, ir_type *alloc_type,
            where_alloc where)
 {
   ir_node *res;
            where_alloc where)
 {
   ir_node *res;
@@ -3124,7 +3204,7 @@ new_d_Alloc (dbg_info *db, ir_node *store, ir_node *size, type *alloc_type,
 
 ir_node *
 new_d_Free (dbg_info *db, ir_node *store, ir_node *ptr,
 
 ir_node *
 new_d_Free (dbg_info *db, ir_node *store, ir_node *ptr,
-    ir_node *size, type *free_type, where_alloc where)
+    ir_node *size, ir_type *free_type, where_alloc where)
 {
   return new_bd_Free (db, current_ir_graph->current_block,
              store, ptr, size, free_type, where);
 {
   return new_bd_Free (db, current_ir_graph->current_block,
              store, ptr, size, free_type, where);
@@ -3147,14 +3227,7 @@ new_d_Sel (dbg_info *db, ir_node *store, ir_node *objptr, int n_index, ir_node *
 }
 
 ir_node *
 }
 
 ir_node *
-new_d_InstOf (dbg_info *db, ir_node *store, ir_node *objptr, type *ent)
-{
-  return (new_bd_InstOf (db, current_ir_graph->current_block,
-                         store, objptr, ent));
-}
-
-ir_node *
-new_d_SymConst_type (dbg_info *db, symconst_symbol value, symconst_kind kind, type *tp)
+new_d_SymConst_type (dbg_info *db, symconst_symbol value, symconst_kind kind, ir_type *tp)
 {
   return new_bd_SymConst_type (db, current_ir_graph->start_block,
                          value, kind, tp);
 {
   return new_bd_SymConst_type (db, current_ir_graph->start_block,
                          value, kind, tp);
@@ -3243,6 +3316,42 @@ new_d_Mux (dbg_info *db, ir_node *sel, ir_node *ir_false,
       sel, ir_false, ir_true, mode);
 }
 
       sel, ir_false, ir_true, mode);
 }
 
+ir_node *new_d_CopyB(dbg_info *db,ir_node *store,
+    ir_node *dst, ir_node *src, ir_type *data_type) {
+  ir_node *res;
+  res = new_bd_CopyB(db, current_ir_graph->current_block,
+    store, dst, src, data_type);
+#if PRECISE_EXC_CONTEXT
+  allocate_frag_arr(res, op_CopyB, &res->attr.copyb.exc.frag_arr);
+#endif
+  return res;
+}
+
+ir_node *
+new_d_InstOf (dbg_info *db, ir_node *store, ir_node *objptr, ir_type *type)
+{
+  return new_bd_InstOf (db, current_ir_graph->current_block,
+                        store, objptr, type);
+}
+
+ir_node *
+new_d_Raise (dbg_info *db, ir_node *store, ir_node *obj)
+{
+  return new_bd_Raise (db, current_ir_graph->current_block,
+              store, obj);
+}
+
+ir_node *new_d_Bound(dbg_info *db,ir_node *store,
+    ir_node *idx, ir_node *lower, ir_node *upper) {
+  ir_node *res;
+  res = new_bd_Bound(db, current_ir_graph->current_block,
+    store, idx, lower, upper);
+#if PRECISE_EXC_CONTEXT
+  allocate_frag_arr(res, op_Bound, &res->attr.bound.exc.frag_arr);
+#endif
+  return res;
+}
+
 /* ********************************************************************* */
 /* Comfortable interface with automatic Phi node construction.           */
 /* (Uses also constructors of ?? interface, except new_Block.            */
 /* ********************************************************************* */
 /* Comfortable interface with automatic Phi node construction.           */
 /* (Uses also constructors of ?? interface, except new_Block.            */
@@ -3362,7 +3471,7 @@ ir_node *get_cur_block(void) {
 }
 
 /* Returns the frame type of the current graph */
 }
 
 /* Returns the frame type of the current graph */
-type *get_cur_frame_type(void) {
+ir_type *get_cur_frame_type(void) {
   return get_irg_frame_type(current_ir_graph);
 }
 
   return get_irg_frame_type(current_ir_graph);
 }
 
@@ -3416,9 +3525,6 @@ ir_node *new_Cond   (ir_node *c) {
 ir_node *new_Return (ir_node *store, int arity, ir_node *in[]) {
   return new_d_Return(NULL, store, arity, in);
 }
 ir_node *new_Return (ir_node *store, int arity, ir_node *in[]) {
   return new_d_Return(NULL, store, arity, in);
 }
-ir_node *new_Raise  (ir_node *store, ir_node *obj) {
-  return new_d_Raise(NULL, store, obj);
-}
 ir_node *new_Const  (ir_mode *mode, tarval *con) {
   return new_d_Const(NULL, mode, con);
 }
 ir_node *new_Const  (ir_mode *mode, tarval *con) {
   return new_d_Const(NULL, mode, con);
 }
@@ -3428,7 +3534,7 @@ ir_node *new_Const_long(ir_mode *mode, long value)
     return new_d_Const_long(NULL, mode, value);
 }
 
     return new_d_Const_long(NULL, mode, value);
 }
 
-ir_node *new_Const_type(tarval *con, type *tp) {
+ir_node *new_Const_type(tarval *con, ir_type *tp) {
   return new_d_Const_type(NULL, get_type_mode(tp), con, tp);
 }
 
   return new_d_Const_type(NULL, get_type_mode(tp), con, tp);
 }
 
@@ -3442,11 +3548,8 @@ ir_node *new_Sel    (ir_node *store, ir_node *objptr, int arity, ir_node **in,
                      entity *ent) {
   return new_d_Sel(NULL, store, objptr, arity, in, ent);
 }
                      entity *ent) {
   return new_d_Sel(NULL, store, objptr, arity, in, ent);
 }
-ir_node *new_InstOf (ir_node *store, ir_node *objptr, type *ent) {
-  return new_d_InstOf (NULL, store, objptr, ent);
-}
 ir_node *new_Call   (ir_node *store, ir_node *callee, int arity, ir_node **in,
 ir_node *new_Call   (ir_node *store, ir_node *callee, int arity, ir_node **in,
-             type *tp) {
+             ir_type *tp) {
   return new_d_Call(NULL, store, callee, arity, in, tp);
 }
 ir_node *new_Add    (ir_node *op1, ir_node *op2, ir_mode *mode) {
   return new_d_Call(NULL, store, callee, arity, in, tp);
 }
 ir_node *new_Add    (ir_node *op1, ir_node *op2, ir_mode *mode) {
@@ -3506,7 +3609,7 @@ ir_node *new_Cmp    (ir_node *op1, ir_node *op2) {
 ir_node *new_Conv   (ir_node *op, ir_mode *mode) {
   return new_d_Conv(NULL, op, mode);
 }
 ir_node *new_Conv   (ir_node *op, ir_mode *mode) {
   return new_d_Conv(NULL, op, mode);
 }
-ir_node *new_Cast   (ir_node *op, type *to_tp) {
+ir_node *new_Cast   (ir_node *op, ir_type *to_tp) {
   return new_d_Cast(NULL, op, to_tp);
 }
 ir_node *new_Phi    (int arity, ir_node **in, ir_mode *mode) {
   return new_d_Cast(NULL, op, to_tp);
 }
 ir_node *new_Phi    (int arity, ir_node **in, ir_mode *mode) {
@@ -3518,12 +3621,12 @@ ir_node *new_Load   (ir_node *store, ir_node *addr, ir_mode *mode) {
 ir_node *new_Store  (ir_node *store, ir_node *addr, ir_node *val) {
   return new_d_Store(NULL, store, addr, val);
 }
 ir_node *new_Store  (ir_node *store, ir_node *addr, ir_node *val) {
   return new_d_Store(NULL, store, addr, val);
 }
-ir_node *new_Alloc  (ir_node *store, ir_node *size, type *alloc_type,
+ir_node *new_Alloc  (ir_node *store, ir_node *size, ir_type *alloc_type,
                      where_alloc where) {
   return new_d_Alloc(NULL, store, size, alloc_type, where);
 }
 ir_node *new_Free   (ir_node *store, ir_node *ptr, ir_node *size,
                      where_alloc where) {
   return new_d_Alloc(NULL, store, size, alloc_type, where);
 }
 ir_node *new_Free   (ir_node *store, ir_node *ptr, ir_node *size,
-             type *free_type, where_alloc where) {
+             ir_type *free_type, where_alloc where) {
   return new_d_Free(NULL, store, ptr, size, free_type, where);
 }
 ir_node *new_Sync   (int arity, ir_node **in) {
   return new_d_Free(NULL, store, ptr, size, free_type, where);
 }
 ir_node *new_Sync   (int arity, ir_node **in) {
@@ -3571,3 +3674,15 @@ 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, ir_type *data_type) {
+  return new_d_CopyB(NULL, store, dst, src, data_type);
+}
+ir_node *new_InstOf (ir_node *store, ir_node *objptr, ir_type *ent) {
+  return new_d_InstOf (NULL, store, objptr, ent);
+}
+ir_node *new_Raise  (ir_node *store, ir_node *obj) {
+  return new_d_Raise(NULL, store, obj);
+}
+ir_node *new_Bound(ir_node *store, ir_node *idx, ir_node *lower, ir_node *upper) {
+  return new_d_Bound(NULL, store, idx, lower, upper);
+}