+ res = new_ir_node(db, irg, block, op_EndReg, mode_T, -1, NULL);
+ set_irg_end_reg(irg, res);
+ IRN_VRFY_IRG(res, irg);
+ return res;
+} /* new_bd_EndReg */
+
+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);
+ set_irg_end_except(irg, res);
+ IRN_VRFY_IRG (res, irg);
+ return res;
+} /* new_bd_EndExcept */
+
+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;
+} /* new_bd_Break */
+
+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;
+} /* new_bd_Filter */
+
+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;
+} /* new_bd_Mux */
+
+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;
+} /* new_bd_CopyB */
+
+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.instof.type = type;
+ res = optimize_node(res);
+ IRN_VRFY_IRG(res, irg);
+ return res;
+} /* new_bd_InstOf */
+
+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;
+} /* new_bd_Raise */
+
+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.bound.exc.pin_state = op_pin_state_pinned;
+ res = optimize_node(res);
+ IRN_VRFY_IRG(res, irg);
+ return res;
+} /* new_bd_Bound */
+
+static ir_node *
+new_bd_Pin(dbg_info *db, ir_node *block, ir_node *node) {
+ ir_node *res;
+ ir_graph *irg = current_ir_graph;
+
+ res = new_ir_node(db, irg, block, op_Pin, get_irn_mode(node), 1, &node);
+ res = optimize_node(res);
+ IRN_VRFY_IRG(res, irg);
+ return res;
+} /* new_bd_Pin */
+
+static ir_node *
+new_bd_ASM(dbg_info *db, ir_node *block, int arity, ir_node *in[], ir_asm_constraint *inputs,
+ int n_outs, ir_asm_constraint *outputs, int n_clobber, ident *clobber[], ident *asm_text) {
+ ir_node *res;
+ ir_graph *irg = current_ir_graph;
+ (void) clobber;
+
+ res = new_ir_node(db, irg, block, op_ASM, mode_T, arity, in);
+ res->attr.assem.pin_state = op_pin_state_pinned;
+ res->attr.assem.inputs = NEW_ARR_D(ir_asm_constraint, irg->obst, arity);
+ res->attr.assem.outputs = NEW_ARR_D(ir_asm_constraint, irg->obst, n_outs);
+ res->attr.assem.clobber = NEW_ARR_D(ident *, irg->obst, n_clobber);
+ res->attr.assem.asm_text = asm_text;
+
+ memcpy(res->attr.assem.inputs, inputs, sizeof(inputs[0]) * arity);
+ memcpy(res->attr.assem.outputs, outputs, sizeof(outputs[0]) * n_outs);
+ memcpy(res->attr.assem.clobber, clobber, sizeof(clobber[0]) * n_clobber);
+
+ res = optimize_node(res);
+ IRN_VRFY_IRG(res, irg);
+ return res;
+} /* new_bd_ASM */
+
+/* --------------------------------------------- */
+/* 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. */