+static void remove_unreachable_keeps(ir_graph *irg)
+{
+ ir_node *end = get_irg_end(irg);
+ int arity = get_irn_arity(end);
+ ir_node **new_in = XMALLOCN(ir_node*, arity);
+ int new_arity = 0;
+ int i;
+
+ for (i = 0; i < arity; ++i) {
+ ir_node *ka = get_End_keepalive(end, i);
+ ir_node *block = is_Block(ka) ? ka : get_nodes_block(ka);
+ if (is_block_unreachable(block))
+ continue;
+ new_in[new_arity++] = ka;
+ }
+ if (new_arity != arity)
+ set_End_keepalives(end, new_arity, new_in);
+ free(new_in);
+}
+
+void remove_unreachable_code(ir_graph *irg)