X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firgopt.c;h=560d47e081ae7ebfd47d8d16c86aae0bd8bf7d03;hb=169fd803ea2ed08171113c1fd7ab4e528e1ebc26;hp=208b8f220dfd9eff4a9dbca65d37919bda96d2d9;hpb=d1aa8c99b4e1326919e4ed2d19ad5599dae970be;p=libfirm diff --git a/ir/ir/irgopt.c b/ir/ir/irgopt.c index 208b8f220..560d47e08 100644 --- a/ir/ir/irgopt.c +++ b/ir/ir/irgopt.c @@ -92,6 +92,7 @@ optimize_in_place_wrapper (ir_node *n, void *env) { static INLINE void do_local_optimize(ir_node *n) { /* Handle graph state */ assert(get_irg_phase_state(current_ir_graph) != phase_building); + if (get_opt_global_cse()) set_irg_pinned(current_ir_graph, op_pin_state_floats); if (get_irg_outs_state(current_ir_graph) == outs_consistent) @@ -100,7 +101,6 @@ static INLINE void do_local_optimize(ir_node *n) { set_irg_dom_inconsistent(current_ir_graph); set_irg_loopinfo_inconsistent(current_ir_graph); - /* Clean the value_table in irg for the CSE. */ del_identities(current_ir_graph->value_table); current_ir_graph->value_table = new_identities(); @@ -118,11 +118,23 @@ void local_optimize_node(ir_node *n) { current_ir_graph = rem; } +/** + * Block-Walker: uses dominance depth to mark dead blocks. + */ +static void kill_dead_blocks(ir_node *block, void *env) +{ + if (get_Block_dom_depth(block) < 0) + set_Block_dead(block); +} + void local_optimize_graph (ir_graph *irg) { ir_graph *rem = current_ir_graph; current_ir_graph = irg; + if (get_irg_dom_state(current_ir_graph) == dom_consistent) + irg_block_walk_graph(irg, NULL, kill_dead_blocks, NULL); + do_local_optimize(irg->end); current_ir_graph = rem;