+void part_block(ir_node *node) {
+ ir_node *new_block;
+ ir_node *old_block;
+ ir_node *phi;
+ ir_node *mbh;
+ ir_node *next, *block;
+
+ /* Turn off optimizations so that blocks are not merged again. */
+ int rem_opt = get_opt_optimize();
+ set_optimize(0);
+
+ /* Transform the control flow */
+ old_block = get_nodes_block(node);
+ mbh = get_Block_MacroBlock(old_block);
+ new_block = new_Block(get_Block_n_cfgpreds(old_block),
+ get_Block_cfgpred_arr(old_block));
+
+ if (mbh != old_block) {
+ /* we splitting a partBlock */
+ set_Block_MacroBlock(new_block, mbh);
+ } else {
+ /* we are splitting a header: this creates a new header */
+ set_Block_MacroBlock(new_block, new_block);
+ }
+ set_irg_current_block(current_ir_graph, new_block);
+ {
+ ir_node *jmp = new_Jmp();
+ set_irn_in(old_block, 1, &jmp);
+ irn_vrfy_irg(old_block, current_ir_graph);
+ }
+
+ /* move node and its predecessors to new_block */
+ move(node, old_block, new_block);
+
+ /* move Phi nodes to new_block */
+ phi = get_Block_phis(old_block);
+ set_Block_phis(new_block, phi);
+ set_Block_phis(old_block, NULL);
+ while (phi) {
+ set_nodes_block(phi, new_block);
+ phi = get_Phi_next(phi);
+ }
+
+ /* rewire partBlocks */
+ if (mbh != old_block) {
+ ir_node *list = NULL;