From 32fc212e2d06debb2ac9ee30b5ff237e076b03e6 Mon Sep 17 00:00:00 2001 From: Matthias Braun Date: Mon, 2 May 2011 11:06:33 +0200 Subject: [PATCH] also do unreachable code elimination during gcse --- ir/ir/irgopt.c | 16 ++++++++-------- ir/ir/iropt.c | 8 +++----- ir/opt/code_placement.c | 23 +---------------------- 3 files changed, 12 insertions(+), 35 deletions(-) diff --git a/ir/ir/irgopt.c b/ir/ir/irgopt.c index fc27fb53a..ee977ae11 100644 --- a/ir/ir/irgopt.c +++ b/ir/ir/irgopt.c @@ -187,16 +187,16 @@ int optimize_graph_df(ir_graph *irg) if (get_opt_global_cse()) { set_irg_pinned(irg, op_pin_state_floats); - } else { - /* The following enables unreachable code elimination (=Blocks may be - * Bad). We cannot enable it in global_cse nodes since we can't - * determine a nodes block there and therefore can't remove all code - * in unreachable blocks */ - set_irg_state(irg, IR_GRAPH_STATE_BAD_BLOCK); - if (get_irg_dom_state(irg) == dom_consistent) - irg_block_walk_graph(irg, NULL, kill_dead_blocks, NULL); } + /* The following enables unreachable code elimination (=Blocks may be + * Bad). We cannot enable it in global_cse nodes since we can't + * determine a nodes block there and therefore can't remove all code + * in unreachable blocks */ + set_irg_state(irg, IR_GRAPH_STATE_BAD_BLOCK); + if (get_irg_dom_state(irg) == dom_consistent) + irg_block_walk_graph(irg, NULL, kill_dead_blocks, NULL); + /* invalidate info */ set_irg_outs_inconsistent(irg); set_irg_doms_inconsistent(irg); diff --git a/ir/ir/iropt.c b/ir/ir/iropt.c index ac017a333..3565713e9 100644 --- a/ir/ir/iropt.c +++ b/ir/ir/iropt.c @@ -6274,10 +6274,8 @@ static ir_node *gigo(ir_node *node) { ir_op *op = get_irn_op(node); - /* Nodes in bad blocks are bad. - * Beware: we can only read the block of a non-floating node. */ - if (op != op_Block && is_irn_pinned_in_irg(node) - && is_Bad(get_nodes_block(node))) { + /* Code in "Bad" blocks is unreachable and can be replaced by Bad */ + if (op != op_Block && is_Bad(get_nodes_block(node))) { ir_graph *irg = get_irn_irg(node); return get_irg_bad(irg); } @@ -6304,7 +6302,7 @@ static ir_node *gigo(ir_node *node) } return node; -} /* gigo */ +} /** * These optimizations deallocate nodes from the obstack. diff --git a/ir/opt/code_placement.c b/ir/opt/code_placement.c index c8eccefd8..581da7962 100644 --- a/ir/opt/code_placement.c +++ b/ir/opt/code_placement.c @@ -45,14 +45,6 @@ static bool is_block_reachable(ir_node *block) return get_Block_dom_depth(block) >= 0; } -/* mark node as not-visited */ -static void clear_irn_visited(ir_node *node) -{ - ir_graph *irg = get_irn_irg(node); - ir_visited_t visited = get_irg_visited(irg); - set_irn_visited(node, visited-1); -} - /** * Find the earliest correct block for node n. --- Place n into the * same Block as its dominance-deepest Input. @@ -112,20 +104,7 @@ static void place_floats_early(ir_node *n, waitq *worklist) arity = get_irn_arity(n); place_floats_early(block, worklist); for (i = 0; i < arity; ++i) { - ir_node *pred = get_irn_n(n, i); - ir_node *pred_block = get_nodes_block(pred); - - /* gcse can lead to predecessors of reachable code being unreachable. - * Move them into the current block in this case */ - if (!is_block_reachable(pred_block)) { - ir_node *new_pred_block = block; - assert(get_irn_pinned(pred) == op_pin_state_floats); - if (is_Phi(n)) { - new_pred_block = get_Block_cfgpred_block(block, i); - } - set_nodes_block(pred, new_pred_block); - clear_irn_visited(pred); - } + ir_node *pred = get_irn_n(n, i); place_floats_early(pred, worklist); } -- 2.20.1