summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>2000-05-31 22:29:38 +0000
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>2000-05-31 22:29:38 +0000
commitb25177401d9b89fbaf70b784320eb6021db7fa18 (patch)
tree02f2ad55c05de20a9e17213ef04d6c96d56f0fc6
parentcec9f9b57ebe90ef88c0430e27c5e623b8f1e623 (diff)
downloadppe42-gcc-b25177401d9b89fbaf70b784320eb6021db7fa18.tar.gz
ppe42-gcc-b25177401d9b89fbaf70b784320eb6021db7fa18.zip
* 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
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/flow.c48
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,5 +1,11 @@
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.
2000-05-31 Mark Mitchell <mark@codesourcery.com>
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)
OpenPOWER on IntegriCloud