X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firgopt.c;h=47d00d64f5bf93d96cc76ad45457f560f0f9d1ae;hb=23ea16875f38dc0c067cce24f64b5c70f3acc496;hp=884d7e69fced730e90e5b940d40dfc5e26c899e0;hpb=cdd903d8e390c19bf09b67bb991b45dde115050e;p=libfirm diff --git a/ir/ir/irgopt.c b/ir/ir/irgopt.c index 884d7e69f..47d00d64f 100644 --- a/ir/ir/irgopt.c +++ b/ir/ir/irgopt.c @@ -177,7 +177,8 @@ void optimize_graph_df(ir_graph *irg) { /* finish the wait queue */ while (! pdeq_empty(waitq)) { ir_node *n = pdeq_getl(waitq); - opt_walker(n, waitq); + if (! is_Bad(n)) + opt_walker(n, waitq); } del_pdeq(waitq); @@ -456,22 +457,23 @@ static void copy_graph(ir_graph *irg, int copy_node_nr) { /*- ... and now the keep alives. -*/ /* First pick the not marked block nodes and walk them. We must pick these first as else we will oversee blocks reachable from Phis. */ - irn_arity = get_irn_arity(oe); + irn_arity = get_End_n_keepalives(oe); for (i = 0; i < irn_arity; i++) { - ka = get_irn_intra_n(oe, i); - if (is_Block(ka) && - (get_irn_visited(ka) <= vfl)) { - /* We must keep the block alive and copy everything reachable */ - set_irg_visited(irg, vfl); - irg_walk(ka, copy_node, copy_preds, INT_TO_PTR(copy_node_nr)); + ka = get_End_keepalive(oe, i); + if (is_Block(ka)) { + if (get_irn_visited(ka) <= vfl) { + /* We must keep the block alive and copy everything reachable */ + set_irg_visited(irg, vfl); + irg_walk(ka, copy_node, copy_preds, INT_TO_PTR(copy_node_nr)); + } add_End_keepalive(ne, get_new_node(ka)); } } /* Now pick other nodes. Here we will keep all! */ - irn_arity = get_irn_arity(oe); + irn_arity = get_End_n_keepalives(oe); for (i = 0; i < irn_arity; i++) { - ka = get_irn_intra_n(oe, i); + ka = get_End_keepalive(oe, i); if (!is_Block(ka)) { if (get_irn_visited(ka) <= vfl) { /* We didn't copy the node yet. */ @@ -582,7 +584,7 @@ dead_node_elimination(ir_graph *irg) { irg->value_table = new_identities(); /* Copy the graph from the old to the new obstack */ - copy_graph_env(1); + copy_graph_env(/*copy_node_nr=*/1); /* Free memory from old unoptimized obstack */ obstack_free(graveyard_obst, 0); /* First empty the obstack ... */ @@ -910,7 +912,7 @@ int inline_method(ir_node *call, ir_graph *called_graph) { ir_type *called_frame; irg_inline_property prop = get_irg_inline_property(called_graph); - if ( (prop != irg_inline_forced) && + if ( (prop < irg_inline_forced) && (!get_opt_optimize() || !get_opt_inline() || (prop == irg_inline_forbidden))) return 0; /* Do not inline variadic functions. */ @@ -984,14 +986,15 @@ int inline_method(ir_node *call, ir_graph *called_graph) { post_bl = get_nodes_block(call); set_irg_current_block(current_ir_graph, post_bl); /* XxMxPxPxPxT of Start + parameter of Call */ - in[pn_Start_X_initial_exec] = new_Jmp(); - in[pn_Start_M] = get_Call_mem(call); - in[pn_Start_P_frame_base] = get_irg_frame(current_ir_graph); - in[pn_Start_P_globals] = get_irg_globals(current_ir_graph); - in[pn_Start_P_tls] = get_irg_tls(current_ir_graph); - in[pn_Start_T_args] = new_Tuple(get_Call_n_params(call), get_Call_param_arr(call)); + in[pn_Start_X_initial_exec] = new_Jmp(); + in[pn_Start_M] = get_Call_mem(call); + in[pn_Start_P_frame_base] = get_irg_frame(current_ir_graph); + in[pn_Start_P_globals] = get_irg_globals(current_ir_graph); + in[pn_Start_P_tls] = get_irg_tls(current_ir_graph); + in[pn_Start_T_args] = new_Tuple(get_Call_n_params(call), get_Call_param_arr(call)); /* in[pn_Start_P_value_arg_base] = ??? */ - pre_call = new_Tuple(pn_Start_max, in); + assert(pn_Start_P_value_arg_base == pn_Start_max - 1 && "pn_Start_P_value_arg_base not supported, fix"); + pre_call = new_Tuple(pn_Start_max - 1, in); post_call = call; /* -- @@ -1353,7 +1356,7 @@ void inline_small_irgs(ir_graph *irg, int size) { ir_graph *callee; callee = get_entity_irg(get_SymConst_entity(get_Call_ptr(env.calls[i]))); if (((_obstack_memory_used(callee->obst) - (int)obstack_room(callee->obst)) < size) || - (get_irg_inline_property(callee) == irg_inline_forced)) { + (get_irg_inline_property(callee) >= irg_inline_forced)) { inline_method(env.calls[i], callee); } } @@ -1536,7 +1539,7 @@ void inline_leave_functions(int maxsize, int leavesize, int size) { if (callee && ((is_smaller(callee, size) && (env->n_nodes < maxsize)) || /* small function */ - (get_irg_inline_property(callee) == irg_inline_forced))) { + (get_irg_inline_property(callee) >= irg_inline_forced))) { if (!phiproj_computed) { phiproj_computed = 1; collect_phiprojs(current_ir_graph);