X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fopt%2Fboolopt.c;h=e1d70eb77272e83f82329a727d26b94272e318f8;hb=3db23eee84cbabb3f399f1ca820948114a9c837c;hp=204b3c2c67abb0475bf8432760826f196c0a4415;hpb=f8cc15664f571aa7ef89d6f6bc8d5bd2b8ca7d53;p=libfirm diff --git a/ir/opt/boolopt.c b/ir/opt/boolopt.c index 204b3c2c6..e1d70eb77 100644 --- a/ir/opt/boolopt.c +++ b/ir/opt/boolopt.c @@ -38,7 +38,6 @@ #include "tv.h" #include "irpass.h" #include "debug.h" -#include "opt_manage.h" /** Describes a pair of relative conditions lo < hi, lo rel_lo x, hi rel_hi x */ typedef struct cond_pair { @@ -584,8 +583,6 @@ restart: ir_node *lower_block; ir_node *lower_cf; ir_node *cond; - ir_node *cond_selector; - ir_node *lower_pred; lower_cf = get_Block_cfgpred(block, low_idx); lower_cf = skip_empty_blocks(lower_cf); @@ -604,17 +601,11 @@ restart: if (get_Block_mark(lower_block)) continue; - cond_selector = get_Cond_selector(cond); - if (get_irn_mode(cond_selector) != mode_b) - continue; - - lower_pred = get_Block_cfgpred_block(lower_block, 0); - + ir_node *const cond_selector = get_Cond_selector(cond); + ir_node *const lower_pred = get_Block_cfgpred_block(lower_block, 0); for (up_idx = 0; up_idx < n_cfgpreds; ++up_idx) { ir_node *upper_block; ir_node *upper_cf; - ir_node *upper_cond; - ir_node *upper_cond_selector; ir_node *replacement; cond_pair cpair; @@ -628,13 +619,6 @@ restart: if (!block_dominates(upper_block, block)) continue; - assert(is_Proj(upper_cf)); - upper_cond = get_Proj_pred(upper_cf); - assert(is_Cond(upper_cond)); - upper_cond_selector = get_Cond_selector(upper_cond); - if (get_irn_mode(upper_cond_selector) != mode_b) - continue; - /* we have found the structure */ /* check Phis: There must be NO Phi in block that depends on the existence of low block */ @@ -642,11 +626,13 @@ restart: continue; /* all fine, try it */ + ir_node *const upper_cond = get_Proj_pred(upper_cf); + ir_node *const upper_cond_selector = get_Cond_selector(upper_cond); if (!find_cond_pair(cond_selector, upper_cond_selector, &cpair)) continue; /* normalize pncs: we need the true case to jump into the - * common block (ie. conjunctive normal form) */ + * common block (i.e. conjunctive normal form) */ if (get_Proj_proj(lower_cf) == pn_Cond_false) { if (cpair.cmp_lo == cond_selector) { ir_node *cmp = cpair.cmp_lo; @@ -716,10 +702,9 @@ restart: } } -static ir_graph_state_t do_simplify_bool(ir_graph *const irg) +void opt_bool(ir_graph *const irg) { bool_opt_env_t env; - ir_graph_state_t res = 0; /* register a debug mask */ FIRM_DBG_REGISTER(dbg, "firm.opt.bool"); @@ -729,30 +714,14 @@ static ir_graph_state_t do_simplify_bool(ir_graph *const irg) /* optimize simple Andb and Orb cases */ irg_walk_graph(irg, NULL, bool_walk, &env); - ir_reserve_resources(irg, IR_RESOURCE_BLOCK_MARK | IR_RESOURCE_PHI_LIST); - /* now more complicated cases: find control flow And/Or and optimize. */ + ir_reserve_resources(irg, IR_RESOURCE_BLOCK_MARK | IR_RESOURCE_PHI_LIST); irg_walk_graph(irg, clear_block_infos, collect_phis, NULL); irg_block_walk_graph(irg, NULL, find_cf_and_or_walker, &env); - - if (! env.changed) { - res |= IR_GRAPH_STATE_CONSISTENT_DOMINANCE; - } - ir_free_resources(irg, IR_RESOURCE_BLOCK_MARK | IR_RESOURCE_PHI_LIST); - return res; -} - -static optdesc_t opt_simplify_bool = { - "bool-simplification", - IR_GRAPH_STATE_ONE_RETURN, /* works better with one return block only */ - do_simplify_bool, -}; - -void opt_bool(ir_graph *irg) -{ - perform_irg_optimization(irg, &opt_simplify_bool); + confirm_irg_properties(irg, + env.changed ? IR_GRAPH_PROPERTIES_NONE : IR_GRAPH_PROPERTIES_ALL); } /* Creates an ir_graph pass for opt_bool. */