cleanup
[libfirm] / ir / opt / cfopt.c
index 71cfc7d..d6f3c0e 100644 (file)
@@ -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);
 }
 
@@ -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, 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);