}
/** 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;
}
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;
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);
}
}
/**
- * 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)
/*
* 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 };
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;
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);
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);