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