aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorDJ Delorie <dj@redhat.com>2001-01-05 16:13:42 -0500
committerDJ Delorie <dj@gcc.gnu.org>2001-01-05 16:13:42 -0500
commitcc1fe44fe8e436d002c0d9245f449ce131918bfa (patch)
tree266940bd84b12c6fb47ca4f802ecf3412a8b8fe4 /gcc
parent8b03b9843b8129d41b806a5e26f0da6142cc7468 (diff)
downloadgcc-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')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/function.c31
2 files changed, 38 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 650faa7..649c391 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2001-01-05 DJ Delorie <dj@redhat.com>
+
+ * 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.
+
Fri Jan 5 20:34:06 2001 J"orn Rennecke <amylaar@redhat.com>
* cse.c (find_comparison_args): Stop if the argument is known to
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;