diff options
author | DJ Delorie <dj@redhat.com> | 2001-01-05 16:13:42 -0500 |
---|---|---|
committer | DJ Delorie <dj@gcc.gnu.org> | 2001-01-05 16:13:42 -0500 |
commit | cc1fe44fe8e436d002c0d9245f449ce131918bfa (patch) | |
tree | 266940bd84b12c6fb47ca4f802ecf3412a8b8fe4 /gcc/function.c | |
parent | 8b03b9843b8129d41b806a5e26f0da6142cc7468 (diff) | |
download | gcc-cc1fe44fe8e436d002c0d9245f449ce131918bfa.zip gcc-cc1fe44fe8e436d002c0d9245f449ce131918bfa.tar.gz gcc-cc1fe44fe8e436d002c0d9245f449ce131918bfa.tar.bz2 |
function.c (reorder_blocks): Make sure the flags are all reset before using them to mark blocks...
* function.c (reorder_blocks): Make sure the flags are all reset
before using them to mark blocks, else a second invocation will
corrupt the block chain.
(reorder_blocks_0): New, resets the flags.
From-SVN: r38724
Diffstat (limited to 'gcc/function.c')
-rw-r--r-- | gcc/function.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/gcc/function.c b/gcc/function.c index 90ca36a..385dbc3 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -275,6 +275,7 @@ static void pad_below PARAMS ((struct args_size *, enum machine_mode, static rtx round_trampoline_addr PARAMS ((rtx)); static rtx adjust_trampoline_addr PARAMS ((rtx)); static tree *identify_blocks_1 PARAMS ((rtx, tree *, tree *, tree *)); +static void reorder_blocks_0 PARAMS ((rtx)); static void reorder_blocks_1 PARAMS ((rtx, tree, varray_type *)); static tree blocks_nreverse PARAMS ((tree)); static int all_blocks PARAMS ((tree, tree *)); @@ -5789,6 +5790,7 @@ reorder_blocks () BLOCK_SUBBLOCKS (block) = NULL_TREE; BLOCK_CHAIN (block) = NULL_TREE; + reorder_blocks_0 (get_insns ()); reorder_blocks_1 (get_insns (), block, &block_stack); BLOCK_SUBBLOCKS (block) = blocks_nreverse (BLOCK_SUBBLOCKS (block)); @@ -5800,6 +5802,35 @@ reorder_blocks () at INSNS. Recurse for CALL_PLACEHOLDER insns. */ static void +reorder_blocks_0 (insns) + rtx insns; +{ + rtx insn; + + for (insn = insns; insn; insn = NEXT_INSN (insn)) + { + if (GET_CODE (insn) == NOTE) + { + if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_BLOCK_BEG) + { + tree block = NOTE_BLOCK (insn); + TREE_ASM_WRITTEN (block) = 0; + } + } + else if (GET_CODE (insn) == CALL_INSN + && GET_CODE (PATTERN (insn)) == CALL_PLACEHOLDER) + { + rtx cp = PATTERN (insn); + reorder_blocks_0 (XEXP (cp, 0)); + if (XEXP (cp, 1)) + reorder_blocks_0 (XEXP (cp, 1)); + if (XEXP (cp, 2)) + reorder_blocks_0 (XEXP (cp, 2)); + } + } +} + +static void reorder_blocks_1 (insns, current_block, p_block_stack) rtx insns; tree current_block; |