diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9461dcaa14dbc38c1d8d9042037cfac741a9ed7d..917a8596e7fae03e824f96058c413c337dbe2993 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +Wed Feb 21 17:35:24 CET 2001 Jan Hubicka <jh@suse.cz> + + * flow.c (init_propagate_block_info): Canon address and use single_set + for killing dead memory stores. + 2001-02-21 Jeffrey Oldham <oldham@codesourcery.com> * Makefile.in (reorg.o): Add params.h dependence. diff --git a/gcc/flow.c b/gcc/flow.c index 65c8a2872e5d379e41e6af060344c882cb1689fc..10c1bd2d3f8479cb20de0aec06ec586fd9ff2d14 100644 --- a/gcc/flow.c +++ b/gcc/flow.c @@ -4110,25 +4110,26 @@ init_propagate_block_info (bb, live, local_set, cond_local_set, flags) || (bb->succ->succ_next == NULL && bb->succ->dest == EXIT_BLOCK_PTR))) { - rtx insn; + rtx insn, set; 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) + && (set = single_set (insn)) + && GET_CODE (SET_DEST (set)) == MEM) { - rtx mem = SET_DEST (PATTERN (insn)); + rtx mem = SET_DEST (set); + rtx canon_mem = canon_rtx (mem); /* This optimization is performed by faking a store to the memory at the end of the block. This doesn't work for unchanging memories because multiple stores to unchanging memory is illegal and alias analysis doesn't consider it. */ - if (RTX_UNCHANGING_P (mem)) + if (RTX_UNCHANGING_P (canon_mem)) continue; - 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)) + if (XEXP (canon_mem, 0) == frame_pointer_rtx + || (GET_CODE (XEXP (canon_mem, 0)) == PLUS + && XEXP (XEXP (canon_mem, 0), 0) == frame_pointer_rtx + && GET_CODE (XEXP (XEXP (canon_mem, 0), 1)) == CONST_INT)) { #ifdef AUTO_INC_DEC /* Store a copy of mem, otherwise the address may be scrogged