diff options
author | Jakub Jelinek <jakub@redhat.com> | 2010-08-17 08:49:20 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2010-08-17 08:49:20 +0200 |
commit | 3373692b59f62e6dfeaa6a3b2f19610bf6ea3886 (patch) | |
tree | a478ba67dac0179edb4b87851b971667925e632c /gcc/function.c | |
parent | 4681303cfd11c83d55eab82e874b6100b3d107e0 (diff) | |
download | gcc-3373692b59f62e6dfeaa6a3b2f19610bf6ea3886.zip gcc-3373692b59f62e6dfeaa6a3b2f19610bf6ea3886.tar.gz gcc-3373692b59f62e6dfeaa6a3b2f19610bf6ea3886.tar.bz2 |
function.c (block_fragments_nreverse, [...]): New functions.
* function.c (block_fragments_nreverse, blocks_nreverse_all): New
functions.
(reorder_blocks): Use blocks_nreverse_all instead of blocks_nreverse.
(reorder_blocks_1): Assert BLOCK_FRAGMENT_ORIGIN is NULL. Don't
call block_nreverse here.
(blocks_nreverse): Rename decl temporary to block.
From-SVN: r163292
Diffstat (limited to 'gcc/function.c')
-rw-r--r-- | gcc/function.c | 59 |
1 files changed, 48 insertions, 11 deletions
diff --git a/gcc/function.c b/gcc/function.c index 5a4dc10..95b9577 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -3953,6 +3953,46 @@ generate_setjmp_warnings (void) } +/* Reverse the order of elements in the fragment chain T of blocks, + and return the new head of the chain (old last element). */ + +static tree +block_fragments_nreverse (tree t) +{ + tree prev = 0, block, next; + for (block = t; block; block = next) + { + next = BLOCK_FRAGMENT_CHAIN (block); + BLOCK_FRAGMENT_CHAIN (block) = prev; + prev = block; + } + return prev; +} + +/* Reverse the order of elements in the chain T of blocks, + and return the new head of the chain (old last element). + Also do the same on subblocks and reverse the order of elements + in BLOCK_FRAGMENT_CHAIN as well. */ + +static tree +blocks_nreverse_all (tree t) +{ + tree prev = 0, block, next; + for (block = t; block; block = next) + { + next = BLOCK_CHAIN (block); + BLOCK_CHAIN (block) = prev; + BLOCK_SUBBLOCKS (block) = blocks_nreverse_all (BLOCK_SUBBLOCKS (block)); + if (BLOCK_FRAGMENT_CHAIN (block) + && BLOCK_FRAGMENT_ORIGIN (block) == NULL_TREE) + BLOCK_FRAGMENT_CHAIN (block) + = block_fragments_nreverse (BLOCK_FRAGMENT_CHAIN (block)); + prev = block; + } + return prev; +} + + /* Identify BLOCKs referenced by more than one NOTE_INSN_BLOCK_{BEG,END}, and create duplicate blocks. */ /* ??? Need an option to either create block fragments or to create @@ -3979,7 +4019,7 @@ reorder_blocks (void) /* Recreate the block tree from the note nesting. */ reorder_blocks_1 (get_insns (), block, &block_stack); - BLOCK_SUBBLOCKS (block) = blocks_nreverse (BLOCK_SUBBLOCKS (block)); + BLOCK_SUBBLOCKS (block) = blocks_nreverse_all (BLOCK_SUBBLOCKS (block)); VEC_free (tree, heap, block_stack); } @@ -4011,9 +4051,8 @@ reorder_blocks_1 (rtx insns, tree current_block, VEC(tree,heap) **p_block_stack) tree block = NOTE_BLOCK (insn); tree origin; - origin = (BLOCK_FRAGMENT_ORIGIN (block) - ? BLOCK_FRAGMENT_ORIGIN (block) - : block); + gcc_assert (BLOCK_FRAGMENT_ORIGIN (block) == NULL_TREE); + origin = block; /* If we have seen this block before, that means it now spans multiple address regions. Create a new fragment. */ @@ -4050,8 +4089,6 @@ reorder_blocks_1 (rtx insns, tree current_block, VEC(tree,heap) **p_block_stack) else if (NOTE_KIND (insn) == NOTE_INSN_BLOCK_END) { NOTE_BLOCK (insn) = VEC_pop (tree, *p_block_stack); - BLOCK_SUBBLOCKS (current_block) - = blocks_nreverse (BLOCK_SUBBLOCKS (current_block)); current_block = BLOCK_SUPERCONTEXT (current_block); } } @@ -4064,12 +4101,12 @@ reorder_blocks_1 (rtx insns, tree current_block, VEC(tree,heap) **p_block_stack) tree blocks_nreverse (tree t) { - tree prev = 0, decl, next; - for (decl = t; decl; decl = next) + tree prev = 0, block, next; + for (block = t; block; block = next) { - next = BLOCK_CHAIN (decl); - BLOCK_CHAIN (decl) = prev; - prev = decl; + next = BLOCK_CHAIN (block); + BLOCK_CHAIN (block) = prev; + prev = block; } return prev; } |