verify: Clarify assertion message.
[libfirm] / ir / opt / boolopt.c
index 204b3c2..e1d70eb 100644 (file)
@@ -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. */