+/* Access predecessor n, honor keep-alives. */
+ir_node *get_Block_cfg_out_ka(ir_node *bl, int pos) {
+ int i, n_outs;
+ assert(bl && is_Block(bl));
+#ifdef DEBUG_libfirm
+ assert (bl->out_valid);
+#endif /* defined DEBUG_libfirm */
+ for (i = 1; i <= PTR_TO_INT(bl->out[0]); ++i) {
+ ir_node *succ = bl->out[i];
+ if (get_irn_mode(succ) == mode_X) {
+ if (get_irn_op(succ) == op_End) {
+ if (get_irn_n(succ, -1) == bl) {
+ /* ignore End if we are in the Endblock */
+ continue;
+ }
+ if (pos == 0) {
+ /* handle keep-alive here: return the Endblock instead of the End node */
+ return get_irn_n(succ, -1);
+ } else
+ --pos;
+ } else {
+ n_outs = PTR_TO_INT(succ->out[0]);
+ if (pos < n_outs)
+ return succ->out[pos + 1];
+ else
+ pos -= n_outs;
+ }
+ }
+ }
+ return NULL;
+}
+
+static void irg_out_walk_2(ir_node *node, irg_walk_func *pre,