diff options
author | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-01-16 13:48:51 +0000 |
---|---|---|
committer | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-01-16 13:48:51 +0000 |
commit | 17e855231d200fa22ae291794f5734be92ffd576 (patch) | |
tree | d817cd44228cfb7d85772f21d53ff970f6238bf6 /gcc/lcm.c | |
parent | 4edd2c141bd6e4aaf40320154b7ec6ee890257d3 (diff) | |
download | gcc-17e855231d200fa22ae291794f5734be92ffd576.tar.gz |
2014-01-16 Richard Biener <rguenther@suse.de>
PR rtl-optimization/46590
* lcm.c (compute_antinout_edge): Use postorder iteration.
(compute_laterin): Use inverted postorder iteration.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@206663 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/lcm.c')
-rw-r--r-- | gcc/lcm.c | 27 |
1 files changed, 19 insertions, 8 deletions
diff --git a/gcc/lcm.c b/gcc/lcm.c index 70d96c14d7c..2f02129aaeb 100644 --- a/gcc/lcm.c +++ b/gcc/lcm.c @@ -109,11 +109,15 @@ compute_antinout_edge (sbitmap *antloc, sbitmap *transp, sbitmap *antin, /* Put every block on the worklist; this is necessary because of the optimistic initialization of ANTIN above. */ - FOR_EACH_BB_REVERSE_FN (bb, cfun) + int *postorder = XNEWVEC (int, n_basic_blocks_for_fn (cfun)); + int postorder_num = post_order_compute (postorder, false, false); + for (int i = 0; i < postorder_num; ++i) { + bb = BASIC_BLOCK_FOR_FN (cfun, postorder[i]); *qin++ = bb; bb->aux = bb; } + free (postorder); qin = worklist; qend = &worklist[n_basic_blocks_for_fn (cfun) - NUM_FIXED_BLOCKS]; @@ -281,11 +285,18 @@ compute_laterin (struct edge_list *edge_list, sbitmap *earliest, /* Add all the blocks to the worklist. This prevents an early exit from the loop given our optimistic initialization of LATER above. */ - FOR_EACH_BB_FN (bb, cfun) + int *postorder = XNEWVEC (int, n_basic_blocks_for_fn (cfun)); + int postorder_num = inverted_post_order_compute (postorder); + for (int i = 0; i < postorder_num; ++i) { + bb = BASIC_BLOCK_FOR_FN (cfun, postorder[i]); + if (bb == EXIT_BLOCK_PTR_FOR_FN (cfun) + || bb == ENTRY_BLOCK_PTR_FOR_FN (cfun)) + continue; *qin++ = bb; bb->aux = bb; } + free (postorder); /* Note that we do not use the last allocated element for our queue, as EXIT_BLOCK is never inserted into it. */ @@ -307,14 +318,14 @@ compute_laterin (struct edge_list *edge_list, sbitmap *earliest, bitmap_ones (laterin[bb->index]); FOR_EACH_EDGE (e, ei, bb->preds) bitmap_and (laterin[bb->index], laterin[bb->index], - later[(size_t)e->aux]); + later[(size_t)e->aux]); /* Calculate LATER for all outgoing edges. */ FOR_EACH_EDGE (e, ei, bb->succs) if (bitmap_ior_and_compl (later[(size_t) e->aux], - earliest[(size_t) e->aux], - laterin[e->src->index], - antloc[e->src->index]) + earliest[(size_t) e->aux], + laterin[bb->index], + antloc[bb->index]) /* If LATER for an outgoing edge was changed, then we need to add the target of the outgoing edge to the worklist. */ && e->dest != EXIT_BLOCK_PTR_FOR_FN (cfun) && e->dest->aux == 0) @@ -333,8 +344,8 @@ compute_laterin (struct edge_list *edge_list, sbitmap *earliest, bitmap_ones (laterin[last_basic_block_for_fn (cfun)]); FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR_FOR_FN (cfun)->preds) bitmap_and (laterin[last_basic_block_for_fn (cfun)], - laterin[last_basic_block_for_fn (cfun)], - later[(size_t) e->aux]); + laterin[last_basic_block_for_fn (cfun)], + later[(size_t) e->aux]); clear_aux_for_edges (); free (worklist); |