+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
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 *));
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));
/* 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;