From 384fa74b40e75d771ad513a58886c546b42d67f8 Mon Sep 17 00:00:00 2001 From: Michael Beck Date: Tue, 9 Dec 2008 00:27:14 +0000 Subject: [PATCH] - do not optimize away labeled blocks [r24422] --- ir/ir/iropt.c | 4 ++-- ir/opt/cfopt.c | 7 +++++-- ir/opt/combo.c | 15 ++++++++------- ir/opt/opt_inline.c | 7 ++++--- 4 files changed, 19 insertions(+), 14 deletions(-) diff --git a/ir/ir/iropt.c b/ir/ir/iropt.c index 1211e52da..d1a3e8a6a 100644 --- a/ir/ir/iropt.c +++ b/ir/ir/iropt.c @@ -757,8 +757,8 @@ static ir_node *equivalent_node_Block(ir_node *n) ir_node *oldn = n; int n_preds; - /* don't optimize dead blocks */ - if (is_Block_dead(n)) + /* don't optimize dead or labeled blocks */ + if (is_Block_dead(n) || has_Block_label(n)) return n; n_preds = get_Block_n_cfgpreds(n); diff --git a/ir/opt/cfopt.c b/ir/opt/cfopt.c index 64c60c117..ab624a055 100644 --- a/ir/opt/cfopt.c +++ b/ir/opt/cfopt.c @@ -224,8 +224,11 @@ static void remove_unreachable_blocks_and_conds(ir_node *block, void *env) { *changed |= remove_senseless_conds(block); - /* clear the block mark of all blocks */ - set_Block_removable(block); + /* clear the block mark of all blocks that have NO label */ + if (has_Block_label(block)) + set_Block_removable(block); + else + set_Block_non_removable(block); } /** diff --git a/ir/opt/combo.c b/ir/opt/combo.c index ba516c8d4..9e68175fa 100644 --- a/ir/opt/combo.c +++ b/ir/opt/combo.c @@ -1878,8 +1878,8 @@ static void compute_Block(node_t *node) { int i; ir_node *block = node->node; - if (block == get_irg_start_block(current_ir_graph)) { - /* start block is always reachable */ + if (block == get_irg_start_block(current_ir_graph) || has_Block_label(block)) { + /* start block and labelled blocks are always reachable */ node->type.tv = tarval_reachable; return; } @@ -2914,10 +2914,11 @@ static int only_one_reachable_proj(ir_node *n) { * Return non-zero if the control flow predecessor node pred * is the only reachable control flow exit of its block. * - * @param pred the control flow exit + * @param pred the control flow exit + * @param block the destination block */ -static int can_exchange(ir_node *pred) { - if (is_Start(pred)) +static int can_exchange(ir_node *pred, ir_node *block) { + if (is_Start(pred) || has_Block_label(block)) return 0; else if (is_Jmp(pred)) return 1; @@ -2983,7 +2984,7 @@ static void apply_cf(ir_node *block, void *ctx) { /* only one predecessor combine */ ir_node *pred = skip_Proj(get_Block_cfgpred(block, 0)); - if (can_exchange(pred)) { + if (can_exchange(pred, block)) { ir_node *new_block = get_nodes_block(pred); DB((dbg, LEVEL_1, "Fuse %+F with %+F\n", block, new_block)); DBG_OPT_COMBO(block, new_block, FS_OPT_COMBO_CF); @@ -3074,7 +3075,7 @@ static void apply_cf(ir_node *block, void *ctx) { /* this Block has only one live predecessor */ ir_node *pred = skip_Proj(in_X[0]); - if (can_exchange(pred)) { + if (can_exchange(pred, block)) { ir_node *new_block = get_nodes_block(pred); DBG_OPT_COMBO(block, new_block, FS_OPT_COMBO_CF); exchange(block, new_block); diff --git a/ir/opt/opt_inline.c b/ir/opt/opt_inline.c index ccd33dc07..350434bd5 100644 --- a/ir/opt/opt_inline.c +++ b/ir/opt/opt_inline.c @@ -221,9 +221,10 @@ static void copy_preds(ir_node *n, void *env) { in array contained Bads. Now it's possible. We don't call optimize_in_place as it requires that the fields in ir_graph are set properly. */ - if ((get_opt_control_flow_straightening()) && - (get_Block_n_cfgpreds(nn) == 1) && - is_Jmp(get_Block_cfgpred(nn, 0))) { + if (!has_Block_label(nn) && + get_opt_control_flow_straightening() && + get_Block_n_cfgpreds(nn) == 1 && + is_Jmp(get_Block_cfgpred(nn, 0))) { ir_node *old = get_nodes_block(get_Block_cfgpred(nn, 0)); if (nn == old) { /* Jmp jumps into the block it is in -- deal self cycle. */ -- 2.20.1