aboutsummaryrefslogtreecommitdiff
path: root/gcc/function.c
diff options
context:
space:
mode:
authorMike Stump <mrs@gcc.gnu.org>1995-12-14 00:00:20 +0000
committerMike Stump <mrs@gcc.gnu.org>1995-12-14 00:00:20 +0000
commitb2a59b15891d92c62c133cb11c3cf92b4957ff44 (patch)
treeb45b96066205616fd1bd9a97ac535029be41f8ce /gcc/function.c
parent869b061cfae61d30a1d5fcedc1e70ddb522e0f7b (diff)
downloadgcc-b2a59b15891d92c62c133cb11c3cf92b4957ff44.zip
gcc-b2a59b15891d92c62c133cb11c3cf92b4957ff44.tar.gz
gcc-b2a59b15891d92c62c133cb11c3cf92b4957ff44.tar.bz2
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
Diffstat (limited to 'gcc/function.c')
-rw-r--r--gcc/function.c69
1 files changed, 41 insertions, 28 deletions
diff --git a/gcc/function.c b/gcc/function.c
index e45eec6..3433e19 100644
--- a/gcc/function.c
+++ b/gcc/function.c
@@ -4532,33 +4532,34 @@ round_trampoline_addr (tramp)
duplicate portions of the RTL code. Call identify_blocks before
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
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. */
tree *
-identify_blocks (top_block, insns)
- tree top_block;
+identify_blocks (block, insns)
+ tree block;
rtx insns;
{
int n_blocks;
tree *block_vector;
int *block_stack;
int depth = 0;
- int next_block_number = 0;
- int current_block_number = 0;
+ int next_block_number = 1;
+ int current_block_number = 1;
rtx insn;
- if (top_block == 0)
+ if (block == 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_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))
if (GET_CODE (insn) == NOTE)
@@ -4576,6 +4577,9 @@ identify_blocks (top_block, insns)
}
}
+ if (n_blocks != next_block_number)
+ abort ();
+
return block_vector;
}
@@ -4586,19 +4590,20 @@ identify_blocks (top_block, insns)
Returns the current top-level block. */
tree
-reorder_blocks (block_vector, top_block, insns)
+reorder_blocks (block_vector, block, insns)
tree *block_vector;
- tree top_block;
+ tree block;
rtx insns;
{
- tree current_block = top_block;
+ tree current_block = block;
rtx insn;
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_CHAIN (current_block) = 0;
for (insn = insns; insn; insn = NEXT_INSN (insn))
if (GET_CODE (insn) == NOTE)
@@ -4626,6 +4631,8 @@ reorder_blocks (block_vector, top_block, insns)
}
}
+ BLOCK_SUBBLOCKS (current_block)
+ = blocks_nreverse (BLOCK_SUBBLOCKS (current_block));
return current_block;
}
@@ -4646,26 +4653,32 @@ blocks_nreverse (t)
return prev;
}
-/* Count the subblocks of BLOCK, and list them all into the vector VECTOR.
- Also clear TREE_ASM_WRITTEN in all blocks. */
+/* Count the subblocks of the list starting with BLOCK, and list them
+ all into the vector VECTOR. Also clear TREE_ASM_WRITTEN in all
+ blocks. */
static int
all_blocks (block, vector)
tree block;
tree *vector;
{
- int n_blocks = 1;
- tree subblocks;
-
- TREE_ASM_WRITTEN (block) = 0;
- /* Record this block. */
- if (vector)
- vector[0] = block;
-
- /* Record the subblocks, and their subblocks. */
- for (subblocks = BLOCK_SUBBLOCKS (block);
- subblocks; subblocks = BLOCK_CHAIN (subblocks))
- n_blocks += all_blocks (subblocks, vector ? vector + n_blocks : 0);
+ int n_blocks = 0;
+
+ while (block)
+ {
+ TREE_ASM_WRITTEN (block) = 0;
+
+ /* Record this block. */
+ if (vector)
+ vector[n_blocks] = block;
+
+ ++n_blocks;
+
+ /* 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;
}