- /* rewire partBlocks */
- if (mbh != old_block) {
- ir_node *list = NULL;
-
- /* move blocks from mbh to old_block if old_block dominates them */
- block = get_irn_link(mbh);
-
- set_irn_link(mbh, NULL);
- set_Block_MacroBlock(old_block, old_block);
-
- /* 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);
-
- if (block == old_block)
- continue;
-
- 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, list);
- list = 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);
- }
- }
- /* beware: do NOT directly manipulate old_block's list, as old_block is
- in mbh's list and this would destroy the list! */
- set_irn_link(old_block, list);