irg = get_irn_irg(n);
+ /* if all predecessors of a block are unreachable, then the block is
+ * unreachable */
+ if (is_irg_state(irg, IR_GRAPH_STATE_BAD_BLOCK)) {
+ int i;
+ int n_cfgpreds = get_Block_n_cfgpreds(n);
+
+ for (i = 0; i < n_cfgpreds; ++i) {
+ ir_node *pred = get_Block_cfgpred(n, i);
+ if (!is_Bad(pred))
+ break;
+ }
+ /* only bad inputs? It's unreachable code (unless it is the start or
+ * end block) */
+ if (i >= n_cfgpreds && n != get_irg_start_block(irg)
+ && n != get_irg_end_block(irg)) {
+ return get_irg_bad(irg);
+ }
+ }
+
/* Straightening: a single entry Block following a single exit Block
* can be merged. */
if (n_preds == 1) {
DBG_OPT_IFSIM1(oldn, a, b, n);
}
}
- } else if (is_irg_state(irg, IR_GRAPH_STATE_BAD_BLOCK)) {
- int i;
- int n_cfgpreds = get_Block_n_cfgpreds(n);
-
- for (i = 0; i < n_cfgpreds; ++i) {
- ir_node *pred = get_Block_cfgpred(n, i);
- if (!is_Bad(pred))
- break;
- }
- /* only bad unreachable inputs? It's unreachable code (unless it is the
- * start or end block) */
- if (i >= n_cfgpreds && n != get_irg_start_block(irg)
- && n != get_irg_end_block(irg)) {
- return get_irg_bad(irg);
- }
}
return n;
{
ir_op *op = get_irn_op(node);
- /* Nodes in bad blocks are bad.
- * Beware: we can only read the block of a non-floating node. */
- if (op != op_Block && is_irn_pinned_in_irg(node)
- && is_Bad(get_nodes_block(node))) {
+ /* Code in "Bad" blocks is unreachable and can be replaced by Bad */
+ if (op != op_Block && is_Bad(get_nodes_block(node))) {
ir_graph *irg = get_irn_irg(node);
return get_irg_bad(irg);
}
}
return node;
-} /* gigo */
+}
/**
* These optimizations deallocate nodes from the obstack.