pdeq *waitq = new_pdeq();
ir_graph *rem = current_ir_graph;
ir_node *end;
- int i, state;
+ int i, state, n_ka;
current_ir_graph = irg;
set_using_irn_link(irg);
+ end = get_irg_end(irg);
+ n_ka = get_End_n_keepalives(end);
+
/* walk over the graph, but don't touch keep-alives */
irg_walk(get_irg_end_block(irg), NULL, opt_walker, waitq);
- end = get_irg_end(irg);
-
- /* optimize keep-alives by removing superfluous ones */
- for (i = get_End_n_keepalives(end) - 1; i >= 0; --i) {
+ /*
+ * Optimize keep-alives by removing superfluous ones.
+ * Beware: the last transformation might add new keep-alives
+ * that keep blocks that are where visited! So, check only the
+ * "old" keep-alives, not the new ones!
+ *
+ * FIXME: it might be better to completely remove this
+ * optimization here ...
+ */
+ for (i = n_ka - 1; i >= 0; --i) {
ir_node *ka = get_End_keepalive(end, i);
if (irn_visited(ka) && !is_irn_keep(ka)) {
ir_node *ret, *phi;
int arity, n_ret, n_exc, n_res, i, n, j, rem_opt, irn_arity;
enum exc_mode exc_handling;
- ir_type *called_frame;
+ ir_type *called_frame, *curr_frame;
irg_inline_property prop = get_irg_inline_property(called_graph);
ir_entity *ent;
/* -- Replicate local entities of the called_graph -- */
/* copy the entities. */
called_frame = get_irg_frame_type(called_graph);
+ curr_frame = get_irg_frame_type(current_ir_graph);
for (i = 0, n = get_class_n_members(called_frame); i < n; ++i) {
ir_entity *new_ent, *old_ent;
old_ent = get_class_member(called_frame, i);
- new_ent = copy_entity_own(old_ent, get_cur_frame_type());
+ new_ent = copy_entity_own(old_ent, curr_frame);
set_entity_link(old_ent, new_ent);
}