X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fopt%2Fcfopt.c;h=d6f3c0ea715ec200c2023b9ecfce677639c05939;hb=762b472fc81c73cf7a1b0041b8cd286b7206d79d;hp=d833f8fe86430b5406ab5a945f35cf4f28a0831c;hpb=2b7851654f662026548655434f80c7fce7f5de5a;p=libfirm diff --git a/ir/opt/cfopt.c b/ir/opt/cfopt.c index d833f8fe8..d6f3c0ea7 100644 --- a/ir/opt/cfopt.c +++ b/ir/opt/cfopt.c @@ -79,7 +79,8 @@ static bool is_Block_removable(ir_node *block) } /** checks if a given Cond node is a switch Cond. */ -static bool is_switch_Cond(ir_node *cond) { +static bool is_switch_Cond(ir_node *cond) +{ ir_node *sel = get_Cond_selector(cond); return get_irn_mode(sel) != mode_b; } @@ -283,6 +284,11 @@ static void optimize_blocks(ir_node *b, void *ctx) ir_node **in; merge_env *env = (merge_env*)ctx; + if (get_Block_dom_depth(b) < 0) { + /* ignore unreachable blocks */ + return; + } + /* Count the number of predecessor if this block is merged with pred blocks that are empty. */ max_preds = 0; @@ -597,33 +603,46 @@ typedef enum block_flags_t { BF_IS_UNKNOWN_JUMP_TARGET = 1 << 2, } block_flags_t; -static bool get_phase_flag(ir_phase *block_info, ir_node *block, int flag) { - return ((int)phase_get_irn_data(block_info, block)) & flag; +static bool get_phase_flag(ir_phase *block_info, ir_node *block, int flag) +{ + return PTR_TO_INT(phase_get_irn_data(block_info, block)) & flag; } -static void set_phase_flag(ir_phase *block_info, ir_node *block, int flag) { - int data = (int)phase_get_irn_data(block_info, block); + +static void set_phase_flag(ir_phase *block_info, ir_node *block, + block_flags_t flag) +{ + int data = PTR_TO_INT(phase_get_irn_data(block_info, block)); data |= flag; - phase_set_irn_data(block_info, block, (void*)data); + phase_set_irn_data(block_info, block, INT_TO_PTR(data)); } -static bool has_operations(ir_phase *block_info, ir_node *block) { +static bool has_operations(ir_phase *block_info, ir_node *block) +{ return get_phase_flag(block_info, block, BF_HAS_OPERATIONS); } -static void set_has_operations(ir_phase *block_info, ir_node *block) { + +static void set_has_operations(ir_phase *block_info, ir_node *block) +{ set_phase_flag(block_info, block, BF_HAS_OPERATIONS); } -static bool has_phis(ir_phase *block_info, ir_node *block) { +static bool has_phis(ir_phase *block_info, ir_node *block) +{ return get_phase_flag(block_info, block, BF_HAS_PHIS); } -static void set_has_phis(ir_phase *block_info, ir_node *block) { + +static void set_has_phis(ir_phase *block_info, ir_node *block) +{ set_phase_flag(block_info, block, BF_HAS_PHIS); } -static bool is_unknown_jump_target(ir_phase *block_info, ir_node *block) { +static bool is_unknown_jump_target(ir_phase *block_info, ir_node *block) +{ return get_phase_flag(block_info, block, BF_IS_UNKNOWN_JUMP_TARGET); } -static void set_is_unknown_jump_target(ir_phase *block_info, ir_node *block) { + +static void set_is_unknown_jump_target(ir_phase *block_info, ir_node *block) +{ set_phase_flag(block_info, block, BF_IS_UNKNOWN_JUMP_TARGET); } @@ -681,7 +700,7 @@ static void optimize_ifs(ir_node *block, void *x) } /** - * Post-Block walker: remove empty blocks that are + * Pre-Block walker: remove empty blocks that are * predecessors of the current block. */ static void remove_empty_blocks(ir_node *block, void *x) @@ -718,7 +737,8 @@ static void remove_empty_blocks(ir_node *block, void *x) /* * Some cfg optimizations, which do not touch Phi nodes */ -static void cfgopt_ignoring_phis(ir_graph *irg) { +static void cfgopt_ignoring_phis(ir_graph *irg) +{ ir_phase *block_info = new_phase(irg, NULL); skip_env env = { false, block_info }; @@ -727,14 +747,14 @@ static void cfgopt_ignoring_phis(ir_graph *irg) { for (;;) { env.changed = false; - /* useless if optimization: will not touch empty blocks */ + /* optimize useless ifs: will not touch empty blocks */ irg_block_walk_graph(irg, NULL, optimize_ifs, &env); /* Remove empty blocks */ - irg_block_walk_graph(irg, NULL, remove_empty_blocks, &env); + irg_block_walk_graph(irg, remove_empty_blocks, NULL, &env); if (env.changed) { set_irg_doms_inconsistent(irg); - /* Removing blocks might enable more Cond optimizations */ + /* Removing blocks might enable more useless-if optimizations */ continue; } else { break; @@ -799,7 +819,6 @@ void optimize_cf(ir_graph *irg) if (!changed) break; - set_irg_outs_inconsistent(irg); set_irg_doms_inconsistent(irg); set_irg_extblk_inconsistent(irg); set_irg_entity_usage_state(irg, ir_entity_usage_not_computed); @@ -864,7 +883,6 @@ void optimize_cf(ir_graph *irg) if (env.changed) { /* Handle graph state if was changed. */ - set_irg_outs_inconsistent(irg); set_irg_doms_inconsistent(irg); set_irg_extblk_inconsistent(irg); set_irg_entity_usage_state(irg, ir_entity_usage_not_computed);