updated
[libfirm] / ir / ir / irgopt.c
index 5ff0ab1..8be6585 100644 (file)
@@ -184,7 +184,7 @@ void optimize_graph_df(ir_graph *irg) {
        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;
 
@@ -207,13 +207,22 @@ void optimize_graph_df(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)) {
@@ -994,7 +1003,7 @@ int inline_method(ir_node *call, ir_graph *called_graph) {
        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;
 
@@ -1111,10 +1120,11 @@ int inline_method(ir_node *call, ir_graph *called_graph) {
        /* -- 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);
        }