From b25177401d9b89fbaf70b784320eb6021db7fa18 Mon Sep 17 00:00:00 2001 From: rth Date: Wed, 31 May 2000 22:29:38 +0000 Subject: * 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@34310 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 6 ++++++ gcc/flow.c | 48 +++++++++++++++++++++++++++--------------------- 2 files changed, 33 insertions(+), 21 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 59870df69b1..aea8ddbbaa1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2000-05-31 Richard Henderson + + * 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 * jump.c (jump_optimize_1): Revert 05-18 change. diff --git a/gcc/flow.c b/gcc/flow.c index 5526c9f7fc3..dcdf9692051 100644 --- a/gcc/flow.c +++ b/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) -- cgit v1.2.1