mirror of
git://gcc.gnu.org/git/gcc.git
synced 2024-12-18 05:09:01 +08:00
flow.c (propagate_block): Move initialization of mem_set_list ...
* flow.c (propagate_block): Move initialization of mem_set_list ... (init_propagate_block_info): ... here. Also track blocks with no successors; don't scan insns if ! PROP_SCAN_DEAD_CODE. From-SVN: r34310
This commit is contained in:
parent
1febe16ba4
commit
eb7e5da2fc
@ -1,3 +1,9 @@
|
||||
2000-05-31 Richard Henderson <rth@cygnus.com>
|
||||
|
||||
* flow.c (propagate_block): Move initialization of mem_set_list ...
|
||||
(init_propagate_block_info): ... here. Also track blocks with
|
||||
no successors; don't scan insns if ! PROP_SCAN_DEAD_CODE.
|
||||
|
||||
2000-05-31 Richard Henderson <rth@cygnus.com>
|
||||
|
||||
* jump.c (jump_optimize_1): Revert 05-18 change.
|
||||
|
48
gcc/flow.c
48
gcc/flow.c
@ -3639,7 +3639,8 @@ init_propagate_block_info (bb, live, local_set, flags)
|
||||
/* If this block ends in a conditional branch, for each register live
|
||||
from one side of the branch and not the other, record the register
|
||||
as conditionally dead. */
|
||||
if (GET_CODE (bb->end) == JUMP_INSN
|
||||
if ((flags & (PROP_DEATH_NOTES | PROP_SCAN_DEAD_CODE))
|
||||
&& GET_CODE (bb->end) == JUMP_INSN
|
||||
&& any_condjump_p (bb->end))
|
||||
{
|
||||
regset_head diff_head;
|
||||
@ -3717,6 +3718,31 @@ init_propagate_block_info (bb, live, local_set, flags)
|
||||
}
|
||||
#endif
|
||||
|
||||
/* If this block has no successors, any stores to the frame that aren't
|
||||
used later in the block are dead. So make a pass over the block
|
||||
recording any such that are made and show them dead at the end. We do
|
||||
a very conservative and simple job here. */
|
||||
if ((flags & PROP_SCAN_DEAD_CODE)
|
||||
&& (bb->succ == NULL
|
||||
|| (bb->succ->succ_next == NULL
|
||||
&& bb->succ->dest == EXIT_BLOCK_PTR)))
|
||||
{
|
||||
rtx insn;
|
||||
for (insn = bb->end; insn != bb->head; insn = PREV_INSN (insn))
|
||||
if (GET_CODE (insn) == INSN
|
||||
&& GET_CODE (PATTERN (insn)) == SET
|
||||
&& GET_CODE (SET_DEST (PATTERN (insn))) == MEM)
|
||||
{
|
||||
rtx mem = SET_DEST (PATTERN (insn));
|
||||
|
||||
if (XEXP (mem, 0) == frame_pointer_rtx
|
||||
|| (GET_CODE (XEXP (mem, 0)) == PLUS
|
||||
&& XEXP (XEXP (mem, 0), 0) == frame_pointer_rtx
|
||||
&& GET_CODE (XEXP (XEXP (mem, 0), 1)) == CONST_INT))
|
||||
pbi->mem_set_list = alloc_EXPR_LIST (0, mem, pbi->mem_set_list);
|
||||
}
|
||||
}
|
||||
|
||||
return pbi;
|
||||
}
|
||||
|
||||
@ -3772,26 +3798,6 @@ propagate_block (bb, live, local_set, flags)
|
||||
{ REG_BASIC_BLOCK (i) = REG_BLOCK_GLOBAL; });
|
||||
}
|
||||
|
||||
/* If this block has no successors, any stores to the frame that aren't
|
||||
used later in the block are dead. So make a pass over the block
|
||||
recording any such that are made and show them dead at the end. We do
|
||||
a very conservative and simple job here. */
|
||||
if (bb->succ != 0 && bb->succ->succ_next == 0
|
||||
&& bb->succ->dest == EXIT_BLOCK_PTR)
|
||||
for (insn = bb->end; insn != bb->head; insn = PREV_INSN (insn))
|
||||
if (GET_CODE (insn) == INSN && GET_CODE (PATTERN (insn)) == SET
|
||||
&& GET_CODE (SET_DEST (PATTERN (insn))) == MEM)
|
||||
{
|
||||
rtx mem = SET_DEST (PATTERN (insn));
|
||||
|
||||
if ((GET_CODE (XEXP (mem, 0)) == REG
|
||||
&& REGNO (XEXP (mem, 0)) == FRAME_POINTER_REGNUM)
|
||||
|| (GET_CODE (XEXP (mem, 0)) == PLUS
|
||||
&& GET_CODE (XEXP (XEXP (mem, 0), 0)) == REG
|
||||
&& REGNO (XEXP (XEXP (mem, 0), 0)) == FRAME_POINTER_REGNUM))
|
||||
pbi->mem_set_list = alloc_EXPR_LIST (0, mem, pbi->mem_set_list);
|
||||
}
|
||||
|
||||
/* Scan the block an insn at a time from end to beginning. */
|
||||
|
||||
for (insn = bb->end; ; insn = prev)
|
||||
|
Loading…
Reference in New Issue
Block a user