Commit b2a59b15 by Mike Stump

function.c (identify_blocks): Start with a chain of BLOCKs to match the rest of…

function.c (identify_blocks): Start with a chain of BLOCKs to match the rest of the backend (dbxout.c)...

	* function.c (identify_blocks): Start with a chain of BLOCKs to
	match the rest of the backend (dbxout.c), instead of just one
	BLOCK.
	(reorder_blocks): Ditto.
	(all_blocks): Ditto.

	* stmt.c (find_loop_tree_blocks): Pass the toplevel list of
	blocks, not just the first subblock.
Fixes unroll1.C.

From-SVN: r10712
parent 869b061c
...@@ -4532,33 +4532,34 @@ round_trampoline_addr (tramp) ...@@ -4532,33 +4532,34 @@ round_trampoline_addr (tramp)
duplicate portions of the RTL code. Call identify_blocks before duplicate portions of the RTL code. Call identify_blocks before
changing the RTL, and call reorder_blocks after. */ changing the RTL, and call reorder_blocks after. */
/* Put all this function's BLOCK nodes into a vector, and return it. /* Put all this function's BLOCK nodes including those that are chained
onto the first block into a vector, and return it.
Also store in each NOTE for the beginning or end of a block Also store in each NOTE for the beginning or end of a block
the index of that block in the vector. the index of that block in the vector.
The arguments are TOP_BLOCK, the top-level block of the function, The arguments are BLOCK, the chain of top-level blocks of the function,
and INSNS, the insn chain of the function. */ and INSNS, the insn chain of the function. */
tree * tree *
identify_blocks (top_block, insns) identify_blocks (block, insns)
tree top_block; tree block;
rtx insns; rtx insns;
{ {
int n_blocks; int n_blocks;
tree *block_vector; tree *block_vector;
int *block_stack; int *block_stack;
int depth = 0; int depth = 0;
int next_block_number = 0; int next_block_number = 1;
int current_block_number = 0; int current_block_number = 1;
rtx insn; rtx insn;
if (top_block == 0) if (block == 0)
return 0; return 0;
n_blocks = all_blocks (top_block, 0); n_blocks = all_blocks (block, 0);
block_vector = (tree *) xmalloc (n_blocks * sizeof (tree)); block_vector = (tree *) xmalloc (n_blocks * sizeof (tree));
block_stack = (int *) alloca (n_blocks * sizeof (int)); block_stack = (int *) alloca (n_blocks * sizeof (int));
all_blocks (top_block, block_vector); all_blocks (block, block_vector);
for (insn = insns; insn; insn = NEXT_INSN (insn)) for (insn = insns; insn; insn = NEXT_INSN (insn))
if (GET_CODE (insn) == NOTE) if (GET_CODE (insn) == NOTE)
...@@ -4576,6 +4577,9 @@ identify_blocks (top_block, insns) ...@@ -4576,6 +4577,9 @@ identify_blocks (top_block, insns)
} }
} }
if (n_blocks != next_block_number)
abort ();
return block_vector; return block_vector;
} }
...@@ -4586,19 +4590,20 @@ identify_blocks (top_block, insns) ...@@ -4586,19 +4590,20 @@ identify_blocks (top_block, insns)
Returns the current top-level block. */ Returns the current top-level block. */
tree tree
reorder_blocks (block_vector, top_block, insns) reorder_blocks (block_vector, block, insns)
tree *block_vector; tree *block_vector;
tree top_block; tree block;
rtx insns; rtx insns;
{ {
tree current_block = top_block; tree current_block = block;
rtx insn; rtx insn;
if (block_vector == 0) if (block_vector == 0)
return top_block; return block;
/* Prune the old tree away, so that it doesn't get in the way. */ /* Prune the old trees away, so that it doesn't get in the way. */
BLOCK_SUBBLOCKS (current_block) = 0; BLOCK_SUBBLOCKS (current_block) = 0;
BLOCK_CHAIN (current_block) = 0;
for (insn = insns; insn; insn = NEXT_INSN (insn)) for (insn = insns; insn; insn = NEXT_INSN (insn))
if (GET_CODE (insn) == NOTE) if (GET_CODE (insn) == NOTE)
...@@ -4626,6 +4631,8 @@ reorder_blocks (block_vector, top_block, insns) ...@@ -4626,6 +4631,8 @@ reorder_blocks (block_vector, top_block, insns)
} }
} }
BLOCK_SUBBLOCKS (current_block)
= blocks_nreverse (BLOCK_SUBBLOCKS (current_block));
return current_block; return current_block;
} }
...@@ -4646,26 +4653,32 @@ blocks_nreverse (t) ...@@ -4646,26 +4653,32 @@ blocks_nreverse (t)
return prev; return prev;
} }
/* Count the subblocks of BLOCK, and list them all into the vector VECTOR. /* Count the subblocks of the list starting with BLOCK, and list them
Also clear TREE_ASM_WRITTEN in all blocks. */ all into the vector VECTOR. Also clear TREE_ASM_WRITTEN in all
blocks. */
static int static int
all_blocks (block, vector) all_blocks (block, vector)
tree block; tree block;
tree *vector; tree *vector;
{ {
int n_blocks = 1; int n_blocks = 0;
tree subblocks;
while (block)
TREE_ASM_WRITTEN (block) = 0; {
/* Record this block. */ TREE_ASM_WRITTEN (block) = 0;
if (vector)
vector[0] = block; /* Record this block. */
if (vector)
/* Record the subblocks, and their subblocks. */ vector[n_blocks] = block;
for (subblocks = BLOCK_SUBBLOCKS (block);
subblocks; subblocks = BLOCK_CHAIN (subblocks)) ++n_blocks;
n_blocks += all_blocks (subblocks, vector ? vector + n_blocks : 0);
/* Record the subblocks, and their subblocks... */
n_blocks += all_blocks (BLOCK_SUBBLOCKS (block),
vector ? vector + n_blocks : 0);
block = BLOCK_CHAIN (block);
}
return n_blocks; return n_blocks;
} }
......
...@@ -5866,10 +5866,6 @@ find_loop_tree_blocks () ...@@ -5866,10 +5866,6 @@ find_loop_tree_blocks ()
{ {
tree block = DECL_INITIAL (current_function_decl); tree block = DECL_INITIAL (current_function_decl);
/* There first block is for the function body, and does not have
corresponding block notes. Don't include it in the block vector. */
block = BLOCK_SUBBLOCKS (block);
block_vector = identify_blocks (block, get_insns ()); block_vector = identify_blocks (block, get_insns ());
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment