Commit 64a05bd2 authored by Andreas Zwinkau's avatar Andreas Zwinkau
Browse files

code placement fixes gcse

GCSEing nodes into unreachable blocks is ok now. The
verifier does not check the cfg, when irg is floating.
Code placement fixes and pins the irg after gcse.
Nodes in unreachable blocks are moved into the first block
after the start block.

Reachability checks in place_late are converted into asserts,
because after place_early, there are no unreachable blocks anymore.

reverts c64fe299 and 318579c4
but also fixes opt/unreachable_block
parent 318579c4
......@@ -6129,16 +6129,6 @@ ir_node *identify_remember(ir_node *n)
if (value_table == NULL)
return n;
if (get_opt_global_cse()) {
/* do not remember unreachable nodes */
if (!is_Block(n)) {
ir_node *block = get_nodes_block(n);
if (is_block_unreachable(block)) {
return n;
}
}
}
ir_normalize_node(n);
/* lookup or insert in hash table with given hash key. */
nn = (ir_node*)pset_insert(value_table, n, ir_node_hash(n));
......
......@@ -1999,7 +1999,7 @@ int irg_verify(ir_graph *irg, unsigned flags)
last_irg_error = NULL;
#endif /* NDEBUG */
if (!check_cfg(irg))
if (pinned && !check_cfg(irg))
res = 0;
if (res == 1 && (flags & VERIFY_ENFORCE_SSA) && pinned)
......
......@@ -95,10 +95,6 @@ static void place_floats_early(ir_node *n, waitq *worklist)
}
block = get_nodes_block(n);
/* do not move unreachable code (or its predecessors around) since dominance
* is inalid there */
if (!is_block_reachable(block))
return;
/* first move predecessors up */
arity = get_irn_arity(n);
......@@ -215,8 +211,8 @@ static ir_node *consumer_dom_dca(ir_node *dca, ir_node *consumer,
if (is_Bad(new_block))
continue;
if (is_block_reachable(new_block))
dca = calc_dom_dca(dca, new_block);
assert(is_block_reachable(new_block));
dca = calc_dom_dca(dca, new_block);
}
}
} else {
......@@ -285,10 +281,7 @@ static ir_node *get_deepest_common_dom_ancestor(ir_node *node, ir_node *dca)
* the users of Proj are our users. */
dca = get_deepest_common_dom_ancestor(succ, dca);
} else {
/* ignore successors in unreachable code */
ir_node *succ_blk = get_nodes_block(succ);
if (!is_block_reachable(succ_blk))
continue;
assert(is_block_reachable(get_nodes_block(succ)));
dca = consumer_dom_dca(dca, succ, node);
}
}
......@@ -364,10 +357,8 @@ static void place_floats_late(ir_node *n, pdeq *worklist)
return;
}
/* don't move unreachable code around */
block = get_nodes_block(n);
if (!is_block_reachable(block))
return;
assert(is_block_reachable(block));
/* deepest common ancestor in the dominator tree of all nodes'
blocks depending on us; our final placement has to dominate
......@@ -422,6 +413,9 @@ void place_code(ir_graph *irg)
worklist = new_waitq();
place_early(irg, worklist);
/* While GCSE might place nodes in unreachable blocks,
* these are now placed in reachable blocks. */
/* Note: place_early changes only blocks, no data edges. So, the
* data out edges are still valid, no need to recalculate them here. */
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment