set_Block_dead(pred_bl);
exchange(pred_X, new_Bad());
*changed = 1;
- } else if (skipped != pred_X)
+ } else if (skipped != pred_X) {
set_Block_cfgpred(block, i, skipped);
+ *changed = 1;
+ }
}
}
for (i = 0, n = get_Block_n_cfgpreds(b); i < n; ++i) {
pred = get_Block_cfgpred_block(b, i);
- if (is_Bad(get_Block_cfgpred(b, i))) {
+ if (is_Block_dead(pred)) {
/* case Phi 1: Do nothing */
}
else if (is_Block_removable(pred) && Block_not_block_visited(pred)) {
for (i = 0; i < k; i++) {
pred = get_Block_cfgpred_block(b, i);
- if (is_Bad(pred)) {
+ if (is_Block_dead(pred)) {
/* Do nothing */
} else if (is_Block_removable(pred) && Block_not_block_visited(pred)) {
/* It's an empty block and not yet visited. */
/* and now all the rest */
for (i = k+1; i < get_Block_n_cfgpreds(b); i++) {
- pred = get_nodes_block(get_Block_cfgpred(b, i));
+ pred = get_Block_cfgpred_block(b, i);
- if (is_Bad(get_Block_cfgpred(b, i))) {
+ if (is_Block_dead(pred)) {
/* Do nothing */
} else if (is_Block_removable(pred) && Block_not_block_visited(pred)) {
/* It's an empty block and not yet visited. */
for (i = 0; i < get_Block_n_cfgpreds(b); i++) {
pred = get_Block_cfgpred_block(b, i);
- if (is_Bad(pred)) {
+ if (is_Block_dead(pred)) {
/* case 1: Do nothing */
} else if (is_Block_removable(pred) && Block_not_block_visited(pred)) {
/* case 2: It's an empty block and not yet visited. */
assert(get_Block_n_cfgpreds(b) > 1);
/* Else it should be optimized by equivalent_node. */
for (j = 0; j < get_Block_n_cfgpreds(pred); j++) {
- ir_node *pred_block = get_Block_cfgpred(pred, j);
+ ir_node *pred_X = get_Block_cfgpred(pred, j);
/* because of breaking loops, not all predecessors are Bad-clean,
* so we must check this here again */
- if (! is_Bad(pred_block))
- in[n_preds++] = pred_block;
+ if (! is_Bad(pred_X))
+ in[n_preds++] = pred_X;
}
/* Remove block as it might be kept alive. */
exchange(pred, b/*new_Bad()*/);
edges_deactivate(irg);
/* we use the mark flag to mark removable blocks */
- set_using_block_mark(irg);
+ ir_reserve_resources(irg, IR_RESOURCE_BLOCK_MARK);
restart:
env.changed = 0;
env.phis_moved = 0;
if (is_Block(ka)) {
/* do NOT keep dead blocks */
- if (get_Block_dom_depth(ka) < 0) {
+ if (is_Block_dead(ka) || get_Block_dom_depth(ka) < 0) {
set_End_keepalive(end, i, new_Bad());
env.changed = 1;
}
}
}
- set_using_irn_link(irg);
+ ir_reserve_resources(irg, IR_RESOURCE_IRN_LINK);
env.list = plist_new();
irg_walk(end, merge_blocks, collect_nodes, &env);
- clear_using_irn_link(irg);
+ ir_free_resources(irg, IR_RESOURCE_IRN_LINK);
if (env.changed) {
/* Handle graph state if was changed. */
/* in rare cases a node may be kept alive more than once, use the visited flag to detect this */
inc_irg_visited(irg);
- set_using_irn_visited(irg);
+ ir_reserve_resources(irg, IR_RESOURCE_IRN_VISITED);
/* fix the keep alive */
for (i = j = 0; i < n; i++) {
env.changed = 1;
}
- clear_using_block_mark(irg);
- clear_using_irn_visited(irg);
+ ir_free_resources(irg, IR_RESOURCE_BLOCK_MARK | IR_RESOURCE_IRN_VISITED);
if (env.phis_moved) {
/* Bad: when we moved Phi's, we might produce dead Phi nodes