flow.c (propagate_block): If block has no successors, stores to frame are dead if...
authorRichard Kenner <kenner@vlsi1.ultra.nyu.edu>
Wed, 31 May 2000 11:58:35 +0000 (11:58 +0000)
committerRichard Kenner <kenner@gcc.gnu.org>
Wed, 31 May 2000 11:58:35 +0000 (07:58 -0400)
* flow.c (propagate_block): If block has no successors, stores to
frame are dead if not used.

From-SVN: r34296

gcc/ChangeLog
gcc/flow.c

index 47df6aa8c0301ec5d568d2d4d7df16dc46d3fd52..8dea6937a98d83b48d90ffd9c9eccb75c4417945 100644 (file)
@@ -1,3 +1,8 @@
+Wed May 31 08:07:52 2000  Richard Kenner  <kenner@vlsi1.ultra.nyu.edu>
+
+       * flow.c (propagate_block): If block has no successors, stores to
+       frame are dead if not used.
+
 2000-05-31  Nathan Sidwell  <nathan@codesourcery.com>
 
        * stmt (expand_end_case): Reorder conversion sequence for jump
index 03e188caa936f5cd6c7576c7b1b13511ad3f82c5..5526c9f7fc34c9d5946cf85d9688a23a8615d12f 100644 (file)
@@ -3772,6 +3772,26 @@ 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)