mirror of
https://gcc.gnu.org/git/gcc.git
synced 2025-01-13 06:23:55 +08:00
function.c (reorder_fix_fragments): Delete.
* function.c (reorder_fix_fragments): Delete. (reorder_blocks): Don't call it. (reorder_blocks_1): Put all subblocks under the origin block. From-SVN: r115761
This commit is contained in:
parent
e69e3d0e8b
commit
51b7d0069a
@ -1,3 +1,9 @@
|
|||||||
|
2006-07-26 Daniel Jacobowitz <dan@codesourcery.com>
|
||||||
|
|
||||||
|
* function.c (reorder_fix_fragments): Delete.
|
||||||
|
(reorder_blocks): Don't call it.
|
||||||
|
(reorder_blocks_1): Put all subblocks under the origin block.
|
||||||
|
|
||||||
2006-07-26 Zdenek Dvorak <dvorakz@suse.cz>
|
2006-07-26 Zdenek Dvorak <dvorakz@suse.cz>
|
||||||
|
|
||||||
PR rtl-optimization/27907
|
PR rtl-optimization/27907
|
||||||
|
@ -195,7 +195,6 @@ static struct temp_slot *find_temp_slot_from_address (rtx);
|
|||||||
static void pad_to_arg_alignment (struct args_size *, int, struct args_size *);
|
static void pad_to_arg_alignment (struct args_size *, int, struct args_size *);
|
||||||
static void pad_below (struct args_size *, enum machine_mode, tree);
|
static void pad_below (struct args_size *, enum machine_mode, tree);
|
||||||
static void reorder_blocks_1 (rtx, tree, VEC(tree,heap) **);
|
static void reorder_blocks_1 (rtx, tree, VEC(tree,heap) **);
|
||||||
static void reorder_fix_fragments (tree);
|
|
||||||
static int all_blocks (tree, tree *);
|
static int all_blocks (tree, tree *);
|
||||||
static tree *get_block_vector (tree, int *);
|
static tree *get_block_vector (tree, int *);
|
||||||
extern tree debug_find_var_in_block_tree (tree, tree);
|
extern tree debug_find_var_in_block_tree (tree, tree);
|
||||||
@ -3584,9 +3583,6 @@ reorder_blocks (void)
|
|||||||
reorder_blocks_1 (get_insns (), block, &block_stack);
|
reorder_blocks_1 (get_insns (), block, &block_stack);
|
||||||
BLOCK_SUBBLOCKS (block) = blocks_nreverse (BLOCK_SUBBLOCKS (block));
|
BLOCK_SUBBLOCKS (block) = blocks_nreverse (BLOCK_SUBBLOCKS (block));
|
||||||
|
|
||||||
/* Remove deleted blocks from the block fragment chains. */
|
|
||||||
reorder_fix_fragments (block);
|
|
||||||
|
|
||||||
VEC_free (tree, heap, block_stack);
|
VEC_free (tree, heap, block_stack);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3615,17 +3611,18 @@ reorder_blocks_1 (rtx insns, tree current_block, VEC(tree,heap) **p_block_stack)
|
|||||||
if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_BLOCK_BEG)
|
if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_BLOCK_BEG)
|
||||||
{
|
{
|
||||||
tree block = NOTE_BLOCK (insn);
|
tree block = NOTE_BLOCK (insn);
|
||||||
|
tree origin;
|
||||||
|
|
||||||
|
origin = (BLOCK_FRAGMENT_ORIGIN (block)
|
||||||
|
? BLOCK_FRAGMENT_ORIGIN (block)
|
||||||
|
: block);
|
||||||
|
|
||||||
/* If we have seen this block before, that means it now
|
/* If we have seen this block before, that means it now
|
||||||
spans multiple address regions. Create a new fragment. */
|
spans multiple address regions. Create a new fragment. */
|
||||||
if (TREE_ASM_WRITTEN (block))
|
if (TREE_ASM_WRITTEN (block))
|
||||||
{
|
{
|
||||||
tree new_block = copy_node (block);
|
tree new_block = copy_node (block);
|
||||||
tree origin;
|
|
||||||
|
|
||||||
origin = (BLOCK_FRAGMENT_ORIGIN (block)
|
|
||||||
? BLOCK_FRAGMENT_ORIGIN (block)
|
|
||||||
: block);
|
|
||||||
BLOCK_FRAGMENT_ORIGIN (new_block) = origin;
|
BLOCK_FRAGMENT_ORIGIN (new_block) = origin;
|
||||||
BLOCK_FRAGMENT_CHAIN (new_block)
|
BLOCK_FRAGMENT_CHAIN (new_block)
|
||||||
= BLOCK_FRAGMENT_CHAIN (origin);
|
= BLOCK_FRAGMENT_CHAIN (origin);
|
||||||
@ -3642,10 +3639,13 @@ reorder_blocks_1 (rtx insns, tree current_block, VEC(tree,heap) **p_block_stack)
|
|||||||
will cause infinite recursion. */
|
will cause infinite recursion. */
|
||||||
if (block != current_block)
|
if (block != current_block)
|
||||||
{
|
{
|
||||||
|
if (block != origin)
|
||||||
|
gcc_assert (BLOCK_SUPERCONTEXT (origin) == current_block);
|
||||||
|
|
||||||
BLOCK_SUPERCONTEXT (block) = current_block;
|
BLOCK_SUPERCONTEXT (block) = current_block;
|
||||||
BLOCK_CHAIN (block) = BLOCK_SUBBLOCKS (current_block);
|
BLOCK_CHAIN (block) = BLOCK_SUBBLOCKS (current_block);
|
||||||
BLOCK_SUBBLOCKS (current_block) = block;
|
BLOCK_SUBBLOCKS (current_block) = block;
|
||||||
current_block = block;
|
current_block = origin;
|
||||||
}
|
}
|
||||||
VEC_safe_push (tree, heap, *p_block_stack, block);
|
VEC_safe_push (tree, heap, *p_block_stack, block);
|
||||||
}
|
}
|
||||||
@ -3660,61 +3660,6 @@ reorder_blocks_1 (rtx insns, tree current_block, VEC(tree,heap) **p_block_stack)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Rationalize BLOCK_FRAGMENT_ORIGIN. If an origin block no longer
|
|
||||||
appears in the block tree, select one of the fragments to become
|
|
||||||
the new origin block. */
|
|
||||||
|
|
||||||
static void
|
|
||||||
reorder_fix_fragments (tree block)
|
|
||||||
{
|
|
||||||
while (block)
|
|
||||||
{
|
|
||||||
tree dup_origin = BLOCK_FRAGMENT_ORIGIN (block);
|
|
||||||
tree new_origin = NULL_TREE;
|
|
||||||
|
|
||||||
if (dup_origin)
|
|
||||||
{
|
|
||||||
if (! TREE_ASM_WRITTEN (dup_origin))
|
|
||||||
{
|
|
||||||
new_origin = BLOCK_FRAGMENT_CHAIN (dup_origin);
|
|
||||||
|
|
||||||
/* Find the first of the remaining fragments. There must
|
|
||||||
be at least one -- the current block. */
|
|
||||||
while (! TREE_ASM_WRITTEN (new_origin))
|
|
||||||
new_origin = BLOCK_FRAGMENT_CHAIN (new_origin);
|
|
||||||
BLOCK_FRAGMENT_ORIGIN (new_origin) = NULL_TREE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (! dup_origin)
|
|
||||||
new_origin = block;
|
|
||||||
|
|
||||||
/* Re-root the rest of the fragments to the new origin. In the
|
|
||||||
case that DUP_ORIGIN was null, that means BLOCK was the origin
|
|
||||||
of a chain of fragments and we want to remove those fragments
|
|
||||||
that didn't make it to the output. */
|
|
||||||
if (new_origin)
|
|
||||||
{
|
|
||||||
tree *pp = &BLOCK_FRAGMENT_CHAIN (new_origin);
|
|
||||||
tree chain = *pp;
|
|
||||||
|
|
||||||
while (chain)
|
|
||||||
{
|
|
||||||
if (TREE_ASM_WRITTEN (chain))
|
|
||||||
{
|
|
||||||
BLOCK_FRAGMENT_ORIGIN (chain) = new_origin;
|
|
||||||
*pp = chain;
|
|
||||||
pp = &BLOCK_FRAGMENT_CHAIN (chain);
|
|
||||||
}
|
|
||||||
chain = BLOCK_FRAGMENT_CHAIN (chain);
|
|
||||||
}
|
|
||||||
*pp = NULL_TREE;
|
|
||||||
}
|
|
||||||
|
|
||||||
reorder_fix_fragments (BLOCK_SUBBLOCKS (block));
|
|
||||||
block = BLOCK_CHAIN (block);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Reverse the order of elements in the chain T of blocks,
|
/* Reverse the order of elements in the chain T of blocks,
|
||||||
and return the new head of the chain (old last element). */
|
and return the new head of the chain (old last element). */
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user