+ /* put the preds in the worklist */
+ be_enqueue_preds(node);
+
+ return block;
+}
+
+static ir_node *transform_end(ir_node *node)
+{
+ /* end has to be duplicated manually because we need a dynamic in array */
+ ir_graph *irg = get_irn_irg(node);
+ dbg_info *dbgi = get_irn_dbg_info(node);
+ ir_node *block = be_transform_node(get_nodes_block(node));
+ int i, arity;
+ ir_node *new_end;
+
+ new_end = new_ir_node(dbgi, irg, block, op_End, mode_X, -1, NULL);
+ copy_node_attr(irg, node, new_end);
+ be_duplicate_deps(node, new_end);
+
+ set_irg_end(irg, new_end);
+
+ /* do not transform predecessors yet to keep the pre-transform
+ * phase from visiting all the graph */
+ arity = get_irn_arity(node);
+ for (i = 0; i < arity; ++i) {
+ ir_node *in = get_irn_n(node, i);
+ add_End_keepalive(new_end, in);
+ }
+ be_enqueue_preds(node);
+
+ return new_end;
+}
+
+void be_start_transform_setup(void)
+{
+ clear_irp_opcodes_generic_func();
+
+ be_set_transform_function(op_Bad, be_duplicate_node);
+ be_set_transform_function(op_be_Copy, be_duplicate_node);
+ be_set_transform_function(op_be_CopyKeep, be_duplicate_node);
+ be_set_transform_function(op_be_IncSP, be_duplicate_node);
+ be_set_transform_function(op_be_Keep, be_duplicate_node);
+ be_set_transform_function(op_be_Return, be_duplicate_node);
+ be_set_transform_function(op_be_Start, be_duplicate_node);
+ be_set_transform_function(op_Block, transform_block);
+ be_set_transform_function(op_End, transform_end);
+ be_set_transform_function(op_NoMem, be_duplicate_node);
+ be_set_transform_function(op_Pin, be_duplicate_node);
+ be_set_transform_function(op_Start, be_duplicate_node);
+ be_set_transform_function(op_Sync, be_duplicate_node);