- /* rewire partBlocks */
- if (mbh != old_block) {
- ir_node *next, *block = get_irn_link(mbh);
-
- set_irn_link(mbh, NULL);
- set_irn_link(old_block, NULL);
-
- /* note that we must splice the list of partBlock here */
- for (; block != NULL; block = next) {
- ir_node *curr = block;
- assert(is_Block(curr));
-
- next = get_irn_link(block);
- assert(get_Block_MacroBlock(curr) == mbh);
-
- for (;;) {
- if (curr == old_block) {
- /* old_block dominates the block, so old_block will be
- the new macro block header */
- set_Block_MacroBlock(block, old_block);
- set_irn_link(block, get_irn_link(old_block));
- set_irn_link(old_block, block);
- break;
- }
- if (curr == mbh) {
- /* leave it in the mbh */
- set_irn_link(block, get_irn_link(mbh));
- set_irn_link(mbh, block);
- break;
- }
-
- assert(get_Block_n_cfgpreds(curr) == 1);
- curr = get_Block_cfgpred_block(curr, 0);
- }
- }
+ set_optimize(rem_opt);
+}
+
+ir_node *part_block_edges(ir_node *node)
+{
+ ir_graph *irg = get_irn_irg(node);
+ ir_node *old_block = get_nodes_block(node);
+ ir_node *new_block = new_r_Block(irg,
+ get_Block_n_cfgpreds(old_block),
+ get_Block_cfgpred_arr(old_block));
+ const ir_edge_t *edge;
+ const ir_edge_t *next;
+
+ /* old_block has no predecessors anymore for now */
+ set_irn_in(old_block, 0, NULL);
+
+ /* move node and its predecessors to new_block */
+ move_edges(node, old_block, new_block);
+
+ /* move Phi nodes to new_block */
+ foreach_out_edge_safe(old_block, edge, next) {
+ ir_node *phi = get_edge_src_irn(edge);
+ if (!is_Phi(phi))
+ continue;
+ set_nodes_block(phi, new_block);