diff options
author | Ian Lance Taylor <iant@google.com> | 2007-04-17 05:16:07 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@gcc.gnu.org> | 2007-04-17 05:16:07 +0000 |
commit | 5a0ed003f06f858e950ea3098e573d8d4361674e (patch) | |
tree | 0cf93f4213ae1d224aa2bd48a39f53f3538278de /gcc/tree-ssa-propagate.c | |
parent | 591523164b128d507b9d9e22e1fd3be1b72fd943 (diff) | |
download | gcc-5a0ed003f06f858e950ea3098e573d8d4361674e.zip gcc-5a0ed003f06f858e950ea3098e573d8d4361674e.tar.gz gcc-5a0ed003f06f858e950ea3098e573d8d4361674e.tar.bz2 |
tree-ssa-propagate.c (cfg_blocks_add): Insert blocks with fewer predecessors at head rather than tail.
* tree-ssa-propagate.c (cfg_blocks_add): Insert blocks with fewer
predecessors at head rather than tail.
From-SVN: r123906
Diffstat (limited to 'gcc/tree-ssa-propagate.c')
-rw-r--r-- | gcc/tree-ssa-propagate.c | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/gcc/tree-ssa-propagate.c b/gcc/tree-ssa-propagate.c index 1981fa1..df31e25 100644 --- a/gcc/tree-ssa-propagate.c +++ b/gcc/tree-ssa-propagate.c @@ -1,5 +1,5 @@ /* Generic SSA value propagation engine. - Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc. + Copyright (C) 2004, 2005, 2006, 2007 Free Software Foundation, Inc. Contributed by Diego Novillo <dnovillo@redhat.com> This file is part of GCC. @@ -176,6 +176,8 @@ cfg_blocks_empty_p (void) static void cfg_blocks_add (basic_block bb) { + bool head = false; + gcc_assert (bb != ENTRY_BLOCK_PTR && bb != EXIT_BLOCK_PTR); gcc_assert (!TEST_BIT (bb_in_list, bb->index)); @@ -198,12 +200,26 @@ cfg_blocks_add (basic_block bb) cfg_blocks_head = 0; VEC_safe_grow (basic_block, heap, cfg_blocks, 2 * cfg_blocks_tail); } - else + /* Minor optimization: we prefer to see blocks with more + predecessors later, because there is more of a chance that + the incoming edges will be executable. */ + else if (EDGE_COUNT (bb->preds) + >= EDGE_COUNT (VEC_index (basic_block, cfg_blocks, + cfg_blocks_head)->preds)) cfg_blocks_tail = ((cfg_blocks_tail + 1) % VEC_length (basic_block, cfg_blocks)); + else + { + if (cfg_blocks_head == 0) + cfg_blocks_head = VEC_length (basic_block, cfg_blocks); + --cfg_blocks_head; + head = true; + } } - VEC_replace (basic_block, cfg_blocks, cfg_blocks_tail, bb); + VEC_replace (basic_block, cfg_blocks, + head ? cfg_blocks_head : cfg_blocks_tail, + bb); SET_BIT (bb_in_list, bb->index); } |