Commit 611a7c7e by Jeff Law Committed by Jeff Law

tree-ssa-threadupdate.c (thread_through_all_blocks): Thread blocks is post order.

	* tree-ssa-threadupdate.c (thread_through_all_blocks): Thread
	blocks is post order.

From-SVN: r254752
parent 171a55e7
2017-11-14 Jeff Law <law@redhat.com>
* tree-ssa-threadupdate.c (thread_through_all_blocks): Thread
blocks is post order.
2017-11-15 Alexandre Oliva <aoliva@redhat.com> 2017-11-15 Alexandre Oliva <aoliva@redhat.com>
* dumpfile.h (TDF_COMPARE_DEBUG): New. * dumpfile.h (TDF_COMPARE_DEBUG): New.
...@@ -2174,7 +2174,6 @@ thread_through_all_blocks (bool may_peel_loop_headers) ...@@ -2174,7 +2174,6 @@ thread_through_all_blocks (bool may_peel_loop_headers)
{ {
bool retval = false; bool retval = false;
unsigned int i; unsigned int i;
bitmap_iterator bi;
struct loop *loop; struct loop *loop;
auto_bitmap threaded_blocks; auto_bitmap threaded_blocks;
...@@ -2278,15 +2277,34 @@ thread_through_all_blocks (bool may_peel_loop_headers) ...@@ -2278,15 +2277,34 @@ thread_through_all_blocks (bool may_peel_loop_headers)
initialize_original_copy_tables (); initialize_original_copy_tables ();
/* First perform the threading requests that do not affect /* The order in which we process jump threads can be important.
loop structure. */
EXECUTE_IF_SET_IN_BITMAP (threaded_blocks, 0, i, bi) Consider if we have two jump threading paths A and B. If the
{ target edge of A is the starting edge of B and we thread path A
basic_block bb = BASIC_BLOCK_FOR_FN (cfun, i); first, then we create an additional incoming edge into B->dest that
we can not discover as a jump threading path on this iteration.
If we instead thread B first, then the edge into B->dest will have
already been redirected before we process path A and path A will
natually, with no further work, target the redirected path for B.
if (EDGE_COUNT (bb->preds) > 0) An post-order is sufficient here. Compute the ordering first, then
process the blocks. */
if (!bitmap_empty_p (threaded_blocks))
{
int *postorder = XNEWVEC (int, n_basic_blocks_for_fn (cfun));
unsigned int postorder_num = post_order_compute (postorder, false, false);
for (unsigned int i = 0; i < postorder_num; i++)
{
unsigned int indx = postorder[i];
if (bitmap_bit_p (threaded_blocks, indx))
{
basic_block bb = BASIC_BLOCK_FOR_FN (cfun, indx);
retval |= thread_block (bb, true); retval |= thread_block (bb, true);
} }
}
free (postorder);
}
/* Then perform the threading through loop headers. We start with the /* Then perform the threading through loop headers. We start with the
innermost loop, so that the changes in cfg we perform won't affect innermost loop, so that the changes in cfg we perform won't affect
......
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