function.c (reorder_blocks): Make sure the flags are all reset before using them...
authorDJ Delorie <dj@redhat.com>
Fri, 5 Jan 2001 21:13:42 +0000 (16:13 -0500)
committerDJ Delorie <dj@gcc.gnu.org>
Fri, 5 Jan 2001 21:13:42 +0000 (16:13 -0500)
* 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

gcc/ChangeLog
gcc/function.c

index 650faa7838f9c398330a8f4b9b71fc92f35e8d06..649c3914d9ccc98e420a6738e78aaf8eb4cfc731 100644 (file)
@@ -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
index 90ca36a5b6a4ba797962c98ebc30616fd0ff0613..385dbc3d931770ca8c80565b46cd3e79649e76dd 100644 (file)
@@ -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));
@@ -5799,6 +5801,35 @@ reorder_blocks ()
 /* Helper function for reorder_blocks.  Process the insn chain beginning
    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;